摘要:無(wú)效生效重復(fù)怎么辦與規(guī)則一樣,標(biāo)準(zhǔn)規(guī)定相同的關(guān)鍵幀不產(chǎn)生層疊,僅最后出現(xiàn)的認(rèn)定為有效。但實(shí)際上和均將關(guān)鍵幀設(shè)計(jì)為可層疊的。為默認(rèn)值,表示動(dòng)畫(huà)一結(jié)束,動(dòng)畫(huà)效果就結(jié)束表示動(dòng)畫(huà)一開(kāi)始就馬上執(zhí)行完第一個(gè)關(guān)鍵幀的效果。
前言
?在《CSS魔法堂:Transition就這么好玩》中我們了解到對(duì)于簡(jiǎn)單的補(bǔ)間動(dòng)畫(huà),我們可以通過(guò)transition實(shí)現(xiàn)。那到底多簡(jiǎn)單的動(dòng)畫(huà)適合用transtion來(lái)實(shí)現(xiàn)呢?答案就是——我們只需定義動(dòng)畫(huà)起始和結(jié)束幀的狀態(tài)的動(dòng)畫(huà)。一旦關(guān)鍵幀數(shù)大于2時(shí),我們必須轉(zhuǎn)向CSS Animation了。本文為這段時(shí)間學(xué)習(xí)的記錄,歡迎拍磚。
簡(jiǎn)單粗暴介紹CSS Animation 規(guī)則和屬性 定義關(guān)鍵幀動(dòng)畫(huà)語(yǔ)法:
@keyframes{ [ { /* CSS Properties */ }]* }
示例:
@keyframes rotate { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
注意項(xiàng):
1.
// 命名需要遵循以下規(guī)則 const rIsInvalid = /^--|^[0-9]+-|^(?:unset|initial|inherit|none)$/ , rIsValid = /^[0-9a-z-_]+$/i function isValidAnimationName(animationName: string): boolean{ return !rIsInvalid.test(animationName) && rIsValid(animationName) }
2.
0-100%、from,等價(jià)與0%、 to,等價(jià)與100%。
3.
@keyframes CSS規(guī)則不支持層疊樣式,因此當(dāng)出現(xiàn)多個(gè)同名keyframes,那么僅最后出現(xiàn)的那個(gè)有效。
/* 無(wú)效 */ @keyframes rotate { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* 生效 */ @keyframes rotate { from { transform: rotate(90deg); } to { transform: rotate(-360deg); } }
4.
與@keyframes CSS規(guī)則一樣,標(biāo)準(zhǔn)規(guī)定相同的關(guān)鍵幀不產(chǎn)生層疊,僅最后出現(xiàn)的認(rèn)定為有效。
但實(shí)際上FireFox14+和Chrome均將關(guān)鍵幀設(shè)計(jì)為可層疊的。
@keyframes rotate { from { transform: rotate(0deg); } from { background: red; } /* 上述兩條time offset實(shí)際上等價(jià)于 * from { transform: rotate(0deg); background: red; } */ to { transform: rotate(360deg); background: yellow; } }
5.!important導(dǎo)致屬性失效
一般情況下使用!important會(huì)讓CSS屬性獲得最高權(quán)重,但在@keyframes下卻會(huì)導(dǎo)致該CSS屬性失效。
@keyframes rotate { from { transform: rotate(90deg); background: red!important; /* background屬性無(wú)效 */ } to { transform: rotate(-360deg); } }
6.必須提供至少兩個(gè)關(guān)鍵幀
/* 不會(huì)根據(jù)緩動(dòng)函數(shù)產(chǎn)生動(dòng)畫(huà)效果,而是在動(dòng)畫(huà)持續(xù)時(shí)間的最后瞬間移動(dòng)過(guò)去 */ @keyframes move-left{ to { left: 100px; } }使用動(dòng)畫(huà)
{ animation: ; }
示例:
.box.rotate { animation: rotate 10s infinite alternate; }子屬性介紹
注意:
默認(rèn)情況下(none),動(dòng)畫(huà)結(jié)束后會(huì)恢復(fù)動(dòng)畫(huà)前的樣式;
設(shè)置backwards時(shí),
其中ease | ease-in | ease-out | ease-in-out | linear | cubic-bezier(
?step-start實(shí)際上等價(jià)于steps(10, start),而step-end則等價(jià)于steps(10),所以我們只要理解好steps(
/* 通過(guò)設(shè)置在一個(gè)動(dòng)畫(huà)周期內(nèi)()的平均刷新幀數(shù),實(shí)現(xiàn)突變動(dòng)效。具體應(yīng)用有:游戲精靈行走、打字效果等 * - 兩個(gè)關(guān)鍵幀間的刷新次數(shù) * - 方向,可選值為 end | start。 * end為默認(rèn)值,表示動(dòng)畫(huà)一結(jié)束,動(dòng)畫(huà)效果就結(jié)束; * start表示動(dòng)畫(huà)一開(kāi)始就馬上執(zhí)行完第一個(gè)關(guān)鍵幀的效果。 */ steps( , )
從張旭鑫那偷來(lái)的解釋:
start:表示直接開(kāi)始。也就是時(shí)間才開(kāi)始,就已經(jīng)執(zhí)行了一個(gè)距離段。于是,動(dòng)畫(huà)執(zhí)行的5個(gè)分段點(diǎn)是下面這5個(gè),起始點(diǎn)被忽略,因?yàn)闀r(shí)間一開(kāi)始直接就到了第二個(gè)點(diǎn):
end:表示戛然而止。也就是時(shí)間一結(jié)束,當(dāng)前距離位移就停止。于是,動(dòng)畫(huà)執(zhí)行的5個(gè)分段點(diǎn)是下面這5個(gè),結(jié)束點(diǎn)被忽略,因?yàn)榈纫獔?zhí)行結(jié)束點(diǎn)的時(shí)候已經(jīng)沒(méi)時(shí)間了:
另外通過(guò)將
const target = document.getElementById("target") target.addEventListener("animationstart", e => { // 動(dòng)畫(huà)開(kāi)始時(shí)觸發(fā) }) target.addEventListener("animationiteration", e => { // 每次重復(fù)執(zhí)行動(dòng)畫(huà)時(shí)觸發(fā) // 當(dāng)搞盡腦汁實(shí)現(xiàn)重播效果為1時(shí),不會(huì)觸發(fā)。 }) target.addEventListener("animationend", e => { // 當(dāng)動(dòng)畫(huà)結(jié)束時(shí)觸發(fā) })
到這里我們已經(jīng)可以通過(guò)@keyframes定義和應(yīng)用CSS Animation了,但我們能否獲取對(duì)動(dòng)畫(huà)效果更多的控制權(quán)呢?如開(kāi)始、暫停、繼續(xù)、重播。通過(guò)
function pause (target: HTMLElement):boolean { const isRunning = target.style.animationPlayState == "running" if (isRunning) { target.style.animationPlayState = "paused" } return isRunning } function play (target: HTMLElement):boolean { const isStop = target.style.animationPlayState == "paused" if (isStop) { target.style.animationPlayState = "running" } return isStop } function replay (target: HTMLElement, animationClassName: string):void { // 先移除動(dòng)畫(huà)效果 target.classList.remove(animationName) // requestAnimationFrame的回調(diào)函數(shù)會(huì)在下一次界面渲染前執(zhí)行 requestAnimationFrame(_ => { // 這時(shí)動(dòng)畫(huà)的影響還在,所以要等界面渲染完后再重新啟用動(dòng)畫(huà)效果,才能實(shí)現(xiàn)重播 requestAnimationFrame(_ => { target.classList.add(animationName) }) }) }總結(jié)
CSS3為我們提供了動(dòng)畫(huà)效果,除了提供比Transition更豐富的可控性,比JavaScript更簡(jiǎn)易的API,還讓我們可以使用GPU來(lái)加速呢^_^
尊重原創(chuàng),轉(zhuǎn)載請(qǐng)注明來(lái)自:https://www.cnblogs.com/fsjoh... ^_^肥仔John
https://developer.mozilla.org...
https://designmodo.com/steps-...
http://lea.verou.me/2011/09/p...
http://jsfiddle.net/simurai/C...
https://www.zhangxinxu.com/wo...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/116846.html
摘要:前言過(guò)去零零星星地了解和使用和等偽類偽元素選擇器,最近看書(shū)時(shí)發(fā)現(xiàn)這方面有所欠缺,于是決定稍微深入學(xué)習(xí)一下,以下為偽類部分的整理。偽類偽類選擇器實(shí)質(zhì)上是讓設(shè)計(jì)師可以根據(jù)元素特定的狀態(tài),設(shè)置不同的視覺(jué)效果。也就是符合以下選擇器的元素均支持狀態(tài)。 前言 ?過(guò)去零零星星地了解和使用:link、::after和content等偽類、偽元素選擇器,最近看書(shū)時(shí)發(fā)現(xiàn)這方面有所欠缺,于是決定稍微深入學(xué)習(xí)...
摘要:不耽誤表單提交數(shù)據(jù)雖然我們無(wú)法看到的元素,但當(dāng)表單提交時(shí)依然會(huì)將隱藏的元素的值提交上去。讓元素在見(jiàn)面上不可視,但保留元素原來(lái)占有的位置。不過(guò)由于各瀏覽器實(shí)現(xiàn)效果均有出入,因此一般不會(huì)使用這個(gè)值。繼承父元素的值。 前言 ?還記得面試時(shí)被問(wèn)起請(qǐng)說(shuō)說(shuō)display:none和visibility:hidden的區(qū)別嗎?是不是回答完display:none不占用原來(lái)的位置,而visibilit...
摘要:非常的龐大,而且它是完全為設(shè)計(jì)而生的動(dòng)效庫(kù)。它運(yùn)行于純粹的之上,是目前最強(qiáng)健的動(dòng)畫(huà)資源庫(kù)之一。可能是創(chuàng)建滾動(dòng)特效最好用的工具,它支持大量的瀏覽器,只要它們支持和特性??梢酝ㄟ^(guò)安裝吊炸天了,接近現(xiàn)實(shí)生活中的物理運(yùn)動(dòng)碰撞慣性動(dòng)畫(huà)庫(kù)。 收集日期為2019-02-28,★代表當(dāng)時(shí)的該項(xiàng)目在github的star數(shù)量 Animate.css 56401 ★ 一個(gè)跨瀏覽器的動(dòng)效基礎(chǔ)庫(kù),是許多基礎(chǔ)動(dòng)...
摘要:擼代碼實(shí)現(xiàn)首頁(yè)檢驗(yàn)單查詢成品通用標(biāo)準(zhǔn)審核圓角的何止是啊上圖的變成橢圓形了,而且中的文字好像飄到外面。我們可以看到兩邊相交所形成的矩形的對(duì)角線,將作為邊的相交點(diǎn)。 前言 ?當(dāng)CSS3推出border-radius屬性時(shí)我們是那么欣喜若狂啊,一想到終于不用再添加額外元素來(lái)模擬圓角了,但發(fā)現(xiàn)border-radius還分水平半徑和垂直半徑,然后又發(fā)現(xiàn)border-top-left/right...
摘要:也就是說(shuō)我們操作的幾何公式中的未知變量,而具體的畫(huà)圖操作則由渲染引擎處理,而不是我們苦苦哀求設(shè)計(jì)師幫忙。 前言 ?當(dāng)CSS3推出border-radius屬性時(shí)我們是那么欣喜若狂啊,一想到終于不用再添加額外元素來(lái)模擬圓角了,但發(fā)現(xiàn)border-radius還分水平半徑和垂直半徑,然后又發(fā)現(xiàn)border-top-left/right-radius的水平半徑之和大于元素寬度時(shí),實(shí)際值會(huì)按比...
閱讀 1760·2023-04-26 02:43
閱讀 3265·2021-11-11 16:54
閱讀 1428·2021-09-23 11:54
閱讀 1248·2021-09-23 11:22
閱讀 2438·2021-08-23 09:45
閱讀 911·2019-08-30 15:54
閱讀 3153·2019-08-30 15:53
閱讀 3245·2019-08-30 15:53