<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          妙??!動(dòng)畫還可以這樣控制?

          共 3433字,需瀏覽 7分鐘

           ·

          2022-05-28 17:47

          作者:chokcoco

          來源:SegmentFault  思否社區(qū) 


          今天,有在群里看到這樣一個(gè)問題:有一個(gè)動(dòng)畫,一開始靜止處于第一幀,只在用戶 hover 的時(shí)候運(yùn)行動(dòng)畫,在運(yùn)行一次后停止,并且停留在最后一幀,使用 CSS 可以完成么?


          像是這樣:



          一個(gè)非常有意思的問題,答案是可以的。我們抽取一下其中的關(guān)鍵點(diǎn):


          1. 動(dòng)畫只運(yùn)行一次,未運(yùn)行前處于第一幀,運(yùn)行完后處于最后一幀
          2. 動(dòng)畫通過 hover 驅(qū)動(dòng),只有用戶 hover 元素的時(shí)候,動(dòng)畫才進(jìn)行


          animation-fill-mode 控制元素在各個(gè)階段的狀態(tài)



          首先,動(dòng)畫只運(yùn)行一次,未運(yùn)行前處于第一幀,運(yùn)行完后處于最后一幀。


          這個(gè)剛好利用 CSS 動(dòng)畫的 animation-fill-mode: both 即可。

          1. animation-fill-mode: backwards:可以讓元素在動(dòng)畫開始之前的樣式為動(dòng)畫運(yùn)行時(shí)的第一幀,動(dòng)畫結(jié)束后的樣式則恢復(fù)為 CSS 規(guī)則設(shè)定的樣式

          2. animation-fill-mode: forwards:元素在動(dòng)畫開始之前的樣式為 CSS 規(guī)則設(shè)定的樣式,而動(dòng)畫結(jié)束后的樣式則表現(xiàn)為由執(zhí)行期間遇到的最后一個(gè)關(guān)鍵幀計(jì)算值(也就是停在最后一幀)


          而,animation-fill-mode: both 兼顧了上面兩種模式的特點(diǎn),可以使得動(dòng)畫開始前的樣式為動(dòng)畫運(yùn)行時(shí)的第一幀,動(dòng)畫結(jié)束后停在最后一幀。

          反向利用 animation-play-state 實(shí)現(xiàn) hover 觸發(fā)動(dòng)畫行進(jìn)



          動(dòng)畫通過 hover 驅(qū)動(dòng),只有用戶 hover 元素的時(shí)候,動(dòng)畫才進(jìn)行這一點(diǎn),利用 animation-play-state 即可。


          我們都知道,正常情況下,動(dòng)畫應(yīng)該是運(yùn)行狀態(tài),那如果我們將動(dòng)畫的默認(rèn)狀態(tài)設(shè)置為暫停,只有當(dāng)鼠標(biāo)點(diǎn)擊或者 hover 的時(shí)候,才設(shè)置其 animation-play-state: running,這樣就可以利用 hover 控制動(dòng)畫的行進(jìn)!

          基于上述兩點(diǎn),我們來實(shí)現(xiàn)一個(gè)有意思的打字動(dòng)畫,做到動(dòng)畫只觸發(fā)單次,并且只有 hover 的時(shí)候動(dòng)畫會(huì)運(yùn)行。

          <p>Hover Me - You are a pig!</p>

          p {
              position: relative;
              font-family: monospace;
              width: 26ch;
              animation: typing 3s steps(15, end);
              animation-fill-mode: both;
              animation-play-state: paused;
              overflow: hidden;
          }
          p:hover  {
              animation-play-state: running;
          }
          p::before {
              position: absolute;
              content: "";
              width: 4px;
              top: 0;
              bottom: 0;
              right: 0;
              animation: blink .8s linear infinite;
          }
          @keyframes blink {
              0%, 50% {
                  border-right: 4px solid transparent;
              }
              50%, 100% {
                  border-right: 4px solid #000;
              }
          }
          @keyframes typing {
              from {
                  width: 11ch;
              }
              to {
                  width: 26ch;
              }
          }

          默認(rèn)情況下,展示這樣一個(gè)界面:


          接下來,我們把鼠標(biāo)放上去,看看會(huì)發(fā)生什么:


          有意思,完美的實(shí)現(xiàn)了上面說的要求 -- 動(dòng)畫通過 hover 驅(qū)動(dòng),只有用戶 hover 元素的時(shí)候,動(dòng)畫才進(jìn)行

          當(dāng)然,這里還運(yùn)用了幾個(gè)小技巧,一并解釋下:

          1. 打字動(dòng)畫運(yùn)用了逐幀動(dòng)畫,而不是補(bǔ)間動(dòng)畫,主要利用了 CSS 動(dòng)畫的 step-timing-function 步驟緩動(dòng)函數(shù),也就是代碼中的 steps(15, end)

          2. ch 是 CSS 當(dāng)中的一個(gè)相對(duì)單位,這一單位代表元素所用字體 font 中 “0” 這一字形的寬度

          3. font-family: monospace 表示等寬字體,每個(gè)字符占據(jù)的寬度是一樣,因?yàn)槲覀兪褂昧?nbsp;26ch 來充當(dāng) <p> 元素的寬度,而 Hover Me - You are a pig 這一段文字算上空格剛好 26 個(gè)字符,26ch 剛好表示這一段文本的長(zhǎng)度

          4. 一開始展示的文本 Hover me - 算上空格是 11ch 寬度,而最后整個(gè)文本展示完需要 26ch 的寬度,中間需要經(jīng)過 15 步的逐幀動(dòng)畫,這里的元素剛好和代碼中的一一對(duì)應(yīng)上


          借助上面 4 步及搭配我們上文介紹的 animation-fill-mode: both、animation-play-state: paused 的應(yīng)用,我們就完美的實(shí)現(xiàn)了這樣一個(gè)非常有意思的打字動(dòng)畫。

          完整的代碼:https://codepen.io/Chokcoco/pen/QWQNJyp

          如果你想對(duì) CSS 動(dòng)畫有更深入細(xì)致的了解,可以翻看我的這篇文章,對(duì)動(dòng)畫的每一個(gè)屬性都有著十分細(xì)致的講解。

          文章鏈接:https://github.com/chokcoco/iCSS/issues/141


          最后



          OK,本文到此結(jié)束,希望本文對(duì)你有所幫助 :)

          如果還有什么疑問或者建議,可以多多交流,原創(chuàng)文章,文筆有限,才疏學(xué)淺,文中若有不正之處,萬望告知。



          點(diǎn)擊左下角閱讀原文,到 SegmentFault 思否社區(qū) 和文章作者展開更多互動(dòng)和交流,掃描下方”二維碼“或在“公眾號(hào)后臺(tái)回復(fù)“ 入群 ”即可加入我們的技術(shù)交流群,收獲更多的技術(shù)文章~

          - END -


          瀏覽 36
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  狼友视频网站 | 特级茜茜人体444WWw高清大胆 | 综合网激情 | 日本美女操逼免费看 | 国产一级乱伦视频 |