Pre:浏览器渲染原理
大体上分为六个步骤:
- 浏览器拿到HTML,构建HTML树
- 根据CSS构建CSS树
- 将两棵树合并,成渲染树(用户最终会看到的)
- 布局layout
- 绘制paint
- 合成compose
动画的两种方式
1.transition过渡
作用
- 给出开始和结尾,浏览器自动补充中间帧,形成动画。
语法
- transition: 属性名 时长 过渡方式 延迟(transition: left 200ms linear)
- 可以用逗号分隔两个不同属性(transition: left 200ms, top 400ms)
- 可以用all代表所有属性(transition: all 200ms)
注意:并不是所有属性都能过渡
display:block;
display:none;
一般改成visibility:hidden→visible
实践:跳动的心
- html代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div id="heart">
<div class="left"></div>
<div class="right"></div>
<div class="bottom"></div>
</div>
</body>
</html>
-CSS代码
*{box-sizing: border-box;}
#heart{
display: inline-block;
margin: 100px;
position: relative;
transition: all 1s;/*动画*/
}
#heart:hover{
transform: scale(1.2);
}
#heart>.left{
background: red;
width: 50px;
height: 50px;
position: absolute;
transform: rotate(45deg) translateX(31px);
bottom: 50px;
left: -50px;
border-radius: 50% 0 0 50%;
}
#heart>.right{
background: red;
width: 50px;
height: 50px;
border-radius: 50%;
position: absolute;
transform: rotate(45deg) translateY(31px);
bottom: 50px;
right: -50px;
border-radius: 50% 50% 0 0;
}
#heart>.bottom{
background: red;
width: 50px;
height: 50px;
transform: rotate(45deg);
}
2.animation动画
使用方式
- @keyframes声名关键帧
- animation添加动画
- 使用forwards使动画停在最后一帧
animation的常用属性
- 时长:表示动画的总时间。单位可以是s,ms
- 过渡方式:默认是先快后慢。linear表示线性,匀速变化。
- 次数:表示动画的次数,infinite表示无限次。
- 方向:reverse:反方向(100%-0%);alternate:原方向,再原路返回。
- 动画名:如xxx。 这些属性可以在一行里缩写。
示例
- @keyframes
@keyframes xxx {
0% {
transform: none;
}
66.66%{
transform: translateX(200px);
}
100%{
transform: translateX(200px) translateY(100px);
}
}
关键帧里使用百分数表示动画里触发关键帧的时间点。0%表示开始,100%表示结束,中间可以任意添加关键帧。xxx是关键帧的名字,在animation中定义。
- animation
animation:xxx 1s;
实践:跳动的心
- html代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div id="heart">
<div class="left"></div>
<div class="right"></div>
<div class="bottom"></div>
</div>
</body>
</html>
-CSS代码
*{box-sizing: border-box;}
#heart{
display: inline-block;
margin: 100px;
position: relative;
animation: .5s heart infinite alternate-reverse;/*动画*/
}
@keyframes heart {
0%{
transform: scale(1);
}
100%{
transform: scale(1.2);
}
}/*声名关键帧*/
#heart>.left{
background: red;
width: 50px;
height: 50px;
position: absolute;
transform: rotate(45deg) translateX(31px);
bottom: 50px;
left: -50px;
border-radius: 50% 0 0 50%;
}
#heart>.right{
background: red;
width: 50px;
height: 50px;
border-radius: 50%;
position: absolute;
transform: rotate(45deg) translateY(31px);
bottom: 50px;
right: -50px;
border-radius: 50% 50% 0 0;
}
#heart>.bottom{
background: red;
width: 50px;
height: 50px;
transform: rotate(45deg);
}
补充讲解:transform
四个常用功能
- 位移 translate
- 缩放 scale
- 旋转 rotate
- 倾斜 skew
示例
transform: translate(12px, 50%);
transform: translateX(2em);
transform: translateY(3in);
transform: scale(2, 0.5);
transform: scaleX(2);
transform: scaleY(0.5);
transform: rotate(0.5turn);
transform: rotateX(10deg);
transform: rotateY(10deg);
transform: rotateZ(10deg);
transform: skew(30deg, 20deg);
transform: skewX(30deg);
transform: skewY(1.07rad);
transform: scale(2) translate(12px);/*组合使用*/