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学习笔记 用jquery实现无刷新登录
Aug 08 Javascript
node.js中的fs.fsync方法使用说明
Dec 15 Javascript
浅谈JavaScript 的执行顺序
Aug 07 Javascript
理解js对象继承的N种模式
Jan 25 Javascript
简单介绍jsonp 使用小结
Jan 27 Javascript
使用Javascript监控前端相关数据的代码
Oct 27 Javascript
详解jQuery插件开发方式
Nov 22 Javascript
js实现小窗口拖拽效果
Dec 03 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
Jan 20 Javascript
对Vue beforeRouteEnter 的next执行时机详解
Aug 25 Javascript
微信小程序实现的图片保存功能示例
Apr 24 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
Nov 27 Vue.js
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
Apache2 httpd.conf 中文版
2006/11/17 PHP
mysql5写入和读出乱码解决
2006/11/25 PHP
php在线代理转向代码
2012/05/05 PHP
Smarty3配置及入门语法
2017/02/22 PHP
js简单实现交换Li的值
2014/05/22 Javascript
深入理解JavaScript系列(36):设计模式之中介者模式详解
2015/03/04 Javascript
jQuery实现将页面上HTML标签换成另外标签的方法
2015/06/09 Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
2016/03/14 Javascript
Bootstrap 附加导航(Affix)插件实例详解
2016/06/01 Javascript
eslint 的三大通用规则详解
2019/05/16 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
Python利用正则表达式匹配并截取指定子串及去重的方法
2015/07/30 Python
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
Python接口自动化判断元素原理解析
2020/02/24 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
2020/04/22 Python
简单了解如何封装自己的Python包
2020/07/08 Python
python zip()函数的使用示例
2020/09/23 Python
CSS3之transition实现下划线的示例代码
2018/05/30 HTML / CSS
印度低票价航空公司:GoAir
2017/10/11 全球购物
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
UGG澳洲官网:UGG Australia
2018/04/26 全球购物
可持续木材、生态和铝制太阳镜:Proof Eyewear
2019/07/24 全球购物
工程管理专业个人求职信范文
2013/12/07 职场文书
创业计划书——互联网商机
2014/01/12 职场文书
安全事故检讨书
2014/01/18 职场文书
劳动实践课感言
2014/02/01 职场文书
四年级语文教学反思
2014/02/05 职场文书
五年级音乐教学反思
2014/02/06 职场文书
办公室秘书岗位职责范本
2014/02/11 职场文书
公司财务会计主管应聘求职信
2014/09/26 职场文书
一文弄懂MySQL索引创建原则
2022/02/28 MySQL