转换Transform
CSS3中的转换允许我们对元素进行==旋转、缩放、移动或倾斜==。它为分2D转换 或 3D 转换。
在css2时代,如果要做一些图片转换角度,都依赖于图片、Flash或JavaScript才能完成。但是==现在借助CSS3就可以轻松倾斜、缩放、移动以及翻转元素==。通过CSS变形,可以让元素生成静态视觉效果,但也可以很容易结合
CSS3的transition和动画的keyframe产生一些动画效果。
一、转换Transform 2D的属性
通常的属性包含了属性名和属性值,而CSS3的transform属性是用函数来定义的。Transform 2D函数包括了
translate()、scale()、rotate()和skew()。
书写格式:
transform:函数名(x轴值,y轴值);
转换的效果:
1.translate()移动
translate()方法,根据左(X轴)和顶部(Y轴)位置给定的参数,从当前元素位置移动。接受CSS的标准度量单位(px)
translate(x,y):转换,沿着X和Y轴移动元素。
如果使用的参数为百分比,那么这个百分比是相对于自身的大小的
鼠标放上去移动元素:
#box1{
width:200px;
height:200px;
margin:100px;
border:1px solid blue;
}
#box1:hover{
/*margin-top:105px 这样也可以实现一个单向移动的效果*/
/*水平和垂直方向移动函数:translate 一个参数,代表水平移动*/
/*transform: translate(-30px); !*向左移动30px*!*/
/*两个参数,代表斜着移动*/
transform:translate(30px,50px); /*向右30,向下50*/
}
向上移动并出现阴影:
#box2{
width:200px;
height:500px;
background: #fff;
border:1px solid #ccc;
margin: 100px auto;
}
#box2:hover{
transform: translate(0px,-10px);
box-shadow:0px 0px 5px 5px #f4f4f4;
}
2.rotate()旋转
通过 rotate() 方法,元素顺时针旋转给定的角度。允许负值,元素将逆时针旋转。它以deg为单位,代表了旋转
的角度。正为顺时针,负为逆时针。
#box2:hover{
/*旋转*/
/* 支持一个参数,指旋转角度 单位 deg*/
transform:rotate(20deg);
}
3.scale()放缩
通过值把宽和高转换为原始尺寸的n倍,接受两个参数,前面的为宽,后面的为高。(实现放大效果)
可取值:默认值为1
缩小:0-1之间的数
放大:大于1的数
#box2:hover{
/*缩放*/
/*
支持两个参数,代表水平方向和垂直方向的缩放
也支持一个参数,水平和垂直等于一个值
*/
transform:scale(0.5,1.2); /*变窄、变长*/
/*transform:scale(1.2);*/
}
4.skew()翻转
根据水平轴和垂直轴翻转,接受两个或一个值,两个值时前面为水平,后面为垂直的角度 ,一个值只是水平轴
的角度。此函数是指元素的倾斜角度。
有一个类似立体的效果
#box4:hover{
/*倾斜*/
transform:skew(40deg,30deg);
}
2D的实例:
注:p标签与span标签区别只在于display,一个是block,一个是inline.,一个换行、一个不换行
#box3{
width:650px;
height:112px;
border:1px solid #ccc;
background: url("./img/javajb.png") no-repeat;
margin: 100px auto;
transition:all 1s; /*这个属性可以实现平滑放大的效果*/
}
#box3>div{
/*border:1px solid red;*/
float:left;
margin-left: 25px;
margin-top: 10px;
}
#box3:hover{
transform: scale(1.2);
}
二、转换Transform 3D的属性
1.Transform 3D常用函数
2.使元素延Z轴移动
要在父类元素中加:perspective 透视的深度(呈现出是伪3D效果),才会显示出移动的效果,因为要透视过去才能看到,不然是被盖住的
perspective: 400px;
#parent{
width: 200px;
height: 200px;
background: pink;
margin:100px auto;
/*perspective 透视的深度(呈现出是伪3D效果)*/
perspective: 400px;
}
#son{
width:100%;
height:100%;
background: blue;
/*Z轴移动*/
transform: translateZ(-100px);
/*transform:translate3d(-10px,-10px,-100px);*/
}
3.使元素呈现由内及外的放大效果
注: perspective属性也可以写在本元素中的transform后面,perspective(400px)
#son{
width:100%;
height:100%;
background: blue;
/*Z轴移动*/
transform: translateZ(-100px);
/*transform:translate3d(-10px,-10px,-100px);*/
transition: all 3s; /*延缓时间,圆滑的效果*/
}
#son:hover{
transform: perspective(400px) scaleZ(1);
}
4.使元素呈现旋转的效果
注: perspective属性也可以写在body中
deg是旋转的角度
body{
perspective: 400px;
}
img{
transition: all 3s;
}
img:hover{
transform: rotateX(180deg);
/*transform: rotateZ(180deg);*/
}
案例:伪类+transform+transition 实现导航栏下划线从中间放缩的效果
<!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>css导航下划线动画效果</title>
</head>
<style>
.items {
display: flex
}
.item {
width: 100px;
height: 60px;
text-align: center;
line-height: 60px;
background-color: black;
color: white;
position: relative;
}
.item:before { /*由于有绝对定位,所以before和after效果一样!*/
content: '';
height: 4px;
background-color: #BADFED;
width: 100%;
position: absolute;
left: 0;
bottom: 0;
transform: scaleX(0);
transition: .3s;
}
.item:hover:before { /*注:hover:before中间不能有空格*/
transform: scaleX(1);
}
</style>
<body>
<div class="items">
<div class="item">因为</div>
<div class="item">所以</div>
<div class="item">无所谓</div>
</div>
</body>
</html>