一、简介
转换(transform)是CSS3中具有颠覆性的特征之一,可以实现元素的位移、旋转、缩放等效果
- 移动:translate
- 旋转:rotate
- 缩放:scale
转换(transform)你可以简单理解为变形
二、二维坐标系
2D转换是改变标签在二维平面上的位置和形状的一种技术,先来学习二维坐标系
三、2D转换之移动translate
1、简介
2D移动是2D转换里面的一种功能,可以改变元素在页面中的位置,类似定位。
2、语法
transform: translate(x,y); 或者分开写
transform: translateX(n);
transform: translateY(n);
3、注意
- 定义 2D 转换中的移动,沿着 X 和 Y 轴移动元素
- translate最大的优点:不会影响到其他元素的位置
- translate中的百分比单位是相对于自身元素的 translate:(50%,50%);
- 对行内标签没有效果
4、demo案例
<!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>Document</title>
<style>
/* 移动盒子位置的三种方法:
1、定位
2、盒子的外边距
3、2d转换移动 */
div{
width: 200px;
height: 200px;
}
div:nth-of-type(1){
background-color: #ccc;
/* x就是x轴上移动位置 y 就是y轴上移动位置 中间用逗号分隔*/
/* transform: translate(x, y); */
/* transform: translate(100px, 100px); */
/* 1. 我们如果只移动x坐标 */
/* transform: translate(100px, 0); */
/* transform: translateX(100px); */
/* 2. 我们如果只移动y坐标 */
/* transform: translate(0, 100px); */
/* transform: translateY(100px); */
transform: translate(100px,100px);
}
div:nth-of-type(2){
background-color: green;
}
</style>
</head>
<body>
<div></div>
<div></div>
</body>
</html>
效果:
5、盒子实现水平居中和垂直居中案例
<!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>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
div{
position: relative;
width: 500px;
height: 500px;
background-color: #ccc;
margin: 100px auto;
}
p{
position: absolute;
top: 50%;
left: 50%;
width: 100px;
height: 100px;
background-color: green;
/* 方法1:让外边距向左偏移自身宽度和高度的一半 */
/* margin-left: -50px;
margin-top: -50px; */
/* 方法2:使用2d转换的移动功能 */
/* translate中的百分比单位是相对于自身元素的 translate:(50%,50%); */
transform: translate(-50%,-50%);
}
</style>
</head>
<body>
<div>
<p></p>
</div>
</body>
</html>
效果:
四、2D转换之旋转rotate
1、简介
2D旋转指的是让元素在2维平面内顺时针旋转或者逆时针旋转。
2、语法
transform:rotate(度数)
3、注意
- rotate里面跟度数, 单位是 deg 比如 rotate(45deg) , deg的全称为degree 美 [dɪˈɡriː] 意思是度数
- 角度为正时,顺时针,负时,为逆时针
- 默认旋转的中心点是元素的中心点
4、案例1
<!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>Document</title>
<style>
div{
width: 500px;
height: 500px;
margin: 100px auto;
}
div img{
width: 100%;
height: 100%;
border-radius: 50%;
border: 5px solid #ccc;
/* 过渡写到本身上,谁做动画给谁加 */
transition: all 2s;
}
div img:hover{
/* 顺时针旋转45度 */
transform: rotate(45deg);
}
</style>
</head>
<body>
<div>
<img src="./media/pic.jpg" alt="">
</div>
</body>
</html>
效果:
5、案例2:利用2d转换之旋转制作CSS三角
<!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>Document</title>
<style>
div{
position: relative;
width: 500px;
height: 100px;
border: 4px solid #ccc;
margin: 100px auto;
}
div::after{
position: absolute;
top: 30px;
right: 50px;
content: '';
width: 10px;
height: 10px;
border-right: 2px solid #ccc;
border-bottom: 2px solid #ccc;
/* 将右边框和下边框旋转45度 */
transform: rotate(45deg);
}
</style>
</head>
<body>
<div>
</div>
</body>
</html>
效果:
五、2D转换之中心点transform-origin
1、简介
我们可以设置元素转换的中心点
2、语法
transform-origin: x y;
3、注意
- 注意后面的参数 x 和 y 用空格隔开
- x y 默认转换的中心点是元素的中心点 (50% 50%)
- 还可以给x y 设置 像素 或者 方位名词 (top bottom left right center)
4、案例1
<!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>Document</title>
<style>
div{
width: 200px;
height: 200px;
background-color: #ccc;
margin: 100px auto;
/* 设置过渡动画 */
transition: all 2s;
/* 1.可以跟方位名词 */
/* transform-origin: left bottom; */
/* 2. 默认的是 50% 50% 等价于 center center */
/* 3. 可以是px 像素 */
/* 把中心点设置在左下角 */
/* 等价于transform-origin: left bottom; */
transform-origin: 0px 200px;
}
div:hover{
transform: rotate(360deg);
}
</style>
</head>
<body>
<div></div>
</body>
</html>
效果:
这里需要注意的是,transform-origin: 0px 200px;
这条语句正确的做法是放到本身标签上,如果放到div:hover
上,会有意向不到的效果,可以自己去试试。
5、案例2
<!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>Document</title>
<style>
div{
width: 300px;
height: 300px;
border: 1px solid #ccc;
margin: 100px auto;
overflow: hidden;
}
div::before{
display: block;
width: 100%;
height: 100%;
background-color: green;
content: '';
transform: rotate(90deg);
transform-origin: left bottom;
transition: all 3s;
}
/* 鼠标经过div 里面的before 复原 */
div:hover::before{
transform: rotate(0deg);
}
</style>
</head>
<body>
<div></div>
</body>
</html>
效果:
六、2D转换之缩放scale
1、简介
缩放,顾名思义,可以放大和缩小。 只要给元素添加上了这个属性就能控制它放大还是缩小。
2、语法
transform:scale(x,y);
3、注意
- 注意其中的x和y用逗号分隔
- transform:scale(1,1) :宽和高都放大一倍,相当于没有放大
- transform:scale(2,2) :宽和高都放大了2倍
- transform:scale(2) :只写一个参数,第二个参数则和第一个参数一样,相当于 scale(2,2)
- transform:scale(0.5,0.5):缩小
- scale缩放最大的优势:可以设置转换中心点缩放,默认以中心点缩放的,而且不影响其他盒子
4、案例1
<!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>Document</title>
<style>
div{
width: 100px;
height: 100px;
background-color: #ccc;
margin: 100px auto;
/* 过渡 */
transition: all 2s;
/* 还可以设置中心点进行缩放 左下角位置为中心点 */
/* transform-origin: left bottom; */
}
div:hover{
/* 1. 里面写的数字不跟单位 就是倍数的意思 1 就是1倍 2就是 2倍 */
/* transform: scale(x, y); */
/* transform: scale(2, 2); */
/* 2. 修改了宽度为原来的2倍 高度 不变 */
/* transform: scale(2, 1); */
/* 3. 等比例缩放 同时修改宽度和高度,我们有简单的写法 以下是 宽度修改了2倍,高度默认和第一个参数一样*/
/* transform: scale(2); */
/* 4. 我们可以进行缩小 小于1 就是缩放 */
/* transform: scale(0.5, 0.5); */
/* transform: scale(0.5); */
/* 5. scale 的优势之处: 不会影响其他的盒子 而且可以设置缩放的中心点*/
transform: scale(2);
}
</style>
</head>
<body>
<div></div>
</body>
</html>
效果:
5、案例2:图片放大
<!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>Document</title>
<style>
*{
padding: 0;
margin: 0;
}
div{
/* 超出部分隐藏 */
overflow: hidden;
width: 225px;
height: 137px;
float: left;
border: 1px solid #ccc;
}
div img{
width: 100%;
height: 100%;
/* 添加过渡效果 */
transition: all 3s;
}
div img:hover{
transform: scale(2);
}
</style>
</head>
<body>
<div><img src="./media/scale.jpg" alt=""></div>
<div><img src="./media/scale.jpg" alt=""></div>
<div><img src="./media/scale.jpg" alt=""></div>
</body>
</html>
效果:
6、案例3:分页按钮放大
<!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>Document</title>
<style>
ul{
margin: 100px auto;
}
ul li{
float: left;
width: 50px;
height: 50px;
line-height: 50px;
text-align: center;
border: 1px solid #ccc;
border-radius: 50%;
list-style: none;
margin-right: 10px;
cursor: pointer;
/* 过渡 */
transition: all .5s;
}
ul li:hover{
transform: scale(1.2);
}
</style>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
</ul>
</body>
</html>
效果:
七、2D转换之综合写法
- 同时使用多个转换,其格式为:
transform: translate() rotate() scale() ...
等, - 其顺序会影转换的效果。(先旋转会改变坐标轴方向)
- 当我们同时有位移和其他属性的时候,记得要将位移放到最前
案例:
<!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>Document</title>
<style>
div{
width: 200px;
height: 200px;
line-height: 200px;
text-align: center;
background-color: #ccc;
margin: 100px auto;
transition: all 2s;
}
div:hover{
/* 我们同时有位移和其他属性,我们需要把位移放到最前面 */
transform: translate(100px,50px) rotate(90deg) scale(1.5);
}
</style>
</head>
<body>
<div>小何</div>
</body>
</html>
效果:
八、2D转换总结
- 转换transform 我们简单理解就是变形 有2D 和 3D 之分
- 我们暂且学了三个 分别是 位移 旋转 和 缩放
- 2D 移动 translate(x, y) 最大的优势是不影响其他盒子, 里面参数用%,是相对于自身宽度和高度来计算的
- 可以分开写比如 translateX(x) 和 translateY(y)
- 2D 旋转 rotate(度数) 可以实现旋转元素 度数的单位是deg
- 2D 缩放 sacle(x,y) 里面参数是数字 不跟单位 可以是小数 最大的优势 不影响其他盒子
- 设置转换中心点 transform-origin : x y; 参数可以百分比、像素或者是方位名词
- 当我们进行综合写法,同时有位移和其他属性的时候,记得要将位移放到最前