目录
- 1. 空间转换
- 1.1 视距 - perspective
- 1.2 空间转换 - 旋转
- 1.3 立体呈现 - transform-style
- 1.4 空间转换 - 缩放
- 2. 动画 - animation
- 2.1 动画的基本用法
- 2.1 animation 复合属性
- 2.2 animation 拆分属性
- 2.3 多组动画
正文开始
1. 空间转换
空间:是从坐标轴角度定义的 X、Y 和 Z 三条坐标轴构成了一个立体空间,Z 轴正方向是垂直页面向外的方向。空间转换又叫 3D转换。
属性:
<style>transform: translate3d(x,y,z);transform: translateX();transform: translateY();transform: translateZ();
</style>
取值:
- 像素单位数值
- 百分比(以盒子自身尺寸为参照)
例如:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>div {width: 100px;height: 100px;background-color: pink;margin: 100px auto;transition: all 0.5s;}div:hover {transform: translate3d(100px,200px,200px);}</style>
</head>
<body><div></div>
</body>
</html>
需要注意的是,默认情况下,Z 轴上的变化是无法生效的,因为屏幕是二维的,并不能显示 Z 轴的效果,观察 Z 轴变化的通过设置视距的方式来实现
1.1 视距 - perspective
作用:指定了观察者与 Z=0 平面的距离,为元素添加近大远小的透视效果。
属性:添加给直接父级,取值范围800-1200效果最佳
perspective: 视距;
例如:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.father {perspective: 1000px;}.son {width: 100px;height: 100px;background-color: pink;margin: 100px auto;transition: all 0.5s;}.son:hover {transform: translateZ(200px);}</style>
</head>
<body><div class="father"><div class="son"></div> </div>
</body>
</html>
1.2 空间转换 - 旋转
作用:设置对象以指定坐标轴为轴旋转,配合视距属性可使空间转换更为真实
属性:
<style>/* 绕 Z 轴转 */transform: rotateZ(转动角度);/* 绕 X 轴转 */transform: rotateX(转动角度);/* 绕 Y 轴转 */transform: rotateY(转动角度);/* 自定义旋转轴位置 */transform: rotate3d(x,y,z,角度度数)
</style>
transform:rotate3d(x,y,z,角度度数):
- x,y,z 取值为0-1之间的数字
- 根据 x,y,z 的值会自动生成一个新的旋转轴,指定盒子会绕着这个轴旋转指定角度
左手法则:用以根据旋转方向确定取值正负。
-左手握住旋转轴,拇指指向正值方向,其他四个手指弯曲方向为旋转正值方向:
例如:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.father {perspective: 1000px;width: 500px;margin: 100px auto;}img {width: 500px;transition: all 0.5s;}.father img {transform: rotateX(45deg);}</style>
</head>
<body><div class="father"><img src="img.jpg" alt=" "> </div>
</body>
</html>
页面效果:
1.3 立体呈现 - transform-style
作用:设置元素的子元素是位于 3D 空间中还是平面中。
属性:
<style>/* 子集处于平面中 */transform-style:flat;/* 子集处于 3D 空间 */transform-style:preserve-3d;
</style>
呈现立体图形步骤:
- 父级元素添加 transform-style:preserve-3d;
- 子集定位,使所有子集都在盒子内部
- 调整子盒子的位置
例如:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box {/* 给父级盒子添加 3D 属性 */margin: 100px auto;width: 200px;position: relative;transform-style: preserve-3d;transition: all .5s;perspective: 1000px;}.box div {/* 子集定位 */position: absolute;top: 0;left: 0;width: 200px;height: 200px;}.back {transform: translateZ(-100px);background-color: red;}.front {transform: translateZ(100px);background-color: green;}.box:hover {transform: rotateY(60deg);}</style>
</head>
<body><div class="box"><div class="back">后面</div><div class="front">前面</div></div>
</body>
</html>
页面效果:
静态的图片很难展示出动态的效果,所以大家可以试着自己运行一下来看看动画效果。
需要注意的是,当盒子在空间中转换的时候,他的坐标轴也会随之改变。
1.4 空间转换 - 缩放
作用:在空间中缩放指定对象。
属性:
<style>transform: scale3d(x,y,z);transform: scaleX();transform: scaleY();transform: scaleZ();
</style>
属性值:
- 属性值为具体数值,即缩放倍数,小于1缩小,大于1放大。
2. 动画 - animation
- 过渡:实现两个状态间的变化过程
- 动画:实现多个状态间的变化过程,动画过程可控(重复播放、最终画面、是否暂停)
2.1 动画的基本用法
动画实现步骤:
- 定义动画:有两种写法
<style>/* 只有初始和末尾状态 */@keyframes 动画名称1 {from {状态1}to {状态2}}/* 将整个动画过程分为若干部分 *//* 百分比表示占动画时长的百分比 */@keyframes 动画名称2 {0% {状态1}10% {状态2}.....100% {状态10}}
</style>
- 使用动画
<style>animation: 动画名称 动画花费时长(s);
</style>
例如:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.div1 {width: 100px;height: 100px;background-color: pink;animation: change1 1s;}.div2 {width: 100px;height: 100px;background-color: green;animation: change2 1s;}@keyframes change1 {from{width: 100px;}to{width: 300px;}}@keyframes change2 {0% {width: 100px;}30% {width: 300px;}50% {width: 500px;}100% {width: 200px;}}</style>
</head>
<body><div class="div1"></div><div class="div2"></div>
</body>
</html>
动画效果不便展示,请大家自行运行浏览
2.1 animation 复合属性
使用动画的属性值不止上面两种,具体为:
<style>animation: 动画名称 动画时长 速度曲线 延迟时间 重复次数 动画方向 执行完毕时状态;
</style>
- 动画名称和动画时长必须要写
- 属性值不分先后顺序
- 如果有两个时间值,第一个时间表示动画时长,第二个时间表示延迟时间
速度曲线取值:
- linear:匀速
- steps(x):x为数字,表示把动画分为x步完成。工作中可配合精灵图实现精灵图动画
重复次数取值:
- 数字:表示重复次数
- infinite:表示无限循环
动画方向取值:
- alternate:反向动画
执行完毕时状态取值:
- forwards:完毕时状态为动画最后状态
- backwards:默认值,完毕时状态为初始状态
例如:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>div {width: 100px;height: 100px;background-color: green;animation: change 1s linear 2s infinite alternate;}@keyframes change {0% {width: 100px;}30% {width: 300px;}50% {width: 500px;}100% {width: 200px;}}</style>
</head>
<body><div></div>
</body>
</html>
动画效果不便展示,请大家自行运行浏览
2.2 animation 拆分属性
属性 | 作用 | 取值 |
---|---|---|
animation-name | 动画名称 | 动画名称 |
animation-duration | 动画时长 | 时长(s) |
animation-delay | 延迟时间 | 时长(s) |
animation-fill-mode | 动画执行完毕时状态 | forwaeds(最后一帧状态);backwards(第一帧状态) |
animation-timing-function | 速度曲线 | steps():逐帧动画 |
animation-iteration-count | 重复次数 | infinite(无限循环) |
animation-direction | 动画执行方向 | alternate(反向) |
animation-play-state | 暂停动画 | paused(暂停),通常配合 :hover 使用 |
例如:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>div {width: 100px;height: 100px;background-color: green;animation-name: change;animation-duration: 1s;animation-iteration-count: infinite;animation-delay: 1s;animation-timing-function: linear;}div:hover {animation-play-state: paused;}@keyframes change {0% {width: 100px;}30% {width: 300px;}50% {width: 500px;}100% {width: 200px;}}</style>
</head>
<body><div></div>
</body>
</html>
动画效果不便展示,请大家自行运行浏览
2.3 多组动画
作用:设置一个标签使用多个动画
属性:
<style>animation:动画1,动画2,...动画N;
</style>
例如:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>div {width: 100px;height: 100px;background-color: green;/* 使用多个动画 */animation: change 1s linear infinite,move 3s;}div:hover {animation-play-state: paused;}@keyframes move {from {transform: translate(0,0);}to {transform: translate(100px,0);}}@keyframes change {0% {width: 100px;}100% {width: 200px;}}</style>
</head>
<body><div></div>
</body>
</html>
动画效果不便展示,请大家自行运行浏览
注:若动画初始状态与盒子默认样式相同,那么初始状态可以省略。
完