1. 程式人生 > >CSS3變形和動畫:旋轉、扭曲、縮放、位移、矩陣 、原點 transform-origin、過渡屬性 transition-property、過渡所需時間 transition-duration...

CSS3變形和動畫:旋轉、扭曲、縮放、位移、矩陣 、原點 transform-origin、過渡屬性 transition-property、過渡所需時間 transition-duration...

旋轉、扭曲、縮放、位移、矩陣 、原點 transform-origin、過渡屬性 transition-property、過渡所需時間 transition-duration、過渡函式 transition-timing-function、過渡延遲時間 transition-delay、Keyframes、呼叫動畫、設定動畫播放時間、設定動畫播放方式、設定動畫開始播放的時間、設定動畫播放次數、設定動畫播放方向、設定動畫的播放狀態、設定動畫時間外屬性

CSS3變形--旋轉 rotate()

旋轉rotate()函式通過指定的角度引數使元素相對原點進行旋轉。它主要在二維空間內進行操作,設定一個角度值,用來指定旋轉的幅度。如果這個值為正值,元素相對原點中心順時針旋轉;如果這個值為負值,元素相對原點中心逆時針旋轉。如下圖所示:

HTML程式碼:

<div class="wrapper">
  <div></div>
</div>

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);
}

演示結果

CSS3中的變形--扭曲 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軸扭曲變形)

示例演示:

通過skew()函式將長方形變成平行四邊形。

HTML程式碼:

<div class="wrapper">
  <div>我變成平形四邊形</div>
</div>

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);
}

演示結果

CSS3中的變形--縮放 scale()

縮放 scale()函式 讓元素根據中心原點對物件進行縮放。

縮放 scale 具有三種情況:

1、 scale(X,Y)使元素水平方向和垂直方向同時縮放(也就是X軸和Y軸同時縮放)

例如:

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程式碼:

<div class="wrapper">
  <div>我將放大1.5倍</div>
</div>

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);
}

演示結果

注意: scale()的取值預設的值為1,當值設定為0.01到0.99之間的任何值,作用使一個元素縮小;而任何大於或等於1.01的值,作用是讓元素放大。

CSS3中的變形--位移 translate()

translate()函式可以將元素向指定的方向移動,類似於position中的relative。或以簡單的理解為,使用translate()函式,可以把元素從原來的位置移動,而不影響在X、Y軸上的任何Web元件。

translate我們分為三種情況:

1、translate(x,y)水平方向和垂直方向同時移動(也就是X軸和Y軸同時移動)

2、translateX(x)僅水平方向移動(X軸移動)

3、translateY(Y)僅垂直方向移動(Y軸移動)

例項演示:通過translate()函式將元素向Y軸下方移動50px,X軸右方移動100px。

HTML程式碼:

<div class="wrapper">
  <div>我向右向下移動</div>
</div>

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);
}

演示結果

CSS3中的變形--矩陣 matrix()

matrix() 是一個含六個值的(a,b,c,d,e,f)變換矩陣,用來指定一個2D變換,相當於直接應用一個[a b c d e f]變換矩陣。就是基於水平方向(X軸)和垂直方向(Y軸)重新定位元素,此屬性值使用涉及到數學中的矩陣,我在這裡只是簡單的說一下CSS3中的transform有這麼一個屬性值,如果需要深入瞭解,需要對數學矩陣有一定的知識。

示例演示:通過matrix()函式來模擬transform中translate()位移的效果。 HTML程式碼:

<div class="wrapper">
  <div></div>
</div>

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);
}

演示結果:

CSS3中的變形--原點 transform-origin

任何一個元素都有一箇中心點,預設情況之下,其中心點是居於元素X軸和Y軸的50%處。如下圖所示:

在沒有重置transform-origin改變元素原點位置的情況下,CSS變形進行的旋轉、位移、縮放,扭曲等操作都是以元素自己中心位置進行變形。但很多時候,我們可以通過transform-origin來對元素進行原點位置改變,使元素原點不在元素的中心位置,以達到需要的原點位置。

transform-origin取值和元素設定背景中的background-position取值類似,如下表所示:

示例展示:

通過transform-origin改變元素原點到左上角,然後進行順時旋轉45度。

HTML程式碼:

<div class="wrapper">
  <div>原點在預設位置處</div>
</div>
<div class="wrapper transform-origin">
  <div>原點重置到左上角</div>
</div>

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;
}

演示結果:

CSS3中的動畫--過渡屬性 transition-property

早期在Web中要實現動畫效果,都是依賴於JavaScript或Flash來完成。但在CSS3中新增加了一個新的模組transition,它可以通過一些簡單的CSS事件來觸發元素的外觀變化,讓效果顯得更加細膩。簡單點說,就是通過滑鼠的單擊、獲得焦點,被點選或對元素任何改變中觸發,並平滑地以動畫效果改變CSS的屬性值。

在CSS中建立簡單的過渡效果可以從以下幾個步驟來實現:
第一,在預設樣式中宣告元素的初始狀態樣式;
第二,宣告過渡元素最終狀態樣式,比如懸浮狀態;
第三,在預設樣式中通過新增過渡函式,新增一些不同的樣式。

CSS3的過度transition屬性是一個複合屬性,主要包括以下幾個子屬性:

  • transition-property:指定過渡或動態模擬的CSS屬性
  • transition-duration:指定完成過渡所需的時間
  • transition-timing-function:指定過渡函式
  • transition-delay:指定開始出現的延遲時間

先來看transition-property屬性

transition-property用來指定過渡動畫的CSS屬性名稱,而這個過渡屬性只有具備一箇中點值的屬性(需要產生動畫的屬性)才能具備過渡效果,其對應具有過渡的CSS屬性主要有:

HTML:

<div></div>

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時,表示的是所有中點值的屬性。

用一個簡單的例子來說明這個問題:

假設你的初始狀態設定了樣式“width”,“height”,“background”,當你在終始狀態都改變了這三個屬性,那麼all代表的就是“width”、“height”和“background”。如果你的終始狀態只改變了“width”和“height”時,那麼all代表的就是“width”和“height”。

CSS3中的動畫--過渡所需時間 transition-duration

transition-duration屬性主要用來設定一個屬性過渡到另一個屬性所需的時間,也就是從舊屬性過渡到新屬性花費的時間長度,俗稱持續時間。

案例演示:

在滑鼠懸停(hover)狀態下,讓容器從直角慢慢過渡到圓角,並讓整個動畫持續0.5s。

HTML:

<div></div>

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;
}

演示結果:

滑鼠移入

滑鼠移出

CSS3中的動畫--過渡函式 transition-timing-function

transition-timing-function屬性指的是過渡的“緩動函式”。主要用來指定瀏覽器的過渡速度,以及過渡期間的操作進展情況,其中要包括以下幾種函式:

(單擊圖片可放大)

案例展示:

在hover狀態下,讓容器從一個正方形慢慢過渡到一個圓形,而整個過渡是先加速再減速,也就是運用ease-in-out函式。

HTML程式碼:

<div></div>

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%;
}

演示結果

滑鼠移入:

滑鼠移出:

CSS3中的動畫--過渡延遲時間 transition-delay

transition-delay屬性和transition-duration屬性極其類似,不同的是transition-duration是用來設定過渡動畫的持續時間,而transition-delay主要用來指定一個動畫開始執行的時間,也就是說當改變元素屬性值後多長時間開始執行。

有時我們想改變兩個或者多個css屬性的transition效果時,只要把幾個transition的宣告串在一起,用逗號(“,”)隔開,然後各自可以有各自不同的延續時間和其時間的速率變換方式。但需要值得注意的一點:第一個時間的值為 transition-duration,第二個為transition-delay。

例如:a{ transition: background 0.8s ease-in 0.3,color 0.6s ease-out 0.3;}

示例演示:

通過transition屬性將一個200px *200px的橙色容器,在滑鼠懸浮狀態時,過渡到一個300px * 300px的紅色容器。而且整個過渡0.1s後觸發,並且整個過渡持續0.28s。

HTML程式碼:

<div class="wrapper">
  <div>滑鼠放到我的身上來</div>
</div>

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;
}

演示結果

滑鼠移入:

滑鼠移出:

CSS3 Keyframes介紹

Keyframes被稱為關鍵幀,其類似於Flash中的關鍵幀。在CSS3中其主要以“@keyframes”開頭,後面緊跟著是動畫名稱加上一對花括號“{…}”,括號中就是一些不同時間段樣式規則。

@keyframes changecolor{
  0%{
   background: red;
  }
  100%{
    background: green;
  }
}

在一個“@keyframes”中的樣式規則可以由多個百分比構成的,如在“0%”到“100%”之間建立更多個百分比,分別給每個百分比中給需要有動畫效果的元素加上不同的樣式,從而達到一種在不斷變化的效果。

經驗與技巧:在@keyframes中定義動畫名稱時,其中0%和100%還可以使用關鍵詞from和to來代表,其中0%對應的是from,100%對應的是to。

瀏覽器的支援情況:

Chrome 和 Safari 需要字首 -webkit-;Foxfire 需要字首 -moz-。

案例演示

通過“@keyframes”宣告一個名叫“wobble”的動畫,從“0%”開始到“100%”結束,同時還經歷了一個“40%”和“60%”兩個過程。“wobble”動畫在“0%”時元素定位到left為100px,背景色為green,然後在“40%”時元素過渡到left為150px,背景色為orange,接著在“60%”時元素過渡到left為75px,背景色為blue,最後“100%”時結束動畫,元素又回到起點left為100px處,背景色變為red。

HTML:

<div>滑鼠放到我身上</div>

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;
}

CSS3中呼叫動畫

animation-name屬性主要是用來呼叫 @keyframes 定義好的動畫。需要特別注意: animation-name 呼叫的動畫名需要和“@keyframes”定義的動畫名稱完全一致(區分大小寫),如果不一致將不具有任何動畫效果。

語法:

animation-name: none | IDENT[,none|DENT]*;

1、IDENT是由 @keyframes 建立的動畫名,上面已經講過了(animation-name 呼叫的動畫名需要和“@keyframes”定義的動畫名稱完全一致);

2、none為預設值,當值為 none 時,將沒有任何動畫效果,這可以用於覆蓋任何動畫。

注意:需要在 Chrome 和 Safari 上面的基礎上加上-webkit-字首,Firefox加上-moz-。

CSS3中設定動畫播放時間

animation-duration主要用來設定CSS3動畫播放時間,其使用方法和transition-duration類似,是用來指定元素播放動畫所持續的時間長,也就是完成從0%到100%一次動畫所需時間。單位:S秒

語法規則

animation-duration: <time>[,<time>]*

取值<time>為數值,單位為秒,其預設值為“0”,這意味著動畫週期為“0”,也就是沒有動畫效果(如果值為負值會被視為“0”)。

案例演示:

製作一個矩形變成圓形的動畫,整個動畫播放時間持續了10s鍾。

HTML:

<div>Hover Me</div>

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;
}

滑鼠移入

滑鼠移出

CSS3中設定動畫播放方式

animation-timing-function屬性主要用來設定動畫播放方式。主要讓元素根據時間的推進來改變屬性值的變換速率,簡單點說就是動畫的播放方式。

語法規則:

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。對應功如下:

在呼叫move動畫播放中,讓元素樣式從初始狀態到終止狀態時,先加速再減速,也就是漸顯漸隱效果。

CSS3中設定動畫開始播放的時間

animation-delay屬性用來定義動畫開始播放的時間,用來觸發動畫播放的時間點。和transition-delay屬性一樣,用於定義在瀏覽器開始執行動畫之前等待的時間。

語法規則:

animation-delay:<time>[,<time>]*

案例演示:    

瀏覽器渲染樣式之後2S之後觸發move動畫。

HTML:

<div><span></span></div>

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;
}

結果展示:

CSS3中設定動畫播放次數

animation-iteration-count屬性主要用來定義動畫的播放次數。

語法規則:

animation-iteration-count: infinite | <number> [, infinite | <number>]*

1、其值通常為整數,但也可以使用帶有小數的數字,其預設值為1,這意味著動畫將從開始到結束只播放一次。

2、如果取值為infinite,動畫將會無限次的播放。

舉例:

通過animation-iteration-count屬性讓動畫move只播放5次,程式碼設定為:

animation-iteration-count:5;

注意:Chrome或Safari瀏覽器,需要加入-webkit-字首!

CSS3中設定動畫播放方向

animation-direction屬性主要用來設定動畫播放方向,其語法規則如下:

animation-direction:normal | alternate [, normal | alternate]*

其主要有兩個值:normal、alternate

1、normal是預設值,如果設定為normal時,動畫的每次迴圈都是向前播放;

2、另一個值是alternate,他的作用是,動畫播放在第偶數次向前播放,第奇數次向反方向播放。

例如:通過animation-direction屬性,將move動畫播放動畫方向設定為alternate,程式碼為:

animation-direction:alternate;

注意:Chrome或Safari瀏覽器,需要加入-webkit-字首!

CSS3中設定動畫的播放狀態

animation-play-state屬性主要用來控制元素動畫的播放狀態。

引數:

其主要有兩個值:running和paused。

其中running是其預設值,主要作用就是類似於音樂播放器一樣,可以通過paused將正在播放的動畫停下來,也可以通過running將暫停的動畫重新播放,這裡的重新播放不一定是從元素動畫的開始播放,而是從暫停的那個位置開始播放。另外如果暫停了動畫的播放,元素的樣式將回到最原始設定狀態。

例如,頁面載入時,動畫不播放。程式碼如下:

animation-play-state:paused;

CSS3中設定動畫時間外屬性

animation-fill-mode屬性定義在動畫開始之前和結束之後發生的操作。主要具有四個屬性值:none、forwards、backwords和both。其四個屬性值對應效果如下:

屬性值

效果

none

預設值,表示動畫將按預期進行和結束,在動畫完成其最後一幀時,動畫會反轉到初始幀處

forwards

表示動畫在結束後繼續應用最後的關鍵幀的位置

backwards

會在向元素應用動畫樣式時迅速應用動畫的初始幀

both

元素動畫同時具有forwards和backwards效果

在預設情況之下,動畫不會影響它的關鍵幀之外的屬性,使用animation-fill-mode屬性可以修改動畫的預設行為。簡單的說就是告訴動畫在第一關鍵幀上等待動畫開始,或者在動畫結束時停在最後一個關鍵幀上而不回到動畫的第一幀上。或者同時具有這兩個效果。

例如:讓動畫停在最一幀處。程式碼如下:

 animation-fill-mode:forwards;