成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

10分鐘入門 CSS3 Animation

Elle / 1565人閱讀

摘要:中文譯為轉(zhuǎn)換,但我更傾向于稱呼它變形大名鼎鼎的變形金剛叫。意為縮放,顧名思義,是用于改變?cè)氐拇笮?。每個(gè)時(shí)間點(diǎn)對(duì)應(yīng)一個(gè)狀態(tài),代表一個(gè)關(guān)鍵幀。我們可以在可視化的創(chuàng)建我們自己的貝塞爾曲線。

簡(jiǎn)介

Animation可以讓你不用依賴javascript或jquery,用純CSS在網(wǎng)頁中輕松實(shí)現(xiàn)各種動(dòng)畫效果。

兼容性

animation在絕大部分主流瀏覽器都得到了很好的支持!還在兼容IE9的同學(xué)要謹(jǐn)慎使用。

CSS 坐標(biāo)系

在了解animtion之前,我們有必要先了解css的坐標(biāo)系,因?yàn)楹芏嗟腶nimation效果都和元素的坐標(biāo)密切相關(guān)。在css3中網(wǎng)頁不再是一個(gè)二維平面,而是一個(gè)三維空間,水平方向、豎直方向和垂直屏幕方向分別對(duì)應(yīng)三維坐標(biāo)系的x,y,z軸,如下圖所示。箭頭方向?yàn)檎?,反之為?fù)向(注意y軸方向與常規(guī)笛卡爾坐標(biāo)系相反)。

Animations 1. Transforms

transform中文譯為“轉(zhuǎn)換”,但我更傾向于稱呼它“變形”(大名鼎鼎的變形金剛叫transformer)。我們可以使用transform function使html元素產(chǎn)生各種各樣的變形,比如平移、縮放、旋轉(zhuǎn)、扭曲等,而且不會(huì)影響正常的文檔流(document flow)。

(1) Translate

Translate一般譯為“翻譯”,但在css里面一般用作“平移”,因?yàn)閠ranslate用于改變html元素的在3d坐標(biāo)系位置。translate支持在坐標(biāo)系內(nèi)任意方向移動(dòng)(通過任意組合x、y、z方向的向量),單位可以是長(zhǎng)度單位和百分比(百分比是相對(duì)于被平移的元素自身尺寸,x軸是相對(duì)于width,y軸是相對(duì)于height,而在z軸方向由于元素是沒有‘厚度’的,所以對(duì)于z方向不能用百分比表示),例如:

transform: translateX(100px) translateY(50%) translateZ(-100px);
// 或者簡(jiǎn)寫
transform: translate3d(100px, 50%, 2em);

注意:

translate是xy平面內(nèi)的2維平移,translate3d是xyz空間內(nèi)的三維平移;

translate也可以多帶帶書寫,如 translate: 50% 105px 5rem;,但是該特性尚在實(shí)驗(yàn)階段,很多瀏覽器不支持,所以現(xiàn)階段還是配合transform使用。詳情參考 MDN translate。

(2) Scale

Scale意為“縮放”,顧名思義,是用于改變?cè)氐拇笮?。例如?/p>

transform: scaleX(2) scaleY(0.5) scaleZ(1);
// 或者簡(jiǎn)寫
transform: scale3d(2, 0.5, 1);

scale方法接收任意數(shù)字(正負(fù)整數(shù)、小數(shù)、0)作為參數(shù),該參數(shù)為縮放系數(shù),系數(shù)>1 效果為放大,0<系數(shù)<1 效果為縮小,系數(shù)=0 元素尺寸變?yōu)闊o限小而不可見,系數(shù)<0 效果為 >0 時(shí)的鏡像(具體效果可自己實(shí)驗(yàn))。

translate類似,scale也有2維 scale() 和三維 scale3d()之分,也可以多帶帶書寫,此處不贅述。

(3) Rotate

Rotate意為“旋轉(zhuǎn)”,支持將元素以x、y、z為軸旋轉(zhuǎn),旋轉(zhuǎn)正方向?yàn)槊娉鴺?biāo)軸正向逆時(shí)針方向,可參考上面坐標(biāo)系示意圖。rotate方法接收一個(gè)角度作為參數(shù),角度>0 正向旋轉(zhuǎn),角度<0 負(fù)向旋轉(zhuǎn),例如:

// 默認(rèn)繞z軸旋轉(zhuǎn)
transform: rotate(90deg);

transform: rotateX(30deg) rotateY(60deg) rotateZ(-90deg);

與translate和scale不同,rotate不能簡(jiǎn)寫為transform: rotate3d(30deg, 60deg, 90deg)的形式,rotate3d的用法為:前三個(gè)參數(shù)為數(shù)字,代表x、y、z方向的向量,相加得到向量v,第四個(gè)參數(shù)為角度,表示以向量v為軸逆時(shí)針旋轉(zhuǎn)的角度,語法如下:

transform: rotate3d(1, 2, 3, 90deg);

translatescale類似,rotate也可以作為多帶帶的css屬性,但還在實(shí)驗(yàn)階段。

出于篇幅考慮,我只列出三種最常用的tranform function,剩下的transform function請(qǐng)參考 MDN transform function。

(4) 組合

我們可以將不同的transform方法組合起來使用,如:

transform: translateY(200px) rotateZ(90deg) scale(3);

組合方法的執(zhí)行順序是從右往左,即先執(zhí)行scale,然后rotate,最后translate,產(chǎn)生的效果是逐次累加的。方法書寫的順序?qū)ψ詈笮Ч泻艽蟮挠绊懀聪旅胬?,沿y軸平移和放大,順序不同,產(chǎn)生的結(jié)果有明顯差別:

如果先translate再scale,平移的距離也將被等比例縮放,而先scale再translate則不會(huì)。所以在使用transform需按照 translate -> rotate -> scale 的順序書寫,讓scale先執(zhí)行,以免放大translate的效果,而rotate先translate執(zhí)行以防止帶著平移的距離一起轉(zhuǎn)動(dòng)。我覺得這是transform目前不方便的地方,因?yàn)榉椒ㄖg相互干擾并不容易理解,書寫順序也不容易記住。在未來有望通過使用獨(dú)立的css transform屬性解決這一問題,因?yàn)楠?dú)立的transform屬性對(duì)書寫順序沒有依賴,方法之間彼此不會(huì)干擾。

Transition

Transition翻譯為“過渡”,強(qiáng)調(diào)的是過程。在css中指在一段時(shí)間內(nèi),元素從一個(gè)狀態(tài)(對(duì)應(yīng)一個(gè)css屬性)過渡到另一個(gè)狀態(tài)的動(dòng)態(tài)過程。我們可以決定以何種方式過渡過渡和花費(fèi)多少時(shí)間。

例如,我們把鼠標(biāo)懸浮到云上面的時(shí)候使其變大一些可以這么寫:

.cloud{
    width: 240px;
    transition: 1s;
}
.cloud:hover{
    width: 320px;
}

效果:

transition可以和transform結(jié)合使用,比如我們可以讓云變大的同時(shí)轉(zhuǎn)一圈:

.cloud:hover{
    width: 320px;
    transform: rotate(360deg);
}

效果:

我們可以給不同的效果設(shè)置不同的過渡時(shí)間:

.cloud{
    width: 240px;
    transition: width 1s, transform 0.5s;
}

我們也可以給效果設(shè)置延時(shí)時(shí)間,比如我們等寬度增大之后再旋轉(zhuǎn):

.cloud{
    width: 240px;
    transition: width 1s, transform 0.5s 1s;
}

效果:

我們還可以給每個(gè)效果設(shè)置不同的timing function,用于控制加速效果。

比如我們可以讓旋轉(zhuǎn)的速度逐漸加快:

.cloud{
    width: 240px;
    transition: transform 2s ease-in;
}

.cloud:hover{
    transform: rotate(1080deg);
}

效果:

更多的timing function請(qǐng)后面會(huì)進(jìn)一步討論,也可以參考 MDN transition-timing-functions

Keyframes (1) 基本用法

Keyframe中文譯為“關(guān)鍵幀”,是animation中很強(qiáng)大的功能,通俗說就是我們可以通過定義一段動(dòng)畫中的關(guān)鍵點(diǎn)、關(guān)鍵狀態(tài)來創(chuàng)建動(dòng)畫。Keyframes相比transition對(duì)動(dòng)畫過程和細(xì)節(jié)有更強(qiáng)的控制。

我們先看一個(gè)例子(部分代碼省略)

html:

css:

.mario{
  position: absolute;
  left: 0px;
  width: 100px;
}

.animated{
  animation-name: drive;
  animation-duration: 1s;
  animation-timing-function: linear;
}

@keyframes drive {
  from{ transform: translateX(0) }
  to{ transform: translateX(700px) }
}

效果:

其中 drive 是該keyframes的名稱,from, to 是keyframes播放過程的時(shí)間起點(diǎn)和終點(diǎn),時(shí)間點(diǎn)也可以用百分比表示,如50%,from, to 等價(jià)于 0%, 100%。每個(gè)時(shí)間點(diǎn)對(duì)應(yīng)一個(gè)css狀態(tài),代表一個(gè)關(guān)鍵幀(keyframe)。keyframes定義完成后使用方法如下:

animation也有簡(jiǎn)寫形式,如:

animation: slidein 3s ease-in 1s infinite reverse both running;

但這種對(duì)書寫順序有一定要求(delay要寫在duration后面,其他參數(shù)無順序要求,css會(huì)通過傳入的關(guān)鍵詞識(shí)別)。

(2) Animation Delay

通過animation-delay,我們可以給動(dòng)畫延遲執(zhí)行:

animation-delay: 2s;
(3) Animation Fill Mode forwards

在上面的例子中可以看到馬里奧運(yùn)動(dòng)到右邊之后又回到了起點(diǎn),如果我們想讓他運(yùn)動(dòng)完成后就停留在右邊呢?很簡(jiǎn)單,我們?cè)O(shè)置annimation fill mode就可以了:

animation-fill-mode: forwards

forwards 表示動(dòng)畫完成后,元素將保持最后一幀的狀態(tài)。

backwards

與之相對(duì)的還有 backwardsbackwards表示并不是動(dòng)畫完成后元素變回第一幀的狀態(tài),而是表示當(dāng)設(shè)置了animation-delay時(shí),在動(dòng)畫開始前的等待過程中,立刻給元素應(yīng)用第一幀的狀態(tài)。我們將上面的例子稍作修改看一下效果:

.animated{
  animation-name: drive;
  animation-duration: 1s;
  animation-fill-mode: backwords;
  animation-delay: 1s;
  animation-timing-function: linear;
}

@keyframes drive {
  from{ transform: translateX(350px) }
  to{ transform: translateX(700px) scale(2) }
}

效果:

可以看到,動(dòng)畫開始之前小人立馬移動(dòng)到350px處,1s之后才開始動(dòng)畫。

both

顯而易見,both會(huì)同時(shí)應(yīng)用forwards和backwards兩種規(guī)則,即在delay時(shí)先應(yīng)用第一幀的狀態(tài),結(jié)束時(shí)保持最后一幀的狀態(tài)。

(3) Animation Repeat

我們可以通過 animation-iteration-count 設(shè)置動(dòng)畫循環(huán)播放的次數(shù),比如:

animation-iteration-count: 3;

// 無限循環(huán)
animation-iteration-count:infinite;

就像這樣:

(4) Animation Direction normal

正常方向,也是默認(rèn)方向,即先from,再to。

reverse

與正常方向相反,即先to,再from。例如:

.animated{
  ...
  
  animation-direction: reverse;
}

@keyframes drive {
  from{ transform: translateX(-100px) rotateY(180deg) }
  to{ transform: translateX(862px) rotateY(180deg)}
}

效果:

alternate

alternate意為“交替”,即normal和reverse交替之行,先normal再reverse。

reverse alternate

反向交替,先reverse再normal。

(4) Animation Timing function

和transition一樣,keyframes也可以設(shè)置timing function,常用的timing function歸納如下:

ease:默認(rèn)方法,初速度較慢,然后加速再減速

ease-in:初速度最慢,然后一直加速

ease-out:初速度最快,然后一直減速

ease-in-out:初速度較慢,然后加速再減速,與ease的區(qū)別在于加速減速過程是對(duì)稱的

linear:恒速運(yùn)動(dòng)

直觀表現(xiàn)如下(codepen):

除了上面現(xiàn)成的方法,我們可以通過貝塞爾曲線自定義速度曲線。我們可以在 http://cubic-bezier.com 可視化的創(chuàng)建我們自己的貝塞爾曲線。比如創(chuàng)建一個(gè)剛開始極慢,突然變得極快的曲線:

css:

animation-timing-function: cubic-bezier(1,.03,1,-0.03);

效果:

是不是挺神奇!

(5) Chain Animation

我們可以將多個(gè)animation串聯(lián)使用,比如我們想讓小人在行駛的過程中跳躍,可以這么寫:

css:

.mario {
  ...
  
  animation: drive 3s both infinite linear, jump 0.5s 1.2s ease-in-out infinite;
}

@keyframes jump {
  0% { top: -40px; }
  50% { top: -120px; }
  100% { top: -40px; }
}

效果:

實(shí)踐

本文目的在于普及css3 animation的基礎(chǔ),并未完全覆蓋animation的知識(shí),未涉及和講解的知識(shí)請(qǐng)大家見諒 。 掌握上述知識(shí)后,我們就已經(jīng)可以用animation做出豐富的動(dòng)畫效果了,下面列出一些codepen上的小例子:

full mario demo

animated popup

fly items to shopping cart

flipping cards

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/53476.html

相關(guān)文章

  • 前端培訓(xùn)-初級(jí)階段(5 - 8)

    摘要:前端最基礎(chǔ)的就是。類同于標(biāo)簽將對(duì)象作為彈性伸縮盒顯示。定義了一條立方貝塞爾曲線。是,表示終止時(shí)間和終止?fàn)顟B(tài)。動(dòng)畫過渡可以理解為兩個(gè)關(guān)鍵幀的補(bǔ)間操作。往期前端培訓(xùn)初級(jí)階段后記年月日更新。參考資料引用培訓(xùn)目錄出處已備份到筆記速查視差滾動(dòng) 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門技術(shù)就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTM...

    PAMPANG 評(píng)論0 收藏0
  • 前端培訓(xùn)-初級(jí)階段(5 - 8)

    摘要:前端最基礎(chǔ)的就是。類同于標(biāo)簽將對(duì)象作為彈性伸縮盒顯示。定義了一條立方貝塞爾曲線。是,表示終止時(shí)間和終止?fàn)顟B(tài)。動(dòng)畫過渡可以理解為兩個(gè)關(guān)鍵幀的補(bǔ)間操作。往期前端培訓(xùn)初級(jí)階段后記年月日更新。參考資料引用培訓(xùn)目錄出處已備份到筆記速查視差滾動(dòng) 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門技術(shù)就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTM...

    gaosboy 評(píng)論0 收藏0
  • 「前端早讀君006」移動(dòng)開發(fā)必備:那些玩轉(zhuǎn)H5的小技巧

    摘要:今日勵(lì)志語錄有志者自有千計(jì)萬計(jì),無志者只感千難萬難。三動(dòng)畫技術(shù)越來越不陌生,使用門檻也漸漸降低,而且動(dòng)畫還可以使用控制。掃一掃查看效果打開微掃一掃關(guān)注早讀君,每天早晨為你推送前端知識(shí),度過擠地鐵坐公交的時(shí)光 今日勵(lì)志語錄有志者自有千計(jì)萬計(jì),無志者只感千難萬難。 文章原出處:騰訊ISUX 開始閱讀之前你可以先掃一掃體驗(yàn)demoshowImg(https://segmentfault.co...

    LittleLiByte 評(píng)論0 收藏0
  • 「前端早讀君006」移動(dòng)開發(fā)必備:那些玩轉(zhuǎn)H5的小技巧

    摘要:今日勵(lì)志語錄有志者自有千計(jì)萬計(jì),無志者只感千難萬難。三動(dòng)畫技術(shù)越來越不陌生,使用門檻也漸漸降低,而且動(dòng)畫還可以使用控制。掃一掃查看效果打開微掃一掃關(guān)注早讀君,每天早晨為你推送前端知識(shí),度過擠地鐵坐公交的時(shí)光 今日勵(lì)志語錄有志者自有千計(jì)萬計(jì),無志者只感千難萬難。 文章原出處:騰訊ISUX 開始閱讀之前你可以先掃一掃體驗(yàn)demoshowImg(https://segmentfault.co...

    liuyix 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<