文章目录
CSS3
转换可以对元素进行移动、缩放、转动、拉长或拉伸。我们将结合过渡功能对
CSS3
的
2D
、
3D
转换进行学习。
2D
转换3D
转换
1、转换属性
转换有下列属性:
transform
: 将2D
或3D
转换应用到元素上去。transform-origin
:可以改变被转换元素的位置。transform-style
:规定被嵌套元素如何在3D
空间中显示。perspective:
规定3D
元素的透视效果,与perspective-origin
结合使用,可以改变3D
元素的底部位置,在实现一些3D
效果,这一项是必不可少的。perspective-origin
:规定3D
元素的底部位置。backface-visibility
:定义元素在不面对屏幕时是否可见。
transform-origin
transform-origin: x-axis y-axis z-axis;
/*
x-axis:定义视图在 X 轴的位置,left | center | right | length | %
y-axis:定义视图在 Y 轴的位置,top | center | bottom | length | %
z-axis:定义视图在 Z 轴的位置,length
*/
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
.div1 {
width: 300px;
height: 300px;
margin: 200px;
border: 2px solid;
text-align: center;
}
.div1 div {
width: 300px;
height: 300px;
background: lightgreen;
/*transform: 将 2D 或 3D 转换应用到元素上去*/
transform: rotate(45deg);
}
.transform-origin div {
/*transform-origin: x-axis y-axis z-axis;*/
transform-origin: 10% 10%;
}
</style>
</head>
<body>
<div class="div1">
<div>变换基点在默认位置</div>
</div>
<div class="div1 transform-origin">
<div>变换基点在 10% 10% 位置</div>
</div>
</body>
可以看到两个变换的基点有了明显的不同,第二个将变换基点设置到 10% 10%
的位置,变换也出现了不同。
transform-style
规定被嵌套元素如何在 3D 空间中显示
transform-style: flat | preserved-3d;
/*
flat:子元素将不保留 3D 位置
preserved-3d:子元素将保留 3D 位置
在实现一些 3D 效果的时候,一般都要声明为 preserved-3d
*/
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
.div1 {
width: 200px;
height: 200px;
border: 1px solid #bbb;
margin: 100px;
/* 在父元素中设置transform-style: preserve-3d; */
/*flat:子元素将不保留 3D 位置
preserved-3d:子元素将保留 3D 位置
在实现一些 3D 效果的时候,一般都要声明为 preserved-3d*/
transform-style: preserve-3d;
transform: perspective(600px);
}
.div1 div {
width: 200px;
height: 200px;
background: lightgreen;
transform: rotateX(60deg);
}
.div2 {
width: 200px;
height: 200px;
border: 1px solid #bbb;
margin: 100px;
/* 在父元素中设置transform-style: flat; */
transform-style: flat;
transform: perspective(600px);
}
.div2 div {
width: 200px;
height: 200px;
background: lightgreen;
transform: rotateX(60deg);
}
</style>
</head>
<body>
<div class="div1">
<div></div>
</div>
<div class="div2">
<div></div>
</div>
</body>
可以看到,div1
和 div2
除了 transform-style
属性之外,其它完全相同,一个保留了 3d
效果,一个未保留 3d
效果。
perspective
规定 3D 元素的透视效果,与 perspective-origin 结合使用,可以改变 3D 元素的底部位置,在实现一些 3D 效果,这一项是必不可少的。
perspective: number | none;
/*
number:单位 px,元素距离视图的距离
none:默认值,0,无透视
*/
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
.div1 {
width: 300px;
height: 300px;
margin: 50px;
border: 1px solid #bbb;
}
.div1 div {
width: 100%;
height: 100%;
background: lightgreen;
/*perspective:规定 3D 元素的透视效果,与 perspective-origin 结合使用,
可以改变 3D 元素的底部位置,在实现一些 3D 效果,这一项是必不可少的。
number:单位 px,元素距离视图的距离
none:默认值,0,无透视
*/
transform: perspective(600px) rotateY(45deg);
/*设置了透视和变换方式*/
}
</style>
</head>
<body>
<div class="div1">
<div></div>
</div>
</body>
perspective-origin
规定 3D 元素的底部位置
perspective-origin: x-axis y-axis;
/*
x-axis:定义该视图在 X 轴上的位置。默认为 50%。left|center|right|length|%
y-axis:定义该视图在 Y 轴上的位置。默认为 50%。top|center|bottom|length|%
将透视聚集点改变到其他位置。
*/
backface-visibility
定义元素在不面对屏幕时是否可见
backface-visibility: visible|hidden;
/*
visible:背面可见
hidden:背面不可见
*/
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
div {
width: 200px;
height: 200px;
background: lightgreen;
transform: rotateY(180deg);
/* 将 div 元素都翻转 180deg,翻转到背面 */
}
.div1 {
backface-visibility: hidden;
}
.div2 {
backface-visibility: visible;
}
</style>
</head>
<body>
<div class="div1">div1 backface-visibility: hidden;</div>
<div class="div2">div2 backface-visibility: visible;</div>
</body>
可以看到,两个 div
块在翻转后都是背面朝向我们,当我们设置 div1
的 backface-visibility: hidden
时,div1
就不可见了,只有 div2
是可见的。
2、2D转换
2D 转换有以下几种常用方法(transform
属性下的函数):
translate(x,y)
:平移,x
为x
轴上的平移,y
为y
轴上的平移,根据原始位置的x
、y
轴位置,分别偏离x
、y
的距离。
{
transform: translate(50px,100px);
-ms-transform: translate(50px,100px); /* IE 9 */
-webkit-transform: translate(50px,100px); /* Safari and Chrome */
}
另外两种⽅法:
(1)translateX(x)
元素仅在⽔平⽅向位移
(2)translateY(y)
元素仅在垂直⽅向位移
translateX(x)
和translateY(y)
同时使用,不会同时生效,后面的会覆盖掉前面的。
rotate(angle)
:根据给定的angle 大小旋转,正度数表示顺时针旋转,angle
为负,则逆时针旋转。
{
transform: rotate(30deg);
-ms-transform: rotate(30deg); /* IE 9 */
-webkit-transform: rotate(30deg); /* Safari and Chrome */
}
scale(x,y)
:将元素根据中⼼原点进⾏缩放,根据x
、y
的值,对应的放大宽度和高度。
{
-ms-transform:scale(2,3); /* IE 9 */
-webkit-transform: scale(2,3); /* Safari */
transform: scale(2,3); /* 标准语法 */
}
另外两种⽅法:
(1) scaleX(x)
元素仅在⽔平⽅向上缩放(x
轴缩放)
(2) scaleY(y)
元素仅在垂直⽅向上缩放(y
轴缩放)
skew(<angle> [,<angle>])
:包含两个参数值,分别表示X轴和Y轴倾斜的⻆度,如果第⼆个参数为空,则默认为0,参数为负表示向相反⽅向倾斜。
{
transform: skew(30deg,20deg);
-ms-transform: skew(30deg,20deg); /* IE 9 */
-webkit-transform: skew(30deg,20deg); /* Safari and Chrome */
}
(1)skewX(< angle>)
:表示只在X
轴(⽔平⽅向)倾斜。
(2)skewY(< angle>)
:表示只在Y
轴(垂直⽅向)倾斜。
matrix()
:matrix
变换涉及到了线性代数的知识,在此不作讲述。感兴趣的同学可以自行了解。
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
.div1 {
margin: 50px;
width: 200px;
height: 200px;
background-color: lightgreen;
opacity: 0.5;
transition: 2s;
}
.div1:hover {
transform: translate(30px, 40px);
/*根据原始位置的 x 、y 轴位置,分别偏离 x 、y 的距离。*/
/*translate(x,y)*/
opacity: 1;
}
.div2 {
margin: 50px;
width: 200px;
height: 200px;
background-color: cyan;
opacity: 0.5;
transition: 2s;
}
.div2:hover {
transform: rotate(180deg);
/*rotate(angle)*/
/*:根据给定的 angle 大小,顺时针旋转,如果 angle 为负,则逆时针旋转。*/
opacity: 1;
}
.div3 {
margin: 50px;
width: 200px;
height: 200px;
background-color: orange;
opacity: 0.5;
transition: 2s;
}
.div3:hover {
transform: skew(20deg, 30deg);
/*skew(angle,angle)*/
/*根据给定的两个角度,分别在水平方向和垂直方向倾斜,第二个角度默认为 0 。*/
opacity: 1;
}
</style>
</head>
<body>
<div class="div1">div1</div>
<div class="div2">div2</div>
<div class="div3">div3</div>
</body>
把鼠标移动到矩形上,观察效果。
3、3D 转换
3D
转换语法与 2D
转换语法较为类似
translate3d(x,y,z)
:定义3D
转化,给出三个值,分别应用于三个坐标轴上translateX(x)
:定义3D
转化,仅用于X
轴translateY(y)
:定义3D
转化,仅用于Y
轴translateZ(z)
:定义3D
转化,仅用于Z
轴 ,在z
轴上的平移,z
轴为⾯向屏幕的这个⽅向
perspective
:定义3D
转换元素的透视视图
-
scale3d(x,y,z)
:定义3D
缩放转换 -
scaleX(x)
:定义3D
缩放转换,仅用于X
轴 -
scaleY(y)
:定义3D
缩放转换,仅用于Y
轴 -
scaleZ(z)
:定义3D
缩放转换,仅用于 Z 轴 -
rotate3d(x,y,z,angle)
:定义3D
旋转 -
rotateX(angle)
:定义沿X
轴的3D
旋转
{
transform: rotateX(180deg);
-webkit-transform: rotateX(180deg); /* Safari 与 Chrome */
}
rotateY(angle)
:定义沿Y
轴的3D
旋转
{
transform: rotateY(180deg);
-webkit-transform: rotateY(180deg); /* Safari 与 Chrome */
}
rotateZ(angle)
:定义沿Z
轴的3D
旋转
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
.div1 {
margin: 50px;
width: 200px;
height: 200px;
background-color: lightgreen;
opacity: 0.5;
transition: 2s;
}
.div1:hover {
/*X 轴旋转*/
transform: rotateX(180deg);
opacity: 1;
}
.div2 {
margin: 50px;
width: 200px;
height: 200px;
background-color: cyan;
opacity: 0.5;
transition: 2s;
}
.div2:hover {
/*Y 轴伸缩*/
transform: scaleY(2);
opacity: 1;
}
.div3 {
margin: 50px;
width: 200px;
height: 200px;
background-color: orange;
opacity: 0.5;
transition: 2s;
}
.div3:hover {
/*X 轴移动*/
transform: translateX(50%);
opacity: 1;
}
</style>
</head>
<body>
<div class="div1">div1</div>
<div class="div2">div2</div>
<div class="div3">div3</div>
</body>
把鼠标移动到盒子上,观察效果。