成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

妙啊!動畫還可以這樣控制?

開發 前端
有一個動畫,一開始靜止處于第一幀,只在用戶 hover 的時候運行動畫,在運行一次后停止,并且停留在最后一幀,使用 CSS 可以完成么?

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

像是這樣:

一個非常有意思的問題,答案是可以的。我們抽取一下其中的關鍵點:

動畫只運行一次,未運行前處于第一幀,運行完后處于最后一幀。

動畫通過 hover 驅動,只有用戶 hover 元素的時候,動畫才進行。

animation-fill-mode 控制元素在各個階段的狀態

首先,動畫只運行一次,未運行前處于第一幀,運行完后處于最后一幀。

這個剛好利用 CSS 動畫的 animation-fill-mode: both 即可。

  1. animation-fill-mode: backwards:可以讓元素在動畫開始之前的樣式為動畫運行時的第一幀,動畫結束后的樣式則恢復為 CSS 規則設定的樣式。
  2. animation-fill-mode: forwards:元素在動畫開始之前的樣式為 CSS 規則設定的樣式,而動畫結束后的樣式則表現為由執行期間遇到的最后一個關鍵幀計算值(也就是停在最后一幀)。

而,animation-fill-mode: both 兼顧了上面兩種模式的特點,可以使得動畫開始前的樣式為動畫運行時的第一幀,動畫結束后停在最后一幀。

反向利用 animation-play-state 實現 hover 觸發動畫行進。

而動畫通過 hover 驅動,只有用戶 hover 元素的時候,動畫才進行這一點,利用 animation-play-state 即可。

我們都知道,正常情況下,動畫應該是運行狀態,那如果我們將動畫的默認狀態設置為暫停,只有當鼠標點擊或者 hover 的時候,才設置其 animation-play-state: running,這樣就可以利用 hover 控制動畫的行進!

基于上述兩點,我們來實現一個有意思的打字動畫,做到動畫只觸發單次,并且只有 hover 的時候動畫會運行。

<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;
}
}

默認情況下,展示這樣一個界面:

接下來,我們把鼠標放上去,看看會發生什么:

有意思,完美的實現了上面說的要求 -- 動畫通過 hover 驅動,只有用戶 hover 元素的時候,動畫才進行。

當然,這里還運用了幾個小技巧,一并解釋下:

  1. 打字動畫運用了逐幀動畫,而不是補間動畫,主要利用了 CSS 動畫的 step-timing-function 步驟緩動函數,也就是代碼中的 steps(15, end)。
  2. ch 是 CSS 當中的一個相對單位,這一單位代表元素所用字體 font 中 “0” 這一字形的寬度。
  3. font-family: monospace 表示等寬字體,每個字符占據的寬度是一樣,因為我們使用了 26ch 來充當 。
  4. 元素的寬度,而 Hover Me - You are a pig 這一段文字算上空格剛好 26 個字符,26ch 剛好表示這一段文本的長度。
  5. 一開始展示的文本 Hover me - 算上空格是 11ch 寬度,而最后整個文本展示完需要 26ch 的寬度,中間需要經過 15 步的逐幀動畫,這里的元素剛好和代碼中的一一對應上。

借助上面 4 步及搭配我們上文介紹的 animation-fill-mode: both、animation-play-state: paused 的應用,我們就完美的實現了這樣一個非常有意思的打字動畫。

完整的代碼,你可以戳這里 CodePen Demo -- running once animation by hover[1]。

如果你想對 CSS 動畫有更深入細致的了解,可以翻看我的這篇文章,對動畫的每一個屬性都有著十分細致的講解:深入淺出 CSS 動畫[2]

最后

OK,本文到此結束,希望本文對你有所幫助 :)

參考資料

  • [1]CodePen Demo -- running once animation by hover: https://codepen.io/Chokcoco/pen/QWQNJyp。
  • [2]深入淺出 CSS 動畫: https://github.com/chokcoco/iCSS/issues/141。
責任編輯:姜華 來源: iCSS前端趣聞
相關推薦

2021-03-03 08:05:53

C++項目函數

2022-07-30 23:45:09

內存泄漏檢測工具工具

2021-02-01 13:35:28

微信Python技巧

2023-07-03 16:49:47

5G

2013-09-18 10:44:01

搜狗輸入法詞語

2012-10-12 10:13:26

eclips代碼編寫Editplus

2020-08-24 07:19:13

主鍵自增數據庫

2019-01-29 10:00:59

GitHub開源搜索

2024-06-13 08:19:08

Controller接口參數

2024-05-17 09:37:26

format屬性Spring

2023-12-11 13:57:00

RFM模型激勵機制

2020-12-28 08:36:30

C語言編程泛型

2018-06-03 09:43:47

iOSAndroid谷歌

2020-06-03 10:54:28

戴爾

2024-08-06 09:51:21

SpringHTTPJSON

2022-06-27 08:01:55

動畫CSS前端

2022-09-26 07:32:24

開發接口編程

2018-06-27 14:23:38

機器學習人工智能入門方法

2022-02-17 13:46:15

SSH命令內網

2016-09-29 17:48:32

騰訊云語音質檢珍愛網
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品爱久久久久久久 | 99久久夜色精品国产亚洲96 | 一区二区三区四区毛片 | 久久极品 | 北条麻妃一区二区三区在线观看 | 亚洲欧美日韩精品久久亚洲区 | 欧美三级三级三级爽爽爽 | 国内精品久久久久久久 | 国产福利91精品一区二区三区 | 亚洲日日操 | 久久久www| 羞羞视频网站免费观看 | 99精品视频在线 | 日韩欧美在线播放 | 色播99 | 怡红院免费的全部视频 | 成人国产一区二区三区精品麻豆 | 免费看黄色片 | 欧美一级片在线看 | 久久亚洲精品国产精品紫薇 | 精品麻豆剧传媒av国产九九九 | 欧美色欧美亚洲另类七区 | 精品国产欧美在线 | 亚洲二区在线观看 | 精品视频一区二区在线观看 | 热99| 久久一二区 | 成人三级视频 | 在线天堂免费中文字幕视频 | 天天干天天插天天 | 丁香色婷婷 | 国产精品成av人在线视午夜片 | 一区二区三区国产好 | 99精品福利视频 | 日韩av福利在线观看 | www.久久国产精品 | 欧洲视频一区 | 激情小说综合网 | 精品久久香蕉国产线看观看亚洲 | 奇米视频777| 亚洲精品一区二区三区四区高清 |