目錄
- 平面轉換
- 平移
- 旋轉
- 改變旋轉原點
- 多重轉換
- 縮放
- 傾斜
- 漸變
- 線性漸變
- 徑向漸變
- 空間轉換
- 平移
- 視距
- 旋轉
- 立體呈現
- 縮放
- 動畫
- 使現步驟
- animation 復合屬性
- animation 屬性拆分
- 逐幀動畫
- 多組動畫
平面轉換
作用:為元素添加動態效果,一般與過渡配合使用
概念:改變盒子在平面內的形態(位移、旋轉、縮放、傾斜)
平面轉換又叫 2D 轉換
屬性名:transform
代碼示例:
<!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{margin: 100px 0;width: 100px;height: 100px;background-color: #e08b8b;transition: all 1s;}div:hover{transform: translate(700px) rotate(360deg) scale(2) skew(360deg);}</style>
</head>
<body><div></div>
</body>
</html>
結果如下:
屏幕錄制 2025-03-13 153147
平移
屬性名:transform: translate(X軸移動距離, Y軸移動距離);
屬性值:
- 像素單位數值
- 百分比(參照盒子自身尺寸計算結果)
- 正負均可
代碼示例:
<!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>.father{width: 500px;height: 300px;margin: 100px auto;border: 1px solid black;}.son{width: 200px;height: 100px;background-color: antiquewhite;transition: all 0.5s;}.father:hover .son{transform: translate(150%,200%);}</style>
</head>
<body><div class="father"><div class="son"></div></div>
</body>
</html>
結果如下:
屏幕錄制 2025-03-13 154956
注意事項:
- translate() 只寫一個值,表示沿著 X 軸移動
- 單獨設置 X 或 Y 軸移動距離:translateX() 或 translateY()
旋轉
屬性名:transform: rotate(旋轉角度);
屬性值:
- 角度單位是 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>img{width: 200px;transition: all 1s;}img:hover{transform: rotate(360deg);}</style>
</head>
<body><img src="./img/3.jpg" alt="">
</body>
</html>
結果如下:
屏幕錄制 2025-03-13 162633
改變旋轉原點
默認情況下,旋轉遠點是盒子中心點
屬性名:transform-origin: 水平原點位置 垂直原點位置;
屬性值:
- 方位名稱(left、top、right、bottom、center)
- 像素單位數值
- 百分比
代碼示例:
<!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{width: 200px;transition: all 1s;transform-origin: right bottom;}img:hover{transform: rotate(360deg);}</style>
</head>
<body><img src="./img/3.jpg" alt="">
</body>
</html>
結果如下:
屏幕錄制 2025-03-13 163957
多重轉換
先平移再旋轉
屬性名:transform: translate() rotate();
代碼示例:
<!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{width: 1200px;height: 200px;border: 1px solid black;}img{width: 200px;transition: all 4s;}div:hover img{transform: translateX(500%) rotate(360deg);}</style>
</head>
<body><div><img src="./img/4.jpg" alt=""></div>
</body>
</html>
結果如下:
屏幕錄制 2025-03-13 165216
注意事項:
- 不能先旋轉再平移,因為旋轉會改變坐標軸向
- 復合屬性不能分開寫,否則后面的屬性會覆蓋前面的屬性
縮放
屬性名:
transform: scale(縮放倍數);
transform: scale(X軸縮放倍數, Y軸縮放倍數);
屬性值:
- 通常只為 scale() 設置一個值,表示 X 軸和 Y 軸等比例縮放
- 取值大于 1 表示放大,取值小于 1 表示縮小
代碼示例:
<!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{width: 200px;height: 143px;margin: 100px auto;}img{width: 200px;transition: all 4s;}div:hover img{transform: scale(2);}</style>
</head>
<body><div><img src="./img/4.png" alt=""></div>
</body>
</html>
結果如下:
屏幕錄制 2025-03-13 171831
傾斜
屬性名:transform: skew();
屬性值:
- 角度度數 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>div{width: 200px;height: 143px;margin: 100px auto;}img{width: 200px;transition: all 2s;}div:hover img{transform: skew(30deg)}</style>
</head>
<body><div><img src="./img/4.png" alt=""></div>
</body>
</html>
結果如下:
屏幕錄制 2025-03-13 174606
漸變
漸變是多個顏色逐漸變化的效果,一般用于設置盒子背景
線性漸變
屬性名:
background-image: linear-gradient(漸變方向,顏色1 終點位置,顏色2 終點位置,......
);
屬性值:
- 漸變方向:(可選)
- to 方位名詞
- 角度度數
- 終點位置:(可選)
- 百分比
代碼示例:
<!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{width: 200px;height: 200px;background-color: #a0adf7;background-image: linear-gradient(45deg, red,#f8a4a4,#a0adf7);}</style>
</head>
<body><div></div>
</body>
</html>
結果如下:
徑向漸變
作用:給按鈕添加高光效果
屬性名:
background-image: radial-gradient(半徑 at 圓心位置,顏色1 終點位置,顏色2 終點位置,......
);
屬性值:
- 半徑可以是兩條,則為橢圓
- 圓心位置取值:像素單位數值/百分比/方位名詞
代碼示例:
<!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{width: 100px;height: 100px;background-color: pink;border-radius: 50%;background-image: radial-gradient(50px at center center,red,pink);}button{width: 100px;height: 40px;background-color: purple;border: 0;border-radius: 5px;color: white;background-image: radial-gradient(30px at center center,rgba(255,255,255,0.2),transparent);}</style>
</head>
<body><div></div><button>按鈕</button>
</body>
</html>
結果如下:
空間轉換
空間:是從坐標軸角度定義的 X、Y 和 Z 三條坐標軸構成了一個立體空間,Z 軸與視線方向相同
空間轉換也叫 3D 轉換
屬性:transform
平移
屬性名:
transform: translate3d(x,y,z);
transform: translateX();
transform: translateY();
transform: translateZ();
屬性值:
- 像素單位數值
- 百分比(參照盒子自身尺寸計算結果)
代碼示例:
<!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;margin: 100px auto;background-color: pink;transition: all 0.5s;}.box:hover{transform: translate3d(100px,200px,300px);}</style>
</head>
<body><div class="box"></div>
</body>
</html>
結果如下:
屏幕錄制 2025-03-13 194159
注意事項:默認無法觀察 Z 軸平移效果
視距
作用:制定了觀察者與 z=0 平面的距離,為元素添加透視效果
透視效果:近大遠小、近實遠虛
屬性名:perspective: 視距;
屬性值:
- 添加給父級,取值范圍 800-1200
代碼示例:
<!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>.father{perspective: 1000px;}.son{width: 200px;height: 200px;margin: 100px auto;background-color: pink;transition: all 0.5;}.son:hover{transform: translateZ(-300px);}</style>
</head>
<body><div class="father"><div class="son"></div></div>
</body>
</html>
結果如下:
屏幕錄制 2025-03-13 195356
旋轉
屬性名:
transform: rotateZ()
沿著 Z 軸旋轉
transform: rotateX()
沿著 X 軸旋轉
transform: rotateY()
沿著 Y 軸旋轉
transform: rotate3d(x,y,z,角度度數);
x,y,z 取值為 0-1 之間的數字
代碼示例:
<!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{width: 300px;margin: 100px auto;perspective: 1000px;}img{width: 200px;transition: all 2s;}.d1 img:hover{transform: rotateZ(360deg);}.d2 img:hover{transform: rotateX(60deg);}.d3 img:hover{transform: rotateY(60deg);}</style>
</head>
<body><div class="d1"><img src="./img/3.jpg" alt=""></div><div class="d2"><img src="./img/1.png" alt=""></div><div class="d3"><img src="./img/2.png" alt=""></div>
</body>
</html>
結果如下:
屏幕錄制 2025-03-13 201450
左手法則
根據旋轉方向確定取值正負
左手握住旋轉軸,拇指指向正值方向,其他四個手指彎曲方向為旋轉正值方向
立體呈現
作用:設置元素的子元素是位于 3D 空間中還是平面中
屬性名:transform-style
屬性值:
- flat:子級處于平面中
- preserve-3d:子級處于 3D 空間中
呈現立體圖形步驟:
- 父元素添加
transform-style: preserve-3d;
- 子級定位
- 調整子盒子的位置(位移或旋轉)
<!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>.cube{position: relative;width: 200px;height: 200px;margin: 100px auto;/* background-color: pink; */transition: all 1s;transform-style: preserve-3d;}.cube div{position: absolute;left: 0;top: 0;width: 200px;height: 200px;}.front{background-color: orange;transform: translateZ(100px);}.back{background-color: green;transform: translateZ(-100px);}.cube:hover{transform: rotateY(90deg);}</style>
</head>
<body><div class="cube"><div class="front">前面</div><div class="back">后面</div></div>
</body>
</html>
結果如下:
屏幕錄制 2025-03-13 213518
縮放
屬性名:
transform: scale3d(x,y,z);
transform: scaleX();
transform: scaleY();
transform: scaleZ();
代碼示例:
<!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>.cube{position: relative;width: 200px;height: 200px;margin: 100px auto;/* background-color: pink; */transition: all 4s;transform-style: preserve-3d;transform: scale3d(1.5,2,3);}.cube div{position: absolute;left: 0;top: 0;width: 200px;height: 200px;}.front{background-color: orange;transform: translateZ(100px);}.back{background-color: green;transform: translateZ(-100px);}.cube:hover{transform: rotate3d(1,1,1,90deg);}</style>
</head>
<body><div class="cube"><div class="front">前面</div><div class="back">后面</div></div>
</body>
</html>
結果如下:
屏幕錄制 2025-03-13 220517
動畫
過渡:實現兩個狀態間的變化過程
動畫:實現多個動態間的變化過程,動畫過程可控(重復播放、最終畫面、是否暫停)
代碼示例:
<!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>.d1{width: 1000px;height: 200px;border: 1px solid black;}.d2{width: 200px;height: 200px;background-color: pink;animation: change 1s infinite alternate;}@keyframes change {0% {transform: translate(0);}100% {transform: translate(800px);}}</style>
</head>
<body><div class="d1"><div class="d2"></div></div>
</body>
</html>
結果如下:
屏幕錄制 2025-03-13 221903
使現步驟
定義動畫
- 兩個狀態
@keyframes 動畫名稱 {from {}to {}
}
- 多個狀態
@keyframes 動畫名稱 {0% {}10% {}......100% {}
}
使用動畫
animation: 動畫名稱 動畫花費時長;
代碼示例:
<!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{width: 200px;height: 200px;background-color: pink;animation: change 10s;}@keyframes change {0% {width: 200px;height: 200px;}25% {width: 400px;height: 200px;}75% {width: 400px;height: 400px;}100% {border-radius: 50%;}}</style>
</head>
<body><div></div>
</body>
</html>
結果如下:
屏幕錄制 2025-03-13 235715
animation 復合屬性
animation: 動畫名稱 動畫時長 速度曲線 延遲時間 重復次數 動畫方向 執行完畢時狀態;
- 速度曲線:
- linear:勻速運動
- steps():括號里填數字,表示分幾步完成動畫
- 重復次數:
- infinite:無限循環重復播放
- 動畫方向:
- alternate:反向執行
- 執行完畢時狀態:
- backwards:開始狀態
- forwards:結束狀態
代碼示例:
<!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: 100px;background-color: pink;animation: change 1s linear 1s 3 alternate forwards;}@keyframes change {from {width: 200px;}to {width: 800px;}}</style>
</head>
<body><div class="box"></div>
</body>
</html>
結果如下:
屏幕錄制 2025-03-14 002430
注意事項:
- 動畫名稱和動畫時長必須賦值
- 取值不分先后順序
- 如果有兩個時間值,第一個時間值表示動畫時長,第二個時間值表示延遲時間
animation 屬性拆分
屬性 | 作用 | 取值 |
---|---|---|
animation-name | 動畫名稱 | |
animation-duration | 動畫時長 | |
animation-delay | 延遲時間 | |
animation-fill-mode | 動畫執行完畢時狀態 | forwards:最后一幀狀態 backwards:第一幀狀態 |
animation-timing-function | 速度曲線 | steps (數字):逐幀動畫 |
animation-iteration-count | 重復次數 | infinite 為無限循環 |
animation-direction | 動畫執行方向 | alternate 為反向 |
animation-play-state | 暫停動畫 | paused 為暫停,通常配合:hover 使用 |
逐幀動畫
核心原理:
- steps() 逐幀動畫
- CSS 精靈圖
精靈動畫制作步驟:
- 準備顯示區域:盒子尺寸與一張精靈小圖尺寸相同
- 定義動畫:移動背景圖(移動距離 = 精靈圖寬度)
- 使用動畫:strps(N),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>div{width: 140px;height: 140px;border: 1px solid black;background-image: url(./img/01.png);animation: run 1s steps(12) infinite;}</style>
</head>
<body><div></div>
</body>
</html>
結果如下:
屏幕錄制 2025-03-14 144049
多組動畫
語法格式:
animation: 動畫1,動畫2,......
;
代碼示例:
<!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{width: 140px;height: 140px;/* border: 1px solid black; */background-image: url(./img/01.png);animation: run 1s steps(12) infinite,move 5s linear forwards;}@keyframes run {from {background-position: 0 0;} to {background-position: -1680px 0;}}@keyframes move {0% {transform: translate(0);}100% {transform: translate(800px);}}</style>
</head>
<body><div></div>
</body>
</html>
結果如下:
屏幕錄制 2025-03-14 144234