CSS 逐幀動畫

CSS 逐幀動畫實現指南

逐幀動畫(frame-by-frame animation)是一種通過快速連續顯示一系列靜態圖像來創造運動效果的技術。以下是使用CSS實現逐幀動畫的幾種方法。

1. 使用 steps() 計時函數

這是實現逐幀動畫最常用的方法,通過animation-timing-functionsteps()函數實現。

.sprite {width: 100px;height: 100px;background-image: url('sprite-sheet.png');animation: play 1s steps(6) infinite;
}@keyframes play {from { background-position: 0 0; }to { background-position: -600px 0; }
}

參數說明:

  • steps(6) - 表示動畫分為6步完成
  • -600px - 雪碧圖總寬度(6幀 × 每幀100px)

2. 完整雪碧圖動畫示例

<!DOCTYPE html>
<html>
<head>
<style>.character {width: 64px;height: 64px;background-image: url('https://example.com/walk-cycle.png');background-position: 0 0;animation: walk 1s steps(8) infinite;}@keyframes walk {from { background-position: 0 0; }to { background-position: -512px 0; } /* 8幀 × 64px */}
</style>
</head>
<body><div class="character"></div>
</body>
</html>

3. 多行雪碧圖處理

對于包含多行動畫的雪碧圖:

.sprite {width: 64px;height: 64px;background-image: url('multi-row-sprite.png');animation: play 0.8s steps(8) infinite;
}/* 行走動畫 */
.walk {animation-name: walk;
}@keyframes walk {from { background-position: 0 0; }to { background-position: -512px 0; }
}/* 跳躍動畫 */
.jump {animation-name: jump;
}@keyframes jump {from { background-position: 0 -64px; } /* 第二行 */to { background-position: -512px -64px; }
}

4. 使用多個DOM元素實現逐幀動畫

如果不使用雪碧圖,可以通過切換多個元素的顯示來實現:

<div class="frame-animation"><img src="frame1.png" class="frame active"><img src="frame2.png" class="frame"><img src="frame3.png" class="frame"><img src="frame4.png" class="frame">
</div>
.frame-animation {position: relative;width: 100px;height: 100px;
}.frame {position: absolute;top: 0;left: 0;opacity: 0;animation: frameAnimation 1s infinite;
}.frame.active {opacity: 1;
}@keyframes frameAnimation {0%, 25% { opacity: 0; }25.1%, 50% { opacity: 1;z-index: 1;}50.1%, 75% { opacity: 0;z-index: 0;}75.1%, 100% { opacity: 1;z-index: 1;}
}.frame:nth-child(1) { animation-delay: 0s; }
.frame:nth-child(2) { animation-delay: 0.25s; }
.frame:nth-child(3) { animation-delay: 0.5s; }
.frame:nth-child(4) { animation-delay: 0.75s; }

5. 使用CSS自定義屬性控制動畫幀

:root {--frame-count: 8;--frame-width: 64px;
}.sprite {width: var(--frame-width);height: 64px;background-image: url('sprite.png');animation: play 1s steps(var(--frame-count)) infinite;
}@keyframes play {to {background-position: calc(-1 * var(--frame-count) * var(--frame-width)) 0;}
}

性能優化建議

  1. 使用will-change:

    .sprite {will-change: background-position;
    }
    
  2. 減少復合操作:

    • 優先使用opacitytransform屬性
    • 避免在動畫中改變width/height等屬性
  3. 合理使用硬件加速:

    .sprite {transform: translateZ(0);
    }
    
  4. 控制動畫頻率:

    @media (prefers-reduced-motion: reduce) {.sprite {animation: none;}
    }
    

瀏覽器兼容性

  • 現代瀏覽器都支持steps()函數
  • IE10及以上支持,但可能需要前綴
  • 對于更老的瀏覽器,可以使用JavaScript實現回退

高級技巧:與JavaScript結合

// 動態改變動畫速度
const sprite = document.querySelector('.sprite');
sprite.style.animationDuration = '0.5s';// 暫停/播放動畫
function toggleAnimation() {const animation = sprite.style.animationPlayState;sprite.style.animationPlayState = animation === 'paused' ? 'running' : 'paused';
}// 切換不同動畫
function changeAnimation(type) {sprite.style.animationName = type;
}

逐幀動畫是游戲開發和UI動效中常用的技術,合理使用可以創建出流暢的視覺效果,同時保持較好的性能表現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88655.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88655.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88655.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高版本IDEA如何開發低版本jdk項目

問題描述 我這個人比較喜歡新的東西&#xff0c;比如使用idea的時候&#xff0c;我就喜歡最新版本。 但是有個問題&#xff0c;最新版本的idea好像不支持jdk1.6&#xff0c;導致我無法去用新版本idea開發項目。 直到有一天&#xff0c;idea給了我一個提示如下&#xff0c;之…

Java設計模式->責任鏈模式的介紹

目錄 1、責任鏈模式概念 1.1、定義介紹 1.2、流程圖 1.3、優缺點 2、實現 3、應用場景 3.1、Springmvc流程 3.2、mybatis的執行流程 3.3、Spring的過濾器和攔截器 3.4、sentinel限流熔斷 3.5、aop的加載和使用 4、舉例 前言 是一種 行為型設計模式&#xff0c;它通…

【Bluedroid】藍牙啟動之 btm_acl_device_down 流程源碼解析

本文詳細分析Android藍牙協議棧在設備故障時的處理流程。當藍牙設備發生硬件故障或系統異常時,協議棧通過btm_acl_device_down觸發多層次的資源清理和狀態重置,包括ACL連接終止、L2CAP通道釋放、SCO連接清理、BLE拓撲更新、設備數據庫重置等關鍵操作,確保系統安全恢復。 一、…

隨記:WebMvcConfigurationSupport 和WebMvcConfigurer 的區別

WebMvcConfigurationSupport &#xff08;抽象類&#xff09; 他是一個完整的 MVC 配置基類&#xff0c;他會禁用所有自動配置。默認靜態資源映射也沒有了。默認消息轉換器&#xff08;json、xml&#xff09;也沒有了。錯誤處理頁默認的error也沒有了。 WebMvcConfigurer &am…

npm run dev報錯

1. 引言 1.1 什么是npm run dev npm run dev 是一個在 Node.js 項目中常用的命令&#xff0c;它允許開發者運行一個預定義的腳本&#xff0c;通常用于啟動開發服務器或者執行開發環境的構建任務。這個命令是通過 package.json 文件中的 scripts 部分定義的&#xff0c;例如&…

Kotlin環境搭建與基礎語法入門

目標&#xff1a;完成開發環境配置&#xff0c;編寫第一個Kotlin程序&#xff0c;理解變量、數據類型和基本輸出。 1. 環境搭建 步驟1&#xff1a;安裝JDK 下載并安裝 JDK 17&#xff08;Kotlin兼容性最佳版本&#xff09;。 配置環境變量 JAVA_HOME&#xff0c;并在終端驗證…

CLion開發Qt桌面程序_git的簡單使用_小團體

OS&#xff1a;Windows Qt&#xff1a;6.8.1&#xff08;6.x&#xff09; Eg&#xff1a;學生信息管理系統 前言 Qt Creator編寫代碼不是太方便&#xff0c;使用CLion編寫代碼或許是個不錯的主意&#xff0c;CLion在此處主要是用于后端和測試的開發&#xff0c;界面方面還是…

C語言專題:8.函數指針(Function Pointer)

? 在 C 語言中&#xff0c;函數也是一種“對象”&#xff0c;它在內存中有地址。因此可以定義指向函數的指針&#xff0c;用于動態調用、回調處理、構建函數表等。 掌握函數指針是理解 C 語言“底層抽象”與“模塊化編程”的關鍵。 一、函數指針的基本概念 ? 函數指針是一個變…

快速傅里葉變換(FFT)是什么?

快速傅里葉變換(FFT)是什么&#xff1f; 快速傅里葉變換&#xff08;FFT&#xff09; 本質上是一種極其高效的算法&#xff0c;用來計算**離散傅里葉變換&#xff08;DFT&#xff09;**及其逆變換。它是數字信號處理、科學計算和工程應用中最重要的算法之一。 要理解 FFT&…

EEG分類 - Theta 頻帶 power

在EEG&#xff08;腦電圖&#xff09;信號處理的背景下&#xff0c;theta波段功率&#xff08;Theta Band Power&#xff09;是一個重要的特征&#xff0c;廣泛應用于認知、神經科學和臨床監測等領域。接下來&#xff0c;我將詳細介紹theta波段功率的定義、特性、計算方法以及在…

蒼穹外賣day3--公共字段填充+新增菜品

1.公共字段填充 1.1 問題分析 在新增員工或者新增菜品分類時需要設置創建時間、創建人、修改時間、修改人等字段&#xff0c;在編輯員工或者編輯菜品分類時需要設置修改時間、修改人等字段。這些字段屬于公共字段&#xff0c;也就是也就是在我們的系統中很多表中都會有這些字段…

每次選擇都是成本

概述 我們每個人都在做選擇&#xff0c;而且無時無刻不在做選擇。 有的人有的選&#xff0c;而有的人卻沒得選。 因此從側面來說&#xff0c;有的選反而更是一種幸福。 我們學習的目的就是為了讓我們自己在未來能有更好地選擇&#xff0c;也可以底氣十足地選擇不去做什么&a…

AI in CSR Writing: Revolutionizing Clinical Trial Reports

一、AI在CSR撰寫中的實際應用 1.1 自動化數據整合與報告生成 1.1.1 數據提取與匯總 AI自動從EDC、實驗室系統、安全數據庫提取數據,生成統計圖表和表格,如人口統計學、療效終點、安全性事件表,減少人工操作。 1.1.2 動態報告生成 基于預設模板,AI自動填充數據結果,如自動…

《Java反射到底該不該用?性能、靈活性與可維護性三者博弈》

大家好呀&#xff01;今天我們要聊一個Java中超級強大但也需要謹慎使用的特性——反射機制(Reflection) &#x1f3ad;。我會用最通俗易懂的方式&#xff0c;帶大家徹底搞懂這個"程序界的魔術師"&#xff01; 一、什么是Java反射&#xff1f;&#x1f914; 想象一下…

從Java API調用者到架構思考:我的Elasticsearch認知升級之路

前言&#xff1a;我的Elasticsearch學習歷程 作為一名Java開發者&#xff0c;記得第一次使用ES的Java High Level REST Client時&#xff0c;我被它強大的搜索能力所震撼&#xff0c;但也為復雜的集群調優所困擾。經過多個項目的實戰積累和系統性學習&#xff0c;我終于建立了對…

高云GW5AT-LV60 FPGA圖像處理板

GW5AT-LV60開發板體積小巧&#xff0c;長100mm寬為61.8mm&#xff0c;還沒有一部Ipone SE2體積大&#xff0c;該板卡采用了核心板和載板分離的形式&#xff0c;核心板的形式可方便開發者在項目中根據實際需求來開發自己的載板&#xff0c;只需要為核心板提供5V的電源就能滿足基…

[XILINX]ZYNQ7010_7020_軟件LVDS設計

若該文為原創文章&#xff0c;未經允許不得轉載風釋雪QQ:627833006WX:Cheng18375816918CSDN博客: 風釋雪FPGA知乎&#xff1a;風釋雪FPGA 1.版本說明 日期作者版本說明2024xxxx風釋雪初始版本 2.概述 ZYNQ 7010/7020 HR/HP Bank LVDS Rx/TX&#xff1b; 3.目標 ZYNQ 7010 LVD…

桌面小屏幕實戰課程:DesktopScreen 11 SPI 水墨屏

飛書文檔https://x509p6c8to.feishu.cn/docx/doxcnlzpIgj3gosCZufBTCZxlMb SPI說明 SPI是串行外設接口&#xff08;Serial Peripheral Interface&#xff09;的縮寫&#xff0c;是一種高速的&#xff0c;全雙工&#xff0c;同步的通信總線&#xff0c;并且在芯片的管腳上占用…

SpringCloud Gateway 組件的使用

作者&#xff1a;小凱 沉淀、分享、成長&#xff0c;讓自己和他人都能有所收獲&#xff01; 我發現了一個很有意思的縮寫單詞 gw、wg&#xff0c;都是網關的意思。因為 gw gateway、wg wangguan&#xff0c;所以在各個系統開發中&#xff0c;既有 gw 也有 wg 的存在。而網關…

隨機地址生成器 - Cloudflare Workers

分享一個完全開源免費部署在 Cloudflare Workers 上的隨機地址生成器&#xff0c;支持全球 24 個國家/地區。 &#x1f517; 工具地址: https://address.chat-tempmail.com ? 特性 &#x1f30d; 支持生成 24 個國家/地區的地址&#x1f4f1; 響應式設計&#xff0c;完美支持…