From e14ad85f4ae8a3f88f4f0b1db9d504a9ea6a2bd8 Mon Sep 17 00:00:00 2001 From: jiangyanxin Date: Sun, 30 Dec 2018 22:07:37 +0800 Subject: [PATCH] merge reivew & make file --- build/epub/book.epub | Bin 3847976 -> 3847755 bytes build/html/book.html | 58 ++++++++++++++++++++----------------------- docs/index.html | 58 ++++++++++++++++++++----------------------- 3 files changed, 54 insertions(+), 62 deletions(-) diff --git a/build/epub/book.epub b/build/epub/book.epub index b3eece7c4af1bf41beda4955e29973462d3dc11d..fff5cc7d2a81609486336bef57af90925b0e6d22 100644 GIT binary patch delta 15356 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 K;b-8B_x}L0H~#zp delta 15655 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 QM6O1DROpcc{+F=-2QZHV8UO$Q diff --git a/build/html/book.html b/build/html/book.html index 368bc87..ce58e59 100644 --- a/build/html/book.html +++ b/build/html/book.html @@ -617,11 +617,11 @@

Let’s recap

下一章我们将讨论 animation 这个话题。

Homework

Before we start looking at the animation property, take some time to think about how you use transitions.

-

Can you think of ways they could help smooth the interactions or state changes on your pages? How might they add appeal? # 动作中的动画

-

现在我们已经了解了 transition 属性,让我们深入了解下 animation 属性

+

Can you think of ways they could help smooth the interactions or state changes on your pages? How might they add appeal? # Animations in action

+

前面我们讲了 transition 属性,现在让我们来学习下 animation 属性

A symbiotic relationship

-

animation 属性应用到元素上如同 transition。它还需要名为 keyframes 的第二部分

+

给元素添加 animation 跟添加 transition类似。不过它还需要 keyframes

.element {
   animation: ...
 }
@@ -629,30 +629,29 @@ 

A symbiotic relationship

@keyframes animation-name { /* Keyframes go here */ }
-

单独定义 keyframse 的好处是它允许我们创建可以多次重复使用的动画。

+

单独定义 keyframes 的好处是我们可以复用这些动画。

The animation property

-

应用这些keyframes到一个元素上使用 animation 属性来完成。除了需要一些额外的属性外,和 transition 十分相似。animation 可以使用下面的简写方式书写:

+

我们通过 animation 属性可以将编写的 keyframes 应用到元素上。animationtransition 很类似,不过多了一些其他的选项。下面是 animation 的简写方式:

animation: change-background 4s linear infinite;
-

分开写像下面这样:

+

分开写就是下面这样:

animation-name: change-background;
 animation-duration: 4s;
 animation-timing-function: linear;
 animation-repeat: infinite;
-

transition 需要带着一个 property,例如 “background” 或 “all”,animation 属性则需要带 keyframes 集合的名字来描述动画顺序

-

动画拥有一些变换没有的属性。例如,我们可以告诉动画来回交替,而不是每次从头开始循环。

+

transition 需要指定一个目标属性,例如 “background” 或 “all”,animation 则需要带 keyframes 的名字来描述动画。

+

animation 拥有一些 transition 没有的属性。例如,我们可以告诉动画来回交替循环,而不是每次从头开始循环。

Keyframes

-

在CSS中,keyframes 集合是通过动画的一系列停靠点。

-

我认为用一个例子来描述它是十分有用的。让我们从网页的 div 标签开始随着时间变化改变背景色。从蓝色背景开始,变为橙色,最后变为绿色。

+

keyframes 是用来描述动画过程中一系列变化的。

+

我们用一个简单的例子来说明下:在网页上有一个 div 标签,它的背景颜色不断地在变,像下面图中显示的那样。

-

如果我们尝试向某些人解释背景色是如何跟随时间改变的,我们也许会这么说:

-

“从蓝色开始,然后是橙色背景,最后绿色背景”

-

或者,如果我们想要更精确地来解释,也许会使用百分比来表述时间点

-

”0%的时候,从蓝色背景开始,然后50%的时候橙色,100%的时候变成绿色“

+

怎样描述这种变化呢?我们可以说“开始时蓝色,到一半时变成橙色,最后变成绿色”

+

如果再精确一点描述,我们可以用百分比来描述:

+

“0%的时候蓝色背景,50%的时候橙色,100%的时候绿色”

我们可以概括为:

0% Blue
 50% Green
 100% Orange
-

通过这些百分比,我们创建了一系列动画可能传递的“路径点”。 我们现在需要做的就是告诉浏览器这些百分比实际上是 keyframes 并为动画命名。 结果如下:

+

这样子我们就创建了动画整个过程中包含的“路径点”(waypoint)。 现在要做的就是将这些百分比按照 keyframes 的规则去写并命名。 结果如下:

@keyframes change-background {
   0% {
     background: blue;
@@ -664,41 +663,38 @@ 

Keyframes

background: green; } }
-

这个动画被称为 “change-background”。稍后我们将 keyframes 应用于元素时使用它。

-

当您从上到下阅读代码时,百分比描述了每个关键帧发生在动画中的距离。我们可以在这里看到它:

+

这个动画名字叫 “change-background”。稍后我们会用到它。

+

结合下面的例子,我们可以看出,上面的百分比指的是在动画过程中,其对应的 keyframe 发生的“时间点”。还可以知道,我们只要告诉浏览器开始、中间和结束时的颜色就可以了,在这些状态之间变化时,浏览器会自动去计算颜色值的插值。

Source: http://codepen.io/donovanh/pen/WbqNwd?editors=110
Source: http://codepen.io/donovanh/pen/WbqNwd?editors=110
-

当动画发生时,浏览器会创建从每种背景颜色到下一种颜色所需的中间帧。通过告诉浏览器我们希望div从一种颜色开始,中间变成另外一种颜色,最后变成第三种颜色结束,浏览器可以完成在每个点之间创建动画的工作。

-

我已经整理了一个 CodePen 示例,表明了这一点。

-

之前,我曾提到使用 animation-direction 属性来替换动画。这是它的样子:

+

CodePen 链接

+

前面提到过,使用 animation-direction 可以让动画来回交替变化,看下面的例子,直观地感受下:

-

在这种情况下,我已将 animation-direction 属性更改为 alternate。在 CodePen 上看到它。

+

代码放到CodePen上了。 animation-direction 属性已经更改为 alternate

Prefixes

-

目前,仍然需要在动画属性上使用 -webkit- 前缀。我没有将它添加到示例中,但是您的动画需要在 Safari 等浏览器中使用它将是需要的。

-

在CodePen中,您可以使用 CSS 设置中的 “Autoprefixer” 选项。对于本地开发,我使用 Gulp 版本的 Autoprefixer。 Prefix Free也是一个不错的选择。

+

虽然我写的代码里没有加 -webkit- 等前缀,但如果要在实际工程里应用 animation,还是要添加对应的浏览器前缀。

+

在 CodePen 中,你可以使用 CSS 设置中的 “Autoprefixer” 选项。对于本地开发,我使用 Gulp 版本的 Autoprefixer。 Prefix Free也是一个不错的选择。

Homework

Open up this keyframes example and try changing the code. See if you can break it, and fix it. Even better, if you come up with something cool, let me know!

I love seeing how you’re getting on. You can email me or get in touch on Twitter. # Animation properties

-

在我们看更多的动画示例之前,先了解一下 animation 的属性。

-

transition 属性一样,animation 可以使用简写属性形式,也可以单独指定这些属性。

+

在我们看更多的例子之前,先来了解下 animation 的各个属性。

+

transition 一样,animation 可以使用简写形式,也可以分开单独指定属性值。

animation-delay

transition-delay 类似,此属性表示在开始之前动画的等待时间。在定义多个动画的情况下特别有用。

-

如果定义的动画是循环的,在这种情况下,delay 属性不会每次循环都有效的,只有在给元素添加上动画效果的时候才有效。(只有第一次循环前会有等待时间,其余的就没有了)

+

如果定义的动画是不断循环的,在这种情况下,delay 属性并不会每次循环都有效,只有在给元素添加上动画效果的时候才有效。(只有第一次循环前会有等待时间,其余的就没有了)

实际上可以给这个属性一个负值,比如-1s。动画会直接从第1s开始执行,就好像这1s时间已经过去了。

animation-direction

-

动画通常从 0% 开始,到 100% 结束。animation-direction 使用 normalreversealternatealternate-reverse 来控制方向。(从开始到结束我们可以看作是一个有向的变化)

-

“Reverse”是指从 100% 播放(或循环)到 0%,而 “alternate” 指动画轮流反向播放,即从 0% 播放到 100% 然后再播放到 0%。

+

动画通常从 0% 开始,到 100% 结束。animation-direction 使用 normalreversealternatealternate-reverse 来控制动画变化的方向。(从开始到结束我们可以看作是一个有向的变化)

+

“Reverse”是指从 100% 播放(或循环)到 0%,而 “alternate” 指动画轮流反复播放,即从 0% 播放到 100% 然后再播放到 0%。

animation-duration

动画完成一个周期所需要的时间。类似于 transition-duration,以秒或毫秒计,如1s200ms

animation-fill-mode

默认情况下,动画播放完成元素返回其正常状态。使用 animation-fill-mode,我们可以定义元素在动画结束或开始前的状态。

使用 forwards 表示当动画完成后,元素属性保持最后一个关键帧的值。使用 backwards 表示动画完成后,元素属性变成第一帧(这个第一帧不是关键帧的第一帧,CodePen Demo)的值。【Tips:animation-fill-mode 除了这里说的两个之外还有多个可选值。】

例子:bouncer animation on Hop.ie。 使用 forwards,动画播放一次并在最后一帧结束。【Tips:这个例子貌似没有啊,我翻遍了也没找到】

-
-

这里多添了个例子来说明 forwards 和 backwards(原作者并没有写)。
+

这里添个例子来说明下 forwards 和 backwards(原作者并没有写)。
在这个例子里使用了 animation-delay 和 animation-fill-mode。从效果上来看,设置 backwards,点击“开始动画”之后,backwards 会立刻变成动画真实过程(animation-duration)第一帧的样子,一直持续整个 animation-delay 时间,然后开始变化,最后动画结束后又变回了最一开始没有添加动画时的状态。

-

animation-iteration-count

这是动画播放的次数。默认情况下,它将播放一次。也可以指定一个数字,或指定 “infinite” 以使其永久循环。

diff --git a/docs/index.html b/docs/index.html index 368bc87..ce58e59 100644 --- a/docs/index.html +++ b/docs/index.html @@ -617,11 +617,11 @@

Let’s recap

下一章我们将讨论 animation 这个话题。

Homework

Before we start looking at the animation property, take some time to think about how you use transitions.

-

Can you think of ways they could help smooth the interactions or state changes on your pages? How might they add appeal? # 动作中的动画

-

现在我们已经了解了 transition 属性,让我们深入了解下 animation 属性

+

Can you think of ways they could help smooth the interactions or state changes on your pages? How might they add appeal? # Animations in action

+

前面我们讲了 transition 属性,现在让我们来学习下 animation 属性

A symbiotic relationship

-

animation 属性应用到元素上如同 transition。它还需要名为 keyframes 的第二部分

+

给元素添加 animation 跟添加 transition类似。不过它还需要 keyframes

.element {
   animation: ...
 }
@@ -629,30 +629,29 @@ 

A symbiotic relationship

@keyframes animation-name { /* Keyframes go here */ }
-

单独定义 keyframse 的好处是它允许我们创建可以多次重复使用的动画。

+

单独定义 keyframes 的好处是我们可以复用这些动画。

The animation property

-

应用这些keyframes到一个元素上使用 animation 属性来完成。除了需要一些额外的属性外,和 transition 十分相似。animation 可以使用下面的简写方式书写:

+

我们通过 animation 属性可以将编写的 keyframes 应用到元素上。animationtransition 很类似,不过多了一些其他的选项。下面是 animation 的简写方式:

animation: change-background 4s linear infinite;
-

分开写像下面这样:

+

分开写就是下面这样:

animation-name: change-background;
 animation-duration: 4s;
 animation-timing-function: linear;
 animation-repeat: infinite;
-

transition 需要带着一个 property,例如 “background” 或 “all”,animation 属性则需要带 keyframes 集合的名字来描述动画顺序

-

动画拥有一些变换没有的属性。例如,我们可以告诉动画来回交替,而不是每次从头开始循环。

+

transition 需要指定一个目标属性,例如 “background” 或 “all”,animation 则需要带 keyframes 的名字来描述动画。

+

animation 拥有一些 transition 没有的属性。例如,我们可以告诉动画来回交替循环,而不是每次从头开始循环。

Keyframes

-

在CSS中,keyframes 集合是通过动画的一系列停靠点。

-

我认为用一个例子来描述它是十分有用的。让我们从网页的 div 标签开始随着时间变化改变背景色。从蓝色背景开始,变为橙色,最后变为绿色。

+

keyframes 是用来描述动画过程中一系列变化的。

+

我们用一个简单的例子来说明下:在网页上有一个 div 标签,它的背景颜色不断地在变,像下面图中显示的那样。

-

如果我们尝试向某些人解释背景色是如何跟随时间改变的,我们也许会这么说:

-

“从蓝色开始,然后是橙色背景,最后绿色背景”

-

或者,如果我们想要更精确地来解释,也许会使用百分比来表述时间点

-

”0%的时候,从蓝色背景开始,然后50%的时候橙色,100%的时候变成绿色“

+

怎样描述这种变化呢?我们可以说“开始时蓝色,到一半时变成橙色,最后变成绿色”

+

如果再精确一点描述,我们可以用百分比来描述:

+

“0%的时候蓝色背景,50%的时候橙色,100%的时候绿色”

我们可以概括为:

0% Blue
 50% Green
 100% Orange
-

通过这些百分比,我们创建了一系列动画可能传递的“路径点”。 我们现在需要做的就是告诉浏览器这些百分比实际上是 keyframes 并为动画命名。 结果如下:

+

这样子我们就创建了动画整个过程中包含的“路径点”(waypoint)。 现在要做的就是将这些百分比按照 keyframes 的规则去写并命名。 结果如下:

@keyframes change-background {
   0% {
     background: blue;
@@ -664,41 +663,38 @@ 

Keyframes

background: green; } }
-

这个动画被称为 “change-background”。稍后我们将 keyframes 应用于元素时使用它。

-

当您从上到下阅读代码时,百分比描述了每个关键帧发生在动画中的距离。我们可以在这里看到它:

+

这个动画名字叫 “change-background”。稍后我们会用到它。

+

结合下面的例子,我们可以看出,上面的百分比指的是在动画过程中,其对应的 keyframe 发生的“时间点”。还可以知道,我们只要告诉浏览器开始、中间和结束时的颜色就可以了,在这些状态之间变化时,浏览器会自动去计算颜色值的插值。

Source: http://codepen.io/donovanh/pen/WbqNwd?editors=110
Source: http://codepen.io/donovanh/pen/WbqNwd?editors=110
-

当动画发生时,浏览器会创建从每种背景颜色到下一种颜色所需的中间帧。通过告诉浏览器我们希望div从一种颜色开始,中间变成另外一种颜色,最后变成第三种颜色结束,浏览器可以完成在每个点之间创建动画的工作。

-

我已经整理了一个 CodePen 示例,表明了这一点。

-

之前,我曾提到使用 animation-direction 属性来替换动画。这是它的样子:

+

CodePen 链接

+

前面提到过,使用 animation-direction 可以让动画来回交替变化,看下面的例子,直观地感受下:

-

在这种情况下,我已将 animation-direction 属性更改为 alternate。在 CodePen 上看到它。

+

代码放到CodePen上了。 animation-direction 属性已经更改为 alternate

Prefixes

-

目前,仍然需要在动画属性上使用 -webkit- 前缀。我没有将它添加到示例中,但是您的动画需要在 Safari 等浏览器中使用它将是需要的。

-

在CodePen中,您可以使用 CSS 设置中的 “Autoprefixer” 选项。对于本地开发,我使用 Gulp 版本的 Autoprefixer。 Prefix Free也是一个不错的选择。

+

虽然我写的代码里没有加 -webkit- 等前缀,但如果要在实际工程里应用 animation,还是要添加对应的浏览器前缀。

+

在 CodePen 中,你可以使用 CSS 设置中的 “Autoprefixer” 选项。对于本地开发,我使用 Gulp 版本的 Autoprefixer。 Prefix Free也是一个不错的选择。

Homework

Open up this keyframes example and try changing the code. See if you can break it, and fix it. Even better, if you come up with something cool, let me know!

I love seeing how you’re getting on. You can email me or get in touch on Twitter. # Animation properties

-

在我们看更多的动画示例之前,先了解一下 animation 的属性。

-

transition 属性一样,animation 可以使用简写属性形式,也可以单独指定这些属性。

+

在我们看更多的例子之前,先来了解下 animation 的各个属性。

+

transition 一样,animation 可以使用简写形式,也可以分开单独指定属性值。

animation-delay

transition-delay 类似,此属性表示在开始之前动画的等待时间。在定义多个动画的情况下特别有用。

-

如果定义的动画是循环的,在这种情况下,delay 属性不会每次循环都有效的,只有在给元素添加上动画效果的时候才有效。(只有第一次循环前会有等待时间,其余的就没有了)

+

如果定义的动画是不断循环的,在这种情况下,delay 属性并不会每次循环都有效,只有在给元素添加上动画效果的时候才有效。(只有第一次循环前会有等待时间,其余的就没有了)

实际上可以给这个属性一个负值,比如-1s。动画会直接从第1s开始执行,就好像这1s时间已经过去了。

animation-direction

-

动画通常从 0% 开始,到 100% 结束。animation-direction 使用 normalreversealternatealternate-reverse 来控制方向。(从开始到结束我们可以看作是一个有向的变化)

-

“Reverse”是指从 100% 播放(或循环)到 0%,而 “alternate” 指动画轮流反向播放,即从 0% 播放到 100% 然后再播放到 0%。

+

动画通常从 0% 开始,到 100% 结束。animation-direction 使用 normalreversealternatealternate-reverse 来控制动画变化的方向。(从开始到结束我们可以看作是一个有向的变化)

+

“Reverse”是指从 100% 播放(或循环)到 0%,而 “alternate” 指动画轮流反复播放,即从 0% 播放到 100% 然后再播放到 0%。

animation-duration

动画完成一个周期所需要的时间。类似于 transition-duration,以秒或毫秒计,如1s200ms

animation-fill-mode

默认情况下,动画播放完成元素返回其正常状态。使用 animation-fill-mode,我们可以定义元素在动画结束或开始前的状态。

使用 forwards 表示当动画完成后,元素属性保持最后一个关键帧的值。使用 backwards 表示动画完成后,元素属性变成第一帧(这个第一帧不是关键帧的第一帧,CodePen Demo)的值。【Tips:animation-fill-mode 除了这里说的两个之外还有多个可选值。】

例子:bouncer animation on Hop.ie。 使用 forwards,动画播放一次并在最后一帧结束。【Tips:这个例子貌似没有啊,我翻遍了也没找到】

-
-

这里多添了个例子来说明 forwards 和 backwards(原作者并没有写)。
+

这里添个例子来说明下 forwards 和 backwards(原作者并没有写)。
在这个例子里使用了 animation-delay 和 animation-fill-mode。从效果上来看,设置 backwards,点击“开始动画”之后,backwards 会立刻变成动画真实过程(animation-duration)第一帧的样子,一直持续整个 animation-delay 时间,然后开始变化,最后动画结束后又变回了最一开始没有添加动画时的状态。

-

animation-iteration-count

这是动画播放的次数。默认情况下,它将播放一次。也可以指定一个数字,或指定 “infinite” 以使其永久循环。