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