页面动画和延迟加载动画的实现

引言

在现代网页中,滚动触发动画 已经成为提升页面观感的重要一环。 恰到好处的入场动画,不仅能吸引用户注意力,还能让信息呈现更有节奏感。

以 莉莉丝游戏(Lilith Games)的 Farlight Games 官网 为例 ------ 我们可以看到页面的多个模块在刚好进入视窗时才开始淡入或滑入展示,而不是页面一加载就全部出现👇

莉莉丝游戏farlightGames官网为例:

这种元素露出即动画展示的设计,在前端开发中非常常见,尤其在官网、营销页、品牌页等类型项目中,能够极大提升整体质感。

实现方式

方式一:借助第三方库 Animate.css

如果你希望快速上手、无需编写复杂的动画逻辑,那 Animate.css 是最方便的选择之一。 该库封装了大量常用动画(淡入淡出、旋转、弹跳、缩放......),只需引入一份 CSS 即可。

使用方式

将类 animate__animated 添加到元素,以及任何 动画名称(不要忘记 animate__ 前缀!)

ini 复制代码
<head>
  <link
    rel="stylesheet"
    href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css"
  />
</head>
ini 复制代码
<h1 class="animate__animated animate__bounce">An animated element</h1>

具体使用参照 Animate.css官网 animatecss.node.org.cn/

👍 优点

  • 快速实现丰富动画效果
  • 无需 JS,纯 CSS 实现
  • 可与任何框架(Vue/React/原生)搭配使用

👎 缺点

  • 动画种类虽多,但难以完全定制
  • 所有动画都预定义在库中,轻量场景下稍显冗余
  • 不具备"滚动触发"逻辑,需要自行添加触发控制

方式二:手写实现滚动触发动画

如果项目中只需要几个简单动画、希望精简体积或更灵活地控制触发逻辑,那么完全可以"手搓"一套滚动检测方案。

页面按独立的块布局

首先页面按独立的块布局,方便在页面露出的时候添加 class ,当滚动到可视区域内时,给该区块添加 on 类,用于触发动画。

html 复制代码
<div id="pc_container">
    <div class="section1">....</div>    
    <div class="section2">....</div>    
    <div class="section3">....</div>
</div>

判断dom是否漏出

通过js判断dom是否漏出,生成一个可复用的可视区域检测 handler。当 targets 中的元素在 root 的可视区域内达到一定比例时,给它加上 on 类(用于触发动画)。

然后在 on 这个class下添加动画即可

js 复制代码
var aniTimer = null;
function createInViewHandler ({ root, targets, threshold }) {
    var $root = $(root);
    var $targets = $(targets);
    var threshold = (threshold == null ? 0.15 : threshold);

    function handler () {
        if (aniTimer) return;
        aniTimer = setTimeout(function () {
            if (!$root.length) { aniTimer = null; return; }

            var rootRect = $root.get(0).getBoundingClientRect();

            $targets.not('.on').each(function () {
                var rect = this.getBoundingClientRect();
                var interTop = Math.max(rect.top, rootRect.top);
                var interBottom = Math.min(rect.bottom, rootRect.bottom);
                var interHeight = interBottom - interTop;
                var ratio = interHeight / rect.height;

                if (interHeight > 0 && ratio >= threshold) {
                    $(this).addClass('on');
                }
            });

            if ($targets.not('.on').length === 0) {
                $root.off('scroll.inview', handler);
                $(window).off('resize.inview', handler);
            }
            aniTimer = null;
        }, 50);
    }
    return handler;
}



// 动画懒触发(只触发一次)
var inViewHandler = createInViewHandler({
    root: '#pc_container',
    targets: '.kv, .feature, .part3, .part4, .part5',
    threshold: 0.15
});
inViewHandler(); // 首次检查
$('#pc_container').on('scroll', inViewHandler);
$(window).on('resize', inViewHandler);

添加css动画

css 复制代码
.section1 .title {
  opacity: 0;
  transform: translateY(30px);
  transition: all 0.8s ease;
}

.section1.on .title {
  opacity: 1;
  transform: translateY(0);
}

通过简单的过渡动画,就能实现淡入 + 上移入场的效果。也可以根据需要扩展更多 CSS 动画属性(如 scale、rotate、blur 等)。

总结

方案 优点 适用场景
Animate.css 简单快速,动画丰富 设计稿动画较多、追求开发效率
手写方案 灵活、轻量、可定制 动画类型有限、追求性能或精细控制

✨ 无论采用哪种方式,核心理念都是一样的: "在正确的时间,让元素出现。"

相关推荐
逛逛GitHub4 小时前
这个牛逼的股票市场平台,在 GitHub 上开源了。
前端·github
细节控菜鸡4 小时前
【排查实录】Web 页面能打开,服务器能通接口,客户端却访问失败?原因全在这!
运维·服务器·前端
duandashuaige4 小时前
解决用electron打包Vue工程(Vite)报错electron : Failed to load URL : xxx... with error : ERR _CONNECTION_REFUSED
javascript·typescript·electron·npm·vue·html
今天头发还在吗4 小时前
React + Ant Design 日期选择器避免显示“Invalid Date“的解决方案
前端·react.js·前端框架·ant design
时雨__5 小时前
利用AndVX6开发流程图——问题总结
前端
渣哥5 小时前
当容器里有多个 Bean,@Qualifier 如何精准定位?
javascript·后端·面试
云枫晖5 小时前
深入浅出npm:现代JavaScript项目基石
前端·javascript·node.js
不一样的少年_5 小时前
你家孩子又偷玩网页游戏? 试试这个防沉迷工具
前端·javascript·浏览器