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

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

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

在这里插入图片描述

首先我们的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写了。

文章介绍:链接

相关文章
|
JavaScript 容器
使用 swiper 做轮播图
使用 swiper 做轮播图
962 0
使用 swiper 做轮播图
|
弹性计算 安全 Ubuntu
阿里云服务器如何安装宝塔面板教程汇总(图文教程)
阿里云服务器如何安装宝塔面板教程汇总(图文教程)
|
开发框架 安全 .NET
托管 CLR 是什么意思,如何实现?
【8月更文挑战第31天】
229 0
|
10月前
|
人工智能 自然语言处理 前端开发
三大行业案例:AI大模型+Agent实践全景
本文将从AI Agent和大模型的发展背景切入,结合51Talk、哈啰出行以及B站三个各具特色的行业案例,带你一窥事件驱动架构、RAG技术、人机协作流程,以及一整套行之有效的实操方法。具体包含内容有:51Talk如何让智能客服“主动进攻”,带来约课率、出席率双提升;哈啰出行如何由Copilot模式升级为Agent模式,并应用到客服、营销策略生成等多个业务场景;B站又是如何借力大模型与RAG方法,引爆了平台的高效内容检索和强互动用户体验。
2444 5
|
JavaScript
Vue2进度条(Progress)
这篇文章介绍了如何在Vue 3框架中创建一个可自定义设置的进度条组件,包括进度条的宽度、当前进度、线条宽度和是否显示进度信息等属性。
552 2
Vue2进度条(Progress)
|
JavaScript 前端开发
JavaScript 事件的绑定
JavaScript 事件的绑定
188 0
uniapp滑动到一定的高度后固定某个元素到顶部效果demo(整理)
uniapp滑动到一定的高度后固定某个元素到顶部效果demo(整理)
Vue3级联选择(Cascader)
这是一个可定制的级联选择器组件,支持多级下拉选项。主要属性包括:数据源、文本字段、值字段、后代字段、占位符文本、选择行为、间距、宽度、高度、禁用状态、清除功能、搜索功能及过滤函数等。组件可根据需求灵活配置,并支持动态更新与事件回调。在线预览和详细示例可见[这里](https://themusecatcher.github.io/vue-amazing-ui/guide/components/cascader.html)。
800 2
Vue3级联选择(Cascader)
|
弹性计算 安全 Linux
3分钟成功《幻兽帕鲁》!阿里云服务器自建幻兽帕鲁联机游戏新手教程
3分钟成功创建《幻兽帕鲁》!阿里云服务器自建幻兽帕鲁联机游戏新手教程,如何自建幻兽帕鲁服务器?基于阿里云服务器搭建幻兽帕鲁palworld服务器教程来了,一看就懂系列。
210 6
|
数据采集 搜索推荐 开发者
Nuxt3 实战 (十二):SEO 搜索引擎优化指南
这篇文章介绍了如何为Nuxt.js项目添加favicon图标和TDK(标题、描述、关键词),安装@nuxtjs/seo模块,以及如何设置Robots、Sitemap、OG Image、Schema.org、Experiments等。文章还提到了添加Google Analytics、Microsoft Clarity和Umami统计代码的方法。文章最后总结称,Nuxt.js 3集成了很多SEOModules,使开发者能够更加高效便捷地做好搜索引擎方面的优化。
687 0
Nuxt3 实战 (十二):SEO 搜索引擎优化指南