LeaVerou 大牛 2014 jsconf > asia speech
http://lea.verou.me/css-4d/ b站视频资源 https://www.bilibili.com/video/av22257628/
阮一峰老师推荐 http://www.ruanyifeng.com/blog/2014/02/css_transition_and_animation.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>CSS 3 transition & animation</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<img class="spiral" src="./img/spiral.png"></img>
<div class="heart">
<img src="./img/heart.svg"></img>
</div>
<div style="display: flex;">
<div class="barX">
<span>rotateX</span>
<img src="./img/frames.png"></img>
</div>
<div class="barY">
<span>rotateY</span>
<img src="./img/frames.png"></img>
</div>
<div class="barZ">
<span>rotateZ</span>
<img src="./img/frames.png"></img>
</div>
</div>
</body>
</html>
@keyframes living {
from {
transform: rotate(0deg);
}
50% {
transform: rotate(180deg);
}
to {
transform: rotate(360deg);
}
}
.spiral {
width: 150px;
height: 150px;
animation: 5s 3s living linear infinite;
/* transition-duration */
transition: 3s;
/* transition-property */
/* transition: 3s height; */
/* transition: 2s width, 2s height; */
/* transition-delay */
/* transition: 2s height, 2s 2s width; */
/* transition-timing-function */
/* transition: 2s height linear, 2s 2s width ease-in-out; */
/* transition: 1s cubic-bezier(0.83, 0.97, 0.05, 1.44); */
}
/*
transition需要明确知道,开始状态和结束状态的具体数值,才能计算出中间状态。
比如,height从0px变化到100px,transition可以算出中间状态。
但是,transition没法算出0px到auto的中间状态,
也就是说,如果开始或结束的设置是height: auto,那么就不会产生动画效果。
类似的情况还有,display: none到block,background: url(foo.jpg)到url(bar.jpg)等等。
*/
.spiral:hover {
width: 300px;
height: 300px;
/* transform: none; */
/* 转换——移动 */
/* transform: translate(100px, 50px); */
/* transform: translate3d(100px, 200px, 30px); */
/* transform: translateX(200px); */
/* transform: translateY(200px); */
/* 转换——缩放 */
/* transform: scale(1.2); */
/* transform: scale(0.8, 1.2); */
/* transform: scale3d(0.8, 0.9, 1.1); */
/* transform: scaleX(0.5); */
/* transform: scaleY(0.5); */
/* transform: scaleZ(1); */
/* 转换——旋转 */
/* transform: rotate(90deg); */
/* transform: rotate3d(10, 20, 30, 60deg); */
/* transform: rotateX(60deg); */
/* transform: rotateY(60deg); */
/* transform: rotateZ(60deg); */
/* 转换——倾斜 */
/* transform: skew(30deg, 30deg); */
/* transform: skewX(30deg); */
/* transform: skewY(60deg); */
}
/*
transition的优点在于简单易用,但是它有几个很大的局限。
(1)transition需要事件触发,所以没法在网页加载时自动发生。
(2)transition是一次性的,不能重复发生,除非一再触发。
(3)transition只能定义开始状态和结束状态,不能定义中间状态,也就是说只有两个状态。
(4)一条transition规则,只能定义一个属性的变化,不能涉及多个属性。
CSS Animation就是为了解决这些问题而提出的。
*/
/* 三个状态 */
@keyframes rainbow {
from {
background: #c00;
}
50% {
background: orange;
}
to {
background: yellowgreen;
}
}
@keyframes beats {
from,
to {
transform: scale(0.8) translateX(-50px);
}
/* 25% {
transform: scale(1) translate(0);
} */
50% {
transform: scale(1.2) translateX(50px);
}
/* 75% {
transform: scale(1) translate(0);
} */
}
.heart {
width: 500px;
height: 300px;
text-align: center;
/* 如果想让动画保持突然终止时的状态,就要使用animation-play-state属性 */
animation: 1s rainbow infinite;
animation-play-state: paused;
}
.heart img {
width: 300px;
height: 300px;
}
.heart:hover {
/* animation: name duration timing-function delay iteration-count direction fill-mode; */
/* 默认情况下,动画只播放一次。 animation-duration animation-name */
/* animation: 1s rainbow; */
/* animation-timing-function linear、ease-in */
/* animation: 1s rainbow linear; */
/* animation-delay */
/* animation: 1s rainbow ease-in 2s; */
/* 指定播放次数 iteration-count */
/* animation: 2s rainbow 3; */
/* infinite关键字,可以让动画无限次播放 infinite... */
/* animation: 1s rainbow infinite; */
/* animation-direction: normal、alternate、reverse、alternate-reverse */
/* animation: 2s rainbow 3 normal; */
/* animation: 2s rainbow 3 alternate; */
/* animation: 2s rainbow 3 reverse; */
/* animation: 2s rainbow 3 alternate-reverse; */
/* 保持在结束状态, animation-fill-mode: none/forwards/backwards/both */
/* animation: 2s rainbow forwards; */
/* 浏览器从一个状态向另一个状态过渡,是平滑过渡。steps函数可以实现分步过渡。 */
/* animation: 1s rainbow infinite steps(10); */
animation-play-state: running;
}
.heart img:hover {
animation: 1s beats infinite;
}
@keyframes rotateX {
from {
transform: rotateX(0deg);
}
50% {
transform: rotateX(180deg);
}
to {
transform: rotateX(360deg);
}
}
@keyframes rotateY {
from {
transform: rotateY(0deg);
}
50% {
transform: rotateY(180deg);
}
to {
transform: rotateY(360deg);
}
}
@keyframes rotateZ {
from {
transform: rotateZ(0deg);
}
50% {
transform: rotateZ(180deg);
}
to {
transform: rotateZ(360deg);
}
}
.barX {
width: 300px;
height: 300px;
line-height: 150px;
}
.barX img {
width: 100%;
animation: 1s rotateX linear infinite;
}
.barY {
width: 300px;
height: 300px;
line-height: 150px;
}
.barY img {
width: 100%;
animation: 3s rotateY linear infinite alternate;
}
.barZ {
width: 300px;
height: 300px;
line-height: 150px;
}
.barZ img {
width: 100%;
animation: 5s rotateZ linear infinite reverse;
}
spiral.png
heart.svg
frames.png