CSS3動畫實(shí)現(xiàn)

1. transform

  1. 通過transform轉(zhuǎn)換,我們能夠?qū)υ剡M(jìn)行移動(translate)、旋轉(zhuǎn)(rotate)、伸縮(scale)、翻轉(zhuǎn)(skew)。轉(zhuǎn)換是使元素改變形狀、尺寸和位置的一種效果。
  2. 瀏覽器支持
    Internet Explorer 10、Firefox 以及 Opera 支持 transform 屬性。ChromeSafari 需要前綴 -webkit-。
    注釋:Internet Explorer 9 需要前綴 -ms-

1.1 2D 轉(zhuǎn)換

  1. 2D轉(zhuǎn)換方法: translate(); rotate(); scale(); skew(); matrix();
  2. CSS示例
div{
  transform: rotate(30deg);
  -ms-transform: rotate(30deg); /* IE 9 */
  -webkit-transform: rotate(30deg); /* Safari and Chrome */
  -o-transform: rotate(30deg);      /* Opera */
  -moz-transform: rotate(30deg);    /* Firefox */
}
  1. translate()移動
transform: translate(50px,100px);  /*右移50px,下移100px*/
transform: translate(50px);  /*右移50px*/
translateX(100px);  /*右移100px*/
translateY(100px);  /*下移100px*/

注釋:使用translate移動元素?zé)o需設(shè)置絕對定位。

  1. rotate()旋轉(zhuǎn)
transform: rotate(30deg);  /*順時針旋轉(zhuǎn)30度*/

注釋: 2D旋轉(zhuǎn)即為3D旋轉(zhuǎn)中的繞Z軸旋轉(zhuǎn)transform:rotateZ(30deg)。

  1. scale()伸縮
transform:scale(2); /*寬度和高度都放大2倍*/
transform:scale(1,2); /*高度放大2倍*/
transform:scaleX(2); /*寬度放大2倍*/
transform:scaleY(2); /*高度放大2被*/
  1. skew()翻轉(zhuǎn)
transform:skew(30deg); /*以X軸為軸翻轉(zhuǎn)30度*/
transform:skew(30deg,20deg); /*以X軸為軸翻轉(zhuǎn)30度,以Y軸為軸翻轉(zhuǎn)20度*/
transform:skewX(30deg); /*以X軸為軸翻轉(zhuǎn)30度*/
transform:skewY(30deg);  /*以Y軸為軸翻轉(zhuǎn)30度*/
  1. transform-origin被轉(zhuǎn)換元素的基準(zhǔn)位置
transform-origin:center;    /*中心點(diǎn)作為基準(zhǔn)位置(默認(rèn))*/
transform-origin:left;  /*左邊中點(diǎn)作為基準(zhǔn)位置*/
transform-origin:top;   /*上邊中點(diǎn)作為基準(zhǔn)位置*/
transform-origin:right; /*右邊中點(diǎn)作為基準(zhǔn)位置*/
transform-origin:bottom;    /*底邊中點(diǎn)作為基準(zhǔn)位置*/
transform-origin:left top;  /*左上端點(diǎn)作為基準(zhǔn)位置*/
transform-origin:right top; /*右上端點(diǎn)作為基準(zhǔn)位置*/
transform-origin:right bottom;  /*右下端點(diǎn)作為基準(zhǔn)位置*/
transform-origin:left bottom; /*左下端點(diǎn)作為基準(zhǔn)位置*/
transform-origin:200px 100px; (200px,100px)/*相對坐標(biāo)作為基準(zhǔn)位置*/
  1. matrix(n,n,n,n,n,n)
    定義 2D 轉(zhuǎn)換,使用六個值的矩陣。

1.2 3D 轉(zhuǎn)換

  1. 3D轉(zhuǎn)換可以實(shí)現(xiàn)元素在X軸、Y軸、Z軸方向上的移動、旋轉(zhuǎn)、伸縮、以及翻轉(zhuǎn)處理。
    注釋:MDN文檔
  2. translate()移動
transform:translateX(50px);
transform:translateY(100px);
transform:translateZ(20px);
/* 第二種寫法 */
transform:translateX(50px) translateY(100px) translateZ(20px);
  1. rotate()旋轉(zhuǎn)
 transform:rotateX(45deg);
 transform:rotateY(45deg);
 transform:rotateZ(45deg);
 /* 第二種寫法 */
 transform:rotateX(45deg) rotateY(45deg) rotateZ(45deg);
  1. scale()伸縮
transform:scaleX(0.5);
transform:scaleY(1);
transform:scaleZ(2);
/* 第二種寫法 */
transform:scaleX(0.5) scaleY(1) scaleZ(2);
  1. skew()翻轉(zhuǎn)
transform:skewX(45deg);
transform:skewY(45deg);   

注意:和2D效果類似,翻轉(zhuǎn)只有兩個方向。

2. transition

  1. CSS3中的動畫分為animation功能與transition功能,這兩種功能都可以通過改變CSS中的屬性值來產(chǎn)生動畫效果。
    (1) animation功能支持通過關(guān)鍵幀的指定在頁面上產(chǎn)生復(fù)雜的動畫效果。
    (2) transition功能支持從一個屬性值平滑過渡到另一個屬性值。
    注釋:animation支持關(guān)鍵幀(中間狀態(tài))的設(shè)定;支持動畫暫停效果;支持延遲時間與動畫結(jié)束后的狀態(tài)設(shè)定。transition不支持中間狀態(tài)的設(shè)定。不支持動畫暫停效果。不支持延遲時間與動畫結(jié)束后的狀態(tài)設(shè)定。
  2. 語法
    transition:屬性名稱 過渡時間 速度曲線 延遲時間 ,屬性名稱 過渡時間 速度曲線 延遲時間
    屬性名稱:默認(rèn)值(all) 、width
    過渡時間:默認(rèn)值(0)、3s、2000ms
    速度曲線:默認(rèn)值(ease)(慢-快-慢) 、linear(勻速)、ease-in(慢-塊) 、ease-out(快-慢)
    延遲時間:默認(rèn)值(0)、3s、2000ms
    注釋:過渡時間不可省略,其余都可省略。
  3. 應(yīng)用于單項(xiàng)屬性的過渡效果
div{
  transition: width 2s;
  -moz-transition: width 2s;    /* Firefox 4 */
  -webkit-transition: width 2s; /* Safari 和 Chrome */
  -o-transition: width 2s;  /* Opera */
}
div:hover{
  width: 300px;
}
  1. 應(yīng)用于多項(xiàng)屬性的過渡效果
    如需添加多個樣式的過渡效果,則用逗號隔開。
div{
  transition: width 2s, height 3s, transform 5s;
}
  1. 應(yīng)用于所有屬性的過渡效果
div{
  transition: 2s;
}

注釋:默認(rèn)值為all。

3. animation與@keyframes

  1. transition實(shí)現(xiàn)動畫時只能指定要改變的屬性開始值結(jié)束值,然后在這兩個值之間進(jìn)行平滑過渡的方式來實(shí)現(xiàn)動畫效果,不能實(shí)現(xiàn)比較復(fù)雜的動畫效果;而animation通過定義多個關(guān)鍵幀(@keyframes)以及定義每個關(guān)鍵幀中元素的屬性值來實(shí)現(xiàn)更為復(fù)雜的動畫效果。
  2. @keyframes規(guī)則用于創(chuàng)建動畫。在 @keyframes 中規(guī)定某項(xiàng) CSS 樣式,就能創(chuàng)建由當(dāng)前樣式逐漸改為新定義樣式的動畫效果。
  3. @keyframe語法
    @keyframe 關(guān)鍵幀集合的名稱{創(chuàng)建關(guān)鍵幀的代碼}
  4. animation功能的使用方法
    animation:動畫名稱 動畫時間 速度曲線 延遲時間 執(zhí)行次數(shù) 執(zhí)行方向 是否暫停 其它狀態(tài)
    動畫名稱:關(guān)鍵幀集合的名稱
    動畫時間:默認(rèn)值(0)、3s 、2000ms
    速度曲線:默認(rèn)值(ease)(慢-快-慢) 、linear(勻速)、ease-in(慢-塊)、ease-out(快-慢)
    延遲時間:默認(rèn)值(0)、3s 、2000ms、-2s(立即執(zhí)行,跳過2秒)
    執(zhí)行次數(shù):默認(rèn)值(1) 、5、infinite(無限次播放)
    執(zhí)行方向:默認(rèn)值(normal)(每次動畫執(zhí)行完畢后返回初始狀態(tài)) 、alternate(正反交替輪流播放)、reverse(反向執(zhí)行動畫)、alternate-reverse(反向開始交替輪流播放)
    是否暫停:默認(rèn)值(running)(動畫正在播放)、paused(動畫已暫停)。
    其它狀態(tài):默認(rèn)值(none)(不改變默認(rèn)行為)、forwards(當(dāng)動畫完成后,保持最后一個屬性值)、backwards(在 animation-delay 所指定的一段時間內(nèi),在動畫顯示之前,應(yīng)用開始屬性值)、both(向前和向后填充模式都被應(yīng)用)。
    注釋: 動畫名稱與動畫時間不可省略,其余都可省略。
  5. 簡單示例
#tc{animation:zh 4s;}
@keyframes zh{
    0%{height: 150px;width: 150px;background-color:pink;}
    25%{height: 200px;width: 200px;background-color:green;}
    50%{height: 100px;width: 100px;background-color:yellow;}
    70%{height: 400px;width: 400px;background-color:blue;}
    100%{height: 500px;width: 500px;background-color:pink;}
}

注釋:為了得到最佳的瀏覽器支持,應(yīng)始終定義0%100%選擇器。

  1. 暫停動畫
    animation-play-state: paused|running;
    plused:定義動畫暫停
    running:定義動畫播放
tc.onmouseover=function(){
   this.style.animationPlayState='paused';
};
tc.onmouseout=function(){
  this.style.animationPlayState='running';
}
  1. 動畫起始終止?fàn)顟B(tài)
    animation-fill-mode : none | forwards | backwards | both;
    none:默認(rèn)值(以初始狀態(tài)作為起始終止?fàn)顟B(tài))
    forwards:以100%時的屬性值作為動畫終止?fàn)顟B(tài)
    backwards:以0%時的屬性值作為延遲時間內(nèi)的狀態(tài)
    bothforwardsbackwards模式都將生效
    注釋:animation-fill-mode屬性必須定義在animation屬性之后才會生效。

4. 總結(jié)

  1. transform
    CSS3中的變形處理,實(shí)現(xiàn)文字和圖像的移動、旋轉(zhuǎn)、伸縮、翻轉(zhuǎn)等。
  2. transition
    CSS3中的動畫功能,通過一個屬性值平滑過渡到另一個屬性值來實(shí)現(xiàn)。
  3. animation
    CSS3中的動畫功能,通過在樣式中創(chuàng)建多個關(guān)鍵幀,在這些關(guān)鍵幀中編寫樣式,并且能夠在頁面上綜合運(yùn)行這些關(guān)鍵幀來實(shí)現(xiàn)較為復(fù)雜的動畫。
  4. 重繪與回流
    (1) 重繪
    操作影響了頁面的可見性,但是沒有影響布局,瀏覽器發(fā)生重繪。
    改變透明度、背景顏色、字體顏色、改變同等尺寸img會發(fā)生重繪。
    (2) 回流
    瀏覽器重新計(jì)算所有元素的尺寸和位置。
    CSS樣式?jīng)]有放在head頭部、刪減Dom節(jié)點(diǎn)、改變Dom節(jié)點(diǎn)尺寸等會引起回流。
    注釋:重繪布局不變、重新繪制?;亓鞑季指淖?、重新繪制。
  5. 為避免回流,使用CSS3執(zhí)行動畫的元素應(yīng)絕對定位(脫離文檔流)。

參考資料

響應(yīng)式布局頁面
理解CSS3 transform中的Matrix(矩陣)
好吧,CSS3 3D transform變換,不過如此!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容