当前位置: 首页 > article >正文

【CSS in Depth 2 精译_099】17.5:基于页面滚动的动画时间线设置(全新)+ 17.6:最后一点建议 + 17.7:本章小结

当前内容所在位置(可进入专栏查看其他译好的章节内容)

  • 第五部分 添加动效 ✔️
  • 【第 17 章 动画】 ✔️
    • 17.1 关键帧
    • 17.2 3D 变换下的动画设置
      • 17.2.1 添加动画前页面布局的构建
      • 17.2.2 为布局添加动画
    • 17.3 动画延迟与填充模式
    • 17.4 通过动画传递意图
      • 17.4.1 对用户交互的反馈
      • 17.4.2 吸引用户注意力
    • 17.5 基于页面滚动的动画时间线设置 ✔️
    • 17.6 最后一点建议 ✔️
    • 17.7 本章小结 ✔️

文章目录

    • 17.5 基于页面滚动的动画时间线设置 Scroll-based timelines
    • 17.6 最后一点建议 One final piece of advice
    • 17.7 本章小结 Summary

《CSS in Depth》新版封面

《CSS in Depth》新版封面

译者按
终于来到了全书的最后一部分内容。想不到作者还给各位预留了彩蛋——CSS新推的 animation-timeline 属性。虽然由于浏览器兼容问题没有详细展开,但完全脱离 JavaScript 实现基于页面滚动的动画特效,想想就让人好奇心爆棚。文末给出的参考文章更是脑洞大开,让人直呼过瘾。能在这本新书正式发行当年顺利完成整本书【正文+附录】部分的翻译,也是我始料未及的。这次弥足珍贵的专栏日更之旅,也再次证明了一点:不积跬步无以至千里。至少我自己对每天日更精进 CSS 的强大力量是有所低估的。让我们继续 stay hungry, stay foolish,在完善自我的道路上矢志不渝地践行长期主义,迎接属于我们的崭新未来!

17.5 基于页面滚动的动画时间线设置 Scroll-based timelines

动画特效常常以线性方式从头播到尾,但它们也可以与页面滚动(scrolling)绑定到一起。当用户向下滚动页面时,可以让动画随页面滚动同步播放;如果向上滚动,动画则相应反向进行。要实现这类动效往往需要借助 JavaScript 脚本;但 CSS 提供的一个全新属性,却能在不依赖任何 JavaScript 的情况下实现同样的效果。

要用纯 CSS 实现同样的页面效果,只需在动画元素上声明 animation-timeline: scroll() 即可。然而,截至 2024 年年中,该特性还尚未得到 FirefoxSafari 浏览器的支持。因此目前并不推荐在生产环境中启用该写法,除非是在页面功能业已丰富齐全的情况下、仅仅出于锦上添花的需求来引入该特性。查看该特性最新的浏览器支持情况,详见 Can I Use 官网:https://mng.bz/qOvr。

译注

根据 Can I Use 网站提供的最新数据,截至 2024 年 12 月 28 日,各大主流浏览器厂商对 animation-timeline 的兼容情况还不容乐观,FirefoxSafari 仍未能提供相应支持(最新截图如下)。因此在项目开发过程中,若要正式引入该功能,还请务必慎重。

补图 1:各大浏览器厂商对 animation-timeline 属性的最新兼容情况(截至 2024 年 12 月 28 日)

【补图 1:各大浏览器厂商对 animation-timeline 属性的最新兼容情况(截至 2024 年 12 月 28 日)】

鉴于此,本节将向您演示一个能在 ChromeEdge 浏览器中运行的简单示例。在一个新建的样式表中,添加如代码清单 17.16 所示的样式代码。该代码会在页面的右上角定位一个蓝色的指示标记块,并在上面定义一个基础的旋转动画效果。

代码清单 17.16 基于页面滚动的动画时间线示例样式代码

body {
  margin: unset;
  height: 200lvh; /* 令页面强制滚动 */
}

.indicator {
  position: fixed;
  top: 15px;
  right: 15px;
  height: 50px;
  width: 50px;
  background-color: oklch(74% 0.08 260deg);
  animation-name: spin;
  animation-timeline: scroll(); /* 将动画与滚动位置相绑定 */
}

@keyframes spin {
  from {
    rotate: 0deg;
  }

  to {
    rotate: 360deg;
  }
}

上述代码中的指示标记块会随着用户页面的滚动而旋转,并且标记块在动画中的位置与用户滚动的页面位置息息相关;若页面向下滚动到 25% 位置处停止,则动画特效也会沿着第一帧到最后一帧的方向,在 25% 的位置处同步停止。

译注

感觉这里缺了一个示例页截图,给大家补一个:

补图 2:基于页面滚动的动画时间线示例页效果图(滚动条大致位于 25% 位置)

【补图 2:基于页面滚动的动画时间线示例页效果图(滚动条大致位于 25% 位置)】

该动效最好放到交互式环境中进行查看。将上述样式表关联到一个包含 <div class="indicator"> 元素的示例页中,如代码清单 17.17 所示。这样就能在浏览器中进行查看了。

代码清单 17.17 页面滚动动画特效对应的示例 HTML 标记

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link href="styles.css" rel="stylesheet">
  </head>
  <body>
    <div class="indicator"></div><!-- 带旋转特效的指示标记元素 -->
  </body>
</html>

默认情况下,scroll() 函数会把元素的动画特效绑定到 DOM 树中具有滚动条的最近的那个祖先级元素。该函数还可以通过下列参数值限定不同的行为模式:

  • scroll(nearest) —— 即默认行为,表示相对于最近的祖先元素的滚动位置来执行动画;
  • scroll(root) —— 即相对于当前文档的根节点元素的滚动位置来执行动画;
  • scroll(self) —— 即相当于当前元素的滚动位置来执行动画。

此外,您也可以手动指定动画效果与页面滚动的某个方向进行绑定。该方向值可以是默认的 block 方向,也可以是 inliney 或者 x 方向。例如,指定 scroll(inline root) 后,动画特效会相对于根元素的任意行内滚动进行绑定;而声明 scroll(y nearest) 则会令元素动画与带有滚动条的、最近祖先元素的垂直方向进行绑定。

前面演示的案例都比较简单,但通过将一些富有创意的设计方案与更为复杂的动画特效相结合,我们就能构建出更多极具想象力的动画效果。例如,可以让页面上的装饰性元素在页面滚动经过它们的时候,利用动画特效从框架外部进入页面;再比如,还可以利用动画时间线原理设计一个 视差(parallax 效果,即当用户滚动页面时,让页面不同位置的内容以不同的速度进行移动。

相了解更多基于页面滚动的动画特效案例用法,可以参考发表在 Codrops 网站上的这篇文章:《A Practical Introduction to Scroll-Driven Animations with CSS scroll() and view()》。这样的动画特效可以让页面更加生动有趣且便于交互,即便页面只包含仅供浏览的内容。

17.6 最后一点建议 One final piece of advice

对很多 Web 开发者而言,CSS 是一门让人望而生畏的语言。只因它的一只脚踩在设计领域,另一只脚却踩在代码世界。CSS 语言中有些内容并不太直观,特别是对于那些自学的开发者,情况更是如此。希望这本书可以帮您找到一些门道。

我们已经深入学习了 CSS 这门语言中最基础的部分,也学习了一些页面布局中容易产生疑惑的内容。其中涵盖了很多话题:从如何组织 CSS 让代码更易于维护,到最新的页面布局方案。我们还尝试涉足设计领域,并构建出了方便实用且赏心悦目的界面(interface)。

我最后再给您一条建议,那就是永葆好奇心。我已经向您介绍了 CSS 工具集里的一大批工具,但这些工具可以组合与搭配的方式是无穷无尽的。当您遇到某个令人印象深刻的 Web 页面时,不妨打开浏览器的开发者工具,试着去弄清它的实现原理。新的 CSS 特性层出不穷,尤其是在过去的几年里,这些新特性新语法更是让人眼花缭乱。多多关注那些不断推出创意演示案例、或者提供趣味教程的线上开发者与设计师;不断尝试新鲜事物,养成终身学习的好习惯。


17.7 本章小结 Summary

  • @keyframe 动画定义了动画中的关键点。使用 animation-* 属性可以将关键帧动画应用到元素上。
  • animation 属性是多个动画属性的简写形式,其中包括 animation-nameanimation-durationanimation-timing-function 以及 animation-iteration-count 属性。
  • animation-fill-mode 属性可以在动画开始之前将动画的第一帧应用于该元素,并且(或者)可以在动画结束时将动画的最后一帧应用于该元素。利用该属性可以让动画无缝开始或结束。
  • 恰当的动画效果可以在用户需要了解某些信息,或者需要与某些内容互动时,有效地传达相关意图。
  • JavaScript 脚本可以在适当的时机触发动画的播放。
  • 动画为网页中的用户交互增添了重要意义,并不仅限于页面装饰作用。


关于《CSS in Depth》(中译本书名《深入解析 CSS》)

第 1 版第 2 版
读者评分原版:4.7(亚马逊);中文版:9.3(豆瓣)原版:5.0(亚马逊);中文版:暂无,待出版
出版时间原版:2018 年 3 月;中文版:2020 年 4 月原版:2024 年 7 月;中文版:暂无,待出版
原价原版:$44.99;中文版:¥139.00原版:$59.99;中文版:暂无,待出版
现价原版:$36.49;中文版:¥52.54 起步原版:$52.09;中文版:暂无,待出版
原版国内预订起步价 ¥461.00起步价 ¥750.00

本专栏为该书第 2 版高分译文专栏,全网首发,精译精校,持续更新,计划今年内完成全书翻译,敬请期待!!!

目前已完结的章节(可进入本专栏查看详情,连载期间完全免费):

  • 第一章 层叠、优先级与继承(已完结)
    • 1.1 层叠
    • 1.2 继承
    • 1.3 特殊值
    • 1.4 简写属性
    • 1.5 CSS 渐进式增强技术
    • 1.6 本章小结
  • 第二章 相对单位(已完结)
    • 2.1 相对单位的威力
    • 2.2 em 与 rem
    • 2.3 告别像素思维
    • 2.4 视口的相对单位
    • 2.5 无单位的数值与行高
    • 2.6 自定义属性
    • 2.7 本章小结
  • 第三章 文档流与盒模型(已完结)
    • 3.1 常规文档流
    • 3.2 盒模型
    • 3.3 元素的高度
    • 3.4 负的外边距
    • 3.5 外边距折叠
    • 3.6 容器内的元素间距问题
    • 3.7 本章小结
  • 第四章 Flexbox 布局(已完结)
    • 4.1 Flexbox 布局原理
    • 4.2 弹性子元素的大小
    • 4.3 弹性布局的方向
    • 4.4 对齐、间距等细节处
    • 4.5 本章小结
  • 第五章 网格布局(已完结)
    • 5.1 构建基础网格
    • 5.2 网格结构剖析 (上)
      • 5.2.1 网格线的编号(下)
      • 5.2.2 网格与 Flexbox 配合(下)
    • 5.3 两种替代语法
      • 5.3.1 命名网格线
      • 5.3.2 命名网格区域
    • 5.4 显式网格与隐式网格(上)
      • 5.4.1 添加变化 (中)
      • 5.4.2 让网格元素填满网格轨道(下)
    • 5.5 子网格(全新增补内容)
    • 5.6 对齐相关的属性
    • 5.7 本章小结
  • 第六章 定位与堆叠上下文(已完结)
    • 6.1 固定定位
      • 6.1.1 创建一个固定定位的模态对话框
      • 6.1.2 在模态对话框打开时防止屏幕滚动
      • 6.1.3 控制定位元素的大小
    • 6.2 绝对定位
      • 6.2.1 关闭按钮的绝对定位
      • 6.2.2 伪元素的定位问题
    • 6.3 相对定位
      • 6.3.1 创建下拉菜单(上)
      • 6.3.2 创建 CSS 三角形(下)
    • 6.4 堆叠上下文与 z-index
      • 6.4.1 理解渲染过程与堆叠顺序(上)
      • 6.4.2 用 z-index 控制堆叠顺序(上)
      • 6.4.3 深入理解堆叠上下文(下)
    • 6.5 粘性定位
    • 6.6 本章小结
  • 第七章 响应式设计(已完结)
    • 7.1 移动端优先设计原则(上篇)
      • 7.1.1 创建移动端菜单(下篇)
      • 7.1.2 给视口添加 meta 标签(下篇)
    • 7.2 媒体查询(上篇)
      • 7.2.1 深入理解媒体查询的类型(上篇)
      • 7.2.2 页面断点的添加(中篇)
      • 7.2.3 响应式列的添加(下篇)
    • 7.3 流式布局
    • 7.4 响应式图片
    • 7.5 本章小结
  • 第八章 层叠图层及其嵌套
    • 8.1 用 layer 图层来操控层叠规则(上篇)
      • 8.1.1 图层的定义(上篇)
      • 8.1.2 图层的顺序与优先级(下篇)
      • 8.1.3 revert-layer 关键字(下篇)
    • 8.2 层叠图层的推荐组织方案
    • 8.3 伪类 :is() 和 :where() 的用法
    • 8.4 CSS 嵌套的使用
      • 8.4.1 嵌套选择器的使用
      • 8.4.2 深入理解嵌套选择器
      • 8.4.3 媒体查询及其他 @规则 的嵌套
    • 8.5 本章小结
  • 第九章 CSS 的模块化与作用域
    • 9.1 模块的定义
      • 9.1.1 模块和全局样式
      • 9.1.2 一个简单的 CSS 模块
      • 9.1.3 模块的变体
      • 9.1.4 多元素模块
    • 9.2 将模块组合为更大的结构
      • 9.2.1 模块中多个职责的拆分
      • 9.2.2 模块的命名
    • 9.3 CSS 的作用域
      • 9.3.1 CSS 作用域的就近原则
      • 9.3.2 划定作用域的边界
      • 9.3.3 CSS 中的隐式作用域
      • 9.3.4 关于 CSS 作用域与层叠图层
    • 9.4 CSS 模式库
    • 9.5 本章小结
  • 第十章 CSS 容器查询
    • 10.1 容器查询的一个简单示例
      • 10.1.1 容器尺寸查询的用法
    • 10.2 深入理解容器
      • 10.2.1 容器的类型
      • 10.2.2 容器的名称
      • 10.2.3 容器与模块化 CSS
    • 10.3 与容器相关的单位
    • 10.4 容器样式查询的用法
      • 10.4.1 将模块与所在容器解耦
      • 10.4.2 减少重复代码
    • 10.5 本章小结
  • 第 11 章 颜色与对比
    • 11.1 通过对比进行交流
      • 11.1.1 模式的建立
      • 11.1.2 还原设计稿
    • 11.2 颜色的定义
      • 11.2.1 色域与色彩空间
      • 11.2.2 CSS 颜色表示法(RGB、Hex、HSL、HWB、LAB/OKLAB、LCH/OKLCH)
    • 11.3 利用 OKLCH 处理颜色(上篇)
      • 11.3.4 从页面其他颜色衍生出新颜色(下篇)
    • 11.4 思考字体颜色的对比效果
    • 11.5 本章小结
  • 第 12 章 CSS 排版与间距
    • 12.1 间距设置
      • 12.1.1 使用 em 还是 px
      • 12.1.2 对行高的深入思考
      • 12.1.3 行内元素的间距设置
    • 12.2 Web 字体
    • 12.3 谷歌字体
    • 12.4 @font-face 的工作原理
      • 12.4.1 字体格式与回退处理
      • 12.4.2 同一字型的多种变体形式
    • 12.5 性能因素考量
      • 12.5.1 font-display 属性解析
      • 12.5.2 可变字体的用法
    • 12.6 调整字间距,提升可读性
      • 12.6.1 正文的字间距
      • 12.6.2 标题、小元素和间距
    • 12.7 本章小结
  • 第 13 章 渐变、阴影与混合模式
    • 13.1 渐变
      • 13.1.1 使用多个颜色节点(上)
      • 13.1.2 颜色插值方法(中)
      • 13.1.3 径向渐变(下)
      • 13.1.4 锥形渐变(下)
    • 13.2 阴影
      • 13.2.1 利用渐变和阴影打造立体感
      • 13.2.2 使用扁平化设计创建元素
      • 13.2.3 创建混合风格的按钮外观
    • 13.3 混合模式
      • 13.3.1 为图片上色
      • 13.3.2 混合模式的类型
      • 13.3.3 图片纹理的添加
      • 13.3.4 融合混合模式的用法
    • 13.4 本章小结
  • 第 14 章 蒙版、形状与剪切
    • 14.1 滤镜
      • 14.1.1 滤镜的类型
      • 14.1.2 背景滤镜
    • 14.2 蒙版
      • 14.2.1 带渐变效果的蒙版特效
      • 14.2.2 基于亮度来定义蒙版
      • 14.2.3 其他蒙版属性
    • 14.3 剪切路径
      • 14.3.1 多边形的裁剪路径
      • 14.3.2 Firefox 内置的剪切路径工具
      • 14.3.3 其他剪切路径类型
    • 14.4 浮动与形状
      • 14.4.1 浮动
      • 14.4.2 形状的定义
    • 14.5 本章小结
  • 第 15 章 过渡
    • 15.1 状态间的由此及彼
    • 15.2 定时函数
      • 15.2.1 定制贝塞尔曲线
      • 15.2.2 阶跃
    • 15.3 非动画属性
      • 15.3.1 不可添加动画效果的属性
      • 15.3.2 淡入与淡出
    • 15.4 过渡到自然高度
    • 15.5 自定义属性的过渡设置
    • 15.6 本章小结
  • 第 16 章 变换
    • 16.1 旋转、平移、缩放与倾斜
      • 16.1.1 变换原点的更改
      • 16.1.2 多重变换的设置
      • 16.1.3 单个变换属性的设置
    • 16.2 变换在动效中的应用
      • 16.2.1 放大图标(上)
      • 16.2.2 带“飞入”特效的文本标签的创建(下)
      • 16.2.3 过渡特效的交错渲染(下)
    • 16.3 动画的性能
    • 16.4 三维变换
      • 16.4.1 控制透视距离
      • 16.4.2 高级三维变换效果的实现
    • 16.5 本章小结
  • 附录
    • 附录A:CSS 选择器参考
    • 附录B:CSS 预处理器简介

http://www.kler.cn/a/461160.html

相关文章:

  • JS基础 -- 数组 (对象 / 数组 / 类数组 / 对象数组)的遍历
  • word文档中的文档网格——解决相同行间距当显示出不同行间距的情况
  • MySQL 入门大全:运算符
  • 苍穹外卖04——Redis初入门 在店铺打烊or营业状态管理功能中的使用
  • 系统设计——大文件传输方案设计
  • 关于使用vue-cropperjs上传一张图后,再次上传时,裁剪的图片不更新的问题
  • TreeMap
  • 如何使用C#与SQL Server数据库进行交互
  • 【每日学点鸿蒙知识】深色模式、Webview查看版本、window设置亮度、List缓存节点更新、预编译JS
  • 1panel fail2ban助力服务器SSH以及删除SSH登陆日志
  • ubuntu22 安装CUDA
  • 【蓝桥杯——物联网设计与开发】系列前言
  • git clone 超时
  • 吊舱激光测距核心技术详解!
  • 5G终端串口AT命令 FM650 常用命令
  • STM32-笔记24-智能开关垃圾桶盖
  • 数据要素在金融领域如何应用?
  • 深入理解C#的冒泡排序、快速排序、插入排序、选择排序和归并排序
  • v3.0.8- 「S+会员」新增专属运动秀,试试新穿搭吧- 与「好友」
  • 基于SpringBoot的电影购票平台的设计与实现(源码+SQL+LW+部署讲解)
  • PyQt6+OpenCV 项目练习
  • 2024年12月31日Github流行趋势
  • ThreadLocal的概述,及如何避免内存泄漏
  • 【优选算法 分治】深入理解分治算法:分治算法入门小专题详解
  • 【持续集成与持续部署(CI/CD)工具 - Jenkins】详解
  • PHP 中的魔术常量