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

資訊專欄INFORMATION COLUMN

CSS魔法堂:更豐富的前端動效by CSS Animation

MrZONT / 875人閱讀

摘要:無效生效重復(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ī)范

// 命名需要遵循以下規(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.重復(fù)怎么辦
@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.重復(fù)怎么辦
與@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;
}
子屬性介紹

,指定通過@keyframes定義的補(bǔ)間動畫名稱。
,動畫持續(xù)時(shí)長,默認(rèn)為0s。單位為s和ms。
,動畫播放延遲,默認(rèn)為0s。單位為s和ms。
,動畫重復(fù)播放次數(shù),默認(rèn)為1,infinite表示無限循環(huán)。動畫播放總時(shí)長為*。
,可選值為normal | reverse | alternate | alternate-reverse,分別表示動畫播放順序是從from到to,從to到from從from到to再從to到from從to到from再從from到to。注意:設(shè)置alternate|alternate-reverse時(shí),animation-iteration-count必須大于1才能看到效果
,可選值為none | forwards | backwards | both,用于設(shè)置動畫開始前和結(jié)束后是否應(yīng)用0%100%的樣式對元素上。分別表示不應(yīng)用,應(yīng)用100%的樣式,延遲播放期間應(yīng)用0%的樣式0%和100%的樣式均應(yīng)用。
注意:

默認(rèn)情況下(none),動畫結(jié)束后會恢復(fù)動畫前的樣式;

設(shè)置backwards時(shí),值大于0才能看到效果。

,可選值running | paused,獲取和設(shè)置播放狀態(tài)。注意:通過這個(gè)屬性,我們僅能實(shí)現(xiàn)暫停和繼續(xù)播放的效果,無法實(shí)現(xiàn)重播,更別說回放了
,用于設(shè)置緩動函數(shù)類型,值為ease | ease-in | ease-out | ease-in-out | linear | step-start | step-end | steps(, ) | frames() | cubic-bezier(,,,)。
其中ease | ease-in | ease-out | ease-in-out | linear | cubic-bezier(,,,)的效果均為連續(xù)漸變的,而step-start | step-end | steps(, ) | frames()則為突變效果。下面我們深入理解后者吧。

緩動函數(shù)-step解疑專題

?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í)間了:

另外通過將設(shè)置為forwards,那么當(dāng)設(shè)置為end時(shí),也會顯示(保持)動畫最后一個(gè)關(guān)鍵幀的樣式。

事件
const target = document.getElementById("target")
target.addEventListener("animationstart", e => {
  // 動畫開始時(shí)觸發(fā)
})
target.addEventListener("animationiteration", e => {
  // 每次重復(fù)執(zhí)行動畫時(shí)觸發(fā)
  // 當(dāng)為1時(shí),不會觸發(fā)。
})
target.addEventListener("animationend", e => {
  // 當(dāng)動畫結(jié)束時(shí)觸發(fā)
})
搞盡腦汁實(shí)現(xiàn)重播效果

到這里我們已經(jīng)可以通過@keyframes定義和應(yīng)用CSS Animation了,但我們能否獲取對動畫效果更多的控制權(quán)呢?如開始、暫停、繼續(xù)、重播。通過我們能輕易實(shí)現(xià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

相關(guān)文章

  • CSS魔法:稍稍深入偽類選擇器

    摘要:前言過去零零星星地了解和使用和等偽類偽元素選擇器,最近看書時(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í)...

    tanglijun 評論0 收藏0
  • CSS魔法:display:none與visibility:hidden恩怨情仇

    摘要:不耽誤表單提交數(shù)據(jù)雖然我們無法看到的元素,但當(dāng)表單提交時(shí)依然會將隱藏的元素的值提交上去。讓元素在見面上不可視,但保留元素原來占有的位置。不過由于各瀏覽器實(shí)現(xiàn)效果均有出入,因此一般不會使用這個(gè)值。繼承父元素的值。 前言 ?還記得面試時(shí)被問起請說說display:none和visibility:hidden的區(qū)別嗎?是不是回答完display:none不占用原來的位置,而visibilit...

    selfimpr 評論0 收藏0
  • 可能是最全前端動效庫匯總

    摘要:非常的龐大,而且它是完全為設(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ǔ)動...

    afishhhhh 評論0 收藏0
  • CSS魔法:重拾Border之——不僅僅是圓角

    摘要:擼代碼實(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...

    _Dreams 評論0 收藏0
  • CSS魔法:重拾Border之——廣闊遐想

    摘要:也就是說我們操作的幾何公式中的未知變量,而具體的畫圖操作則由渲染引擎處理,而不是我們苦苦哀求設(shè)計(jì)師幫忙。 前言 ?當(dāng)CSS3推出border-radius屬性時(shí)我們是那么欣喜若狂啊,一想到終于不用再添加額外元素來模擬圓角了,但發(fā)現(xiàn)border-radius還分水平半徑和垂直半徑,然后又發(fā)現(xiàn)border-top-left/right-radius的水平半徑之和大于元素寬度時(shí),實(shí)際值會按比...

    lily_wang 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<