commit
00f138c611
1 changed files with 41 additions and 37 deletions
|
@ -1,14 +1,14 @@
|
|||
# CSS-animations
|
||||
|
||||
CSS animations allow to do simple animations without JavaScript at all.
|
||||
CSS animations make it possible to do simple animations without JavaScript at all.
|
||||
|
||||
JavaScript can be used to control CSS animation and make it even better with a little of code.
|
||||
JavaScript can be used to control CSS animations and make them even better, with little code.
|
||||
|
||||
## CSS transitions [#css-transition]
|
||||
|
||||
The idea of CSS transitions is simple. We describe a property and how its changes should be animated. When the property changes, the browser paints the animation.
|
||||
|
||||
That is: all we need is to change the property. And the fluent transition is made by the browser.
|
||||
That is, all we need is to change the property, and the fluid transition will be done by the browser.
|
||||
|
||||
For instance, the CSS below animates changes of `background-color` for 3 seconds:
|
||||
|
||||
|
@ -47,7 +47,7 @@ There are 4 properties to describe CSS transitions:
|
|||
- `transition-timing-function`
|
||||
- `transition-delay`
|
||||
|
||||
We'll cover them in a moment, for now let's note that the common `transition` property allows to declare them together in the order: `property duration timing-function delay`, and also animate multiple properties at once.
|
||||
We'll cover them in a moment, for now let's note that the common `transition` property allows declaring them together in the order: `property duration timing-function delay`, as well as animating multiple properties at once.
|
||||
|
||||
For instance, this button animates both `color` and `font-size`:
|
||||
|
||||
|
@ -70,13 +70,13 @@ growing.onclick = function() {
|
|||
</script>
|
||||
```
|
||||
|
||||
Now let's cover animation properties one by one.
|
||||
Now, let's cover animation properties one by one.
|
||||
|
||||
## transition-property
|
||||
|
||||
In `transition-property` we write a list of property to animate, for instance: `left`, `margin-left`, `height`, `color`.
|
||||
In `transition-property`, we write a list of properties to animate, for instance: `left`, `margin-left`, `height`, `color`. Or we could write `all`, which means "animate all properties".
|
||||
|
||||
Not all properties can be animated, but [many of them](http://www.w3.org/TR/css3-transitions/#animatable-properties-). The value `all` means "animate all properties".
|
||||
Do note that, there are properties which can not be animated. However, [most of the generally used properties are animatable](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animated_properties).
|
||||
|
||||
## transition-duration
|
||||
|
||||
|
@ -84,11 +84,15 @@ In `transition-duration` we can specify how long the animation should take. The
|
|||
|
||||
## transition-delay
|
||||
|
||||
In `transition-delay` we can specify the delay *before* the animation. For instance, if `transition-delay: 1s`, then animation starts after 1 second after the change.
|
||||
In `transition-delay` we can specify the delay *before* the animation. For instance, if `transition-delay` is `1s` and `transition-duration` is `2s`, then the animation starts 1 second after the property change and the total duration will be 2 seconds.
|
||||
|
||||
Negative values are also possible. Then the animation starts from the middle. For instance, if `transition-duration` is `2s`, and the delay is `-1s`, then the animation takes 1 second and starts from the half.
|
||||
Negative values are also possible. Then the animation is shown immediately, but the starting point of the animation will be after given value (time). For example, if `transition-delay` is `-1s` and `transition-duration` is `2s`, then animation starts from the halfway point and total duration will be 1 second. You can think it like this:
|
||||
|
||||
Here's the animation shifts numbers from `0` to `9` using CSS `translate` property:
|
||||
`transition-delay + transition-duration = animation duration`
|
||||
|
||||
So, if for instance, `transition-delay` is `-2s` and `transition-duration` is `2s`, then it will be as if there was no transitioning animation for that property and the changes are shown instantly. Therefore, "animation duration" must always be greater than `0s` for any animation to be shown.
|
||||
|
||||
Here the animation shifts numbers from `0` to `9` using CSS `translate` property:
|
||||
|
||||
[codetabs src="digits"]
|
||||
|
||||
|
@ -108,13 +112,13 @@ In the example above JavaScript adds the class `.animate` to the element -- and
|
|||
stripe.classList.add('animate');
|
||||
```
|
||||
|
||||
We can also start it "from the middle", from the exact number, e.g. corresponding to the current second, using the negative `transition-delay`.
|
||||
We could also start it from somewhere in the middle of the transition, from an exact number, e.g. corresponding to the current second, using a negative `transition-delay`.
|
||||
|
||||
Here if you click the digit -- it starts the animation from the current second:
|
||||
|
||||
[codetabs src="digits-negative-delay"]
|
||||
|
||||
JavaScript does it by an extra line:
|
||||
JavaScript does it with an extra line:
|
||||
|
||||
```js
|
||||
stripe.onclick = function() {
|
||||
|
@ -129,25 +133,25 @@ stripe.onclick = function() {
|
|||
|
||||
## transition-timing-function
|
||||
|
||||
Timing function describes how the animation process is distributed along the time. Will it start slowly and then go fast or vise versa.
|
||||
The timing function describes how the animation process is distributed along its timeline. Will it start slowly and then go fast, or vice versa.
|
||||
|
||||
That's the most complicated property from the first sight. But it becomes very simple if we devote a bit time to it.
|
||||
It appears to be the most complicated property at first. But it becomes very simple if we devote a bit time to it.
|
||||
|
||||
That property accepts two kinds of values: a Bezier curve or steps. Let's start from the curve, as it's used more often.
|
||||
That property accepts two kinds of values: a Bezier curve or steps. Let's start with the curve, as it's used more often.
|
||||
|
||||
### Bezier curve
|
||||
|
||||
The timing function can be set as a [Bezier curve](/bezier-curve) with 4 control points that satisfies the conditions:
|
||||
The timing function can be set as a [Bezier curve](/bezier-curve) with 4 control points that satisfy the conditions:
|
||||
|
||||
1. First control point: `(0,0)`.
|
||||
2. Last control point: `(1,1)`.
|
||||
3. For intermediate points values of `x` must be in the interval `0..1`, `y` can be anything.
|
||||
3. For intermediate points, the values of `x` must be in the interval `0..1`, `y` can be anything.
|
||||
|
||||
The syntax for a Bezier curve in CSS: `cubic-bezier(x2, y2, x3, y3)`. Here we need to specify only 2nd and 3rd control points, because the 1st one is fixed to `(0,0)` and the 4th one is `(1,1)`.
|
||||
|
||||
The timing function describes how fast the animation process goes in time.
|
||||
The timing function describes how fast the animation process goes.
|
||||
|
||||
- The `x` axis is the time: `0` -- the starting moment, `1` -- the last moment of `transition-duration`.
|
||||
- The `x` axis is the time: `0` -- the start, `1` -- the end of `transition-duration`.
|
||||
- The `y` axis specifies the completion of the process: `0` -- the starting value of the property, `1` -- the final value.
|
||||
|
||||
The simplest variant is when the animation goes uniformly, with the same linear speed. That can be specified by the curve `cubic-bezier(0, 0, 1, 1)`.
|
||||
|
@ -197,7 +201,7 @@ CSS:
|
|||
|
||||
There are several built-in curves: `linear`, `ease`, `ease-in`, `ease-out` and `ease-in-out`.
|
||||
|
||||
The `linear` is a shorthand for `cubic-bezier(0, 0, 1, 1)` -- a straight line, we saw it already.
|
||||
The `linear` is a shorthand for `cubic-bezier(0, 0, 1, 1)` -- a straight line, which we described above.
|
||||
|
||||
Other names are shorthands for the following `cubic-bezier`:
|
||||
|
||||
|
@ -221,9 +225,9 @@ So we could use `ease-out` for our slowing down train:
|
|||
|
||||
But it looks a bit differently.
|
||||
|
||||
**A Bezier curve can make the animation "jump out" of its range.**
|
||||
**A Bezier curve can make the animation exceed its range.**
|
||||
|
||||
The control points on the curve can have any `y` coordinates: even negative or huge. Then the Bezier curve would also jump very low or high, making the animation go beyond its normal range.
|
||||
The control points on the curve can have any `y` coordinates: even negative or huge ones. Then the Bezier curve would also extend very low or high, making the animation go beyond its normal range.
|
||||
|
||||
In the example below the animation code is:
|
||||
```css
|
||||
|
@ -244,21 +248,21 @@ But if you click the train, you'll see that:
|
|||
|
||||
[codetabs src="train-over"]
|
||||
|
||||
Why it happens -- pretty obvious if we look at the graph of the given Bezier curve:
|
||||
Why it happens is pretty obvious if we look at the graph of the given Bezier curve:
|
||||
|
||||

|
||||
|
||||
We moved the `y` coordinate of the 2nd point below zero, and for the 3rd point we made put it over `1`, so the curve goes out of the "regular" quadrant. The `y` is out of the "standard" range `0..1`.
|
||||
We moved the `y` coordinate of the 2nd point below zero, and for the 3rd point we made it over `1`, so the curve goes out of the "regular" quadrant. The `y` is out of the "standard" range `0..1`.
|
||||
|
||||
As we know, `y` measures "the completion of the animation process". The value `y = 0` corresponds to the starting property value and `y = 1` -- the ending value. So values `y<0` move the property lower than the starting `left` and `y>1` -- over the final `left`.
|
||||
As we know, `y` measures "the completion of the animation process". The value `y = 0` corresponds to the starting property value and `y = 1` -- the ending value. So values `y<0` move the property beyond the starting `left` and `y>1` -- past the final `left`.
|
||||
|
||||
That's a "soft" variant for sure. If we put `y` values like `-99` and `99` then the train would jump out of the range much more.
|
||||
|
||||
But how to make the Bezier curve for a specific task? There are many tools. For instance, we can do it on the site <http://cubic-bezier.com/>.
|
||||
But how do we make a Bezier curve for a specific task? There are many tools. For instance, we can do it on the site <http://cubic-bezier.com/>.
|
||||
|
||||
### Steps
|
||||
|
||||
Timing function `steps(number of steps[, start/end])` allows to split animation into steps.
|
||||
The timing function `steps(number of steps[, start/end])` allows splitting an animation into steps.
|
||||
|
||||
Let's see that in an example with digits.
|
||||
|
||||
|
@ -324,11 +328,11 @@ When the CSS animation finishes the `transitionend` event triggers.
|
|||
|
||||
It is widely used to do an action after the animation is done. Also we can join animations.
|
||||
|
||||
For instance, the ship in the example below starts to swim there and back on click, each time farther and farther to the right:
|
||||
For instance, the ship in the example below starts to sail there and back when clicked, each time farther and farther to the right:
|
||||
|
||||
[iframe src="boat" height=300 edit link]
|
||||
|
||||
The animation is initiated by the function `go` that re-runs each time when the transition finishes and flips the direction:
|
||||
The animation is initiated by the function `go` that re-runs each time the transition finishes, and flips the direction:
|
||||
|
||||
```js
|
||||
boat.onclick = function() {
|
||||
|
@ -337,11 +341,11 @@ boat.onclick = function() {
|
|||
|
||||
function go() {
|
||||
if (times % 2) {
|
||||
// swim to the right
|
||||
// sail to the right
|
||||
boat.classList.remove('back');
|
||||
boat.style.marginLeft = 100 * times + 200 + 'px';
|
||||
} else {
|
||||
// swim to the left
|
||||
// sail to the left
|
||||
boat.classList.add('back');
|
||||
boat.style.marginLeft = 100 * times - 200 + 'px';
|
||||
}
|
||||
|
@ -357,7 +361,7 @@ boat.onclick = function() {
|
|||
};
|
||||
```
|
||||
|
||||
The event object for `transitionend` has few specific properties:
|
||||
The event object for `transitionend` has a few specific properties:
|
||||
|
||||
`event.propertyName`
|
||||
: The property that has finished animating. Can be good if we animate multiple properties simultaneously.
|
||||
|
@ -369,7 +373,7 @@ The event object for `transitionend` has few specific properties:
|
|||
|
||||
We can join multiple simple animations together using the `@keyframes` CSS rule.
|
||||
|
||||
It specifies the "name" of the animation and rules: what, when and where to animate. Then using the `animation` property we attach the animation to the element and specify additional parameters for it.
|
||||
It specifies the "name" of the animation and rules - what, when and where to animate. Then using the `animation` property, we can attach the animation to the element and specify additional parameters for it.
|
||||
|
||||
Here's an example with explanations:
|
||||
|
||||
|
@ -405,11 +409,11 @@ Here's an example with explanations:
|
|||
|
||||
There are many articles about `@keyframes` and a [detailed specification](https://drafts.csswg.org/css-animations/).
|
||||
|
||||
Probably you won't need `@keyframes` often, unless everything is in the constant move on your sites.
|
||||
You probably won't need `@keyframes` often, unless everything is in constant motion on your sites.
|
||||
|
||||
## Summary
|
||||
|
||||
CSS animations allow to smoothly (or not) animate changes of one or multiple CSS properties.
|
||||
CSS animations allow smoothly (or not) animated changes of one or multiple CSS properties.
|
||||
|
||||
They are good for most animation tasks. We're also able to use JavaScript for animations, the next chapter is devoted to that.
|
||||
|
||||
|
@ -419,9 +423,9 @@ Limitations of CSS animations compared to JavaScript animations:
|
|||
+ Simple things done simply.
|
||||
+ Fast and lightweight for CPU.
|
||||
- JavaScript animations are flexible. They can implement any animation logic, like an "explosion" of an element.
|
||||
- Not just property changes. We can create new elements in JavaScript for purposes of animation.
|
||||
- Not just property changes. We can create new elements in JavaScript as part of the animation.
|
||||
```
|
||||
|
||||
The majority of animations can be implemented using CSS as described in this chapter. And `transitionend` event allows to run JavaScript after the animation, so it integrates fine with the code.
|
||||
The majority of animations can be implemented using CSS as described in this chapter. And the `transitionend` event allows JavaScript to be run after the animation, so it integrates fine with the code.
|
||||
|
||||
But in the next chapter we'll do some JavaScript animations to cover more complex cases.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue