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 相关文章推荐
JavaScript delete操作符应用实例
Jan 13 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
Feb 03 Javascript
JavaScript中数组成员的添加、删除介绍
Dec 30 Javascript
javascript中for/in循环及使用技巧
Sep 01 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
Mar 11 Javascript
Angular.js如何从PHP读取后台数据
Mar 24 Javascript
jQuery简单设置文本框回车事件的方法
Aug 01 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
Oct 28 Javascript
Centos6.8下Node.js安装教程
May 12 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
May 25 Javascript
三步实现ionic3点击退出app程序
Sep 17 Javascript
node.js实现简单的压缩/解压缩功能示例
Nov 05 Javascript
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
用户的详细注册和判断
2006/10/09 PHP
php和javascript之间变量的传递实现代码
2012/12/19 PHP
php调用C代码的实现方法
2014/03/11 PHP
PHP6新特性分析
2016/03/03 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
在IE,Firefox,Safari,Chrome,Opera浏览器上调试javascript
2008/12/02 Javascript
JS小框架 fly javascript framework
2009/11/26 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
JS实现的不规则TAB选项卡效果代码
2015/09/18 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
详解springmvc 接收json对象的两种方式
2016/12/06 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
原生js实现3D轮播图
2020/03/21 Javascript
vue深度监听(监听对象和数组的改变)与立即执行监听实例
2020/09/04 Javascript
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
python读取Android permission文件
2013/11/01 Python
使用Python实现BT种子和磁力链接的相互转换
2015/11/09 Python
python中import学习备忘笔记
2017/01/24 Python
Python实现曲线点抽稀算法的示例
2017/10/12 Python
shell命令行,一键创建 python 模板文件脚本方法
2018/03/20 Python
python 3调用百度OCR API实现剪贴板文字识别
2018/09/04 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
草莓网化妆品加拿大网站:Strawberrynet Canada
2016/09/20 全球购物
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
广州御银科技股份有限公司试卷(C++)
2016/11/04 面试题
春节慰问信范文
2015/02/15 职场文书
基层党支部承诺书
2015/04/30 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
python基于turtle绘制几何图形
2021/06/15 Python
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python