js簡單動畫:勻速動畫、緩動動畫、多物體動畫以及透明度動畫

来源:https://www.cnblogs.com/sunyan-blog/archive/2019/12/20/12072819.html
-Advertisement-
Play Games

主要實現以下幾種簡單的動畫效果(其實原理基本相同): 1.勻速動畫:物體的速度固定 2.緩動動畫:物體速度逐漸變慢 3.多物體動畫 4.透明度動畫 效果實現: 1.勻速動畫(以物體左右勻速運動為例) 動畫效果主要是用定時器setInterval()來實現的,每隔幾毫秒讓物體移動一點距離,通過不斷調用 ...


主要實現以下幾種簡單的動畫效果(其實原理基本相同):

1.勻速動畫:物體的速度固定

2.緩動動畫:物體速度逐漸變慢

3.多物體動畫

4.透明度動畫

效果實現:

1.勻速動畫(以物體左右勻速運動為例)

動畫效果主要是用定時器setInterval()來實現的,每隔幾毫秒讓物體移動一點距離,通過不斷調用定時器來達到讓物體運動的效果。

將定時器放在一個函數內,定義物體的運動速度speed為10,判斷物體的運動方向(向左走或向右走)來規定speed的正負;

然後將 物體的offsetLeft加上速度speed 賦值給物體的left樣式值(要給物體設置定位);

當物體到達目標位置時清除定時器;

 1   var box = document.querySelector('.box'); // 獲取box盒子
 2   box.addEventListener("mouseover", function() {
 3       animate(400);  // 當滑鼠經過盒子時,讓盒子運動到400的位置
 4   });
 5   var timer = null;  // 聲明一個變數來存儲定時器
 6   function animate(target) {  // target 目標位置
 7       clearInterval(timer);  // 開啟定時器前要先關閉上一個定時器,不然定時器會累加導致速度越來越快
 8       timer = setInterval(function() {
 9           var speed = 10;  // 速度 固定值10
10           speed = box.offsetLeft < target ? speed : - speed;  // 判斷是向左走(負)還是向右走(正)
11           if(box.offsetLeft == target) {
12               clearInterval(timer);  // 盒子到達目標值時清除定時器
13           } else {
14               box.style.left = box.offsetLeft + speed + 'px';
15           }
16       },25)
17   }

 

2.緩動動畫(和勻速運動相同原理,只不過速度做些改變)

讓速度等於 目標值和當前位置之差/10,二者之差會越來越小,即速度speed也會越來越小;

二者之差除以十並不總是整數,可能會導致物體位置和目標值不能完全相等,所以需要對speed進行取整,大於0向上取整,小於0向下取整;

 1     var box = document.querySelector('.box');
 2     box.addEventListener("mouseover", function() {
 3         animate(400);
 4     });
 5     var timer = null;
 6     function animate(target) {
 7         clearInterval(timer);
 8         timer = setInterval(function() {
 9             var speed = (target - box.offsetLeft) / 10; // 速度為目標值和當前位置之差/10
10             speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); // 判斷speed的正負,大於0向上取整,小於0向下取整
11             if(box.offsetLeft == target) {
12                 clearInterval(timer);
13             } else {
14                 box.style.left = box.offsetLeft + speed + 'px';
15             }
16         }, 25)
17     }

 

3.多物體動畫(相同原理,不過要多開器幾個定時器)

因為有多個物體要做動畫,所以要給每個物體都要開啟一個定時器,向上邊那樣只聲明一個timer是不行的,

所以要迴圈遍歷每個li(我是用列表寫了幾個小盒子),給每個li聲明一個timer來存儲各自的定時器,

並且要給animate函數多添加一個形參obj來區分是哪個盒子的定時器

 1     var lis = document.querySelectorAll('li');
 2     for(var i = 0; i < lis.length; i++) {   // 迴圈遍歷li
 3         lis[i].timer = null;   // 給每個li聲明一個timer來存儲定時器
 4         lis[i].addEventListener("mouseover", function() {
 5             animate(this, 400);
 6         });
 7     }
 8     function animate(obj, target) {
 9         clearInterval(obj.timer);
10         obj.timer = setInterval(function() {
11             var speed = (target - obj.offsetLeft) / 10;
12             speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
13             if(obj.offsetLeft == target) {
14                 clearInterval(obj.timer);
15             } else {
16                 obj.style.left = obj.offsetLeft + speed + 'px';
17             }
18         }, 25)
19     }

 

4.透明度動畫(與勻速運動相似)

聲明一個alpha變數來存儲當前的透明度,speed為速度,當前透明度加速度 賦值給盒子的透明度樣式。

(多個物體透明度也是和上邊多物體動畫一樣的,給每個物體都添加一個定時器,並給animate函數多一個形參obj)

 1 <style>
 2     .box {
 3         width: 200px;
 4         height: 200px;
 5         background-color: #f00;
 6         opacity: 0.3;
 7         filter: alpha(opacity = 30); /* 相容IE8及以下的IE瀏覽器 */
 8     }
 9 </style>
10 <script>
11     window.addEventListener('load', function() {
12         var box = document.querySelector('.box');
13         box.addEventListener('mouseover', function() {
14             animateAlpha(100);  // 滑鼠經過盒子 透明度變為1
15         })
16         box.addEventListener('mouseout', function() {
17             animateAlpha(30);  // 滑鼠離開透明度變為0.3
18         })
19         var alpha = 30;  // 存儲當前透明度 初始值為30
20         var timer = null;
21         function animateAlpha(target) {
22             clearInterval(timer);
23             timer = setInterval(function() {
24                 var speed = 10;
25                 speed = alpha < target ? speed : - speed; // 判斷速度的正負
26                 if(alpha == target) {
27                     clearInterval(timer);
28                 } else {
29                     alpha += speed;
30                     /* 這裡有兩個樣式都需要改變 */
31                     box.style.filter = 'alpha(opacity = '+ alpha +')';
32                     box.style.opacity = alpha / 100; // opacity別忘了除以100
33                 }
34             }, 25);
35         }
36     })
37 </script>

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

-Advertisement-
Play Games
更多相關文章
  • 本文將簡單介紹flutter的語言特性、基礎語法,以及在日常開發中非常實用的如何請求數據、如何處理非同步、如何序列化與反序列化json等技能。 ...
  • <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv ...
  • //一、 畫一個直角三角形 // 第幾行 *號數 // * 1 1 // ** 2 2 // *** 3 3 // **** 4 4 // ***** 5 5 // 規律:行數 = *號數 function left(n){ // right為函數名,n為形式參數,用於接收實體參數。 for(var ...
  • XML 什麼是XML - Tomcat - Http XML:eXtensible Markup Language (可擴展標記語言)。 XML 是一種標記語言,很類似 HTML。 XML 的設計宗旨是傳輸數據,而非顯示數據。 XML的使命,就是以一個統一的格式,組織有關係的數據。為不同平臺下的應用 ...
  • 時間如流水,只能流去不流回! 點贊再看,養成習慣,這是您給我創作的動力! 本文 Dotnet9 https://dotnet9.com 已收錄,站長樂於分享dotnet相關技術,比如Winform、WPF、ASP.NET Core等,亦有C++桌面相關的Qt Quick和Qt Widgets等,只分 ...
  • 封裝了一個JS方法,支持元素的基本動畫:寬、高、透明度...等,也支持鏈式動畫和同時運動。 獲取元素的屬性的函數併進行了相容性處理: 1 function getStyle(obj, attr) { 2 if(obj.currentStyle){ //IE瀏覽器 3 return obj.curre ...
  • 入一行,要先知一行 ”;我們來看看web前端開發職位 無論什麼門派都要做到的一些基本工作職責 首先,你必須是一個合格的“頁面仔”,這個叫法不好聽,但很生動; 我們都知道,所有呈現的內容都是基於HTML 網頁的。 如果你的html、css(包括現在的HTML5+CSS3)基礎不會,或者不夠扎實,都很難 ...
  • web前端分享JavaScript到底是什麼?特點有哪些?這也是成為web前端工程師必學的內容。今天為大家分享了這篇關於JavaScript的文章,我們一起來看看。 一、JavaScript是什麼? 1、JavaScript是在網站瀏覽器上運行的編程語言。 主要是向使用HTML和CSS構建的網站添加 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...