菜单栏底部线条切换效果(标题滚动居中显示)

简介: 菜单栏底部线条切换效果(标题滚动居中显示)

要实现的效果是当点击某一个菜单的时候,菜单的底部有一个线条高亮,从上一次的位置切换到点击的位置,而且需要添加动画效果。

在这里插入图片描述

首先我们的DOM结构是这样的,li 是显示每一个菜单的内容,我们添加了自定义的属性,用来区分在点击的时候具体是点击第几个的位置。线条是通过定位在最底下的。

<div class="wrapper">
  <ul class="list" id="list">
    <li class="item" data-index="0">首页</li>
    <li class="item" data-index="1">详情</li>
    <li class="item" data-index="2">评价</li>
  </ul>
  <div class="line" id="line">
    <span class="inner"></span>
  </div>
</div>

在css上面,线条通过两个 div 控制,外层的宽度要和菜单的宽度保持一致,里面的宽度是具体线条显示的宽度。这样就能居中显示。

.wrapper {
  position: relative;
}
.list {
  display: flex;
}
.item {
  flex: 1;
  text-align: center;
  line-height: 36px;
}
.line {
  position: absolute;
  text-align: center;
  left: 0;
  bottom: 0;
  width: 0;
  transform: translate3d(0, 0, 0);
  transition: transform 0.3s ease-out;
  display: none;
}
.inner {
  width: 20px;
  height: 2px;
  background: red;
  display: inline-block;
  vertical-align: bottom;
}

在JS里面,我们先需要获取每个菜单的宽度和距离页面左边的距离,然后绑定点击事件,根据自定义属性我们知道点击的位置,然后重新设置线条的偏移位置。

const list = document.getElementsByClassName('item')
const line = document.getElementById('line')
const listWrapper = document.getElementById('list')
const resut = []
for (let i = 0; i < list.length; i++) {
  const element = list[i]
  resut.push({
    width: element.offsetWidth,
    left: element.offsetLeft
  })
}
line.style.width = `${resut[0].width}px`
line.style.display = 'block'
listWrapper.onclick = function (e) {
  const index = e.target.dataset.index
  const width = resut[index].width
  line.style.width = `${width}px`
  const left = resut[index].left
  line.style.transform = `translate3d(${left}px, 0, 0)`
}

设置了宽度是为了防止有些菜单宽度不一样,所以为了能居中,我们就需要点击的时候去重新设置一下。


经过扩展,我还写了一个标题滚动的项目:GitHub:链接,分别用JS和Vue写了。

文章介绍:链接

相关文章
|
小程序 开发者
小程序顶部自定义导航栏添加背景图的实现
小程序顶部自定义导航栏添加背景图的实现
186 0
|
4月前
|
JavaScript
Elementplus淡入淡出效果,头部顶栏如何设置文字隐藏效果,默认图标如何收缩,icons如何通过类进行替换,侧边栏如何添加阴影,右边如何设置高度,侧边栏如何设置阴影,如何让icon与文字
Elementplus淡入淡出效果,头部顶栏如何设置文字隐藏效果,默认图标如何收缩,icons如何通过类进行替换,侧边栏如何添加阴影,右边如何设置高度,侧边栏如何设置阴影,如何让icon与文字
|
4月前
|
JavaScript 容器
Vue 动画 —— 滑动切换动画 / 滑动翻页过渡动画——从顶部到底部、从底部到顶部、从左侧到右侧、从右侧到左侧
Vue 动画 —— 滑动切换动画 / 滑动翻页过渡动画——从顶部到底部、从底部到顶部、从左侧到右侧、从右侧到左侧
767 0
|
6月前
SVProgressHUD弹出框总是显示在屏幕左上角问题
SVProgressHUD弹出框总是显示在屏幕左上角问题
85 0
|
6月前
|
JavaScript 前端开发 容器
随着页面的滚动导航条跟着滚动
随着页面的滚动导航条跟着滚动
|
6月前
【推荐】实现跟随鼠标移动的浮动提示框、气泡框、Tip效果
【推荐】实现跟随鼠标移动的浮动提示框、气泡框、Tip效果
|
JavaScript 前端开发
鼠标拖拽菜单栏控制宽度大小及flex实现经典左右两栏布局
鼠标拖拽菜单栏控制宽度大小及flex实现经典左右两栏布局
鼠标拖拽菜单栏控制宽度大小及flex实现经典左右两栏布局
|
前端开发
HTMLCSS实现左侧固定宽度右侧内容可滚动
在做移动端页面的时候,经常会碰到一个div中分左右两个div,左侧div固定宽度或百分比,右侧div中内容左右溢出,需要左右滑动才可以浏览到全部内容,为此写了一个demo。 处理这个问题的核心关键点是右侧div需要设置固定宽度或者百分比,然后设置它的overflow为auto或者scroll。
3289 1