Apple网页中滚动效果

打开Apple官网查看iPhone页面,我们可以看到一个特殊效果,当你滚动鼠标时,页面不出现滚动效果,但内容却在变化。现在,基于 position : sticky 可以很容易实现这个效果。

初次尝试

刚开始,打算用absolute来实现这个效果,但用 JavaScript 计算 absolute 的 top 时,偶尔会出现滚动效果跟不上速度的情况,导致图片会随着容器滚动一段,体验十分不好。

.container {
    position : relative;
    height : 800vh;
}

.container > img {
    position : absolute;
    top : 0;
    width : 100%;
    height : 100vh;
}

大概设置使用8张图来展示,通过监听页面滚动事件来进行图片的切换和元素的新位置。

var con = document.querySelector("#con");
var image = document.querySelector("#image");

window.addEventListener( 'scroll' , e =>{
    if (window.scrollY > con.offsetTop && window.scrollY < (con.offsetTop + con.clientHeight - image.clientHeight))
        image.src ='images/'+  (Math.floor((window.scrollY - con.offsetTop) / (image.clientHeight / 2))) + '.jpg';
        image.style.top=window.scrollY - con.offsetTop ;
});

之后还考虑过使用 fixed 布局来进行定位,使其不会变化,不过效果也是不尽人意,这样对于导航栏又需要重新计算布局。

之后再谷歌查找一番有没有把两个结合起来的操作,一查还真有,就是本文的主角 :sticky 布局,MDN介绍在这里,简单来说,就是再父元素不滚动是,子元素表现出来的是 absolute 布局,根据设定好的 left, top 值来展示,当父级元素开始滚动并达到该子元素时,表现出 fixed 布局,该元素就固定在页面上(表述为 fixed ,其实不够准确,fixed 是相对整个浏览器页面来说的,sticky 的固定只是根据父级元素来说)。

.container {
    position : relative;
    height : 800vh;
}

.container > img {
    position : sticky;
    top : 0;
    width : 100%;
    height : 100vh;
}

监听页面滚动事件只进行图片的切换,不需要重新计算元素定位。

var con = document.querySelector("#con");
var image = document.querySelector("#image");

window.addEventListener( 'scroll' , e =>{
    if (window.scrollY > con.offsetTop && window.scrollY < (con.offsetTop + con.clientHeight - image.clientHeight))
        image.src ='images/'+  (Math.floor((window.scrollY - con.offsetTop) / (image.clientHeight / 2))) + '.jpg';
});

最终效果如下

发布时间:2021-04-27