### 變形--旋轉 rotate()
旋轉`rotate()`函數通過指定的角度參數使元素相對原點進行旋轉。它主要在二維空間內進行操作,設置一個角度值,用來指定旋轉的幅度。如果這個值為正值,元素相對原點中心順時針旋轉;如果這個值為負值,元素相對原點中心逆時針旋轉。
html代碼:
```html
<div class="wrapper">
<div></div>
</div>
```
CSS代碼:
```css
.wrapper {
width: 200px;
height: 200px;
border: 1px dotted red;
margin: 100px auto;
}
.wrapper div {
width: 200px;
height: 200px;
background: orange;
-webkit-transform: rotate(45deg);
transform: rotate(45deg);
}
```
### 變形--扭曲 skew()
扭曲`skew()`函數能夠讓元素傾斜顯示。它可以將一個對象以其中心位置圍繞著X軸和Y軸按照一定的角度傾斜。這與`rotate()`函數的旋轉不同,`rotate()`函數只是旋轉,而不會改變元素的形狀。`skew()`函數不會旋轉,而只會改變元素的形狀。
`Skew()`具有三種情況:
1. `skew(x,y)`使元素在水平和垂直方向同時扭曲(X軸和Y軸同時按一定的角度值進行扭曲變形), 第一個參數對應X軸,第二個參數對應Y軸。如果第二個參數未提供,則值為0,也就是Y軸方向上無斜切。
2. `skewX(x)`僅使元素在水平方向扭曲變形(X軸扭曲變形)
3. `skewY(y)`僅使元素在垂直方向扭曲變形(Y軸扭曲變形)
html代碼:
```html
<div class="wrapper">
<div>我變成平形四邊形</div>
</div>
```
CSS代碼:
```css
.wrapper {
width: 300px;
height: 100px;
border: 2px dotted red;
margin: 30px auto;
}
.wrapper div {
width: 300px;
height: 100px;
line-height: 100px;
text-align: center;
color: #fff;
background: orange;
-webkit-transform: skew(45deg);
-moz-transform:skew(45deg);
transform:skew(45deg);
}
```
### 變形--縮放 scale()
縮放`scale()`函數 讓元素根據中心原點對對象進行縮放。
縮放 `scale` 具有三種情況:
1. `scale(X,Y)`使元素水平方向和垂直方向同時縮放(也就是X軸和Y軸同時縮放)
```css
div:hover {
-webkit-transform: scale(1.5,0.5);
-moz-transform:scale(1.5,0.5)
transform: scale(1.5,0.5);
}
```
注意:Y是一個可選參數,如果沒有設置Y值,則表示X,Y兩個方向的縮放倍數是一樣的。
2. `scaleX(x)`元素僅水平方向縮放(X軸縮放)
3. `scaleY(y)`元素僅垂直方向縮放(Y軸縮放)
html代碼:
```html
<div class="wrapper">
<div>我將放大1.5倍</div>
</div>
```
CSS代碼:
```css
.wrapper {
width: 200px;
height: 200px;
border:2px dashed red;
margin: 100px auto;
}
.wrapper div {
width: 200px;
height: 200px;
line-height: 200px;
background: orange;
text-align: center;
color: #fff;
}
.wrapper div:hover {
opacity: .5;
-webkit-transform: scale(1.5);
-moz-transform:scale(1.5)
transform: scale(1.5);
}
```
### 變形--位移 translate()
`translate()`函數可以將元素向指定的方向移動,類似于`position`中的`relative`, 或以簡單的理解為,使用`translate()`函數,可以把元素從原來的位置移動,而不影響在X、Y軸上的任何Web組件。
`translate`我們分為三種情況:
1. `translate(x,y)`水平方向和垂直方向同時移動(也就是X軸和Y軸同時移動)
2. `translateX(x)`僅水平方向移動(X軸移動)
3. `translateY(Y)`僅垂直方向移動(Y軸移動)
html代碼:
```html
<div class="wrapper">
<div>我向右向下移動</div>
</div>
```
CSS代碼:
```css
.wrapper {
width: 200px;
height: 200px;
border: 2px dotted red;
margin: 20px auto;
}
.wrapper div {
width: 200px;
height: 200px;
line-height: 200px;
text-align: center;
background: orange;
color: #fff;
-webkit-transform: translate(50px,100px);
-moz-transform:translate(50px,100px);
transform: translate(50px,100px);
}
```
### 變形--矩陣 matrix()
`matrix()` 是一個含六個值的(a,b,c,d,e,f)變換矩陣,用來指定一個2D變換,相當于直接應用一個[a b c d e f]變換矩陣。就是基于水平方向(X軸)和垂直方向(Y軸)重新定位元素
html代碼:
```html
<div class="wrapper">
<div></div>
</div>
```
CSS代碼:
```css
.wrapper {
width: 300px;
height: 200px;
border: 2px dotted red;
margin: 40px auto;
}
.wrapper div {
width:300px;
height: 200px;
background: orange;
-webkit-transform: matrix(1,0,0,1,50,50);
-moz-transform:matrix(1,0,0,1,50,50);
transform: matrix(1,0,0,1,50,50);
}
```
### 變形--原點 transform-origin
任何一個元素都有一個中心點,默認情況之下,其中心點是居于元素X軸和Y軸的50%處
在沒有重置`transform-origin`改變元素原點位置的情況下,CSS變形進行的旋轉、位移、縮放,扭曲等操作都是以元素自己中心位置進行變形。但很多時候,我們可以通過`transform-origin`來對元素進行原點位置改變,使元素原點不在元素的中心位置,以達到需要的原點位置。
`transform-origin`取值和元素設置背景中的`background-position`取值類似
關鍵詞|百分比
---|---
top = top center = center top|50% 0
right = right center = center right|100%或(100% 50%)
bottom = bottom center = center bottom|50% 100%
left = left center = center left|0或(0 50%)
center = center center|50%或(50% 50%)
top left = left top|0 0
right top|top right|100% 0
bottom right|right bottom|100% 100%
bottom left = left bottom|0 100%
示例展示:通過`transform-origin`改變元素原點到左上角,然后進行順時旋轉45度
html代碼:
```html
<div class="wrapper">
<div>原點在默認位置處</div>
</div>
<div class="wrapper transform-origin">
<div>原點重置到左上角</div>
</div>
```
CSS代碼:
```css
.wrapper {
width: 300px;
height: 300px;
float: left;
margin: 100px;
border: 2px dotted red;
line-height: 300px;
text-align: center;
}
.wrapper div {
background: orange;
-webkit-transform: rotate(45deg);
transform: rotate(45deg);
}
.transform-origin div {
-webkit-transform-origin: left top;
transform-origin: left top;
}
```
### 動畫--過渡屬性 transition-property
早期在Web中要實現動畫效果,都是依賴于JavaScript或Flash來完成。但在CSS3中新增加了一個新的模塊`transition`,它可以通過一些簡單的CSS事件來觸發元素的外觀變化,讓效果顯得更加細膩。簡單點說,就是通過鼠標的單擊、獲得焦點,被點擊或對元素任何改變中觸發,并平滑地以動畫效果改變CSS的屬性值。
在CSS中創建簡單的過渡效果可以從以下幾個步驟來實現:
1. 在默認樣式中聲明元素的初始狀態樣式;
2. 聲明過渡元素最終狀態樣式,比如懸浮狀態;
3. 在默認樣式中通過添加過渡函數,添加一些不同的樣式。
CSS3的過度`transition`屬性是一個復合屬性,主要包括以下幾個子屬性:
* `transition-property`:指定過渡或動態模擬的CSS屬性
* `transition-duration`:指定完成過渡所需的時間
* `transition-timing-function`:指定過渡函數
* `transition-delay`:指定開始出現的延遲時間
先來看`transition-property`屬性
`transition-property`用來指定過渡動畫的CSS屬性名稱,而這個過渡屬性只有具備一個中點值的屬性(需要產生動畫的屬性)才能具備過渡效果,其對應具有過渡的CSS屬性主要有:
* `background-color`
* `background-position`
* `border-bottom-color`
* `border-botom-width`
* `border-left-color`
* `border-left-width`
* `border-right-color`
* `border-right-width`
* `border-spacing`
* `border-top-color`
* `border-top-width`
* `bottom`
* `clip`
* `color`
* `font-size`
* `font-weight`
* `height`
* `left`
* `letter-spacing`
* `line-height`
* `margin-bottom`
* `margin-left`
* `margin-right`
* `margin-top`
* `max-height`
* `max-width`
* `min-height`
* `min-width`
* `opacity`
* `ouline-color`
* `ouline-width`
* `padding-bottom`
* `padding-left`
* `padding-right`
* `padding-top`
* `right`
* `text-indent`
* `text-shadow`
* `vertical-align`
* `visibility`
* `width`
* `word-spacing`
* `z-index`
```css
div {
width: 200px;
height: 200px;
background-color:red;
margin: 20px auto;
-webkit-transition: background-color .5s ease .1s;
transition: background-color .5s ease .1s;
}
div:hover {
background-color: orange;
}
```
特別注意:當`transition-property`屬性設置為`all`時,表示的是所有中點值的屬性。
### 動畫--過渡所需時間 transition-duration
`transition-duration`屬性主要用來設置一個屬性過渡到另一個屬性所需的時間,也就是從舊屬性過渡到新屬性花費的時間長度,俗稱持續時間。
案例演示:在鼠標懸停(hover)狀態下,讓容器從直角慢慢過渡到圓角,并讓整個動畫持續0.5s。
```css
div {
width: 300px;
height: 200px;
background-color: orange;
margin: 20px auto;
-webkit-transition-property: -webkit-border-radius;
transition-property: border-radius;
-webkit-transition-duration: .5s;
transition-duration: .5s;
-webkit-transition-timing-function: ease-out;
transition-timing-function: ease-out;
-webkit-transition-delay: .2s;
transition-delay: .2s;
}
div:hover {
border-radius: 20px;
}
```
### 動畫--過渡函數 transition-timing-function
`transition-timing-function`屬性指的是過渡的“緩動函數”。主要用來指定瀏覽器的過渡速度,以及過渡期間的操作進展情況,其中要包括以下幾種函數:
函數|功能描述
---|---
ease|默認值,元素樣式從初始狀態過渡到終止狀態時速度由快到慢,逐漸變慢
linear|元素樣式從初始狀態過渡到終止狀態速度是恒定的
ease-in|元素樣式從初始狀態過渡到終止狀態時,速度越來越快,呈一種加速狀態
ease-out|元素樣式從初始狀態多度到終止狀態時,速度越來越慢,呈一種減速狀態
ease-in-out|元素原始初始狀態到終止狀態時,先加速再減速。
案例展示:在hover狀態下,讓容器從一個正方形慢慢過渡到一個圓形,而整個過渡是先加速再減速,也就是運用`ease-in-out`函數。
```css
div {
width: 200px;
height: 200px;
background: red;
margin: 20px auto;
-webkit-transition-property: -webkit-border-radius;
transition-property: border-radius;
-webkit-transition-duration: .5s;
transition-duration: .5s;
-webkit-transition-timing-function: ease-in-out;
transition-timing-function: ease-in-out;
-webkit-transition-delay: .2s;
transition-delay: .2s;
}
div:hover {
border-radius: 100%;
}
```
### 動畫--過渡延遲時間 transition-delay
`transition-delay`屬性和`transition-duration`屬性極其類似,不同的是`transition-duration`是用來設置過渡動畫的持續時間,而`transition-delay`主要用來指定一個動畫開始執行的時間,也就是說當改變元素屬性值后多長時間開始執行。
有時我們想改變兩個或者多個css屬性的`transition`效果時,只要把幾個`transition`的聲明串在一起,用逗號(“,”)隔開,然后各自可以有各自不同的延續時間和其時間的速率變換方式。但需要值得注意的一點:第一個時間的值為 `transition-duration`,第二個為`transition-delay`。
例如:
```css
a{ transition: background 0.8s ease-in 0.3,color 0.6s ease-out 0.3;}
```
示例演示:通過`transition`屬性將一個200px X 200px的橙色容器,在鼠標懸浮狀態時,過渡到一個300px * 300px的紅色容器。而且整個過渡0.1s后觸發,并且整個過渡持續0.28s。
html代碼:
```html
<div class="wrapper">
<div>鼠標放到我的身上來</div>
</div>
```
CSS代碼:
```css
.wrapper {
width: 400px;
height: 400px;
margin: 20px auto;
border: 2px dotted red;
}
.wrapper div {
width: 200px;
height: 200px;
background-color: orange;
-webkit-transition: all .28s ease-in .1s;
transition: all .28s ease-in .1s;
}
.wrapper div:hover {
width: 300px;
height: 300px;
background-color: red;
}
```
### Keyframes介紹
> `Keyframes`被稱為關鍵幀,其類似于Flash中的關鍵幀。在CSS3中其主要以`@keyframes`開頭,后面緊跟著是動畫名稱加上一對花括號`{…}`,括號中就是一些不同時間段樣式規則。
```css
@keyframes changecolor{
0%{
background: red;
}
100%{
background: green;
}
}
```
在一個`@keyframes`中的樣式規則可以由多個百分比構成的,如在`0%`到`100%`之間創建更多個百分比,分別給每個百分比中給需要有動畫效果的元素加上不同的樣式,從而達到一種在不斷變化的效果。
經驗與技巧:在`@keyframes`中定義動畫名稱時,其中0%和100%還可以使用關鍵詞from和to來代表,其中0%對應的是from,100%對應的是to。
案例演示: 通過`@keyframes`聲明一個名叫`wobble`的動畫,從“0%”開始到“100%”結束,同時還經歷了一個“40%”和“60%”兩個過程。“wobble”動畫在“0%”時元素定位到left為100px,背景色為green,然后在“40%”時元素過渡到left為150px,背景色為orange,接著在“60%”時元素過渡到left為75px,背景色為blue,最后“100%”時結束動畫,元素又回到起點left為100px處,背景色變為red。
html:
```html
<div>鼠標放到我身上</div>
```
CSS:
```css
@keyframes wobble {
0% {
margin-left: 100px;
background:green;
}
40% {
margin-left:150px;
background:orange;
}
60% {
margin-left: 75px;
background: blue;
}
100% {
margin-left: 100px;
background: red;
}
}
div {
width: 100px;
height: 100px;
background:red;
color: #fff;
}
div:hover{
animation: wobble 5s ease .1s;
}
```
### 調用動畫
> `animation-name`屬性主要是用來調用 `@keyframes` 定義好的動畫。需要特別注意: `animation-name` 調用的動畫名需要和`@keyframes`定義的動畫名稱完全一致(區分大小寫),如果不一致將不具有任何動畫效果。
語法:
```css
animation-name: none | IDENT[,none|DENT]*;
```
1. IDENT是由 `@keyframes` 創建的動畫名,上面已經講過了(`animation-name` 調用的動畫名需要和`@keyframes`定義的動畫名稱完全一致)
2. `none`為默認值,當值為 `none` 時,將沒有任何動畫效果,這可以用于覆蓋任何動畫。
注意:需要在 Chrome 和 Safari 上面的基礎上加上`-webkit-`前綴,Firefox加上`-moz-`。
### 設置動畫播放時間
> `animation-duration`主要用來設置CSS3動畫播放時間,其使用方法和`transition-duration`類似,是用來指定元素播放動畫所持續的時間長,也就是完成從0%到100%一次動畫所需時間。單位:S秒
語法規則:
```css
animation-duration: <time>[,<time>]*
```
取值<time>為數值,單位為秒,其默認值為“0”,這意味著動畫周期為“0”,也就是沒有動畫效果(如果值為負值會被視為“0”)。
案例演示:制作一個矩形變成圓形的動畫,整個動畫播放時間持續了10s鐘。
HTML:
```html
<div>Hover Me</div>
```
CSS:
```css
@keyframes toradius{
from {
border-radius: 0;
}
to {
border-radius: 100%;
}
}
div {
width: 200px;
height: 200px;
line-height: 200px;
text-align: center;
color: #fff;
background: green;
margin: 20px auto;
}
div:hover {
animation-name: toradius;
animation-duration: 10s;
animation-timing-function: ease-in-out;
animation-delay: .1s;
}
```
### 設置動畫播放方式
> `animation-timing-function`屬性主要用來設置動畫播放方式。主要讓元素根據時間的推進來改變屬性值的變換速率,簡單點說就是動畫的播放方式。
語法規則:
```css
animation-timing-function:ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier(<number>, <number>, <number>, <number>) [, ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier(<number>, <number>, <number>, <number>)]*
```
它和`transition`中的`transition-timing-function`一樣,具有以下幾種變換方式:`ease`,`ease-in`,`ease-in-out`,`ease-out`,`linear`和`cubic-bezier`。對應功如下:
函數|功能描述
---|---
ease|默認值,元素樣式從初始狀態過渡到終止狀態時速度由快到慢
linear|元素樣式從初始狀態過渡到終止狀態速度是恒定的
ease-in|元素樣式從初始狀態過渡到終止狀態時速度越來越快,呈加速狀態
ease-out|元素樣式從初始狀態過渡到終止狀態時越來越慢,呈減速狀態
ease-in-out|元素樣式從初始狀態到終止狀態時先加速再減速
### 設置動畫開始播放的時間
> `animation-delay`屬性用來定義動畫開始播放的時間,用來觸發動畫播放的時間點。和`transition-delay`屬性一樣,用于定義在瀏覽器開始執行動畫之前等待的時間。
語法規則:
```css
animation-delay:<time>[,<time>]*
```
案例演示: 瀏覽器渲染樣式之后2S之后觸發move動畫。
HTML:
```html
<div><span></span></div>
```
CSS:
```css
@keyframes move {
0%{
transform: translate(0);
}
15%{
transform: translate(100px,180px);
}
30%{
transform: translate(150px,0);
}
45%{
transform: translate(250px,180px);
}
60%{
transform:translate(300px,0);
}
75%{
transform: translate(450px,180px);
}
100%{
transfrom: translate(480px,0);
}
}
div {
width: 500px;
height: 200px;
border: 1px solid red;
margin: 20px auto;
}
div span {
display: inline-block;
width: 20px;
height: 20px;
background: green;
border-radius: 100%;
animation-name:move;
animation-duration: 10s;
animation-timing-function:ease;
animation-delay:2s;
animation-iteration-count:infinite;
}
```
### 設置動畫播放次數
> `animation-iteration-count`屬性主要用來定義動畫的播放次數。
語法規則:
```css
animation-iteration-count: infinite | <number> [, infinite | <number>]*
```
1. 其值通常為整數,但也可以使用帶有小數的數字,其默認值為1,這意味著動畫將從開始到結束只播放一次。
2. 如果取值為infinite,動畫將會無限次的播放。
舉例:通過animation-iteration-count屬性讓動畫move只播放5次,代碼設置為:
```css
animation-iteration-count:5;
```
注意:Chrome或Safari瀏覽器,需要加入-webkit-前綴!
### 設置動畫播放方向
> `animation-direction`屬性主要用來設置動畫播放方向,其語法規則如下:
```css
animation-direction:normal | alternate [, normal | alternate]*
```
其主要有兩個值:normal、alternate
1. `normal`是默認值,如果設置為`normal`時,動畫的每次循環都是向前播放;
2. 另一個值是`alternate`,他的作用是,動畫播放在第偶數次向前播放,第奇數次向反方向播放。
例如:通過`animation-direction`屬性,將`move`動畫播放動畫方向設置為`alternate`,代碼為:
```css
animation-direction:alternate;
```
注意:Chrome或Safari瀏覽器,需要加入-webkit-前綴!
### 設置動畫的播放狀態
> `animation-play-state`屬性主要用來控制元素動畫的播放狀態。
參數:`running`和`paused`
其中running是其默認值,主要作用就是類似于音樂播放器一樣,可以通過paused將正在播放的動畫停下來,也可以通過running將暫停的動畫重新播放,這里的重新播放不一定是從元素動畫的開始播放,而是從暫停的那個位置開始播放。另外如果暫停了動畫的播放,元素的樣式將回到最原始設置狀態。
例如,頁面加載時,動畫不播放。代碼如下:
```css
animation-play-state:paused;
```
### 設置動畫時間外屬性
> `animation-fill-mode`屬性定義在動畫開始之前和結束之后發生的操作。主要具有四個屬性值:`none`、`forwards`、`backwords`和`both`。其四個屬性值對應效果如下:
屬性值|效果
---|---
none|默認值,表示動畫將按預期進行和結束,在動畫完成其最后一幀時,動畫會反轉到初始幀處
forwards|表示動畫在結束后繼續應用最后的關鍵幀的位置
backwards|會在向元素應用動畫樣式時迅速應用動畫的初始幀
both|元素動畫同時具有forwards和backwards效果
在默認情況之下,動畫不會影響它的關鍵幀之外的屬性,使用`animation-fill-mode`屬性可以修改動畫的默認行為。簡單的說就是告訴動畫在第一關鍵幀上等待動畫開始,或者在動畫結束時停在最后一個關鍵幀上而不回到動畫的第一幀上。或者同時具有這兩個效果。
例如:讓動畫停在最一幀處。代碼如下:
```css
animation-fill-mode:forwards;
```