js实现多个标题吸顶效果


Posted in Javascript onJanuary 08, 2020

对于导航的吸顶效果,pc端和移动端的需求可能有些差异。在pc端,我们通常只需要一个顶部导航;在移动端,在滑动页面的时候,更需要多个标题的吸顶(例如地区的选择,需要将省份吸顶)。

单个标题吸顶和多个标题吸顶的区别在于:多个标题吸顶需要确定一个高度范围,在这个范围中只能有一个标题吸顶,其他都是固定效果。

一、页面布局及样式

此处为了测试效果,用了几个重复的section标签,大家根据实际需求编写布局和样式。

<body>
 <ul id="container">
 <h1>实现多个标题的吸顶</h1>
 <section>
  <div class="box">header1</div>
  <li>1</li>
  <li>1</li>
  <li>1</li>
  <li>1</li>
  <li>1</li>
  <li>1</li>
 </section>
 
 <!--设置多个如header1的子列表,窗口可以进行滚动,此处省略-->
 
 <section>
  <div class="box">header5</div>
  <li>1</li>
  <li>1</li>
  <li>1</li>
  <li>1</li>
  <li>1</li>
  <li>1</li>
 </section>
 
 </ul>
</body>
<style type="text/css">
 * {
 padding: 0;
 margin: 0;
 }
 ul {
 width: 100%;
 }
 li {
 width: 200px;
 color: white;
 margin: 10px;
 list-style: none;
 border-radius: 5px;
 border: 1px solid #191970;
 background: #4169E1;
 text-align: center;
 }
 div {
 width: 100%;
 height: 30px;
 color: white;
 padding-left: 20px;
 background: #DC143C;
 }
 .box1 {
 position: fixed;
 top: 0;
 }
</style>

二、js的编写

1、获取所有需要吸顶效果的标题。这里的标题最好用相同的布局和样式,获取时能够更快捷和统一。

var box = document.getElementsByClassName('box'), //获取所有需要吸顶效果的标题
  section = document.getElementsByTagName('section'); //获取所有子列表,后面有用

2、获取标题个数和定义一个数组,用来存放每个标题到父元素的距离(offsetTop)。

var ot = [],  //存储每个标题的offsetTop
  len = box.length;   //标题的个数

3、遍历所有标题,获取offsetTop,并存入ot数组中。

for(let i=0; i<len; i++) {
 ot.push(box[i].offsetTop);  //获取每个标题的offsetTop
}

4、监听window的滚动事件,获取scrollTop;如果滚动高度位于第i个标题的offsetTop和第i+1个标题的offsetTop之间(例如滚动的高度位于header1和header2的offsetTop之间,heade1吸顶),则第i个标题添加box1样式,实现吸顶。

window.onscroll = function () {
 //获取滚动的高度
 var st = document.documentElement.scrollTop || document.body.scrollTop;
 
 for(let i=0; i<len; i++) {
 if(st>ot[i] && st<ot[i+1]) { //滚动时监听位置,为标题的吸顶设置一个现实范围
  box[i].className = 'box box1';
 } else {
  box[i].className = 'box';
 }
 
 }
}

5、第四步中,有个问题:当滚动道最后一个标题(i)时,无法获取(i+1)。

解决方法:从第一步中获得的section标签集合中拿出最后一个子列表(section[0]),然后获取最后一个子列表的高度,计算出最后一个标题的显示高度范围,并存入ot数组中。

//获取最后一个子列表的高度,为了设置最后一个吸顶标题的位置
//section[len-1].getBoundingClientRect().height
//此方法返回一个number
 
ot.push(box[len-1].offsetTop + section[len-1].getBoundingClientRect().height);

三、最后效果

js实现多个标题吸顶效果

js实现多个标题吸顶效果

完整js代码

var box = document.getElementsByClassName('box'), //获取所有需要吸顶效果的标题
 section = document.getElementsByTagName('section'); //获取所有子列表
 
var ot = [],       //存储每个标题的offsetTop
 len = box.length;   //标题的个数
 
for(let i=0; i<len; i++) {
 ot.push(box[i].offsetTop);  //获取每个标题的offsetTop
}
 
//获取最后一个子列表的高度,为了设置最后一个吸顶标题的位置
//section[len-1].getBoundingClientRect().height
//此方法返回一个number
 
ot.push(box[len-1].offsetTop + section[len-1].getBoundingClientRect().height);
 
window.onscroll = function () {
 //获取滚动的高度
 var st = document.documentElement.scrollTop || document.body.scrollTop;
 
 for(let i=0; i<len; i++) {
 if(st>ot[i] && st<ot[i+1]) { //滚动时监听位置,为标题的吸顶设置一个现实范围
  box[i].className = 'box box1';
 } else {
  box[i].className = 'box';
 }
 
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
Dec 05 Javascript
JavaScript实现的使用键盘控制人物走动实例
Aug 27 Javascript
jquery单行文字向上滚动效果的实现代码
Sep 05 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
Feb 29 Javascript
一个用jquery写的判断div滚动条到底部的方法【推荐】
Apr 29 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
Aug 09 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
Oct 07 Javascript
AngularJS动态绑定HTML的方法分析
Nov 07 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
Feb 14 Javascript
js+html5实现侧滑页面效果
Jul 15 Javascript
vue 中 beforeRouteEnter 死循环的问题
Apr 23 Javascript
jQuery实现消息弹出框效果
Dec 10 jQuery
Vue v-model组件封装(类似弹窗组件)
Jan 08 #Javascript
jquery实现吸顶导航效果
Jan 08 #jQuery
JS实现网站吸顶条
Jan 08 #Javascript
js实现移动端吸顶效果
Jan 08 #Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
Jan 08 #Javascript
微信小程序实现吸顶效果
Jan 08 #Javascript
JS实现吸顶特效
Jan 08 #Javascript
You might like
PHP操作文件方法问答
2007/03/16 PHP
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
js 匿名调用实现代码
2009/06/19 Javascript
让innerText在firefox火狐和IE浏览器都能用的写法
2011/05/14 Javascript
js 控制页面跳转的5种方法
2013/09/09 Javascript
nodejs如何获取时间戳与时间差
2016/08/03 NodeJs
vue.js表格分页示例
2016/10/18 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
jquery实现左右轮播切换效果
2018/01/01 jQuery
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
[00:58]他们到底在电话里听到了什么?
2017/11/21 DOTA
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
Python如何获取系统iops示例代码
2016/09/06 Python
python 容器总结整理
2017/04/04 Python
matplotlib绘图实例演示标记路径
2018/01/23 Python
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
python计算日期之间的放假日期
2018/06/05 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
django如何通过类视图使用装饰器
2019/07/24 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
大学生个人求职口试自我评价
2014/02/16 职场文书
合作意向书范本
2014/03/31 职场文书
工作证明格式及范本
2014/09/12 职场文书
邀请函怎么写
2015/01/30 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
分享几个JavaScript运算符的使用技巧
2021/04/24 Javascript
用Python进行栅格数据的分区统计和批量提取
2021/05/27 Python