简析网页的那些滚动效果

2,081 阅读1分钟

最常见的就是手机官网,随着用户不断向下查看,页面上的内容也会非常契合的进行变换,元素从无到有,大小的变化,视觉容器的更换,都会让人在浏览时感受到这款产品该有的魅力。可以看看这几个页面:一加 9R, ColorOS

其实实现这种交互的原理是很简单的,但要做好交互体验则需要花一定的时间去调试,不知道有没有类似的less code 可视化平台可以更方便的实现这种交互。这一切的源头就是监听页面的滚动,滚动到相应位置的时候,实现相应的动画效果

window.addEventListener("scroll",handleScroll,true)

function handleScroll(){
// 处理相应逻辑
}

在这主要介绍两个非常好用的轮子

WOW.js

用它来实现滚动到一定位置使元素淡入淡出的效果非常的简单,而且支持 animate.css 官方文档

Vue3 demo

npm install wowjs
<template>
    <div class="wow move-up" />
</template>
<script>
    import { defineComponent } from "vue";
    import {WOW} from 'wowjs'
    
    export default defineComponent({
        name: 'app',
        mounted() {
            this.$nextTick(() => {
                new WOW().init()
            })
        },
    })
</script>
<style lang="scss" scoped>
.move-up {
  animation: 2s move-up;
}
@keyframes move-up {
  0% {
    transform: translate3d(0, 30px, 0);
    opacity: 0;
  }
  50% {
    opacity: 1;
  }
  100% {
    transform: translate3d(0, 0, 0);
  }
}
</style>

WOW 会先让元素样式 visibility:hidden; animation-name: none;,当滚动到当前这个元素时visibility: visible再将 animation-name: none;移除,自然就有了我们自己写的 move-up动画效果了

ScrollMagic.js

这个轮子还是很强大的经典用法就是 元素随着滚动条变化而不变自己的相对位置 ScrollMagic官网

ScrollMagic例子 可以看看 sticky elements(pinning) 和 section wipes(natural)经典效果

vue3 demo

npm install scrollmagic

<template>
    <div id="trigger"></div>
    <div class="magic"></div>
</template>
<script>
    import { defineComponent } from "vue";
    import ScrollMagic from "scrollmagic";
    export default defineComponent({
        data(){
            // 创建 controller实例
            controller: new ScrollMagic.Controller(),
        }
        mounted(){
            const scene = new ScrollMagic.Scene({
                duration: 100, // 该场景生效在滚动距离100以内
                offset: 50, // 该场景开始效果在元素被触发滚动50px之后触发
                triggerElement: "#trigger", //滚到trigger元素触发scrollMagic
            })
            scene.setPin(".magic").addTo(this.controller) //setPin(): 在场景持续期间固定一个元素
                scene.on("enter", function () {
                  console.log("Scene entered.");
                });
                scene.on("progress", (event) => {
                  console.log(event.type,"事件名称")
                  console.log(event.target,"触发此事件的对象")
                  console.log(event.progress,"反应当前场景的进度 0-1 ")
                  console.log(event.state,"场景当前状态:BEFORE DURING AFTER")
                  console.log(event.scrollDirection,"滚动的方向:PAUSED FORWARD REVERSE")
                });
                scene.on("end", function (event) {
                    console.log("Hit end point of scene.");
                });
        }
    })
</script>

ScrollMagic 文档

这篇文章其实主要介绍了两种滚动的轮子,有兴趣的同学可以去看看他们的官网了解更多信息