Html5之title吸顶功能


Posted in HTML / CSS onJune 04, 2018

吸顶功能

吸顶是一种比较常见的交互效果,当页面滑出屏幕边界,标题会自动吸附在屏幕边缘,用于提示用户。

基本原理

在H5中实现的基本原理就是判断当前页面滑动的距离scrollTop和标题距离页面顶部距离offsetTop的关系,进而设置标题的position = fixed。这里需要明白scrollTop和offsetTop属性的含义。

scrollTop

代表在有滚动条时,滚动条向下滚动的距离也就是元素顶部被遮住部分的高度。在没有滚动条时scrollTop==0恒成立。单位px,可读可设置。

Html5之title吸顶功能

offsetTop

当前元素顶部距离最近父元素顶部的距离,和有没有滚动条没有关系。单位px,只读元素。

Html5之title吸顶功能

所以,当scrollTop>offsetTop时,title的position = fixed,top = 0,使之固定在屏幕上方;当scrollTop < offsetTop,取消position = fixed,代码如下:

if (fixedDom[0].offsetTop - elementScrollTop < 0){
            fixedDom.addClass("road-tab-fixed")
          }else {
            fixedDom.removeClass("road-tab-fixed")
          }

效果如下:

Html5之title吸顶功能

优化

有图看出基本功能实现的差不多了,但是感觉哪里怪怪的。当页面向上滑时效果还是比较自然的,但是当页面下滑时,只有当页面完全滑到顶部时,标题才会回到原位,导致过度不自然,所以对于titile的position的设定要分两种情况:上滑和下滑。

判断上下滑动方向

判断上下滑动点击此处

当页面上滑时

当scrollTop>offsetTop时,title的position = fixed,top = 0,使之固定在屏幕上方;

当页面下滑时

当scrollTop<offsetTop时,取消掉fixed属性,这样就会使标题跟随页面滑动下来,交互更加自然了,

代码如下:

if(beforeElementScrollTop - elementScrollTop <=0){//up
            console.log('up');
            if (beforeOffsetTop - elementScrollTop < 0){
              fixedDom.addClass("road-tab-fixed")
            }
          }else{
            console.log('down');
            // console.log('beforeOffsetTop-----------',beforeOffsetTop);
            // console.log('elementScrollTop--------------',elementScrollTop);
            if (beforeOffsetTop - elementScrollTop >= 0){
              fixedDom.removeClass("road-tab-fixed")
            }
          }

效果如下:

Html5之title吸顶功能

优化之scroll节流

当对页面监听了scroll事件后,滑动时scroll的回调会一直在执行,影响到页面性能,而节流只允许一个函数在 X 毫秒内执行一次,只有当上一次函数执行后过了你规定的时间间隔,才能进行下一次该函数的调用。代码如下

const fixedDom = $("#road-tab"),
          isIos = utils.getMobileType(),
          tabclass = "road-tab-fixed";
        let beforeElementScrollTop = 0;
        let beforeOffsetTop = fixedDom[0].offsetTop;
        //scroll节流
        const throttle = (func,wait,mustRun) => {
          var timeout,
            startTime = new Date();

          return function() {
            var context = this,
              args = arguments,
              curTime = new Date()
            clearTimeout(timeout)
            // 如果达到了规定的触发时间间隔,触发 handler
            if(curTime - startTime >= mustRun){
              beforeElementScrollTop = document.body.scrollTop;
              console.log("beforelementScrollTop----------",document.body.scrollTop);
              func.apply(context,args);
              startTime = curTime
              // 没达到触发间隔,重新设定定时器
            }else{
              timeout = setTimeout(func, wait)
            }
          }
        }
        const winScroll = (e) => {
          const elementScrollTop=document.body.scrollTop;
          console.log('elementScrollTop--------------',elementScrollTop);
          if(beforeElementScrollTop - elementScrollTop <=0){//up
            console.log('up');
            if (beforeOffsetTop - elementScrollTop < 0){
              fixedDom.addClass("road-tab-fixed")
            }
          }else{
            if (beforeOffsetTop - elementScrollTop >= 0){console.log("UUUUUU");
              fixedDom.removeClass("road-tab-fixed")
            }
          }
        };
        $(window).off("scroll").on("scroll", throttle(winScroll,10,100));

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

HTML / CSS 相关文章推荐
全面总结使用CSS实现水平垂直居中效果的方法
Mar 10 HTML / CSS
CSS3 选择器 属性选择器介绍
Jan 21 HTML / CSS
基于CSS3实现的黑色个性导航菜单效果
Sep 14 HTML / CSS
CSS3之transition实现下划线的示例代码
May 30 HTML / CSS
CSS3 实现的缩略图悬停效果
Dec 09 HTML / CSS
HTML5 WebGL 实现民航客机飞行监控系统
Jul 25 HTML / CSS
html5 Canvas绘制线条 closePath()实例代码
May 10 HTML / CSS
HTML5制作酷炫音频播放器插件图文教程
Dec 30 HTML / CSS
基于html5 DeviceOrientation 实现微信摇一摇功能
Sep 25 HTML / CSS
html5 input输入实时检测以及延时优化
Jul 18 HTML / CSS
详解canvas绘制多张图的排列顺序问题
Jan 21 HTML / CSS
关于CSS浮动与取消浮动的问题
Jun 28 HTML / CSS
浅谈Html5移动端ios/Android兼容性总结
Jun 01 #HTML / CSS
HTML5中的websocket实现直播功能
May 21 #HTML / CSS
深入浅析HTML5中的article和section的区别
May 15 #HTML / CSS
HTML5触摸事件实现移动端简易进度条的实现方法
May 04 #HTML / CSS
HTML5声音录制/播放功能的实现代码
May 03 #HTML / CSS
HTML5离线应用与客户端存储的实现
May 03 #HTML / CSS
浅谈Html5多线程开发之WebWorkers
May 02 #HTML / CSS
You might like
php5 mysql分页实例代码
2008/04/10 PHP
PHP JS Ip地址及域名格式检测代码
2013/09/27 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
纯CSS3实现质感细腻丝滑按钮
2021/03/09 HTML / CSS
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能示例
2019/05/14 Javascript
搭建Vue从Vue-cli到router路由护卫的实现
2019/11/14 Javascript
关于JavaScript数组去重的一些理解汇总
2020/09/10 Javascript
17个Python小技巧分享
2015/01/23 Python
python更新列表的方法
2015/07/28 Python
利用python将pdf输出为txt的实例讲解
2018/04/23 Python
python抓取网站的图片并下载到本地的方法
2018/05/22 Python
Python简单计算给定某一年的某一天是星期几示例
2018/06/27 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
Hurley官方网站:扎根于海滩生活方式的全球青年文化品牌
2020/05/18 全球购物
解释下面关于J2EE的名词
2013/11/15 面试题
教师专业理论水平的自我评价分享
2013/11/09 职场文书
求职自荐书范文
2013/12/04 职场文书
迟到检讨书大全
2014/01/25 职场文书
大学运动会入场词
2014/02/22 职场文书
应届毕业生自荐信例文
2014/02/26 职场文书
土地转让协议书
2014/04/15 职场文书
2014年业务工作总结
2014/11/17 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP
Mysql 一主多从的部署
2022/05/20 MySQL