2D
transform
transform(转换)是css3新增的属性 能够实现元素的旋转 位移 缩放等成果
二维坐标系
2D转换是扭转元素在二维立体上形态和地位的一种技术
translate(位移)
注意事项
- 所谓的位移 是沿着x轴和Y轴挪动地位
- 不会影响到其它元素的地位
- 对行内元素有效
应用办法
- translate(x,y)
- translateX(n):针对X轴
- translateY(n):针对Y轴
- translate(50%,50%) 这里的百分比是依据本身宽度和高度进行挪动
<!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> * { margin: 0; padding: 0; } div { width: 200px; height: 200px; background-color: red; margin: 20px 100px; } div[class="box"] { background-color: blue; transform: translate(200px, 50px); } </style></head><body> <div class="box"></div> <div></div></body></html>
让盒子实现程度和垂直居中对齐
留神:盒子必须是块级元素和行内块元素。能够用tanslate实现,用定位和translate配合更佳
<!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 { position: relative; width: 600px; height: 600px; margin: 200px auto; background-color: red; } p { position: absolute; left: 50%; top: 50%; width: 200px; height: 200px; background-color: blue; transform: translate(-50%, -50%); } </style></head><body> <div> <p></p> </div></body></html>
旋转
注意事项
- 旋转的单位为deg
- 正值为顺时针旋转 负值为逆时针旋转
- 旋转的中心点为元素的中心点
<!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> * { margin: 0; padding: 0; } img { display: block; margin: 500px auto; border-radius: 20px; /* 过渡的成果 */ transition: all 2s linear 0s; } img:hover { /* 旋转180deg */ transform: rotate(180deg); } </style></head><body> <img src="./image/形象.jpg" alt=""></body></html>
三角形案例
<!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 { position: relative; width: 200px; height: 35px; border: 1px solid black; } /* 利用伪元素制作案例 */ .box::after { position: absolute; top: 9px; left: 175px; content: ''; width: 10px; height: 10px; border-right: 1px solid red; border-bottom: 1px solid red; transform: rotate(45deg); transition: all 2s linear 0s; } /* 鼠标通过div时旋转 */ .box:hover::after { transform: rotate(-135deg); } </style></head><body> <div class="box"></div></body></html>
扭转旋转中心点
transform-origin:x y
- x y之间用空格相隔开
- 默认的旋转中心点(50% 50%)
- 能够用像素或者方位名词示意
<!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 { width: 200px; height: 200px; background-color: red; margin: 200px auto; transition: all 6s linear 0s; /* 旋转中心点 左下角 */ transform-origin: left top; } .box:hover { transform: rotate(360deg); } </style></head><body> <div class="box"></div></body></html>
旋转案例
<!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> * { margin: 0; padding: 0; } .box { height: 400px; width: 400px; border: 1px solid red; margin: 200px auto; overflow: hidden; } .box::after { display: block; content: ""; width: 400px; height: 400px; background-color: red; transform-origin: right bottom; transform: rotate(90deg); transition: all 1s linear 0s; } .box:hover::after { transform: rotate(0deg); } </style></head><body> <div class="box"> </div></body></html>
缩放
scale(x,y)
注意事项
- scale(1,1) 宽高及放大1倍
- scale(2,3) 宽放大2倍 高放大3倍
- scale(5) 宽高都放大5倍
长处:能够设置旋转中心点,缩放的时候不会影响其它元素
<!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> * { margin: 0; padding: 0; } .box { width: 200px; height: 200px; background-color: blue; /* 应用过渡成果 */ transition: all 2s linear 0s; /* 让盒子居中对齐 */ margin: 200px auto; } .box:hover { /* 放大2.0倍 不会影响其它元素的地位 */ transform: scale(2); } </style></head><body> <div class="box"></div></body></html>
图片放大案例
<!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> /* img放大star */ * { margin: 0; padding: 0; } div { float: left; overflow: hidden; width: 450px; height: 288px; margin: 50px; } img { transition: all 2s linear 0s; } img:hover { transform: scale(2); } /* img放大 end */ </style> <body> <div><img src="./image/星空.jpg" alt=""></div> <div><img src="./image/星空.jpg" alt=""></div> <div><img src="./image/星空.jpg" alt=""></div> </body></html>
分页按钮案例
<!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> * { margin: 0; padding: 0; } .box { width: 800px; margin: 200px auto; } li { float: left; list-style: none; width: 30px; height: 30px; border: 1px solid #cccccc; border-radius: 50%; text-align: center; line-height: 30px; margin: 50px 20px; transition: all 3s linear 0s; } li:hover { transform: scale(2); } </style></head><body> <div class="box"> <ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> <li>7</li> <li>8</li> <div style="clear: both;"></div> </ul> </div></body></html>
2D综合写法
注意事项
- CSS 2D的属性能够简写
- transform:translate(x,y) rolate(n) scale(n) 依照这个程序来写,属性之间用空格相隔
- 位移放在最后面 切记不能扭转程序
<!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> * { margin: 0; padding: 0; } .box { width: 200px; height: 200px; background-color: blue; /* 设置过渡成果 */ transition: all 2s linear 0s; } .box:hover { /* 记住程序 先设置 *位移 再设置旋转 最初设置缩放*/ transform: translate(200px, 200px) rotate(200deg) scale(2); } </style></head><body> <div class="box"> </div></body></html>
动画
动画 相比于过渡 能够实现更多变动 更多管制 自动播放等
应用动画的步骤
- 先定义动画
- 再应用(调用)动画
- 定义动画应用@keyframes 0%是起始状态 100%是完结状态。
- 调用动画必须须要的两个属性 animation-name ainimation-duration(动画的持续时间)
<!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> * { margin: 0; padding: 0; } /* 定义动画 */ @keyframes move { 0% { transform: translate(0px, 0px); } 100% { /* 正告 :translate(x,y)要加逗号 */ transform: translate(1000px, 0px); background-color: blue; border-radius: 50%; } } .box { width: 200px; height: 200px; background-color: red; /* 动画的名字 */ animation-name: move; /* 动画的持续时间 */ animation-duration: 5s; } </style></head><body> <div class="box"></div></body></html>
动画的根本实现
注意事项
- form to等价于 0% 100%
- 实现更多细节能够用百分比来实现
<!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> @keyframes move { 0% { transform: translate(0, 0); } 25% { transform: translate(1600px, 0); } 50% { transform: translate(1600px, 800px); } 75% { transform: translate(0px, 800px); } 100% { transform: translate(0px, 0px); } } .box { width: 200px; height: 200px; border-radius: 50%; background-color: blue; animation-name: move; animation-duration: 5s; } </style></head><body> <div class="box"></div></body></html>
动画属性
<!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> * { margin: 0; padding: 0; } /* 定义动画 */ @keyframes move { 25% { transform: translate(1350px, 0px); } 50% { transform: translate(1350px, 600px); } 75% { transform: translate(0px, 600px); } 100% { transform: translate(0px, 0px); } } .pic-con { width: 450px; height: 288px; overflow: hidden; border-radius: 40px; margin: 10px; /* 应用动画 */ /* 动画名字 */ animation-name: move; /* 动画的持续时间 */ animation-duration: 4s; /* 动画的静止曲线 */ animation-timing-function: linear; /* 动画的提早 */ animation-delay: 0s; /* 动画的播放次数 */ animation-iteration-count: infinite; /* 是否反方向播放 */ animation-direction: alternate; /* 动画完结后放弃的状态 可省略*/ /* animation-fill-mode: forwards; */ } /* 鼠标挪动到此处 动画进行播放 */ .pic-con:hover { animation-play-state: paused; } </style></head><body> <div class="pic-con"> <img src="./image/星空.jpg" alt=""> </div></body></html>
注意事项 规定动画完结后的状态与动画的播放次数和是否反向播放有抵触
动画的简写
<!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> @keyframes move { 0% { transform: translate(0, 0); } 25% { transform: translate(1600px, 0); } 50% { transform: translate(1600px, 800px); } 75% { transform: translate(0px, 800px); } 100% { transform: translate(0px, 0px); } } .box { width: 200px; height: 200px; border-radius: 50%; background-color: blue; /* 动画的简写 */ animation: move 10s linear 0s infinite alternate; } </style></head><body> <div class="box"></div></body></html><!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> @keyframes move { 0% { transform: translate(0, 0); } 25% { transform: translate(1600px, 0); } 50% { transform: translate(1600px, 600px); } 75% { transform: translate(0px, 600px); } 100% { transform: translate(0px, 0px); } } .box { width: 200px; height: 200px; border-radius: 50%; background-color: blue; /* 动画的简写 */ animation: move 10s linear 0s infinite alternate; } .box:hover { animation-play-state: paused; } </style></head><body> <div class="box"></div></body></html>
热点图
思路:利用定位和动画可做出成果,必须确保向外扩散的波浪线位于核心地位,且用盒子暗影色彩代替背景色
留神:为什么不必scale呢,因为scale会把盒子的暗影放大,视觉会受到影响
<!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> * { margin: 0; padding: 0; } body { background-color: #333333; } .map { /* 应用定位 自绝父相 */ position: relative; width: 747px; height: 617px; background: url(./image/map.png) no-repeat; margin: 200px auto; } .city { position: absolute; top: 194px; left: 500px; width: 80px; height: 80px; } div.city1 { position: absolute; top: 460px; left: 606px; } div.city2 { position: absolute; top: 508px; left: 500px; } .circle { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 8px; height: 8px; background-color: blue; border-radius: 50%; } div[class^="wave"] { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 8px; height: 8px; box-shadow: 0px 0px 20px skyblue; border-radius: 50%; /* 应用动画 */ animation: move 2s linear 0s infinite; } .city .wave2 { /* 应用动画 */ animation: move 2s linear 10s infinite; } .city .wave3 { /* 应用动画 */ animation: move 2s linear 20s infinite; } /* 定义动画 */ @keyframes move { 50% { width: 40px; height: 40px; opacity: 1; } 100% { width: 80px; height: 80px; opacity: 0; } } </style></head><body> <div class="map"> <div class="city"> <div class="circle"></div> <div class="wave1"></div> <div class="wave2"></div> <div class="wave3"></div> </div> <div class="city city1"> <div class="circle"></div> <div class="wave1"></div> <div class="wave2"></div> <div class="wave3"></div> </div> <div class="city city2"> <div class="circle"></div> <div class="wave1"></div> <div class="wave2"></div> <div class="wave3"></div> </div> </div></body></html>
速度曲线详解
打字机成果
<!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> /* 思路:利用步长可实现打字机成果 */ * { margin: 0; padding: 0; } .box { width: 0px; height: 30px; /* 让文本强制一行显示 */ white-space: nowrap; /* 剪裁 */ overflow: hidden; font-size: 20px; background-color: pink; animation: move 2s steps(10) 0s infinite; } /* 定义动画 */ @keyframes move { 0% { width: 0px; } 100% { width: 280px; } } </style></head><body> <div class="box">大家好,我的名字叫做尧子陌</div></body></html>
奔跑的小熊
留神:背景图片和小熊的奔跑,用的是背景图片
<!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> * { margin: 0; padding: 0; } body { background: url(./image/形象.jpg) no-repeat fixed top center; background-size: cover; } .box { position: fixed; width: 200px; height: 100px; top: 50%; transform: translate(0px, -50px); background: url(./image/bear.png) no-repeat; animation: bear 0.4s steps(8) 0s infinite, move 3s forwards; } @keyframes bear { 0% { background-position: 0 0; } 100% { background-position: -1600px 0px; } } @keyframes move { 0% { left: 0; } 100% { left: 50%; transform: translateX(-50%); } } </style></head><body> <div class="box"> </div></body></html>