
- Javascript 基礎教程
- Javascript - 首頁
- JavaScript - 路線圖
- JavaScript - 概述
- JavaScript - 特性
- JavaScript - 啟用
- JavaScript - 位置
- JavaScript - 語法
- JavaScript - Hello World
- JavaScript - Console.log()
- JavaScript - 註釋
- JavaScript - 變數
- JavaScript - let 語句
- JavaScript - 常量
- JavaScript - 資料型別
- JavaScript - 型別轉換
- JavaScript - 嚴格模式
- JavaScript - 保留關鍵字
- JavaScript 運算子
- JavaScript - 運算子
- JavaScript - 算術運算子
- JavaScript - 比較運算子
- JavaScript - 邏輯運算子
- JavaScript - 位運算子
- JavaScript - 賦值運算子
- JavaScript - 條件運算子
- JavaScript - typeof 運算子
- JavaScript - 空值合併運算子
- JavaScript - delete 運算子
- JavaScript - 逗號運算子
- JavaScript - 分組運算子
- JavaScript - yield 運算子
- JavaScript - 展開運算子
- JavaScript - 指數運算子
- JavaScript - 運算子優先順序
- JavaScript 控制流
- JavaScript - if...else
- JavaScript - while 迴圈
- JavaScript - for 迴圈
- JavaScript - for...in
- Javascript - for...of
- JavaScript - 迴圈控制
- JavaScript - break 語句
- JavaScript - continue 語句
- JavaScript - switch case
- JavaScript - 使用者自定義迭代器
- JavaScript 函式
- JavaScript - 函式
- JavaScript - 函式表示式
- JavaScript - 函式引數
- JavaScript - 預設引數
- JavaScript - Function() 建構函式
- JavaScript - 函式提升
- JavaScript - 自執行函式
- JavaScript - 箭頭函式
- JavaScript - 函式呼叫
- JavaScript - Function call()
- JavaScript - Function apply()
- JavaScript - Function bind()
- JavaScript - 閉包
- JavaScript - 變數作用域
- JavaScript - 全域性變數
- JavaScript - 智慧函式引數
- JavaScript 物件
- JavaScript - Number
- JavaScript - Boolean
- JavaScript - String
- JavaScript - Array
- JavaScript - Date
- JavaScript - DataView
- JavaScript - Handler
- JavaScript - Math
- JavaScript - RegExp
- JavaScript - Symbol
- JavaScript - Set
- JavaScript - WeakSet
- JavaScript - Map
- JavaScript - WeakMap
- JavaScript - 可迭代物件
- JavaScript - Reflect
- JavaScript - TypedArray
- JavaScript - 模板字面量
- JavaScript - 標籤模板
- 面向物件的 JavaScript
- JavaScript - 物件
- JavaScript - 類
- JavaScript - 物件屬性
- JavaScript - 物件方法
- JavaScript - 靜態方法
- JavaScript - 顯示物件
- JavaScript - 物件訪問器
- JavaScript - 物件建構函式
- JavaScript - 原生原型
- JavaScript - ES5 物件方法
- JavaScript - 封裝
- JavaScript - 繼承
- JavaScript - 抽象
- JavaScript - 多型
- JavaScript - 解構賦值
- JavaScript - 物件解構
- JavaScript - 陣列解構
- JavaScript - 巢狀解構
- JavaScript - 可選鏈
- JavaScript - 全域性物件
- JavaScript - Mixins
- JavaScript - 代理 (Proxies)
- JavaScript 版本
- JavaScript - 歷史
- JavaScript - 版本
- JavaScript - ES5
- JavaScript - ES6
- ECMAScript 2016
- ECMAScript 2017
- ECMAScript 2018
- ECMAScript 2019
- ECMAScript 2020
- ECMAScript 2021
- ECMAScript 2022
- JavaScript 非同步程式設計
- JavaScript - 非同步程式設計
- JavaScript - 回撥函式
- JavaScript - Promise
- JavaScript - Async/Await
- JavaScript - 微任務
- JavaScript - Promisification
- JavaScript - Promise 鏈式呼叫
- JavaScript - 定時事件
- JavaScript - setTimeout()
- JavaScript - setInterval()
- JavaScript Cookie
- JavaScript - Cookie
- JavaScript - Cookie 屬性
- JavaScript - 刪除 Cookie
- JavaScript 瀏覽器 BOM
- JavaScript - 瀏覽器物件模型
- JavaScript - Window 物件
- JavaScript - Document 物件
- JavaScript - Screen 物件
- JavaScript - History 物件
- JavaScript - Navigator 物件
- JavaScript - Location 物件
- JavaScript - Console 物件
- JavaScript Web APIs
- JavaScript - Web API
- JavaScript - History API
- JavaScript - Storage API
- JavaScript - Forms API
- JavaScript - Worker API
- JavaScript - Fetch API
- JavaScript - Geolocation API
- JavaScript 事件
- JavaScript - 事件
- JavaScript - DOM 事件
- JavaScript - addEventListener()
- JavaScript - 滑鼠事件
- JavaScript - 鍵盤事件
- JavaScript - 表單事件
- JavaScript - 視窗/文件事件
- JavaScript - 事件委託
- JavaScript - 事件冒泡
- JavaScript - 事件捕獲
- JavaScript - 自定義事件
- JavaScript 錯誤處理
- JavaScript - 錯誤處理
- JavaScript - try...catch
- JavaScript - 除錯
- JavaScript - 自定義錯誤
- JavaScript - 擴充套件錯誤
- JavaScript 重要關鍵字
- JavaScript - this 關鍵字
- JavaScript - void 關鍵字
- JavaScript - new 關鍵字
- JavaScript - var 關鍵字
- JavaScript HTML DOM
- JavaScript - HTML DOM
- JavaScript - DOM 方法和屬性
- JavaScript - DOM Document
- JavaScript - DOM 元素
- JavaScript - DOM 屬性 (Attr)
- JavaScript - DOM 表單
- JavaScript - 修改 HTML
- JavaScript - 修改 CSS
- JavaScript - DOM 動畫
- JavaScript - DOM 導航
- JavaScript - DOM 集合
- JavaScript - DOM NodeList
- JavaScript - DOM DOMTokenList
- JavaScript 其他
- JavaScript - Ajax
- JavaScript - 非同步迭代
- JavaScript - Atomics 物件
- JavaScript - rest 引數
- JavaScript - 頁面重定向
- JavaScript - 對話方塊
- JavaScript - 頁面列印
- JavaScript - 驗證
- JavaScript - 動畫
- JavaScript - 多媒體
- JavaScript - 圖片地圖
- JavaScript - 瀏覽器
- JavaScript - JSON
- JavaScript - 多行字串
- JavaScript - 日期格式
- JavaScript - 獲取日期的方法
- JavaScript - 設定日期的方法
- JavaScript - 模組
- JavaScript - 動態匯入
- JavaScript - BigInt
- JavaScript - Blob
- JavaScript - Unicode
- JavaScript - 淺複製
- JavaScript - 呼叫棧
- JavaScript - 引用型別
- JavaScript - IndexedDB
- JavaScript - 點選劫持攻擊
- JavaScript - 柯里化
- JavaScript - 圖形
- JavaScript - Canvas
- JavaScript - 防抖
- JavaScript - 效能
- JavaScript - 樣式指南
JavaScript - DOM 動畫
DOM 動畫可以透過使用 JavaScript 改變 DOM 元素的樣式來實現。當改變是漸進的並且時間間隔很小時,動畫看起來是連續的。通常,有三種方法可以動畫化 DOM 元素
使用 CSS 過渡 - 它利用 CSS 中預定義的動畫樣式,這些樣式由元素屬性的變化觸發。
使用 CSS 動畫 - 透過在 CSS 檔案中定義關鍵幀和動畫屬性,它提供了對動畫時間和行為的更多控制。
使用 JavaScript - 它提供了最大的靈活性,允許你直接在 JavaScript 程式碼中動態操作樣式屬性並建立複雜的動畫。
本章提供了一個關於如何使用 JavaScript 動畫化 DOM 元素的基本理解。
使用 JavaScript 動畫化 DOM 元素
JavaScript 可用於更改 DOM 元素的樣式。
你可以在特定時間段後更改 DOM 元素的樣式以使其動起來。例如,你可以使用 setInterval() 方法來更改 DOM 元素的位置,使其透過動畫從一個位置移動到另一個位置。
同樣,你可以更新 CSS 屬性(如“animation”等)以動態地為元素設定動畫。
此外,requestAnimationFrame() 方法也可以用於為 DOM 元素設定動畫。
下面,你將學習不同的方法來為 DOM 元素設定動畫。
使用 setInterval() 方法為 DOM 元素設定動畫
你可以在每個時間段後呼叫 setInterval() 方法並更改 DOM 元素的樣式以使其動起來。但是,你可以將時間段保持較小以使動畫流暢執行。
語法
請遵循以下語法使用 setInterval() 方法為 DOM 元素設定動畫。
let id = setInterval(frame_func, timeframe); function frame_func() { if (animation_end) { clearInterval(id); } else { // change style to animate } }
在上面的語法中,我們使用 setInterval() 方法啟動動畫,並在每隔“timeframe”毫秒後呼叫 frame_func()。
在 frame_func() 函式中,我們定義了結束或繼續動畫的條件。
示例
在下面的程式碼中,我們為 <div> 元素設定了樣式。
當用戶點選按鈕時,它將呼叫 startAnimation() 函式。
在 startAnimation() 函式中,我們定義了“pos”變數並將其初始化為 0,表示 div 元素的初始位置。
之後,我們使用 setInterval() 方法在每隔 5 毫秒後呼叫 animationFrame() 函式。
在 animationFrame() 函式中,如果內部 div 的位置變為 350,我們將使用 clearInterval() 方法停止動畫。否則,我們將更改內部 div 的左側位置。
當你點選按鈕時,它將使內部 div 元素從左向右移動。
<!DOCTYPE html> <html> <head> <style> #parent { width: 700px; height: 50px; position: relative; background: yellow; } #child { width: 50px; height: 50px; position: absolute; background-color: red; } </style> </head> <body> <div id = "parent"> <div id = "child"> </div> </div> <br> <button onclick = "startAnimation()"> Animate Div </button> <script> function startAnimation() { const elem = document.getElementById("child"); // Starting position let pos = 0; // Changing frames for animation let id = setInterval(animationFrame, 5); function animationFrame() { // Stop the animation if (pos == 350) { clearInterval(id); } else { pos++; elem.style.left = pos + "px"; } } } </script> </body> </html>
示例
在下面的程式碼中,<div> 元素的背景顏色為綠色。
我們使用 `setInterval()` 方法每隔 50 毫秒呼叫一次 `animationFrame()` 函式。
在 `animationFrame()` 函式中,我們將 `
<!DOCTYPE html> <html> <head> <style> #parent { width: 700px; height: 200px; background: green; } </style> </head> <body> <div id = "parent"> </div> <br> <button onclick = "startAnimation()"> Animate Div </button> <script> function startAnimation() { const parent = document.getElementById("parent"); let opacity = 1; let id = setInterval(animationFrame, 50); function animationFrame() { if (opacity <= 0) { // Stop animation clearInterval(id); parent.style.opacity = 1; parent.style.backgroundColor = "red"; } else { // Decrease the opacity parent.style.opacity = opacity; opacity = opacity - 0.1; } } } </script> </body> </html>
使用 `requestAnimationFrame()` 方法動畫化 DOM 元素
`requestAnimationFrame()` 方法用於像 `setInterval()` 方法一樣動畫化 DOM 元素。它連續執行任務並在瀏覽器中重繪下一幀。
`requestAnimationFrame()` 方法比 `setInterval()` 方法更有效率地進行渲染。
語法
遵循以下語法使用 `requestAnimationFrame()` 方法來動畫化 DOM 元素。
function animate() { // Animation logic // Request the next animation frame requestAnimationFrame(animate); } // Animation loop animate();
讓我們瞭解 `requestAnimationFrame()` 方法的工作原理。
您將回調函式作為 `requestAnimationFrame()` 方法的引數傳遞,以執行下一幀。
Web 瀏覽器將在重繪下一幀之前執行回撥函式。
回撥函式將更新 DOM 元素。
瀏覽器將重繪 DOM 元素。
瀏覽器將再次呼叫回撥函式,迴圈將繼續。
您可以使用 `cancelAnimationFrame()` 方法取消動畫。
示例
在下面的程式碼中,我們定義了 `startAnimation()` 和 `stopAnimation()` 函式,並在使用者單擊按鈕時呼叫它們。
在 `startAnimation()` 函式中,我們將 'pos' 的值增加 1,並更新子 div 元素的左側位置。
之後,我們使用 `requestAnimationFrame()` 方法在 Web 瀏覽器中繪製下一幀。它將子 div 元素從父 div 元素的左側移動到右側。
`stopAnimation()` 函式使用 `cancelAnimationFrame()` 方法停止動畫。它將 `requestAnimationFrame()` 方法返回的 id 作為引數。
<!DOCTYPE html> <html> <head> <style> #parent {width: 700px; height: 50px; position: relative;background: yellow;} #child {width: 50px;height: 50px; position: absolute; background-color: red;} </style> </head> <body> <div id = "parent"> <div id = "child"> </div> </div> <br> <button onclick = "startAnimation()"> Animate Div </button> <button onclick = "stopAnimation()"> Stop Animation </button> <script> let animationId; let pos = 0; function startAnimation() { const elem = document.getElementById("child"); function animationFrame() { if (pos < 650) { pos++; elem.style.left = pos + "px"; // Make a call for a next frame animationId = requestAnimationFrame(animationFrame); } } // Start Animation animationFrame(); } function stopAnimation() { // Stop animation if (animationId) { cancelAnimationFrame(animationId); animationId = null; } } </script> </body> </html>
透過更改 CSS 屬性來動畫化 DOM 元素
CSS 的 `animation` 屬性可用於向 DOM 元素新增動畫。JavaScript 也允許自定義 `animation` 屬性。
語法
遵循以下語法透過在 JavaScript 中更改元素的 `animation` 屬性的值來動畫化 DOM 元素。
element.style.animation = "key_frame_name duration timing_function iterationCount";
屬性值
key_frame_name − 這是您需要在 CSS 中定義的關鍵幀的名稱。
duration − 這是動畫的持續時間。
timing_function − 用於設定動畫的執行方式。
iterationCount − 指定動畫應重複的次數。
示例
在下面的程式碼中,當用戶單擊按鈕時,我們呼叫 `animateDiv()` 函式並更新 div 元素的 style 物件的 `animation` 屬性的值。
我們已經在 CSS 中定義了 `moveAnimation` 關鍵幀。因此,當您單擊按鈕時,它將開始移動 div 元素。
<!DOCTYPE html> <html> <head> <style> #element { width: 90px; height: 90px; background: blue; color: white; position: relative; text-align: center; } @keyframes moveAnimation { from { transform: translateX(0); } to { transform: translateX(550px); } } </style> </head> <body> <div id = "element"> Animate </div> <br> <button onclick = "animateDiv()"> Animate Div </button> <script> function animateDiv() { const element = document.getElementById("element"); element.style.animation = "moveAnimation 3s ease-in-out infinite"; } </script> </body> </html>
動畫化 DOM 元素的最佳方法是使用 `requestAnimationFrame()` 方法,該方法可以平滑地動畫化 DOM 元素。此外,它還可以用於同時執行不同的動畫。