本篇文章為大家展示了Animation怎么在CSS3 中使用,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
創(chuàng)新互聯(lián)建站從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元合作做網(wǎng)站,已為上家服務(wù),為合作各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792
兼容性
animation在絕大部分主流瀏覽器都得到了很好的支持!還在兼容IE9的同學(xué)要謹(jǐn)慎使用。
CSS 坐標(biāo)系
在了解animtion之前,我們有必要先了解css的坐標(biāo)系,因?yàn)楹芏嗟腶nimation效果都和元素的坐標(biāo)密切相關(guān)。在css3中網(wǎng)頁不再是一個二維平面,而是一個三維空間,水平方向、豎直方向和垂直屏幕方向分別對應(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)、扭曲等,而且不會影響正常的文檔流(document flow)。
(1) Translate
Translate一般譯為“翻譯”,但在css里面一般用作“平移”,因?yàn)閠ranslate用于改變html元素的在3d坐標(biāo)系位置。translate支持在坐標(biāo)系內(nèi)任意方向移動(通過任意組合x、y、z方向的向量),單位可以是長度單位和百分比(百分比是相對于被平移的元素自身尺寸,x軸是相對于width,y軸是相對于height,而在z軸方向由于元素是沒有‘厚度’的,所以對于z方向不能用百分比表示),例如:
transform: translateX(100px) translateY(50%) translateZ(-100px); // 或者簡寫 transform: translate3d(100px, 50%, 2em);
注意:
translate
是xy平面內(nèi)的2維平移,translate3d
是xyz空間內(nèi)的三維平移;
translate
也可以單獨(dú)書寫,如 translate: 50% 105px 5rem;
,但是該特性尚在實(shí)驗(yàn)階段,很多瀏覽器不支持,所以現(xiàn)階段還是配合transform
使用。詳情參考MDN translate。
(2) Scale
Scale意為“縮放”,顧名思義,是用于改變元素的大小。例如:
transform: scaleX(2) scaleY(0.5) scaleZ(1); // 或者簡寫 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()
之分,也可以單獨(dú)書寫,此處不贅述。
(3) Rotate
Rotate意為“旋轉(zhuǎn)”,支持將元素以x、y、z為軸旋轉(zhuǎn),旋轉(zhuǎn)正方向?yàn)槊娉鴺?biāo)軸正向逆時(shí)針方向,可參考上面坐標(biāo)系示意圖。rotate
方法接收一個角度作為參數(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不能簡寫為transform: rotate3d(30deg, 60deg, 90deg)
的形式,rotate3d
的用法為:前三個參數(shù)為數(shù)字,代表x、y、z方向的向量,相加得到向量v,第四個參數(shù)為角度,表示以向量v為軸逆時(shí)針旋轉(zhuǎn)的角度,語法如下:
transform: rotate3d(1, 2, 3, 90deg);
與translate
和scale
類似,rotate
也可以作為單獨(dú)的css屬性,但還在實(shí)驗(yàn)階段。
出于篇幅考慮,我只列出三種最常用的tranform function,剩下的transform function請參考 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則不會。所以在使用transform需按照 translate -> rotate -> scale
的順序書寫,讓scale先執(zhí)行,以免放大translate的效果,而rotate先translate執(zhí)行以防止帶著平移的距離一起轉(zhuǎn)動。我覺得這是transform目前不方便的地方,因?yàn)榉椒ㄖg相互干擾并不容易理解,書寫順序也不容易記住。在未來有望通過使用獨(dú)立的css transform屬性解決這一問題,因?yàn)楠?dú)立的transform屬性對書寫順序沒有依賴,方法之間彼此不會干擾。
Transition
Transition翻譯為“過渡”,強(qiáng)調(diào)的是過程。在css中指在一段時(shí)間內(nèi),元素從一個狀態(tài)(對應(yīng)一個css屬性)過渡到另一個狀態(tài)的動態(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; }
效果:
我們還可以給每個效果設(shè)置不同的timing function,用于控制加速效果。
比如我們可以讓旋轉(zhuǎn)的速度逐漸加快:
.cloud{ width: 240px; transition: transform 2s ease-in; } .cloud:hover{ transform: rotate(1080deg); }
效果:
更多的timing function請后面會進(jìn)一步討論,也可以參考 MDN transition-timing-functions
Keyframes
(1) 基本用法
Keyframe中文譯為“關(guān)鍵幀”,是animation中很強(qiáng)大的功能,通俗說就是我們可以通過定義一段動畫中的關(guān)鍵點(diǎn)、關(guān)鍵狀態(tài)來創(chuàng)建動畫。Keyframes相比transition對動畫過程和細(xì)節(jié)有更強(qiáng)的控制。
我們先看一個例子(部分代碼省略)
html:
<div class="sky"></div> <div class="grass"></div> <div class="road"> <div class="lines"></div> <img src="http://lc-jOYHMCEn.cn-n1.lcfile.com/a3f630c957a4b32d0221.png" class="mario animated"> </div>
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%
。每個時(shí)間點(diǎn)對應(yīng)一個css狀態(tài),代表一個關(guān)鍵幀(keyframe)。keyframes定義完成后使用方法如下:
animation也有簡寫形式,如:
animation: slidein 3s ease-in 1s infinite reverse both running;
但這種對書寫順序有一定要求(delay要寫在duration后面,其他參數(shù)無順序要求,css會通過傳入的關(guān)鍵詞識別)。
(2) Animation Delay
通過animation-delay
,我們可以給動畫延遲執(zhí)行:
animation-delay: 2s;
(3) Animation Fill Modeforwards
在上面的例子中可以看到馬里奧運(yùn)動到右邊之后又回到了起點(diǎn),如果我們想讓他運(yùn)動完成后就停留在右邊呢?很簡單,我們設(shè)置annimation fill mode就可以了:
animation-fill-mode: forwards
forwards
表示動畫完成后,元素將保持最后一幀的狀態(tài)。
backwards
與之相對的還有 backwards
,backwards
表示并不是動畫完成后元素變回第一幀的狀態(tài),而是表示當(dāng)設(shè)置了animation-delay
時(shí),在動畫開始前的等待過程中,立刻給元素應(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) } }
效果:
可以看到,動畫開始之前小人立馬移動到350px處,1s之后才開始動畫。
both
顯而易見,both會同時(shí)應(yīng)用forwards和backwards兩種規(guī)則,即在delay時(shí)先應(yīng)用第一幀的狀態(tài),結(jié)束時(shí)保持最后一幀的狀態(tài)。
(3) Animation Repeat
我們可以通過 animation-iteration-count
設(shè)置動畫循環(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ū)別在于加速減速過程是對稱的
linear:恒速運(yùn)動
直觀表現(xiàn)如下(codepen):
除了上面現(xiàn)成的方法,我們可以通過貝塞爾曲線自定義速度曲線。我們可以在 http://cubic-bezier.com 可視化的創(chuàng)建我們自己的貝塞爾曲線。比如創(chuàng)建一個剛開始極慢,突然變得極快的曲線:
css:
animation-timing-function: cubic-bezier(1,.03,1,-0.03);
效果:
是不是挺神奇!
(5) Chain Animation
我們可以將多個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; } }
效果:
上述內(nèi)容就是Animation怎么在CSS3 中使用,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站標(biāo)題:Animation怎么在CSS3中使用
鏈接分享:http://www.rwnh.cn/article24/jcjgje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、自適應(yīng)網(wǎng)站、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站策劃、搜索引擎優(yōu)化、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)