打造苹果级视差滚动动画:现代网页滚动动画技术详解

article/2025/6/15 9:02:46

目录

实现原理分析

完整实现方案

​编辑

核心技术解析

1. 视差滚动效果

2. 滚动触发动画

3. 3D透视效果

4. 性能优化技巧

进阶实现方案

设计原则


苹果、华为等顶尖科技公司的官网以其流畅的滚动动画效果著称,这种随着页面滚动而播放的动画能显著提升用户体验。本文将详细介绍实现这类效果的技术方案。

实现原理分析

苹果官网的滚动动画主要基于以下核心技术:

  • 视差滚动(Parallax Scrolling):不同层级的元素以不同速度滚动

  • 滚动触发动画(Scroll-triggered Animations):当元素进入视口时触发动画

  • CSS变换与过渡:实现平滑的视觉变化效果

  • Canvas动画集成:复杂场景使用Canvas渲染

完整实现方案

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>苹果级视差滚动动画</title><style>* {margin: 0;padding: 0;box-sizing: border-box;}body {font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;background: #000;color: #fff;overflow-x: hidden;}.hero {height: 100vh;display: flex;flex-direction: column;justify-content: center;align-items: center;text-align: center;position: relative;overflow: hidden;}.parallax-container {position: absolute;top: 0;left: 0;width: 100%;height: 100%;}.parallax-layer {position: absolute;width: 100%;height: 100%;background-size: cover;background-position: center;}.layer-1 {background-image: linear-gradient(120deg, #0f0c29, #302b63, #24243e);z-index: 1;}.layer-2 {background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><circle cx="50" cy="50" r="2" fill="white" opacity="0.6"/></svg>');background-size: 200px 200px;z-index: 2;opacity: 0.4;}.hero-content {position: relative;z-index: 10;max-width: 900px;padding: 0 20px;}h1 {font-size: 5rem;font-weight: 700;margin-bottom: 1rem;opacity: 0;transform: translateY(50px);transition: all 1s cubic-bezier(0.16, 1, 0.3, 1);}.subtitle {font-size: 1.5rem;opacity: 0;transform: translateY(30px);transition: all 1s cubic-bezier(0.16, 1, 0.3, 1) 0.1s;}.scroll-down {position: absolute;bottom: 30px;left: 50%;transform: translateX(-50%);display: flex;flex-direction: column;align-items: center;z-index: 20;opacity: 0.7;animation: bounce 2s infinite;}@keyframes bounce {0%, 20%, 50%, 80%, 100% {transform: translateY(0) translateX(-50%);}40% {transform: translateY(-20px) translateX(-50%);}60% {transform: translateY(-10px) translateX(-50%);}}.feature-section {min-height: 150vh;padding: 100px 0;position: relative;}.feature-content {position: sticky;top: 0;height: 100vh;display: flex;flex-direction: column;justify-content: center;align-items: center;overflow: hidden;}.feature-title {font-size: 3.5rem;margin-bottom: 2rem;text-align: center;max-width: 800px;}.feature-description {font-size: 1.3rem;max-width: 600px;text-align: center;margin-bottom: 3rem;opacity: 0.8;}.device-container {position: relative;width: 100%;max-width: 800px;margin: 0 auto;}.device {position: relative;width: 100%;padding-top: 56.25%; /* 16:9 Aspect Ratio */border-radius: 30px;overflow: hidden;background: #111;box-shadow: 0 30px 60px rgba(0,0,0,0.3);transform-style: preserve-3d;}.device-screen {position: absolute;top: 5%;left: 5%;width: 90%;height: 90%;background: #000;overflow: hidden;border-radius: 5px;}.screen-content {position: absolute;top: 0;left: 0;width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;font-size: 5rem;color: rgba(255,255,255,0.1);transition: transform 0.5s ease-out;}.scroll-progress {position: fixed;top: 0;left: 0;height: 5px;background: linear-gradient(90deg, #ff2d75, #5c5cff);z-index: 1000;width: 0%;}.animated-element {width: 200px;height: 200px;background: linear-gradient(135deg, #00c6ff, #0072ff);border-radius: 30px;margin: 100px auto;opacity: 0;transform: scale(0.8) rotate(-10deg);transition: all 1s cubic-bezier(0.16, 1, 0.3, 1);}.reveal-section {min-height: 100vh;display: flex;flex-direction: column;justify-content: center;align-items: center;padding: 100px 20px;text-align: center;}.reveal-content {max-width: 800px;}.features-grid {display: grid;grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));gap: 40px;margin-top: 80px;}.feature-card {background: rgba(255,255,255,0.05);padding: 40px 30px;border-radius: 20px;transform: translateY(50px);opacity: 0;transition: all 0.8s cubic-bezier(0.16, 1, 0.3, 1);}.feature-card:nth-child(2) { transition-delay: 0.1s; }.feature-card:nth-child(3) { transition-delay: 0.2s; }.feature-card h3 {font-size: 1.8rem;margin-bottom: 20px;}.footer {padding: 100px 20px;text-align: center;background: #0a0a0a;}@media (max-width: 768px) {h1 { font-size: 3rem; }.feature-title { font-size: 2.5rem; }.features-grid { grid-template-columns: 1fr; }}</style>
</head>
<body><div class="scroll-progress"></div><section class="hero"><div class="parallax-container"><div class="parallax-layer layer-1"></div><div class="parallax-layer layer-2"></div></div><div class="hero-content"><h1>视差滚动动画</h1><p class="subtitle">打造苹果级用户体验的现代网页技术</p></div><div class="scroll-down"><span>向下滚动</span><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 5v14M19 12l-7 7-7-7"></path></svg></div></section><section class="feature-section"><div class="feature-content"><h2 class="feature-title">滚动驱动的视觉叙事</h2><p class="feature-description">随着用户滚动页面,元素以精心设计的节奏进入视图</p><div class="device-container"><div class="device"><div class="device-screen"><div class="screen-content">滚动动画</div></div></div></div></div></section><section class="reveal-section"><div class="reveal-content"><h2 class="feature-title">优雅的内容呈现</h2><p class="feature-description">当元素进入视口时,触发平滑的过渡效果</p><div class="animated-element"></div></div></section><section class="reveal-section"><div class="reveal-content"><h2 class="feature-title">核心技术特性</h2><p class="feature-description">实现高级滚动动画的关键技术</p><div class="features-grid"><div class="feature-card"><h3>CSS Scroll API</h3><p>使用最新的CSS Scroll API实现高性能的滚动绑定动画,无需JavaScript</p></div><div class="feature-card"><h3>Intersection Observer</h3><p>高效检测元素进入视口,触发复杂的动画序列</p></div><div class="feature-card"><h3>3D变换与透视</h3><p>利用CSS 3D变换创造深度感和空间感</p></div></div></div></section><footer class="footer"><p>© 2023 现代网页动画技术展示 | 使用纯CSS和JavaScript实现</p></footer><script>// 滚动进度指示器window.addEventListener('scroll', () => {const scrollProgress = document.querySelector('.scroll-progress');const scrollPosition = window.scrollY;const documentHeight = document.documentElement.scrollHeight - window.innerHeight;const scrollPercent = (scrollPosition / documentHeight) * 100;scrollProgress.style.width = `${scrollPercent}%`;});// Intersection Observer 用于动画触发const observer = new IntersectionObserver((entries) => {entries.forEach(entry => {if (entry.isIntersecting) {entry.target.classList.add('visible');// 设备屏幕内容动画if(entry.target.classList.contains('device-screen')) {const screenContent = entry.target.querySelector('.screen-content');animateScreenContent(screenContent);}// 移除观察器避免重复触发observer.unobserve(entry.target);}});}, {threshold: 0.2});// 动画元素列表const elementsToAnimate = document.querySelectorAll('h1, .subtitle, .animated-element, .feature-card');elementsToAnimate.forEach(element => {observer.observe(element);});// 视差效果window.addEventListener('scroll', () => {const scrollY = window.scrollY;const parallaxLayers = document.querySelectorAll('.parallax-layer');parallaxLayers.forEach((layer, index) => {// 不同层级以不同速度移动const speed = 0.2 * (index + 1);const offset = -scrollY * speed;layer.style.transform = `translate3d(0, ${offset}px, 0)`;});// 设备3D旋转效果const device = document.querySelector('.device');if (device) {const deviceRect = device.getBoundingClientRect();const deviceCenter = deviceRect.top + deviceRect.height / 2;const viewportCenter = window.innerHeight / 2;const rotation = (deviceCenter - viewportCenter) / 30;device.style.transform = `perspective(1000px) rotateX(${rotation}deg)`;}});// 设备屏幕内容动画function animateScreenContent(element) {let counter = 0;const effects = [{ transform: 'scale(0.9)', opacity: 0 },{ transform: 'scale(1)', opacity: 1 }];const animate = () => {if (counter >= 5) return;element.animate(effects, {duration: 800,easing: 'cubic-bezier(0.22, 1, 0.36, 1)'});counter++;setTimeout(animate, 1500);};animate();}// 初始加载后触发标题动画setTimeout(() => {document.querySelector('h1').classList.add('visible');document.querySelector('.subtitle').classList.add('visible');}, 500);// 添加可见类时的样式变化const styleSheet = document.styleSheets[0];styleSheet.insertRule(`h1.visible,.subtitle.visible,.feature-card.visible {opacity: 1 !important;transform: translateY(0) !important;}`, styleSheet.cssRules.length);styleSheet.insertRule(`.animated-element.visible {opacity: 1 !important;transform: scale(1) rotate(0) !important;}`, styleSheet.cssRules.length);</script>
</body>
</html>

核心技术解析

1. 视差滚动效果

// 视差层以不同速度移动
window.addEventListener('scroll', () => {const scrollY = window.scrollY;parallaxLayers.forEach((layer, index) => {const speed = 0.2 * (index + 1);const offset = -scrollY * speed;layer.style.transform = `translate3d(0, ${offset}px, 0)`;});
});

2. 滚动触发动画

使用Intersection Observer API检测元素进入视口:

const observer = new IntersectionObserver((entries) => {entries.forEach(entry => {if (entry.isIntersecting) {entry.target.classList.add('visible');observer.unobserve(entry.target);}});
}, { threshold: 0.2 });

3. 3D透视效果

// 设备3D旋转效果
window.addEventListener('scroll', () => {const deviceRect = device.getBoundingClientRect();const deviceCenter = deviceRect.top + deviceRect.height / 2;const rotation = (deviceCenter - viewportCenter) / 30;device.style.transform = `perspective(1000px) rotateX(${rotation}deg)`;
});

4. 性能优化技巧

  • 使用transformopacity属性进行动画(避免布局重排)

  • 使用will-change: transform提示浏览器元素将发生变化

  • 对复杂动画使用requestAnimationFrame

  • 限制滚动事件处理函数的执行频率

进阶实现方案

对于更复杂的项目,可以考虑以下方案:

  1. 专业动画库

    • GSAP + ScrollTrigger:提供最强大的时间轴控制和滚动绑定

    • AOS (Animate On Scroll):轻量级库,简单易用

    • Framer Motion:适合React应用的动画库

  2. CSS滚动API

@keyframes fade-in {from { opacity: 0; transform: translateY(50px); }to { opacity: 1; transform: translateY(0); }
}.element {animation: fade-in linear;animation-timeline: view();animation-range: entry 20% cover 30%;
}
  1. Canvas动画集成

    • 使用Three.js创建3D滚动场景

    • 复杂粒子效果和物理模拟

设计原则

  1. 适度使用:动画应增强内容而非分散注意力

  2. 性能优先:确保60fps流畅体验

  3. 渐进增强:在低性能设备上优雅降级

  4. 无障碍访问:提供减少动画的选项

  5. 统一风格:动画应与品牌风格保持一致

通过合理运用这些技术,您可以创建出媲美苹果官网的滚动动画体验,显著提升用户参与度和品牌形象。


http://www.hkcw.cn/article/BRiLYHcHLp.shtml

相关文章

[GHCTF 2025]SQL???

打开题目在线环境&#xff1a; 先尝试注入&#xff1a; id1;show databases; 发现报错&#xff0c;后来看了wp才知道这个题目是SQLite注入。 我看的是这个师傅的wp: https://blog.csdn.net/2401_86190146/article/details/146164505?ops_request_misc%257B%2522request%255Fid…

中国单方面免签“朋友圈”再增5国 拉美五国享便利

从6月1日起,中国对巴西、阿根廷、智利、秘鲁、乌拉圭五个国家的普通护照持有者试行免签政策。这一举措标志着中国的单方面免签“朋友圈”再次扩大。自2025年6月1日至2026年5月31日,这五国的公民来华经商、旅游观光、探亲访友或交流访问时,如果停留时间不超过30天,则无需办理…

Leetcode第451场周赛分析总结

题目链接 竞赛 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 题目解析 A. 3560. 木材运输的最小成本 AC代码 class Solution { public:long long minCuttingCost(int n, int m, int k) {if (n > m) swap(n, m); // n < m;using ll long lon…

Maestro CLI云端测试以及github cl,bitrise原生cl的测试流程

昨天我们了解了maestro测试框架以及maestro studio工具以及创建我们的第一个flow&#xff0c;然后通过例子在maestro cli云端进行测试请求并且成功&#xff0c;今天我们就在我们自己的app上简单的进行三种测试流程&#xff0c;maestro cli云端测试&#xff0c;github cl集成测试…

少年跪地救人 获救者到学校感谢 深情拥抱致谢恩人

5月25日晚,在芜湖市繁昌一中东大门外,中年男子孙修义在路边昏厥。17岁高二学生骆易跪地三分钟,成功施救。5月30日下午,康复出院后的孙修义和妻子俞乃芽来到学校,向救命恩人骆易当面致谢,送上锦旗、感谢信和鲜花。见到骆易时,孙修义眼眶泛红,快步上前将少年拥入怀中,哽…

亚洲篮球冠军联赛完成抽签 小组对决揭晓

北京时间5月31日,2025年FIBA亚洲篮球冠军联赛分组抽签结果公布。浙江广厦男篮与乌兰巴托野马队及塔比亚特队同处A组。A组包括:浙江广厦(中国)、乌兰巴托野马(蒙古)、塔比亚特(伊朗);B组有宇都宫Brex队(日本)、马尼拉电气(菲律宾)、迪拜青年国民(阿联酋);C组则由…

知名黄金机构疑爆雷 有人被套超千万 黄金托管模式风险凸显

近日,浙江永坤控股有限公司(以下简称永坤黄金)出现兑付异常,引发广泛关注。多名投资者反映,无论在线上还是线下购买的黄金都无法提取或退款。永坤黄金提供线上和线下的黄金买卖服务,但大部分时间里,黄金并不在投资者手中,这种模式被称为黄金托管。业内人士指出,这种模…

广州市中心堵船了 龙舟盛景再现珠江

端午节期间,广州CBD上演了一场热闹非凡的龙舟招景仪式。5月31日上午,猎德涌上锣鼓喧天、鞭炮齐鸣,140个兄弟村社的150多条龙船汇聚于此,共庆佳节。这是猎德村近十年来规模最大的一次龙舟招景活动。河涌里舟楫相连,出现了“堵船”的盛况。河涌两岸挤满了围观的市民游客,欢…

用python绘制表格

1. 使用 tabulate 库&#xff08;终端/文本表格&#xff09; 适合在命令行或终端中快速生成简单的文本表格。 # 安装库 pip install tabulate # 示例代码 from tabulate import tabulatedata [["Alice", 28, "Engineer"],["Bob", 32, "…

【图文】VSCode配置与安装(超详细教程版)

目录 一、下载 二、安装 三、设置 四、环境配置&#xff08;随时更新&#xff09; 1.Python配置 一、下载 官网链接&#xff1a;Visual Studio Code - Code Editing. Redefined 点击“Download for Windows”&#xff0c;下载安装包后双击安装。 二、安装 双击下载好的…

【五子棋在线对战】一.前置知识的了解

前置知识的了解 前言1.Websocketpp1.1 使用Websocketpp的原因1.2 Websocket常用接口1.3 Websocket搭建服务器流程 2.JsonCpp2.1 Json 数据对象类的表示2.2序列化和反序列化的接口2.3 演示代码 3.Mysql![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/93305f423b544fc1…

数据中台(大数据平台)之主数据管理

主数据管理是为了确保主数据一致性和准确性而进行的一系列管理活动&#xff0c;包括主数据的收集、存储、分析、更新和共享等&#xff0c;旨在确保一个组织中使用的各个系统都有准确、一致的主数据。 1.主数据编码管理&#xff1a;主数据编码是主数据的唯一标识符。主数据编码…

Leetcode 1908. Nim 游戏 II

1.题目基本信息 1.1.题目描述 Alice 和 Bob 交替进行一个游戏&#xff0c;由 Alice 先手。 在游戏中&#xff0c;共有 n 堆石头。在每个玩家的回合中&#xff0c;玩家需要 选择 任一非空石头堆&#xff0c;从中移除任意 非零 数量的石头。如果不能移除任意的石头&#xff0c…

飞致云开源社区月度动态报告(2025年5月)

自2023年6月起&#xff0c;中国领先的开源软件公司飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营数据概览&…

湖北秭归:屈原故里过端午 龙舟竞渡展非遗

5月30日,2025年屈原故里传统龙舟大赛在湖北省秭归县茅坪镇徐家冲港湾激情开赛。秭归作为屈原的故乡,也是中国龙舟运动的重要发源地之一,端午节期间赛龙舟、祭屈原的传统习俗一直延续至今。今年的比赛继续展示了“点睛、下水、游江、竞渡、抢红”等传统的龙舟仪式,追溯历史岁…

Target店铺应该如何入驻?

Target作为美国知名的零售巨头&#xff0c;其电商平台为众多商家提供了一个拓展业务、提升品牌知名度的绝佳机会。然而&#xff0c;入驻Target平台并非易事&#xff0c;需要商家满足一系列的条件并支付相应的费用。 以下是&#xff0c;明月跨境&#xff0c;总结出的详细的入驻指…

基于PyQt5 开发的Todo应用

Demo地址&#xff1a;https://gitcode.com/rmbnetlife/todo-app-pyqt.git PyQt Todo 应用 一个使用 PyQt5 开发的现代化任务管理应用&#xff0c;帮助您高效管理日常任务和待办事项。 &#x1f4cb; 应用简介 这是一个功能完整的桌面任务管理应用&#xff0c;具有直观的图形…

springboot集成websocket给前端推送消息

一般通常情况下&#xff0c;我们都是前端主动朝后端发送请求&#xff0c;那么有没有可能&#xff0c;后端主动给前端推送消息呢&#xff1f;这时候就可以借助websocket来实现。下面给出一个简单的实现样例。 首先创建一个websocketDemo工程&#xff0c;该工程的整体结构如下&a…

002医护人员排班系统技术解析:构建高效医疗人力管理平台

医护人员排班系统技术解析&#xff1a;构建高效医疗人力管理平台 在医疗行业高速发展的今天&#xff0c;科学合理的医护人员排班对保障医疗服务质量和效率至关重要。医护人员排班系统作为医疗信息化管理的重要工具&#xff0c;通过整合医院信息管理、医护信息管理、医护类型管…

CTFHub-RCE 命令注入-过滤目录分隔符

观察源代码 代码里面可以发现过滤了目录分隔符\和/ 判断是Windows还是Linux 源代码中有 ping -c 4 说明是Linux 查看有哪些文件 127.0.0.1|ls 打开flag文件 发现存在一个flag_is_here的文件夹&#xff0c;我们需要打开这个文件夹找到目标文件我们尝试分步&#xff0c;先利…