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

来源:https://www.cnblogs.com/coco1s/archive/2022/05/24/16304660.html
-Advertisement-
Play Games

今天,有在群里看到這樣一個問題:有一個動畫,一開始靜止處於第一幀,只在用戶 hover 的時候運行動畫,在運行一次後停止,並且停留在最後一幀,使用 CSS 可以完成麽? 像是這樣: 一個非常有意思的問題,答案是可以的。我們抽取一下其中的關鍵點: 動畫只運行一次,未運行前處於第一幀,運行完後處於最後一 ...


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

像是這樣:

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

  1. 動畫只運行一次,未運行前處於第一幀,運行完後處於最後一幀
  2. 動畫通過 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 來充當 <p> 元素的寬度,而 Hover Me - You are a pig 這一段文字算上空格剛好 26 個字元,26ch 剛好表示這一段文本的長度
  4. 一開始展示的文本 Hover me - 算上空格是 11ch 寬度,而最後整個文本展示完需要 26ch 的寬度,中間需要經過 15 步的逐幀動畫,這裡的元素剛好和代碼中的一一對應上

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

完整的代碼,你可以戳這裡 CodePen Demo -- running once animation by hover

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

最後

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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ⚡工程化、模塊化與更舒服的用戶腳本開發方式,顯著提升開發體驗 ...
  • 第1章 課程介紹(瞭解本課程必看) 試看1 節 | 8分鐘 整體瞭解課程目標和課程內容安排,對 Next.js 作簡要介紹,讓同學對要做的事情有直觀瞭解,準備前置流程。 收起列表 視頻:1-1 導學 (07:23)試看 第2章 使用Next.js 項目初始化及工程配置介紹3 節 | 35分鐘 初始化 ...
  • 第1章 【序章】關於這門課,你需要瞭解得都在這裡 試看3 節 | 5分鐘 前端工程化&ne;Webpack ,真正的前端工程化覆蓋一個項目從創建到開發到發佈的整個流程,既是目前大廠主流的項目提效方案,更是高薪面試 “必考項”!從本章開始,讓我們一起跟隨 Sam 老師,開啟“前端工程化”得升級之旅吧! ...
  • 第1章 課程介紹 試看1 節 | 15分鐘 本章中,將會對課程的內容做介紹說明,總覽課程中涉及到的知識點和學習方向。 收起列表 視頻:1-1 課程介紹 (14:39)試看 第2章 從0搭建一個項目腳手架5 節 | 36分鐘 從0配置開發環境並初始化項目腳手架 收起列表 視頻:2-1 本章導學 (01 ...
  • ###效果圖 ###組件介紹 原生小程式編寫,簡單輕便,拿來即用。 gitee地址:https://gitee.com/qq_connect-EC6BCC0B556624342/wx-calendar ###代碼部分(這裡可能不是最新的推薦去gitee克隆代碼) calendar.wxml <!-- ...
  • 階段一:課程設計及前端創建腳手架開發 第1周 需求分析和架構設計:做什麼,如何做? 開工之前,先來看看我們到底要做一個什麼項目,有哪些功能。然後站在上帝視角,從整體的架構層面,該如何設計該項目。 課程安排: 1、需求分析-瞭解軟體開發生命周期2、技術整體架構3、研發流程優化背後的思考4、為什麼要優化 ...
  • 建議您在閱覽此文之前學完W3school - JS Tutorial章節所有內容 經典的問題 在一些文章中或者工作面試問題上,會遇見這種看似簡單的經典問題。 for(var i = 0; i < 5; i++) { setTimeout(function () { console.log(i); } ...
  • Vivus是一個輕量級的JavaScript類(沒有依賴關係),它允許您對svg進行動畫處理,使它們具有正在繪製的外觀。有多種不同的動畫可供選擇,還可以創建自定義腳本,以您喜歡的任何方式繪製SVG。 一、安裝 npm:npm install vivus bower install vivus 通過s ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...