CSS3 转换、过渡和动画

时间:2024-01-04 17:54:50

一、转换

1、属性:transform

取值:none/transform-function(转换函数)

注意:如果要实现多个转换函数的话,可以用空格分开若干transform-function

2、转换的原点

默认情况,原点在元素的中心处,width*50%,height*50%

更换原点-属性:transform-origin:数值/百分比/关键字(top/bottom/left/right)

取值:按照当前元素的左上点为(0,0)

一个值:所有轴的位置

两个值:第一个值表示x轴上的值,第二个表示y轴

三个值:x,y,z

转换主要分为两类:2D转换和3D转换

(一)2D转换

1、位移:位置移动

函数:translate()

取值:数值/百分比(可为负)

一个值:x轴

两个值:x轴,y轴

单向位移函数:translateX(),translateY()

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS3-2D变换之位移</title>
<link rel="stylesheet" href="demo05.css">
</head>
<body>
<div id="d1"></div>
<div id="d2"></div>
</body>
</html>
 @charset "utf-8";

 div{
width: 200px;
height: 200px;
position: absolute;
top: 100px;
left: 200px;
}
#d1{
border: 1px dotted #000;
}
#d2{
border: 1px solid #000;
background-color: #f00;
opacity: 0.5;
/*2D变换之位移*/
transform: translate(50px,50px);
}

2、缩放:改变元素尺寸

函数:scale()

取值:

一个值:x轴和y轴同样的缩放比例

两个值:分别表示x轴和y轴的缩放比例

可取值:

默认值为 1

放大:大于1的数值,可以取小数

缩小:0-1的数值

单向缩放函数:scaleX(x),scaleY(y)

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS3-2D变换之缩放</title>
<link rel="stylesheet" href="demo06.css">
</head>
<body>
<div id="d1"></div>
<div id="d2"></div>
</body>
</html>
@charset "utf-8";

div{
width: 200px;
height: 200px;
position: absolute;
top: 100px;
left: 200px;
}
#d1{
border: 1px dotted #000;
}
#d2{
border: 1px solid #000;
background-color: #f00;
opacity: 0.5;
/*2D变换之缩放*/
transform: scale(0.8,0.5); /*缩小*/
/*transform: scale(1.2); 放大*/
}

3、旋转:围绕着一个圆心(转换原点)发生旋转的操作

函数:rotate(nxdeg)

n:符号,可正(顺时针)可负(逆时针)

x:旋转角度的数值

deg:角度单位

注意:旋转是连同坐标轴一起转

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS3-2D变换之旋转</title>
<link rel="stylesheet" href="demo07.css">
</head>
<body>
<div id="d1"></div>
<div id="d2">Web前端</div>
</body>
</html>
 @charset "utf-8";

 div{
width: 200px;
height: 200px;
position: absolute;
top: 100px;
left: 200px;
}
#d1{
border: 1px dotted #000;
}
#d2{
border: 1px solid #000;
background-color: #f00;
opacity: 0.5;
/*定义新原点*/
transform-origin: 100% 100%;
/*2D变换之旋转*/
transform: rotate(30deg);
}

4、倾斜:让元素围绕着x轴或y轴,按照一定的角度产生倾斜效果

函数:skew(nxdeg)

单向缩放函数:skewX(),skewY()

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS3-2D变换之倾斜</title>
<link rel="stylesheet" href="demo08.css">
</head>
<body>
<div id="d1"></div>
<div id="d2">Web前端</div>
</body>
</html>
 @charset "utf-8";

 div{
width: 200px;
height: 200px;
position: absolute;
top: 100px;
left: 200px;
}
#d1{
border: 1px dotted #000;
}
#d2{
border: 1px solid #000;
background-color: #f00;
opacity: 0.5;
/*2D变换之倾斜*/
transform: skew(45deg,15deg);
}

(二)3D转换

元素可以沿着z轴,发生各种转换的效果

1、属性

perspective:模拟人眼到3D视图的距离,取值为数值

意义:

1、定义距离

2、标识元素可以完成3D转换

注意:该属性要设置在父元素上。即设置完成后,该元素的子元素能够发生3D转换,自身元素是不可以的。

浏览器兼容性:

-webkit-perspective

-moz-perspective

-o-perspective

2、3D - 位移

函数:translateZ(z),translate3D(x,y,z)

3、3D - 旋转

函数:

rotateX(deg)

rotateY(deg)

rotateZ(deg)

rotate3D(x,y,z,deg)

x,y,z取值为0和1,0表示该轴不旋转,1表示该轴按照deg的角度进行旋转

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS3-3D变换之旋转</title>
<link rel="stylesheet" href="demo09.css">
</head>
<body>
<div id="parent">
<div id="son">Better late than never.</div>
</div>
</body>
</html>
 @charset "utf-8";

 #parent{
width: 300px;
height: 300px;
border: 1px solid #ddd;
padding: 10px;
margin: 80px 0 0 150px;
/*设置子级元素,允许发生3D转换*/
perspective: 100px;
-webkit-perspective: 100px;
}
#son{
text-align: center;
width: 200px;
height: 200px;
line-height: 200px;
margin: auto;
border: 1px solid #000;
background-color: #ddd;
margin-top: 50px;
/*3D旋转*/
transform: rotateX(45deg); /*x轴旋转*/
/*transform: rotateY(30deg);*/ /*y轴旋转*/
/*transform: rotateZ(60deg);*/ /*Z轴旋转*/
transform: rotate3d(1,1,1,30deg); /*整体旋转*/
}

二、过渡:元素的一个状态到另一个状态的平缓过渡

1、过渡相关属性(要素)

a、过渡属性:transition-property

能够实现过渡效果的CSS属性:

颜色:文本颜色,背景颜色

取值为数值:宽度、高度、字体大小

转换属性:transform

渐变属性:background:linear-gradient ....

visibility:

阴影:

透明度:

b、过渡时间:transition-duration

整个过渡的效果将在多长时间内完成,以秒(s)或毫秒(ms)作为单位

注意:默认值为0,整个过渡中,必须要设置transition-duration属性,否则没有过渡效果

c、过渡时间曲线函数:transition-timing-function

取值:

ease:默认值,慢速开始,快速变快,慢速结束

linear:匀速

ease-in:慢速开始,加速效果

ease-out:快速开始,减速效果

ease-in-out:慢速开始和结束,中间先加速再减速

d、过度的延迟:transition-delay

过渡效果什么时候开始,以秒(s)或毫秒(ms)作为单位

e、过渡的综合属性:

transition:property duration timing-function delay

将以上四个过渡属性放在一起,后面两个可以省略

2、触发过渡效果

a、用户的行为(点击、悬浮)

b、:hover, :active ...

3、过渡属性定义在什么地方

div{

width: 100px;

}

div:hover{

width: 300px;

}

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>过渡</title>
<style>
#d1{
width: 100px;
height: 30px;
background-color: #bfb;
/*定义过渡效果*/
/*在此处定义过渡效果,恢复时仍然有效果*/
/*transition-property: width;
transition-duration: 1s;
transition-timing-function: linear;
transition-delay: 100ms;*/
}
#d1:hover{
width: 300px;
height: 30px;
background: #bfb;
/*定义过渡效果*/
transition: width 1s ease-in 100ms;
}
img{
/*若将过渡效果定义在此处,则恢复时依然能看到效果 */
}
img:hover{
transform: translate(200px) rotate(720deg);
transition: transform 1s linear 100ms;
}
</style>
</head>
<body>
<div id="d1"></div>
<img src="Images/star.jpg">
</body>
</html>

过渡+3D旋转效果

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>过渡+3D旋转</title>
<style>
#parent{
width: 200px;
height: 200px;
padding: 50px;
border: 1px solid #ddd;
perspective: 100px;
margin: 10px auto;
}
#son{
width: 100px;
height: 100px;
background-color: #ccc;
border: 1px solid #ddd;
margin: 30px auto;
transition: transform 5s linear 2s;
}
#son:hover{
transform: rotate3d(1,1,1,360deg);
}
</style>
</head>
<body>
<div id="parent">
<div id="son">360°旋转</div>
</div>
</body>
</html>

三、动画

1、在多个状态之中,做平缓过渡的效果

2、浏览器兼容性

-webkit- 谷歌

-moz- 火狐

-o- 欧鹏

3、创建使用动画步骤

A、声明动画

a、起名

b、使用 @keyframes 声明动画的关键帧

关键帧:特殊时间点上的状态

B、使用动画

属性:animation

通过以上属性调用动画的名称

设置相关操作

4、声明动画

通过 @keyframe 声明动画

语法:@keyframes 动画名称

{

from | 0%{

//动画开始的状态,CSS属性

width:0px;

}

[percent{

//动画的中间状态

}]

10%{

width:10px;

}

20%{

width:20%;

}

to | 100%{

//动画结束的状态

width:100px;

}

}

5、调用动画

属性

a、animation-name:动画名称

b、animation-duration:动画完成一个周期所需要的时间(s|ms为单位)

c、animation-timing-function:动画执行过程中的时间速度曲线函数

取值:ease,linear,ease-in,ease-out,ease-in-out

d、animation-delay:播放动画之前的延迟

e、animation-iteration-count:动画播放次数

取值:

定数值:播放指定次数

infinite:无限次

f、animation-direction:动画播放方向

取值:

normal:正常,从头到尾

alternate:轮播,在奇数次上正向播放,在偶数次上逆向播放

g、animation:动画的综合属性

animation:name duration timing-function delay iteration-count direction;(后四个可省略)

h、animation-fill-mode:动画播放前后元素的状态

取值:

none:默认,不改变默认行为

forwards:动画完成后,保持在最后一个帧的状态

backwards:动画显示之前,保持在第一个关键帧的状态

both:结合了forwards和backwards的状态

i、animation-play-state:设置动画播放状态

取值:

paused:暂停

running:播放

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>动画练习 - 钟表</title>
<style>
#circle{
width: 500px;
height: 500px;
border: 3px solid #00f;
border-radius: 50%;
margin: auto;
}
#hour{
float: left;
height: 125px;
border: 4px solid #bbf;
position: relative;
top: 125px;
left: 250px;
transform-origin: 0 125px;
animation: hours 3600s linear 0s infinite;
}
#second{
float: left;
height: 200px;
border: 2px solid #00f;
position: relative;
top: 54px;
left: 244px;
transform-origin: 0 200px;
animation: seconds 60s linear 0s infinite;
}
/*声明动画*/
@keyframes hours{
from{
transform: rotate(0deg);
/*transform-origin: 0 125px;*/
}
25%{
transform: rotate(90deg);
}
50%{
transform: rotate(180deg);
}
75%{
transform: rotate(270deg);
}
to{
transform: rotate(360deg);
}
}
@keyframes seconds{
from{
transform: rotate(0deg);
/*transform-origin: 0 200px;*/
}
25%{
transform: rotate(90deg);
}
50%{
transform: rotate(180deg);
}
75%{
transform: rotate(270deg);
}
to{
transform: rotate(360deg);
}
}
</style>
</head>
<body>
<div id="circle">
<b id="hour"></b>
<b id="second"></b>
</div>
</body>
</html>