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 相关文章推荐
详解css3 mask遮罩实现一些特效
Oct 24 HTML / CSS
收集的7个CSS3代码生成工具
Apr 17 HTML / CSS
利用css3制作3D样式按钮实现代码
Mar 18 HTML / CSS
css3实现六边形边框的实例代码
May 24 HTML / CSS
CSS3 实现的火焰动画
Dec 07 HTML / CSS
html5 学习简单的拾色器
Sep 03 HTML / CSS
实例教程 利用html5和css3打造一款创意404页面
Oct 20 HTML / CSS
浅谈利用缓存来优化HTML5 Canvas程序的性能
May 12 HTML / CSS
HTML5拖放效果的实现代码
Nov 17 HTML / CSS
html5使用Drag事件编辑器拖拽上传图片的示例代码
Aug 22 HTML / CSS
详解Canvas 跨域脱坑实践
Nov 07 HTML / CSS
使用canvas生成含有微信头像的邀请海报没有微信头像问题
Oct 29 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
php和javascript之间变量的传递实现代码
2012/12/19 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
Discuz论坛密码与密保加密规则
2016/12/19 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
php unlink()函数使用教程
2018/07/12 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
一段好玩的JavaScript代码
2006/12/01 Javascript
jQuery下通过replace字符串替换实现大小图片切换
2012/05/22 Javascript
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
JS常用字符串处理方法应用总结
2014/05/22 Javascript
js使用removeChild方法动态删除div元素
2014/08/01 Javascript
js+jquery实现图片裁剪功能
2015/01/02 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
浅谈Javascript数据属性与访问器属性
2016/07/26 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
微信小程序request出现400的问题解决办法
2017/05/23 Javascript
将 vue 生成的 js 上传到七牛的实例
2017/07/28 Javascript
Javascript中的getter和setter初识
2017/08/17 Javascript
JS实现的JSON数组去重算法示例
2018/04/11 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
2018/12/16 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
Python数据类型详解(一)字符串
2016/05/08 Python
基于Python os模块常用命令介绍
2017/11/03 Python
对Python3中dict.keys()转换成list类型的方法详解
2019/02/03 Python
俄罗斯游戏商店:Buka
2020/03/01 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
餐厅采购员岗位职责
2014/03/06 职场文书
七夕活动策划方案
2014/08/16 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
督导岗位职责
2015/02/04 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
2022/07/15 Java/Android