如何快速實現一個無縫輪播效果

🧑?💻 寫在開頭
點贊 + 收藏 === 學會🤣🤣🤣

需求簡介

輪播圖是我們前端開發中的一個常見需求,在項目開發中,我們可以使用element、ant等UI庫實現。某些場景,為了一個簡單的功能安裝一個庫是沒必要的,我們最好的選擇就是手搓。
在這里插入圖片描述
我們來看一個需求
在這里插入圖片描述
上述需求核心就是實現一個無縫輪播的切換效果。以這個需求為例,我們看看最終實現效果:
在這里插入圖片描述

實現思路

要想實現一個無縫的輪播效果,其實非常簡單,核心思想就是動態改變顯示的列表而已。比如我們有這樣一個數組

const list = ref([{ name: 1, id: 1 }, { name: 2, id: 2 },{ name: 3, id: 3 }
])

如果我們想無縫切換的展示這個數據,最簡單的代碼就是動態的改變下面的代碼的index

<template><div>{{ list[index] }}</div>
</template>
<script setup>const index = ref(0)const list = ref([{ name: 1, id: 1 }, { name: 2, id: 2 }, { name: 2, id: 2 }])
<scriptp>

那如何實現切換的樣式呢?也非常簡單,我們只要給元素添加一個出現樣式和離開樣式即可。現在,我們來具體實現這樣一個需求。

技術方案

數據的動態切換

要想實現一個數據的動態循環切換效果,是非常容易的:

<template><div v-for="(build, index) in list" :key="index"><div v-show="index === selectIndex">卡片自定義內容</div></div>
</template>
<script setup>
const selectIndex = ref(0)
const list = ref([{ name: "卡片1", id: 1 }, { name: "卡片1", id: 2 }, { name: "卡片1", id: 2 }]
)// #計時器實例
let timer: any = null// >計時器邏輯
const timeFuc = () => {timer = setInterval(() => {// 更改選中的indexif (selectIndex.value >= list.value.length - 1) {selectIndex.value = 0} else {selectIndex.value++}}, 5000)
}timeFuc()
<scriptp>

上述代碼中,我們設置了一個定時器,定時器每5s執行一次,每次執行都會動態更改當前要顯示的數據索引值,當索引值達到最大實,在將其重置。通過上述的簡單代碼,我們就實現了一個可以自動切換的循環渲染的卡片。

動畫添加

要想實現最終效果的動態效果也非常容易,我們只需要給每個元素出現時設置一些樣式,離開時設置一些樣式即可。借助vue的Transition組件,我們能很容易實現這樣一個效果。

如果你不了解vue的Transition組件,請去官網補充下知識:cn.vuejs.org/guide/built…

<template>
<div class="main-content"><Transition v-for="(build, index) in list" :key="selectIndex"><div class="banner-scroll-wrap" v-show="index === selectIndex">卡片自定義內容</div></Transition>
</div>
</template>
<script setup>
const selectIndex = ref(0)
const list = ref([{ name: "卡片1", id: 1 }, { name: "卡片1", id: 2 }, { name: "卡片1", id: 2 }]
)// #計時器實例
let timer: any = null// >計時器邏輯
const timeFuc = () => {timer = setInterval(() => {// 更改選中的indexif (selectIndex.value >= list.value.length - 1) {selectIndex.value = 0} else {selectIndex.value++}}, 5000)
}timeFuc()
<scriptp>
<style lang="less" scoped>
.main-content {position: relative;height: 100%;.banner-scroll-wrap {position: absolute;top: 0;bottom: 0;right: 0;left: 0;}
}.v-enter-from {transform: translateX(100%);opacity: 0;
}.v-enter-active,
.v-leave-active {transition: transform 600ms ease-in-out, opacity 600ms ease-in-out;
}.v-enter-to {transform: translateX(0);opacity: 1;
}.v-leave-from {transform: translateX(0);opacity: 1;
}.v-leave-to {transform: translateX(-100%);opacity: 0;
}
<style/>

上述代碼中,由于 selectIndex是動態的,元素不斷地在顯示與隱藏。因此,Transition標簽的進入樣式和離開樣式會動態觸發,從而形成切換效果。

v-enter是元素的進入樣式,進入時,我們從最右邊偏移100%的距離到正常位置,透明度從0到1,這個過程持續0.6s,實現了元素左移淡入的效果。

v-leave是元素的離開樣式,離開時,我們從正常位置偏移到100%的左側位置,透明度從1到0,這個過程持續0.6s,實現了元素左移淡出的效果。

在這些類的共同作用下,我們實現了元素的動態切換。
你可能注意到了我給元素設置了一個banner-scroll-wrap類名,并使用了position: absolute,這樣設置的注意目的是保證切換離開元素的淡出效果和進入元素的淡入效果是連貫的。如果你不這樣寫,可能會出現樣式問題。
此外,注意我給Transition設置了key=“Transition”,這樣些會保證每次數據在切換時,transition能夠重新渲染,觸發元素離開和進入的樣式。
至此,我們就完成了基本功能樣式
在這里插入圖片描述

輪播的停止與恢復

很常見的一種情況就是我們需要鼠標放在卡片上時停止輪播,離開卡片的時候恢復輪播,這非常容易。

<template>
<div class="main-content"  @mouseenter="stop()" @mouseleave="start()"><Transition v-for="(build, index) in list" :key="selectIndex"><div class="banner-scroll-wrap" v-show="index === selectIndex">卡片自定義內容</div></Transition>
</div>
</template>
<script setup>
const selectIndex = ref(0)
const list = ref([{ name: "卡片1", id: 1 }, { name: "卡片1", id: 2 }, { name: "卡片1", id: 2 }]
)// #計時器實例
let timer: any = null// >計時器邏輯
const timeFuc = () => {timer = setInterval(() => {// 更改選中的indexif (selectIndex.value >= list.value.length - 1) {selectIndex.value = 0} else {selectIndex.value++}}, 5000)
}// >開啟輪播const start = () => {if (timer) returntimeFuc()}// >關閉輪播const stop = () => {clearInterval(timer)timer = null}timeFuc()
<scriptp>
<style lang="less" scoped>
<style/>

解決重影問題

在某些情況下,我們離開這個頁面很久后(瀏覽器切換到其他選項卡),然后在切回來的時候,可能會出現短暫的畫面重影問題,這個問題也很好解決,加上下面的代碼即可

<script setup>//...// 解決切屏后重影的問題onMounted(() => {document.addEventListener('visibilitychange', () => {// 用戶息屏、或者切到后臺運行 (離開頁面)if (document.visibilityState === 'hidden') {stop()}// 用戶打開或回到頁面if (document.visibilityState === 'visible') {start()}})})onBeforeUnmount(() => stop())<scriptp>

visibilitychange 事件:當其選項卡的內容變得可見或被隱藏時,會在 document 上觸發 visibilitychange 事件。該事件不可取消。

總結

在本教程中,我們通過簡單代碼實現了無縫輪播效果,樣式是左右切換,我們也可以通過樣式控制實現上下切換的效果,比如將translateX設置為translateY即可。

 .v-enter-from {transform: translateY(100%);opacity: 0;
}

時間原因,本教程也沒有對技術上做深究,也希望各位大佬能提供自己的思路與建議,感謝大家分享!

如果對您有所幫助,歡迎您點個關注,我會定時更新技術文檔,大家一起討論學習,一起進步。
在這里插入圖片描述

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

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

相關文章

IDEA新建項目并撰寫Java代碼的方法

本文介紹在IntelliJ IDEA軟件中&#xff0c;新建項目或打開已有項目&#xff0c;并撰寫Java代碼的具體方法&#xff1b;Groovy等語言的代碼也可以基于這種方法來撰寫。 在之前的文章IntelliJ IDEA社區版在Windows電腦中的下載、安裝方法&#xff08;https://blog.csdn.net/zheb…

35.搜索插入位置

題目描述 給定一個排序數組和一個目標值&#xff0c;在數組中找到目標值&#xff0c;并返回其索引。如果目標值不存在于數組中&#xff0c;返回它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的算法。 示例 1: 輸入: nums [1,3,5,6], target 5 輸出: 2示例 2:…

在任何崗位都可以把自己當成一個項目經理

這幾天跟一個剛入職場的姐妹交流的時候&#xff0c;她問了我一個問題&#xff0c;如果讓你總結三年從助理升到經理的關鍵點&#xff0c;你覺得是什么&#xff1f;我思考了那么幾秒鐘&#xff0c;大概就是——在任何崗位都把自己當項目經理。 今天給大家介紹我的項目管理工具——…

解析Spring Boot中的數據遷移工具

解析Spring Boot中的數據遷移工具 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. 數據遷移工具的重要性和選擇 在開發和維護現代化應用程序時&#xff0c;數據遷移是一個關鍵的任務。Spring Bo…

頭歌資源庫(21)走方格

一、 問題描述 二、算法思想 首先&#xff0c;確定方格中間下方人所在的位置&#xff0c;即(row, col) (n//2, m//2)。初始化路徑和為0。從初始位置開始&#xff0c;按照給定的5個方向進行移動&#xff1a;上(U)&#xff0c;下(D)&#xff0c;左(L)&#xff0c;右(R)&#x…

關于騰訊的那些事(6月新聞紀要)

祝賀&#xff01;深圳市科技進步一等獎 這份文件是關于騰訊云數據庫TDSQL獲得深圳市科技進步一等獎的詳細報道。以下是詳細總結分析&#xff1a; 獲獎榮譽&#xff1a; 騰訊云數據庫TDSQL榮獲2022年深圳市科技進步一等獎&#xff0c;成為唯一入選的數據庫產品。該獎項由深圳市…

菜雞的原地踏步史05(???)

每日一念 改掉自己想到哪寫哪的壞習慣 子串 和為K的子數組 class Solution {/**有點像找出和為0的子數組&#xff0c;只不過這里和變成了k不太對&#xff0c;嘗試使用雙指針滑動窗口&#xff0c;完全過不去樣例正確做法hashmap存放 sum -- count對nums中的數字進行遍歷sum累…

C#與物聯網:打造智能家居解決方案

引言 隨著物聯網&#xff08;IoT&#xff09;的快速發展&#xff0c;智能家居成為了現代生活的一個重要組成部分。智能家居系統通過連接各種智能設備&#xff0c;如智能燈光、恒溫器、安防攝像頭等&#xff0c;實現家居環境的自動化和智能化控制。C#作為一種強大的編程語言&am…

Linux C++ 045-設計模式之工廠模式

Linux C 045-設計模式之工廠模式 本節關鍵字&#xff1a;Linux、C、設計模式、簡單工廠模式、工廠方法模式、抽象工廠模式 相關庫函數&#xff1a; 簡單工廠模式 基本簡介 從設計模式的類型上來說&#xff0c;簡單工廠模式是屬于創建型模式&#xff0c;又叫做靜態工廠方法&…

10、Python之寫出更加Pythonic的代碼:unpacking拆包機制

引言 有些小伙伴有其他編程語言的學習、使用的經驗&#xff0c;然后遷移到Python。一般會比完全的新手小白&#xff0c;更快速地把Python用起來。這是他們的優勢&#xff0c;但也是他們的劣勢。 之所以這么說&#xff0c;是因為從其他編程語言帶過來的&#xff0c;除了相通的編…

MOJO語言中的字典和哈希表:數據結構的靈活性與效率

MOJO是一種編程語言&#xff0c;它以其獨特的語法和對現代編程范式的支持而聞名。在MOJO中&#xff0c;字典&#xff08;也稱為哈希表或散列表&#xff09;是一種非常重要的數據結構&#xff0c;它允許開發者以鍵值對的形式存儲和檢索數據。本文將深入探討MOJO語言中的字典和哈…

第十八節 LLaVA如何按需構建LORA訓練(視覺、語言、映射多個組合訓練)

文章目錄 前言一、基于llava源碼構建新的參數1、添加lora_vit參數2、訓練命令腳本設置二、修改源碼,構建lora訓練1、修改源碼-lora訓練2、LLM模型lora加載3、VIT模型加載4、權重凍結操作5、結果顯示三、實驗結果前言 如果看了我前面文章,想必你基本對整個代碼有了更深認識。…

Raylib 實現超大地圖放大縮小與兩種模式瓦片地圖刷新

原理&#xff1a; 一種刷新模式&#xff1a; 在宮格內整體刷新&#xff0c;類似九宮格移動到邊緣&#xff0c;則九宮格整體平移一個宮格&#xff0c;不過這里是移動一個瓦片像素&#xff0c;實際上就是全屏刷新&#xff0c;這個上限是 筆記本 3060 70幀 100*100個瓦片每幀都…

數據庫之MQL

1&#xff0c;查詢所有 mysql> select * from grade;2&#xff0c; mysql> select id,firstname,lastname from grade;3&#xff0c; mysql> select firstname,lastname from grade where id > 4;4&#xff0c; mysql> select * from grade where sex f;5&…

C++中的函數指針

C中的函數指針 在C中&#xff0c;函數指針是一個指向函數的指針&#xff0c;可以用來調用函數。函數指針的聲明方式如下&#xff1a; 返回類型 (*指針變量名)(參數列表);例如&#xff0c;如果有一個函數&#xff1a; int add(int a, int b) {return a b; }可以聲明一個指向…

微服務通信新紀元:Eureka與分布式服務網格的融合

微服務通信新紀元&#xff1a;Eureka與分布式服務網格的融合 引言 在微服務架構中&#xff0c;服務間的通信是構建分布式系統的核心。Eureka作為Netflix開源的服務發現框架&#xff0c;提供了服務注冊與發現的功能&#xff0c;而服務網格技術則為服務間通信提供了更細粒度的控…

Hive/Spark窗口函數

窗口函數 hive文檔鏈接 spark文檔鏈接 1. OVER支持的函數 自然序編號 Syntax: ROW_NUMBER按等級編號 Syntax: RANK | DENSE_RANK | PERCENT_RANK分組內分桶&#xff0c;并返回對應桶的序號 Syntax: NTILE(n)Analytic Functions&#xff08;分析函數&#xff09; Syntax: CUM…

odoo17 常見升級問題

通用問題 模型名變更 字段變更 方法名變更 方法參數變更 xml數據結構定義變化 xml的id變更 view視圖變化&#xff0c;導致xpath路徑出差 template結構變化&#xff0c;&#xff0c;導致xpath路徑出差&#xff0c;或者id不存在 升16問題 前端owl的架構變化 升17問題 前端 標…

什么,有狗快跑!慢著,這次手把手教你怎么過安全狗!(sql注入篇)

前言 在記憶里上次繞安全狗還是在上次&#xff0c;開開心心把自己之前繞過狗的payload拿出來&#xff0c;發現全部被攔截了&#xff0c;事情一下子就嚴肅起來了&#xff0c;這就開整。 環境 本次環境如下sqli-lab的sql注入靶場 網站安全狗APACHE版V4.0版本的最高防護等級繞過…

秋招Java后端開發沖刺——并發篇2(ThreadLocal、Future接口)

本文對ThreadLocal類和Future接口進行了總結概括&#xff0c;包括ThreadLocal類的原理、內存泄露等問題&#xff0c;和Future接口的使用等問題。 一、ThreadLocal 1. 介紹 ThreadLocal&#xff08;線程局部變量&#xff09;是Java中的一個類&#xff0c;線程通過維護一個本地…