| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> vue实现导航栏吸顶效果 + 与内容联动 -> 正文阅读 |
|
[JavaScript知识库]vue实现导航栏吸顶效果 + 与内容联动 |
大家好,我是南宫。今天写一篇博客来整理下最近刚解决的一个问题,那就是导航栏跟内容联动的问题。 ? 简单说一下我想要的效果:写了一个宽度为屏幕100%的div,居中的部分是一个导航栏,水平排列,默认位于banner下,如果页面滚到了banner下面,要让导航栏固定顶部。如果页面滚到了下方对应的内容,那就高亮对应的tab标记。如果点击了tab,那就要让页面滚到对应的内容,并且让该tab高亮。 (效果是动态的,我随便截取一个场景来展示吧,比如我点击“应用场景”的时候,页面滚动到了对应的内容区域,并且对应的tab高亮了,也能看到导航栏固定顶部) 拆解一下,可以分为这么几个部分:①吸顶、②选择tab,可以让页面滚动到对应内容的位置、③页面滚动到了对应的内容的位置,可以设置tab的选择。 吸顶的实现: 这个是最容易的,我先简单说一下原理:默认导航栏是位于banner下方的,也就是普通的标准流元素,没有浮动没有定位,是正常占位的;而固定顶部的状态下,导航栏被固定定位(position: fixed)到了顶部,这个时候可以设置一下top。我们可以判断当前滚动的位置是否需要固定定位,如果是,那就做一下样式的切换。 显然导航栏有两种状态,所以我们可以写两个class来分别控制。(我这里使用SCSS,可以参考一下我的代码,nav-bar是默认状态,再加上fixed的是固定顶部的状态)
那么怎么控制导航栏是否固定顶部呢?可以在data里放一个变量(如isFixed)来控制,默认为false。监听一下页面的滚动,如果滚动超过了某个值,就让isFixed改为true,否则改为false。然后在导航栏这边,动态绑定class,“fixed”在isFixed为true才设置上去。
Vue项目中如何监听页面的滚动呢?把刚才的handleScroll定义到组件的methods里面,在mounted的时候绑定window的滚动时间,注意是在mounted的时候才可以使用DOM。退出页面的时候,也要记得销毁监听。
点击选择tab,让页面滚动到对应内容的实现: 首先,tab会有普通状态和高亮状态,所以我们也需要用一个变量来控制当前选中的、处于高亮状态的tab是第几个,默认为0,让第一个tab高亮。
然后,页面上有好几块内容,每一块对应一个tab,我们给这几块内容的最外层加上一个class,作为标记,便于选择这些锚点元素,比如我给它们加上“j-content”这个类名。这样就实现了导航栏和每块内容的绑定。
点击tab的时候,我们可以获取到当前点击的tab的索引(比如第1个的索引是0),在带有j-content的div里,我们找到下标相同的div(如索引为0的时候找到第一个这样的div),获取它顶部的坐标,让页面滚动到这里。 (看下面的代码,从所有的带有j-content的class里找到对应当前索引的div,获取它的offsetTop,然后用window.scrollTo平滑滚动到指定地方,这里用behavior设置了平滑滚动)
页面滚动到对应内容,设置tab高亮的实现: 首页,要判断页面滚到到了哪一块内容,就得监听页面的滚动事件,所以判断的代码需要写到handleScroll方法里。 然后滚动的时候,滚动的位置跟哪些值比较呢?这就需要我们记录每一块内容的offsetTop的位置。根据之前定好的class,找到每一块内容的div,获取一下它们各自的offsetTop,并保存。
接着,在滚动的过程中,怎么确定当前要高亮的tab是哪个呢?我们可以把当前的scrollTop值与每一个div的offsetTop比较,找到“小于但又最接近”的那个值,把这个下标作为要高亮的tab的下标。 (我补充了一个判断,假如刚开始滚,还没有滚到第一个内容区域的话,navIndex会算出来undefined,为了让这个时候也有tab被高亮,我认为当前高亮的是0.)
到这一步,就已经做到了滚动吸顶、点击tab滚动到相应的锚点、滚动高亮对应的tab。但是在调试的时候我又发现了一个问题——点击tab,页面滚动的过程中,经过其他区域的时候,也会点亮对应的tab,这就显得效果有些拖泥带水,不像是被直接定位过去的。 于是我觉得,需要区分这两种情况:“因为点击而直接滚动到这里”? 和 “页面自己滚动的时候路过这里”。我在data里加了一个新的变量,叫isClick,默认为false,表示不是点击定位的。在点击tab后,瞬间把isClick赋值为true。然后在“根据滚动位置,判断高亮tab”之前,先判断isClick,确定不是点击定位的才判断。在点击动作完成、滚动完毕后,过一小段时间,把isClick还原成true,以便恢复后续的滚动高亮效果。 完整的handleScroll和toBox代码在这里:
?还有20分钟就是新年了,我总算赶在2021年写完了这一篇博客,欢迎有类似需要的小伙伴来探讨哦,谢谢大家! |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 11:02:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |