CSS3 过渡、2D变形、3D变形、动画
- 一、过渡
- 二、2D变形 transform
- 1.移动 translate
- 2.缩放 scale
- 3. 旋转 rotate
- 4. 倾斜 skew
- 三、3D变形
- 1. rotateX()rotateY() rotateZ()
- 2. 体会透视 perspective
- 3. translateX() translateY() translateZ()
- 4. 开门大吉例子
- 5. backface-visibility
- 四、动画
- 例子:无缝滚动
一、过渡
为元素从一种样式变为另一种样式时添加效果。
transition: 过渡属性 花费时间 运动曲线 何时开始;
前两个值不可省略,运动曲线默认ease,合适开始默认0s立即开始可以省略。
注意:transition需要写在div里而不是hover里;多个属性设置不同时,用逗号隔开;需要描述所有属性变化时,过渡属性值为all。
<html>
<head>
<style>
div {
width: 200px;
height: 200px;
background-color: pink;
transition: width 0.2s ease 0s,height 0.3s ease-in 1s;
/* transition: all 0.6s ease 0s; */
}
div:hover {
width: 300px;
height: 300px;
}
</style>
</head>
<body>
<div></div>
</html>
二、2D变形 transform
做元素的变形、位移、缩放,可以和transition结合使用。
1.移动 translate
用translate平移
transform: translate(x,y)
<html>
<head>
<style>
div {
width: 200px;
height: 200px;
background-color: pink;
transition: all 0.5s;
}
div:active { /*鼠标点击没有松开鼠标,相当于点击*/
transform: translate(100px,200px);
transform: translate(50%,100%);
}
</style>
</head>
<body>
<div></div>
</html>
注意:
-
只移动一个坐标可以把另一个坐标设为0;
-
也可以写成:translateX(只跟一个参数);translateY(只跟一个参数)。
-
translate移动的距离如果是%,则以自己的宽度为准,而不是父亲为准。
<html> <head> <style> div { width: 200px; height: 200px; background-color: pink; position: absolute; /*盒子居中对齐*/ left: 50%; /*以父级宽度为准*/ margin-left: -100px; /*需要计算*/ top: 50%; transform: translate(-50%,-50%); } </style> </head> <body> <div></div> </html>
2.缩放 scale
transform: scale(x,y)
x和y的值小于1为缩小倍数,大于1为放大倍数。
<html>
<head>
<style>
div {
width: 200px;
height: 200px;
background-color: pink;
}
div:hover {
transform: scale(1.2,1.5);
}
</style>
</head>
<body>
<div></div>
</html>
注意:
-
如果只写一个参数,宽高都缩放!
-
谁做动画,谁加过渡!
<html> <head> <style> div { width: 100px; height: 50px; background-color: pink; overflow: hidden; } div img { transition: all 0.3s; } div:hover img { transform: scale(1.2,1.5); } </style> </head> <body> <div> <img src="images/search.png" alt=""> </div> </html>
3. 旋转 rotate
transform: rotate(*deg)
正值是顺时针,负值是逆时针;比如90deg是顺时针旋转90度
<html>
<head>
<style>
div {
width: 100px;
height: 50px;
background-color: pink;
overflow: hidden;
}
div img {
transition: all 0.3s;
}
div:hover img {
transform: rotate(90deg);
}
</style>
</head>
<body>
<div>
<img src="images/search.png" alt="">
</div>
</html>
旋转中心点的设置:
<html>
<head>
<style>
div img {
padding: 200px;
transition: all 0.3s;
transform-origin: bottom top;
}
div:hover img {
transform: rotate(90deg);
}
</style>
</head>
<body>
<div>
<img src="images/search.png" alt="">
</div>
</html>
4. 倾斜 skew
transform: skew(x,y);
<html>
<head>
<style>
div {
font-size: 50px;
font-weight: 700;
transition: all 0.2s;
}
div:hover {
transform: skew(20deg,0);
}
</style>
</head>
<body>
<div>
123
</div>
</html>
三、3D变形
3D多了z轴,遵循左手法则。
1. rotateX()rotateY() rotateZ()
<html>
<head>
<style>
div img {
transition: all 0.2s;
}
div:hover img {
transform: rotateX(180deg);
}
</style>
</head>
<body>
<div>
<img src="images/course.png" alt="">
</div>
</html>
2. 体会透视 perspective
- 透视原理:近大远小。
- 浏览器透视:把近大远小的所有图像,透视在屏幕上。
- perspective:视距,表示视点距离屏幕的长短。视点,用于模拟透视效果时人眼的位置
注:并非任何情况下需要透视效果,根据开发需要进行设置。
perspective一般作为一个属性,设置给父元素,作用于所有3D转换的子元素
<html>
<head>
<style>
div {
perspective: 1000px;
}
div img {
transition: all 0.2s;
}
div:hover img {
transform: rotateX(180deg);
}
</style>
</head>
<body>
<div>
<img src="images/course.png" alt="">
</div>
</html>
3. translateX() translateY() translateZ()
Z轴是物体到屏幕的距离,透视是一种展示形式。
<html>
<head>
<style>
div {
margin: 200px;
perspective: 1000px;
}
div img {
transition: all 0.2s;
}
div:hover img {
transform: translateZ(100px);
}
</style>
</head>
<body>
<div>
<img src="images/course.png" alt="">
</div>
</html>
transform: translate3d(x,y,z);
z轴只能是px单位。
<html>
<head>
<style>
div {
margin: 200px;
perspective: 1000px;
}
div img {
transition: all 0.2s;
}
div:hover img {
transform: translate3d(100px,100px,100px);
}
</style>
</head>
<body>
<div>
<img src="images/course.png" alt="">
</div>
</html>
4. 开门大吉例子
<html>
<head>
<style>
div {
width: 200px;
height: 180px;
margin: 200px;
background: url(images/course.png);
perspective: 1000px;
position: relative;
}
span {
display: block;
width: 100px;
height: 180px;
background-color: pink;
border: 1px solid black;
transition: all 0.2s;
}
span.door-l {
position: absolute;
top: 0;
left: 0;
transform-origin: left;
}
span.door-r {
position: absolute;
top: 0;
right: 0;
transform-origin: right;
}
div:hover .door-l {
transform: rotateY(-130deg);
}
div:hover .door-r {
transform: rotateY(130deg);
}
</style>
</head>
<body>
<div>
<span class="door-l"></span>
<span class="door-r"></span>
</div>
</html>
5. backface-visibility
用于设置图片不正向对着屏幕时是否可见。
可以用来写翻转图片,先translateY(180deg),当backface-visibility:hidden可以实现翻转时显示背面图片。
四、动画
animation: 动画名称 动画时间 运动曲线 何时开始 播放次数 是否反方向;
动画名称是自定义的
<html>
<head>
<style>
div {
width: 200px;
height: 180px;
margin: 200px;
background: url(images/course.png);
/*animation: name duration timing-function delay iteration-count direction fill-mode;*/
animation: go 2s ease 0s 2 reverse;
}
@keyframes go { /*定义动画*/
from{
transform: translate(0);
}
to{
transform: translate(600px);
}
}
</style>
</head>
<body>
<div>
</div>
</html>
例子:无缝滚动
<html>
<head>
<style>
* {
margin: 0;
padding: 0;
}
ul {
list-style: none;
}
nav {
width: 1200px;
height: 20px;
}
nav li {
float: left;
}
nav ul {
width: 200%; /*两倍!!!*/
animation: moving 2s linear infinite;
}
div {
width: 200px;
height: 20px;
}
@keyframes moving { /*定义动画*/
from{
transform: translate(0);
}
to{
transform: translate(-1000px);
}
}
nav:hover ul { /*鼠标经过nav,里面的ul不做动画*/
animation-play-state: paused ;
}
</style>
</head>
<body>
<nav>
<ul>
<li><div style="background-color: red;"></div></li>
<li><div style="background-color: orange;"></div></li>
<li><div style="background-color: yellow;"></div></li>
<li><div style="background-color: green;"></div></li>
<li><div style="background-color: blue;"></div></li>
<li><div style="background-color: purple;"></div></li>
<li><div style="background-color: red;"></div></li>
<li><div style="background-color: orange;"></div></li>
<li><div style="background-color: yellow;"></div></li>
<li><div style="background-color: green;"></div></li>
<li><div style="background-color: blue;"></div></li>
<li><div style="background-color: purple;"></div></li>
</ul>
</nav>
</html>