【案例】Vue3 實現高性能級橫向循環滾動生產線效果:基于 requestAnimationFrame 的流暢動畫方案

動畫效果

在工業監控系統、生產看板等場景中,經常需要模擬生產線的動態運行效果。本文將基于 Vue3 和 requestAnimationFrame 實現一個高性能的橫向循環滾動效果,完美模擬生產線傳輸帶的視覺體驗。我們將從代碼實現到原理分析,全面講解如何打造流暢、高效的滾動動畫。

一、效果展示與應用場景

先來看下最終實現的效果:一系列生產物料圖標將沿著橫向軌道從左向右連續滾動,到達終點后自動循環,形成無限滾動的生產線效果。這種效果非常適合:

  • 工業監控大屏中的生產線模擬
  • 生產進度可視化展示
  • 物流傳輸過程動態演示
  • 數據看板中的動態元素展示

相比傳統的輪播組件,這種實現方式具有更高的性能和更自然的動畫效果,尤其適合長時間運行的監控場景。

二、核心實現方案

我們將使用以下技術棧和方案:

  • Vue3 + TypeScript:提供組件化開發和類型安全
  • requestAnimationFrame:實現高性能動畫,替代傳統的 setInterval
  • CSS 滾動優化:隱藏滾動條并優化滾動容器樣式
  • 循環邏輯設計:通過重置 scrollLeft 實現無縫循環

下面是完整的實現代碼:

1. 模板結構(Template)

<template><!-- 生產線滾動容器 --><div class="ktscx-box" ref="scrollDom"><div class="ktscx"><!-- 生產線上的物品,這里循環生成40個 --><divclass="ktscx-item"v-for="(item, index) in 40":key="index"></div></div></div>
</template>

模板結構非常簡潔,主要包含兩個層級:

  • 外層?ktscx-box:作為滾動容器,通過 ref 綁定到組件實例
  • 內層?ktscx:包含所有滾動項的容器,設置為 200% 寬度確保能產生滾動效果
  • 循環生成的?ktscx-item:生產線中的物品元素,共 40 個

2. 腳本邏輯(Script)

<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue';// 定義滾動容器的ref,指向DOM元素
const scrollDom = ref<HTMLDivElement | null>(null);
let timer: number | null = null; // 動畫幀ID,用于控制動畫// 開始橫向滾動(從左向右視覺效果)
const startScroll = () => {if (!scrollDom.value) return;// 啟動動畫幀,開始滾動timer = requestAnimationFrame(scrollStep);
};// 停止滾動
const stopScroll = () => {if (timer) {cancelAnimationFrame(timer);timer = null;}
};// 動畫幀執行的滾動邏輯
const scrollStep = () => {const moveDom = scrollDom.value;if (!moveDom) {stopScroll();return;}// 每次滾動的步長(負值表示向右滾動)const step = -1; moveDom.scrollLeft += step;// 計算最大可滾動距離 = 內容總寬度 - 容器可視寬度const maxScrollLeft = moveDom.scrollWidth - moveDom.clientWidth;// 當滾動到最左側時,重置到最右側(形成循環)if (moveDom.scrollLeft <= 0) {moveDom.scrollLeft = maxScrollLeft; }// 繼續請求下一幀動畫,形成連續滾動timer = requestAnimationFrame(scrollStep);
};// 組件掛載時啟動滾動
onMounted(() => {startScroll();
});// 組件卸載時停止滾動,防止內存泄漏
onUnmounted(() => {stopScroll();
});
</script>

腳本邏輯解析:

  1. 核心變量

    • scrollDom:通過 ref 綁定到滾動容器 DOM 元素
    • timer:存儲動畫幀 ID,用于控制動畫的啟動和停止
  2. 動畫控制函數

    • startScroll():啟動滾動動畫,通過 requestAnimationFrame 觸發第一幀
    • stopScroll():停止滾動動畫,通過 cancelAnimationFrame 取消動畫幀
    • scrollStep():每幀執行的滾動邏輯,是實現動畫的核心
  3. 滾動原理

    • 通過修改容器的?scrollLeft?屬性實現滾動
    • 負的步長值(step = -1)使內容從左向右滾動
    • 當滾動到最左側(scrollLeft <= 0)時,重置到最大滾動位置,實現循環

3. 樣式設計(Style)

<style scoped lang="scss">
.ktscx-box {width: 83%;height: 20px;overflow-x: auto;  // 允許橫向滾動position: absolute;top: 256px;margin-left: 3%;// 隱藏滾動條,提升視覺體驗&::-webkit-scrollbar {display: none;}.ktscx {width: 200%;  // 寬度設為200%,確保內容超出容器寬度產生滾動height: 20px;display: flex;justify-content: space-around;  // 物品均勻分布align-items: center;.ktscx-item {width: 20px;height: 10px;// 使用背景圖作為生產線物品background-image: url('@/assets/images/yundong4.png');background-size: 100% 100%;background-repeat: no-repeat;flex-shrink: 0;  // 防止物品被壓縮變形}}
}
</style>

樣式設計要點:

  1. 滾動容器樣式

    • 設置?overflow-x: auto?允許橫向滾動
    • 使用?::-webkit-scrollbar { display: none }?隱藏滾動條
    • 固定高度和寬度,確保滾動區域可控
  2. 內容容器樣式

    • 寬度設為 200%,確保內容寬度超過容器寬度,產生滾動空間
    • 使用 flex 布局使物品均勻分布
  3. 滾動項樣式

    • 固定寬高,使用背景圖展示物品
    • flex-shrink: 0?確保物品不會被壓縮變形

三、核心技術點解析

1. requestAnimationFrame 為什么比 setInterval 更好?

本實現使用 requestAnimationFrame 而非傳統的 setInterval 來驅動動畫,原因如下:

  • 與瀏覽器刷新同步:requestAnimationFrame 會在瀏覽器每次重繪前執行,與顯示器刷新率(通常 60Hz)保持同步,避免動畫卡頓
  • 自動性能調整:在性能較低的設備上,瀏覽器會自動降低執行頻率,保證動畫的流暢度
  • 后臺暫停:當頁面處于后臺或隱藏標簽頁時,動畫會自動暫停,減少不必要的性能消耗
  • 精確計時:基于系統時間計算幀間隔,避免 setInterval 可能產生的累積誤差

對于生產線這種需要長時間運行的動畫,這些優勢尤為重要。

2. 循環滾動的實現原理

循環滾動的核心在于巧妙利用?scrollLeft?屬性和內容寬度:

  1. scrollLeft?屬性表示元素內容向左滾動的像素數:

    • 增大?scrollLeft?→ 內容向左移動
    • 減小?scrollLeft?→ 內容向右移動
  2. 循環邏輯:

    • 當內容滾動到最左側(scrollLeft <= 0)時
    • 立即將?scrollLeft?重置為最大可滾動距離(maxScrollLeft
    • 由于內容容器寬度是 200%,重置后視覺上看不出跳躍,形成無縫循環
  3. 最大可滾動距離計算:

const maxScrollLeft = moveDom.scrollWidth - moveDom.clientWidth;
  1. 其中?scrollWidth?是內容總寬度,clientWidth?是容器可視寬度。

四、功能擴展與優化

基于以上實現,我們可以進行一些實用的擴展:

1. 添加入交互控制

<!-- 在模板中添加控制按鈕 -->
<div class="controls"><button @click="startScroll">啟動</button><button @click="stopScroll">停止</button>
</div>

2. 滾動速度調節

// 添加速度控制變量
const speed = ref(1);// 在scrollStep中使用speed
const step = -speed.value;

3. 鼠標懸停暫停

<!-- 修改滾動容器 -->
<div class="ktscx-box" ref="scrollDom" @mouseenter="stopScroll" @mouseleave="startScroll">

4. 性能優化建議

  • 對于大量滾動項(超過 100 個),考慮使用虛擬列表技術
  • 添加?will-change: scroll-position?提示瀏覽器優化滾動性能
  • 避免在?scrollStep?中執行復雜計算或 DOM 操作
  • 滾動項使用相同尺寸,減少布局重排

五、總結

本文基于 Vue3 實現了一個高性能的橫向循環滾動效果,完美模擬生產線傳輸帶。核心要點包括:


使用 requestAnimationFrame 實現流暢動畫,替代傳統的 setInterval 通過控制 scrollLeft 屬性值實現滾動效果,負步長產生從左到右的視覺體驗 利用內容寬度和容器寬度的關系,實現無縫循環滾動 隱藏滾動條并優化樣式,提升視覺體驗

這種實現方式性能優異、代碼簡潔,非常適合工業監控、生產看板等場景。根據實際需求,你可以進一步擴展功能,如添加速度控制、方向切換、交互暫停等特性。

寶子們加加關注,會持續更新前端學習內容。

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

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

    相關文章

    萬字長文解碼如何玩轉Prompt(附實踐應用)

    在AI技術迅猛發展的今天&#xff0c;如何與大型語言模型高效“對話”已成為釋放其潛力的關鍵。本文深入探討了提示詞工程&#xff08;Prompt Engineering&#xff09;這一新興領域&#xff0c;系統解析了從基礎概念到高級技巧的完整知識體系&#xff0c;并結合“淘寶XX業務數科…

    easyExcel嵌套子集合導出Excel

    我想要的Excel效果說明: 1.創建兩個自定義注解:ExcelMerge(表示主對象內的單個屬性,后續會根據子集合的大小合并下面的單元格),ExcelNestedList(表示嵌套的子集合) 2.NestedDataConverter.java 會把查詢到的數據轉換為一行一行的,相當于主表 left join 子表 ON 主.id子.主id的形…

    基于 C# WinForm 字體編輯器開發記錄:從基礎到進階

    目錄 基礎版本實現 進階版本改進 字體設置窗體增強 主窗體改進 功能對比 項目在本文章的綁定資源中免費的&#xff0c;0積分就可以下載哦~ 在 Windows Forms 應用開發中&#xff0c;字體編輯功能是許多文本處理軟件的基礎功能。本文將分享一個簡易字體編輯器的開發過程&a…

    Linux基本使用和Java程序部署(含 JDK 與 MySQL)

    文章目錄Linux 背景知識Linux 基本使用Linux 常用的特殊符號和操作符Linux 常用命令文本處理與分析系統管理與操作用戶與權限管理文件/目錄操作與內容處理工具Linux系統防火墻Shell 腳本與實踐搭建 Java 部署環境apt&#xff08;Debian/Ubuntu 系的包管理利器&#xff09;介紹安…

    抗輻照CANFD通信芯片在高安全領域國產化替代的研究

    摘要&#xff1a;隨著現代科技的飛速發展&#xff0c;高安全領域如航空航天、衛星通信等對電子設備的可靠性與抗輻照性能提出了極高的要求。CANFD通信芯片作為數據傳輸的關鍵組件&#xff0c;其性能優劣直接關系到整個系統的穩定性與安全性。本文聚焦于抗輻照CANFD通信芯片在高…

    Mybatis 源碼解讀-SqlSession 會話源碼和Executor SQL操作執行器源碼

    作者源碼閱讀筆記主要采用金山云文檔記錄的&#xff0c;所有的交互圖和代碼閱讀筆記都是記錄在云文檔里面&#xff0c;本平臺的文檔編輯實在不方便&#xff0c;會導致我梳理的交互圖和文檔失去原來的格式&#xff0c;所以整理在文檔里面&#xff0c;供大家閱讀交流. 【金山文檔…

    Java集合類綜合練習題

    代碼 import java.util.*; class ScoreRecord {private String studentId;private String name;private String subject;private int score;public ScoreRecord(String studentId, String name, String subject, int score) {this.studentId studentId;this.name name;this.s…

    秒懂邊緣云|1分鐘了解邊緣安全加速 ESA

    普通開發者如何搭建安全快速的在線業務才能性價比最高 &#xff1f;阿里云現已為開發者推出免費版邊緣安全加速 ESA&#xff0c;1 個產品就能把 CDN 緩存 API 加速 DNS WAF DDoS 防護全部搞定&#xff0c;還支持邊緣函數快速部署網站和 AI 應用&#xff0c;性價比拉滿。 1…

    數據結構:串、數組與廣義表

    &#x1f4cc;目錄&#x1f524; 一&#xff0c;串的定義&#x1f330; 二&#xff0c;案例引入場景1&#xff1a;文本編輯器中的查找替換場景2&#xff1a;用戶手機號驗證&#x1f4da; 三&#xff0c;串的類型定義、存儲結構及其運算&#xff08;一&#xff09;串的抽象類型定…

    服務器路由相關配置Linux和Windows

    服務器路由相關配置Linux和Windowscentos路由系統核心概念傳統工具集(命令)iproute2 工具集&#xff08;推薦&#xff09;NetworkManager 工具路由配置文件體系高級路由功能策略路由多路徑路由路由監控工具系統級路由配置啟用IP轉發路由守護進程路由問題診斷流程Windows 路由Wi…

    Spring Boot啟動事件詳解:類型、監聽與實戰應用

    1. Spring Boot啟動事件概述1.1 什么是Spring Boot啟動事件在Spring Boot的應用生命周期中&#xff0c;從main方法執行到應用完全就緒&#xff0c;期間會發生一系列事件&#xff08;Event&#xff09;。這些事件由Spring Boot框架在特定時間點觸發&#xff0c;用于通知系統當前…

    Python閉包詳解:理解閉包與可變類型和不可變類型的關系

    一、定義閉包&#xff08;Closure&#xff09; 指的是一個函數對象&#xff0c;即使其外部作用域的變量已經不存在了&#xff0c;仍然能訪問這些變量。簡單來說&#xff0c;閉包是由函數及其相關的環境變量組成的實體。def outer():x 10def inner():print(x)return innerf ou…

    BotCash:GPT-5發布觀察 工程優化的進步,還是技術突破的瓶頸?

    BotCash&#xff1a;GPT-5發布觀察 工程優化的進步&#xff0c;還是技術突破的瓶頸&#xff1f; 在GPT-4以多模態能力震撼業界的一年后&#xff0c;GPT-5的亮相顯得有些“平靜”。當人們期待著又一場顛覆性技術革命時&#xff0c;這場發布會更像是給大模型技術按下了“精細打磨…

    AJAX學習(2)

    目錄 一.XMLHttpRequest 二.XMLHttpRequest——查詢參數 三.案例——地區查詢 四.XMLHttpRequest_數據提交 五.Promise 六.Promise三種狀態 七.PromiseeeXHR獲取省份列表&#xff08;案例&#xff09; 八.封裝-簡易axios-獲取省份列表 九.封裝-簡易axios-獲取地區列表 …

    解決 pip 安裝包時出現的 ReadTimeoutError 方法 1: 臨時使用鏡像源(單次安裝)

    解決 pip 安裝包時出現的 ReadTimeoutError 當您在使用 pip 安裝 Python 包時遇到 pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(hostfiles.pythonhosted.org, port443): Read timed out. 錯誤時&#xff0c;這通常是由于網絡問題導致的連接超時。P…

    Linux下使用Samba 客戶端訪問 Samba 服務器的配置(Ubuntu Debian)

    在 Linux 系統中&#xff0c;Samba 提供了與 Windows 系統文件共享的便利方式。本文將詳細介紹在 Ubuntu 和 Debian 系統下如何安裝 Samba 客戶端、訪問共享資源&#xff0c;并實現遠程目錄掛載和開機自動掛載。 文章參考自&#xff08;感謝分享&#xff09;&#xff1a;https…

    解決dedecms文章默認關鍵字太短的問題

    在管理文章或軟件的時候&#xff0c;大家在添加關鍵字和內容摘要的時候&#xff0c;是不是對這樣的情況感到比較的郁悶&#xff0c;我的關鍵字設定的明明非常的好&#xff0c;可是添加或修改后&#xff0c;會被無緣無故的截去很多&#xff0c;想必大家也都非常的明白&#xff0…

    K8s-kubernetes(二)資源限制-詳細介紹

    K8s如何合理規定對象資源使用 基本概念 Kubernetes中&#xff0c;占用資源的最小單元為單個PodKubernetes中&#xff0c;資源占用主要針對服務器的CPU、內存 為什么要做資源限制 對于Kubernetes集群而言&#xff0c;所有Pod都會占用K8s集群所在服務器的資源&#xff0c;如果不做…

    量子神經網絡:從NISQ困境到邏輯比特革命的破局之路

    ——解析2025千比特時代開發者的機遇與行動框架 引言:量子計算的“20比特魔咒”與千比特悖論 當開發者被建議“避免在>20量子比特電路訓練”時,富士通卻宣布2025年實現10,000物理比特系統。這一矛盾揭示了量子計算從NISQ時代向FTQC時代躍遷的核心邏輯:千比特突破非為直接…

    react+vite-plugin-react-router-generator自動化生成路由

    前言&#xff1a;react項目實際使用中有很多提升性能與功能的插件&#xff0c;今天來說一說vite里面提供的vite-plugin-react-router-generator&#xff0c;他主要提供了自動生成路由的功能&#xff0c;配合我們的loadable/component可以實現路由的懶加載與統一管理。1、實現效…