CSS + Javascript实现吸顶效果样式切换
需求
在某项目开发过程中,产品妹子提了一个需求,要抄支付宝账单,大概看了一下,主要是吸顶的部分不太好做。
刚开始打算用Javascript一把梭,后来想起来CSS3有一个position: sticky
可以做到吸顶,直接搞定收工。
等等,让我再看看设计稿……
啊,还要修改吸顶时的样式!还是谷歌一下吧。
解决方案
最终从这里找到了一个Solution。
.myElement {
position: sticky;
top: -1px;
}
.is-pinned {
color: red;
}
const el = document.querySelector(".myElement")
const observer = new IntersectionObserver(
([e]) => e.target.classList.toggle("is-pinned", e.intersectionRatio < 1),
{ threshold: [1] }
);
observer.observe(el);
原理
浏览器给我们提供了一个API用来观察元素是否在可视区域内,IntersectionObserver构造函数第一个参数是当元素可见时的回调函数,它的参数所携带的intersectionRatio属性值为1即监听对象完全可见,为0即完全不可见。
构造函数第二个参数是配置项,threshold属性值数组里的1表示当何时执行回调函数(或者说是执行函数的最低可视比例,0的时候元素刚刚进入可视区域就执行,1的时候元素完全进入可视区域才会执行)。
上述的解决方案使用了一个巧妙的方式,让吸顶时的元素top: -1px
。当元素进入可视区域但未滚动到吸顶位置时,它完全可视;当元素吸顶时由于顶部向上偏移了1像素实际上没有完全可视,这样就完成了样式的切换。
要注意的是:回调函数的参数和配置项的threshold属性都是数组
关于IntersectionObserver的更多内容,请移步阮一峰大佬的博客。