非常教程

CSS参考手册

动画和转换 | Animations & Transitions

贴士和技巧 | CSS Animations: Tips

CSS 动画使得您能够实现一些难以置信的效果点缀您的页面或者应用程序 。 然而, 有些您想实现的东西表现的并不浅显易懂,或者没法使您立马想到一种聪明的解决办法。这篇文章集合一个一些温馨贴士和技巧,从而帮助您更轻松地工作,这其中包括了如何使一个已经停止的动画重新开始播放。

重新播放动画

CSS 动画的规范并没有提供使得动画重新激活的方法。在元素上调用resetAnimation()并不生效,您也不能直接通过设置元素的 animation-play-state使得动画重新“跑起来”。事实上,你必须使用一些技巧使得已经停止的动画重新播放。

这有一种我们认为足够稳定和可靠的方法推荐给您。

HTML内容

首先,让我们定义一个我们想要添加动画的元素<div>以及一个“播放”或“重播”动画的按钮。

<div class="box">
</div>

<div class="runButton">Click me to run the animation</div>

CSS内容

现在我们将使用CSS定义动画本身。为了简洁,有些并不重要的CSS(如“播放”按钮的样式)并没有显示在这里。

@keyframes colorchange {
  0% { background: yellow }
  100% { background: blue }
}

.box {
  width: 100px;
  height: 100px;
  border: 1px solid black;
}

.changing {
  animation: colorchange 2s;
}

这里有两个类。 "box" 类基本表述了box的外观,它不包含任何动画信息。动画的细节包含在"changing"类, 它描述了名为 "colorchange" 的@keyframes应该这持续两秒的时间段播放动画。

注意,正因为如此,这个box在这里不触发任何动画效果, 因此他不会动起来。

JavaScript内容

接下来我们将看看 JavaScript的部分如何工作。这里关键的部分在 play() 方法中, 他在用户点击“播放”按钮时被触发。

function play() {
  document.querySelector(".box").className = "box";
  window.requestAnimationFrame(function(time) {
    window.requestAnimationFrame(function(time) {
      document.querySelector(".box").className = "box changing";
    });
  });
}

这看起来有点奇怪,不是么?这是因为重新播放动画的唯一方法是删除动画效果,让文档重新计算样式以使得它知道您已经设置了它,然后再将动画效果加回该元素。要实现这个,我们必须更具创造性。 

这里是play()方法被调用时发生的事情:

  1. box的CSS类列表被重置为"box" 。这么做的效果是移除了在这个box上的其他类属性, 包括处理动画的 "changing"类。换句话说,我们从box元素上删除了动画效果。然而,改变类属性列表在样式被重新计算完成或者发生刷新事件之前并不会生效。

  1. 为了确保样式被重新计算我们使用 window.requestAnimationFrame(),同时设置了一个回调。我们的回调在下一次重绘页面之前被调用。问题是由于它在重绘之前被调用,而此时样式还没有被真正重新计算。

  1. 我们的回调聪明地调用了requestAnimationFrame() 方法!这一次,回调在下一次重绘之前被调用,这发成在样式被重新计算之后。回调在box元素上添加"changing" 类,使得重绘后重新触发动画。

当然,我们同样需要在“播放”按钮上添加事件处理方法使其生效:

document.querySelector(".runButton").addEventListener("click", play, false);

结果

另见

  • 使用CSS转换
  • Window.requestAnimationFrame()
CSS

层叠样式表( Cascading Style Sheets )是一种用来表现 HTML 或 XML 等文件样式的计算机语言。CSS 不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。

CSS目录

1.动画和转换 | Animations & Transitions
2.背景和边框 | Backgrounds & Borders
3.基本框模型 | Basic Box Model
4.基本用户界面 | Basic User Interface
5.框对齐 | Box Alignment
6. 级联和继承 | Cascading & Inheritance
7.颜色 | Color
8. 合成与混合 | Compositing & Blending
9.条件和规则 | Conditional Rules
10.计数器样式 | Counter Styles
11.设备适配 | Device Adaptation
12.扩展 | Extensions
13.滤镜效果 | Filter Effects
14.灵活的框布局 | Flexible Box Layout
15.字体 | Fonts
16.片段模块 | Fragmentation
17.全屏 API | Fullscreen API
18. 生成内容 | Generated Content
19.网格布局 | Grid Layout
20.图像值 | Image Values
21.初始线格局 | Inline Layout
22.列表和计数器 | Lists & Counters
23.逻辑属性 | Logical Properties
24.面具 | Masking
25.媒体查询 | Media Queries
26.杂项 | Miscellaneous
27.Miscellaneous Level 1
28.Miscellaneous Level 2
29.运动路径 | Motion Path
30. 多列布局 | Multi-column Layout
31.命名空间 | Namespaces
32.项目模型 | Object Model View
33.网页媒体 | Paged Media
34.定位布局 | Positioned Layout
35.伪元素 | Pseudo-
36.节奏大小 | Rhythmic Sizing
37. Ruby布局 | Ruby Layout
38.可缩放矢量图形 | Scalable Vector Graphics
39.滚动快照 | Scroll Snap
40.选择 | Selectors
41.形状 | Shapes
42.文本 | Text
43.文字装饰 | Text Decoration
44.变换 | Transforms
45.值和单位 | Values & Units
46.变量 | Variables
47.写入模型 | Writing Modes
48.CSS 教程
49.CSS 创建
50.CSS Id 和 Class选择器
51.CSS 简介
52.CSS 盒子模型
53.CSS Table(表格)
54.CSS 列表样式(ul)
55.CSS 链接(link)
56.CSS Fonts(字体)
57.CSS Text(文本)
58.CSS Backgrounds(背景)
59.CSS Display(显示) 与 Visibility(可见性)
60.CSS 尺寸 (Dimension)
61.CSS 分组和嵌套
62.CSS 轮廓(outline)属性
63.CSS Border(边框)
64.CSS 图像透明/不透明
65.CSS 导航栏
66.CSS 伪元素
67.CSS 伪类
68.CSS Float(浮动)
69.CSS Position(定位)
70.CSS 总结
71.CSS 属性选择器
72.CSS 媒体类型
73.CSS 图像拼合技术
74.CSS 实例
75.CSS 组合选择符
76.响应式 Web 设计 – 框架
77.响应式 Web 设计 – 视频(Video)
78.CSS 提示工具(Tooltip)
79.CSS 布局 Overflow
80.CSS 计数器
81.CSS 表单