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实现鼠标滑过鼠标点击代码写法
Dec 26 HTML / CSS
HTML5中的postMessage API基本使用教程
May 20 HTML / CSS
HTML5 Canvas实现文本对齐的方法总结
Mar 24 HTML / CSS
HTML5中实现拖放效果无须借助javascript
Dec 26 HTML / CSS
利用HTML5中Geolocation获取地理位置调用Google Map API在Google Map上定位
Jan 23 HTML / CSS
html5教程画矩形代码分享
Dec 04 HTML / CSS
HTML5+CSS3实现拖放(Drag and Drop)示例
Jul 07 HTML / CSS
phonegap常用事件总结(必看篇)
Mar 31 HTML / CSS
html5中audio支持音频格式的解决方法
Aug 24 HTML / CSS
HTML5 Canvas 实现K线图的示例代码
Dec 23 HTML / CSS
html5 canvas手势解锁源码分享
Jan 07 HTML / CSS
详解移动端h5页面根据屏幕适配的四种方案
Apr 15 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
《星际争霸II》全新指挥官斯台特曼现已上线
2020/03/08 星际争霸
zend Framework中的Layout(模块化得布局)详解
2013/06/28 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
2014/03/13 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
JS Array对象入门分析
2008/10/30 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
JS分页效果示例
2013/10/11 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
vue-router:嵌套路由的使用方法
2017/02/21 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
微信小程序商品详情页的底部弹出框效果
2020/11/16 Javascript
浅谈Vue SSR中的Bundle的具有使用
2019/11/21 Javascript
JavaScript基于面向对象实现的无缝滚动轮播示例
2020/01/17 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
Python2.5/2.6实用教程 入门基础篇
2009/11/29 Python
使用Mixin设计模式进行Python编程的方法讲解
2016/06/21 Python
Python正规则表达式学习指南
2016/08/02 Python
python实现简单点对点(p2p)聊天
2017/09/13 Python
Python机器学习之SVM支持向量机
2017/12/27 Python
python的re正则表达式实例代码
2018/01/24 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
python将回车作为输入内容的实例
2018/06/23 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
CK美国官网:Calvin Klein
2016/08/26 全球购物
int和Integer有什么区别
2013/05/25 面试题
建筑公司文秘岗位职责
2013/11/29 职场文书
出国签证在职证明
2014/01/16 职场文书
租房合同协议书
2014/04/09 职场文书
个人投资计划书
2014/05/01 职场文书
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL
Appium中scroll和drag_and_drop根据元素位置滑动
2022/02/15 Python
Nginx 配置 HTTPS的详细过程
2022/05/30 Servers