因为项目需求,最近开始转到微信公众号开发,接触到了Vue框架,这个效果的实现虽说是基于Vue框架下实现的,但是同样也可以借鉴到其他地方,原理都是一样的。
进入正题,先看下效果图:
其实js做这个效果还是挺简单的,因为在css中我们可以设置一个元素的 position: fixed;
,这样它就可以固定在那里,这样不管页面怎么滚动,它的位置都不受影响,所以我们的思路就是在合适的时机把要吸顶的头部元素的position属性设置为fixed就可以了。但是这个合适的时机是什么时候呢,这就需要我们计算了,我们需要监听页面的滚动状态,当页面滚动到要吸顶元素所处的位置的时候就是我们设置它固定的时候,所以就需要我们:
1.监听页面的滚动状态:
在mounted回调中加入以下代码:
mounted() { // handleScroll为页面滚动的监听回调 window.addEventListener('scroll', this.handleScroll); },
同时在destroyed回调中移除监听:
destroyed(){ window.removeEventListener('scroll', this.handleScroll); },
2.计算吸顶元素到页面顶部的距离:
计算出来这个距离之后就可以确定固定吸顶元素的时机了,如果你的吸顶元素上面的元素的高度是固定的话,那就简单了,直接在handleScroll方法中进行判断就可以了,可以直接跳到第三步了,如果是动态的,那就需要我们在接口请求完数据,dom元素渲染完之后进行动态计算了,Vue中有一个很好用的方法,可以很方便的监听dom渲染完成:
// 监听dom渲染完成 this.$nextTick(function(){ // 这里fixedHeaderRoot是吸顶元素的ID let header = document.getElementById("fixedHeaderRoot"); // 这里要得到top的距离和元素自身的高度 this.offsetTop = header.offsetTop; this.offsetHeight = header.offsetHeight; console.log("offsetTop:" + this.offsetTop + "," + this.offsetHeight); });
3.判断页面滚动距离:
handleScroll(){ // 得到页面滚动的距离 let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop; // 判断页面滚动的距离是否大于吸顶元素的位置 this.headerFixed = scrollTop > (this.offsetTop - this.offsetHeight * 2); },
ps:这里理论上其实应该是scrollTop > (this.offsetTop - this.offsetHeight),但是不知道为啥我这里做出来后滚动到吸顶元素位置的时候scrollTop还是比this.offsetTop - this.offsetHeight的值小,所以这里*2,这样得出来的值才刚刚好,如果有知道的朋友可以帮忙解惑一下。
上面我们得到了一个headerFixed的boolean属性值,接下来我们只需要根据它的值来设置吸顶元素的 position: fixed;
属性就可以了。 我们可以写一个css样式:
.isFixed{ position: fixed; top: px2rem(110); left: px2rem(20); right: px2rem(20); }
然后Vue可以在dom元素里这样动态设置class,非常方便:
<div id="fixedHeaderRoot"> <div id="knowPointHeader" class="knowPointHeader" :class="headerFixed"> <div><span>知识模块</span></div> <div><span>知识点</span></div> <div><span>能力要求</span></div> </div> </div>
其实到这里这个效果已经实现完成了,不过我在测试过程中发现,因为ios手机页面滚动到底部的时候,还可以上拉,有一个橡皮筋效果,这个效果会导致一个我们页面的一个Bug,因为它的这种橡皮筋效果也会触发页面滚动的监听,当数据很多的时候其实看不出来,只有当数据刚好占满屏幕的时候,这个时候你再继续往上滑动屏幕,就会触发页面的滚动监听,这个时候handleScroll方法中计算出来的值scrollTop是大于吸顶元素top的距离,所以吸顶元素会被设置为固定属性,大家知道一个元素一旦被设置为 position: fixed;
,那么它就会相对于浏览器窗口进行定位,这样我们下面的内容就会往上顶,这样的话scrollTop的值又小于了吸顶元素top的距离,这样headerFixed属性又为false, position: fixed;
属性又没有了,这样它就又相对与它原本的父元素进行定位,这样就成了一个循环,你会发现页面会上下跳到,这样是肯定不行的,所以我下面又针对这个问题进行了一个优化,当然这个方案感觉不是特别完美,不过确实可以解决这个问题。
通过上面的分析我们可以得知造成这个问题的原因是因为我们把设置了元素的 position: fixed;
属性,使得下面的内容往上顶,所以要想解决这个问题,那我们就不固定这个元素,但是这样的话就达不到吸顶的效果了,所以我们需要再加一个和吸顶元素一模一样的元素,它一直就是固定状态:
<div id="fixedHeaderRootReal"> <div class="knowPointHeader isFixed" v-show="headerFixed"> <div><span>知识模块</span></div> <div><span>知识点</span></div> <div><span>能力要求</span></div> </div> </div>
这个元素默认是隐藏的,只有当页面滚动的距离达到了它的位置的时候我们才让它显示,由于它是固定状态,所以它的隐藏显示并不会对页面产生影响,这样下面的内容就不会往上顶了,就可以解决ios手机上拉页面橡皮筋效果的Bug了,当然这种方式有些取巧,但是暂时没有更好的解决方案了,如果大家有更好的解决方案,欢迎在下面评论。最后给大家看一下我的页面布局:
<div v-show="kpointListShow" class="knowPointList"> <div id="fixedHeaderRoot"> <div id="knowPointHeader" class="knowPointHeader"> <div><span>知识模块</span></div> <div><span>知识点</span></div> <div><span>能力要求</span></div> </div> </div> <div id="fixedHeaderRootReal"> <div class="knowPointHeader isFixed" v-show="headerFixed"> <div><span>知识模块</span></div> <div><span>知识点</span></div> <div><span>能力要求</span></div> </div> </div> <div class="knowPointItem" v-for="(kpointItem,index) in rows.kpointList" :key="index"> <div><span>{{kpointItem.knowModule}}</span></div> <div><span>{{kpointItem.knowPoint}}</span></div> <div><span>{{kpointItem.abilityRequire}}</span></div> </div> </div>
参考
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 第五街的士高《印度激情版》3CD [WAV+CUE][2.4G]
- 三国志8重制版哪个武将智力高 三国志8重制版智力武将排行一览
- 三国志8重制版哪个武将好 三国志8重制版武将排行一览
- 三国志8重制版武将图像怎么保存 三国志8重制版武将图像设置方法
- 何方.1990-我不是那种人【林杰唱片】【WAV+CUE】
- 张惠妹.1999-妹力新世纪2CD【丰华】【WAV+CUE】
- 邓丽欣.2006-FANTASY【金牌大风】【WAV+CUE】
- 饭制《黑神话》蜘蛛四妹手办
- 《燕云十六声》回应跑路:年内公测版本完成95%
- 网友发现国内版《双城之战》第二季有删减:亲亲环节没了!
- 邓丽君2024-《漫步人生路》头版限量编号MQA-UHQCD[WAV+CUE]
- SergeProkofievplaysProkofiev[Dutton][FLAC+CUE]
- 永恒英文金曲精选4《TheBestOfEverlastingFavouritesVol.4》[WAV+CUE]
- 群星《国风超有戏 第9期》[320K/MP3][13.63MB]
- 群星《国风超有戏 第9期》[FLAC/分轨][72.56MB]