Apple网页中滚动效果

发布时间:2021-04-27

打开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';
});

最终效果如下

其他阅读

WPF中切换主题功能

在现代 Windows 系统中,系统提供了亮色主题和暗色主题,Windows 自带的应用程序都已经适配该功能。本文介绍在使用 WPF 构建 Windows 窗口应用时怎么实现主题切换。

查看原文

自驾环游抚仙湖

抚仙湖作为云南第三大湖,以前只去过北边几个开发比较好的区域,周末闲来无事,准备自驾完整地环湖一圈,从呈贡出发,沿着国道开到澄江,然后环湖一圈,经过江川后再到澄江,吃完饭后回到呈贡。

查看原文

git的一些技巧

git 是一个免费开源分布式版本控制系统,可以高效处理从小型到超大型项目内容管理,本文会介绍一些 git 使用的技巧。

查看原文

西华湿地公园

昆明周末好去处。

查看原文

WPF 入门系列1 环境搭建

本文为WPF 入门系列的第一篇,主要介绍如何搭建 WPF 开发环境。选择 .NET 8.0 作为运行时,工具介绍了 Visual Stido,Rider 和 Visual Studio Code。

查看原文