携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第二天,点击查看活动详情
一句话告诉大家,css实现动画主要有3种方式,这三种方式必会,分别是:
transition实现过渡动画,
transform转变动画,
animation实现自定义动画。
transition过渡动画
下面代码呈现出来的效果就是鼠标经过div,宽高都变大(200→400;100→200) 颜色由粉色变成蓝色
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>CSS3 过渡效果</title>
<style>
div {
width: 200px;
height: 100px;
background-color: pink;
/* transition: 变化的属性 花费时间 运动曲线 何时开始; */
/* transition: width .5s ease 0s, height .5s ease 1s; */
/* 如果想要写多个属性,利用逗号进行分割 */
/* transition: width .5s, height .5s; */
/* 谁做过渡,给谁加 */
/* transition: height .5s ease 1s; */
/* 如果想要多个属性都变化,属性写all就可以了 */
transition: all 0.5s;
}
div:hover {
/* 过渡经常要和hover一起使用 */
width: 400px;
height: 200px;
background-color: skyblue;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
transform转变动画
先会基本用法就好啦 等以后需要的话可以再细查
基本写法:
transform:rotate(度数)
transform:scale(倍数,[倍数])
transform:skew(度数,[度数])
transform:translate(距离,[距离])
rotate(旋转)
2D旋转
transform: rotate(45deg); // 顺时针旋转45度
3D旋转
围绕原地到(x,y,z)的直线进行3D旋转
transform: rotate(x,y,z,angle);
x,y,z:分别表示 X、Y 和 Z 轴方向,都不能省略;
angle:设置对象设置对象的旋转角度,不能省略;
rotateX(angle),沿着X轴进行3D旋转;
rotateY(angle),沿着Y轴进行3D旋转;
rotateZ(angle),沿着Z轴进行3D旋转
单位 deg 为度的意思,正数为顺时针旋转,负数为逆时针旋转。
scale(缩放)
2D缩放
transform: scale(0.5);
transform: scale(0.5, 2);
- 一个参数时: 表示水平和垂直同时缩放该倍率;
- 两个参数时:第一个参数指定水平方向的缩放倍率,第二个参数指定垂直方向的缩放倍率 。
3D缩放
无非就是多了个z轴
transform: scale3d(m, n, s);
transform: scaleX(m);
transform: scaleY(n);
transform: scaleZ(s);
- m, n, s为收缩比例
skew(倾斜)
transform: skew(30deg) ;
transform: skew(30deg, 30deg);
- 一个参数时:表示水平方向的倾斜角度 ;
- 两个参数时:第一个参数表示水平方向的倾斜角度,第二个参数表示垂直方向的倾斜角度 。
- skew 的默认原点 transform-origin 是这个物件的中心点(transform-origin这个东西,)
translate(位移)
2D移动
3D移动
组合变形
transform: rotate(44deg) scale(0.8) skew(35deg, 35deg) translate(10px, 10px);
animation关键帧动画(重要)
css3中添加的新属性animation是用来为元素实现动画效果的,使用动画时,用@keyframes来作为关键帧,通过百分比构建样式规则。使用的时候为了兼容可加上-webkit-、-o-、-ms-、-moz-、-khtml-等前缀以适应不同的浏览器。
语法
animation: name duration timing-function delay iteration-count direction;
name 规定需要绑定到选择器的 keyframe 名称(具体参考loading实例)
timing-function 规定动画的速度曲线。 默认是 “ease”。其他常用值 linear
delay 规定动画何时开始 。 默认是 0。
iteration-count 规定动画被播放的次数 。 默认是 1。其他常用值 infinite
direction 规定动画是否在下一周期逆向地播放 。 默认是 “normal”; alternate (轮流),。(不太懂,不常用)
@keyframes
-
通过 @keyframes 规则,您能够创建动画。
-
@keyframes定义一个动画,并定义具体的动画效果,比如是放大还是位移等等。
-
@keyframes 它定义的动画并不直接执行,需要借助animation来运转。
-
在动画过程中,您能够多次改变这套 CSS 样式。
-
以百分比来规定改变发生的时间,或者通过关键词 "from" 和 "to",等价于 0% 和 100%。
百分比是指动画完成一遍的时间长度的的百分比 ,0% 是动画的开始时间,50%是动画完成一半的时间,100% 动画的结束时间。百分比后面的花括号写:在动画执行过程中的某时间点要完成的变化。 -
为了获得最佳的浏览器支持,您应该始终定义 0% 和 100% 选择器。
例如1
@keyframes a {
0% { transform: rotate(0deg);
}
100% { transform: rotate(360deg);
}
}
例如2
.load-border {
width: 120px;
height: 120px;
background: url(../images/loading_icon.png) no-repeat center center;
-webkit-animation: gif 1.4s infinite linear;
animation: gif 1.4s infinite linear;
}
@keyframes gif {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
loading动画实例(这个可以不看)
(摘的是vue项目中的内容,样式使用了less来写)
html:
<!-- loading框 -->
<div class="maskTwo" v-if="flagLoading" :class="[afterPay?'noneModule':'']">
<div class="back">
<div><img class="loading" src="@/assets/images/circle.png" alt=""></div>
<div>挂号中请稍后</div>
</div>
</div>
style:
.maskTwo {
position: fixed;
width: 100%;
height: 100%;
background-color: rgba(1, 89, 170, 0.7);
top: 0;
left: 0;
z-index: 99999;
}
.back {
position: absolute;
top: 50%;
left: 50%;
width: 43%;
height: 45%;
transform: translate(-50%, -50%);
display: flex;
flex-direction: column;
border-radius: 20px;
background: url("@/assets/images/lodingback.png") no-repeat center/100% 100%;
div:nth-of-type(1) {
margin: 14% auto 12%;
.loading {
width: 98%;
height: 90%;
border-radius: 50%;
animation: a 1.48s linear infinite; //关键步骤
}
//定义动画
@keyframes a { //关键步骤
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
}
div:nth-of-type(2) {
width: 41%;
height: 12.5%;
margin: 0 auto;
font-size: 0.36rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 500;
color: #ffffff;
line-height: 116%;
letter-spacing: 5px;
}
}
综合代码实例(要看一下)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>transition过渡/transform变形/animation关键帧动画</title>
</head>
<style>
.w_publuc-style {
margin-bottom: 30px;
border: 3px solid #ccc;
}
/* transition 过渡 */
.w_transition {
width: 200px;
height: 200px;
background-color: wheat;
color: #333;
transition: background 0.8s ease-in 0.3s, width 0.8s ease-in 0.3s, color 0.6s ease-out 0.3s;
//下面的三行是为了适应不同终端的浏览器
-moz-transition: background 0.8s ease-in 0.3s, width 0.8s ease-in 0.3s, color 0.6s ease-out 0.3s; /* Firefox 4 */
-webkit-transition: background 0.8s ease-in 0.3s, width 0.8s ease-in 0.3s, color 0.6s ease-out 0.3s; /* Safari and Chrome */
-o-transition: background 0.8s ease-in 0.3s, width 0.8s ease-in 0.3s, color 0.6s ease-out 0.3s; /* Opera */
}
.w_transition:hover { //transition一般需要结合hover使用
background: yellow;
width: 300px;
color: blueviolet;
}
/* transform 变形 */
.w_transform {
margin:30px;
width:200px;
height:100px;
background-color:yellow;
/* Rotate div */
transform:rotate(9deg);
//下面的四行是为了适应不同终端的浏览器
-ms-transform:rotate(9deg); /* Internet Explorer */
-moz-transform:rotate(9deg); /* Firefox */
-webkit-transform:rotate(9deg); /* Safari 和 Chrome */
-o-transform:rotate(9deg); /* Opera */
}
/* animation 关键帧动画 */
.w_animation {
width: 200px;
height: 200px;
background: red;
animation: myfirst 2s ease 0.5s infinite alternate;
/* Firefox */
-moz-animation:myfirst 2s ease 0.5s infinite alternate;
/* Safari and Chrome */
-webkit-animation:myfirst 2s ease 0.5s infinite alternate;
/* Opera */
-o-animation:myfirst 2s ease 0.5s infinite alternate;
}
//定义动画
@keyframes myfirst {
from {background:red;}
to {background:yellow;}
}
/* Firefox */
@-moz-keyframes myfirst {
from {background:red;}
to {background:yellow;}
}
/* Safari and Chrome */
@-webkit-keyframes myfirst {
from {background:red;}
to {background:yellow;}
}
/* Opera */
@-o-keyframes myfirst {
from {background:red;}
to {background:yellow;}
}
</style>
<body>
<div class="w_transition w_publuc-style">transition 过渡</div>
<div class="w_transform w_publuc-style">transform 变形</div>
<div class="w_animation w_publuc-style">animation 关键帧动画</div>
</body>
</html>