Element輪播圖組件切換太單調?手把手帶你重寫切換效果

在這里插入圖片描述

前言:

最近在逛山東博物館網站的時候,發現該網站主頁淡入淡出的輪播圖非常的優雅,所以就想來復刻一下,也算是對組件進行了二次的封裝和修改

工具準備:

Vue3+Element Plus走馬燈組件

注意事項:

Element Plus的走馬燈有以下幾個屬性需要注意下:

.el-carousel__item 所有輪播圖元素的樣式。

. is-active 樣式來確定當前展示的元素 。

.is-animating 演示來實現過渡的間隔。

還有一個行內樣式,組件內部是通過添加或修改行內樣式實現切換的效果(這個比較重要)。

案例代碼

HTML

<template><div class="home-container"><div class="home-container_banner"><el-carousel height="100vh" @change="change" :interval="3000" :pause-on-hover="false"><el-carousel-item v-for=" item in bannerList" :key="item"><div class="container-pic" :style="{ backgroundImage: `url(${getImage(item)})` }"></div></el-carousel-item></el-carousel></div></div>
</template>

JavaScript

背景圖片需要用絕對路徑,所以封裝一個小的方法

<script setup>
import { ref, onMounted, onBeforeUnmount, nextTick } from 'vue';
const getImage = (imgUrl) => {return new URL(`../image/${imgUrl}`, import.meta.url).href
}// 組件名稱定義
defineOptions({name: 'MuseumDash'
});// 輪播圖圖片列表
const bannerList = ref(['1.jpg', '2.jpg', '3.jpg', '4.jpg']);// 幻燈片切換后的樣式更改
const change = () => {nextTick(() => {const picItems = document.querySelectorAll('.el-carousel__item');picItems.forEach(item => {item.style.transform = 'scale(1)';});setTimeout(() => {const isActive = document.querySelector('.el-carousel__item.is-active');if (isActive) {isActive.style.transform = 'scale(1.08)';}}, 10);});
};
change()
// 使用 MutationObserver 監控并覆蓋 translate 樣式
const observer = new MutationObserver(mutations => {mutations.forEach(mutation => {if (mutation.type === 'attributes' && mutation.attributeName === 'style') {mutation.target.style.transform = mutation.target.style.transform.replace(/translateX\([^)]*\)/, '');}});
});// 監聽頁面加載和卸載事件
onMounted(() => {const items = document.querySelectorAll('.el-carousel__item');items.forEach(item => {observer.observe(item, {attributes: true,attributeFilter: ['style']});});
});onBeforeUnmount(() => {observer.disconnect();
});
</script>

Css

<style lang="scss" scoped>
.home-container_banner {height: 100vh;width: 100vw;overflow: hidden;position: relative;.container-pic {height: 100%;width: 100%;background-size: cover;background-position: center;background-repeat: no-repeat;}
}.el-carousel__item {transition: opacity 0.5s linear, transform 2s ease-in-out !important;position: absolute !important;top: 0;left: 0;right: 0;bottom: 0;opacity: 0;z-index: 1;
}.el-carousel__item.is-active {opacity: 1;z-index: 2;
}
</style>

解析:

  1. 修改 .el-carousel__item 樣式,讓元素本身實現放大的效果。這里使用 !important 進行加權,防止組件內部的樣式文件對其進行覆蓋。

  2. 通過 JS 控制覆蓋掉組件自身邏輯添加的style(覆蓋樣式是實現功能重要的點之一),使用 nextTick 是為了保證先獲取元素再進行邏輯執行,這里使用 setTimeout 是為了延遲執行放大效果,如果不使用的話,當頁面刷新時幻燈片的第一個頁面直接就會被放大,就沒有逐漸放大的效果了。整體的邏輯是在 組件切換的時候執行的,為了讓頁面創建時就開始執行,要在 created 周期中執行一次,讓第一張幻燈片實現動效。

    const change = () => {nextTick(() => {const picItems = document.querySelectorAll('.el-carousel__item');picItems.forEach(item => {item.style.transform = 'scale(1)';});setTimeout(() => {const isActive = document.querySelector('.el-carousel__item.is-active');if (isActive) {isActive.style.transform = 'scale(1.08)';}}, 10);});
    };
    change()
    
  3. 通過 MutationObserver 監聽 Dom 添加元素或屬性事件,解決更改視口大小動效錯亂的問題。因為 Element 組件會根據視口位置自動計算當前位置,計算完畢后會添加上 style 屬性那么就會將我們修改后的 style 屬性進行覆蓋。(重要的優化邏輯)(這個方法不是很常用,大家可以去 MDN 查看對應的 Api)

    const observer = new MutationObserver(mutations => {mutations.forEach(mutation => {if (mutation.type === 'attributes' && mutation.attributeName === 'style') {mutation.target.style.transform = mutation.target.style.transform.replace(/translateX\([^)]*\)/, '');}});
    });// 監聽頁面加載和卸載事件
    onMounted(() => {const items = document.querySelectorAll('.el-carousel__item');items.forEach(item => {observer.observe(item, {attributes: true,attributeFilter: ['style']});});
    });onBeforeUnmount(() => {observer.disconnect();
    });
    
  4. 在組件銷毀前清除監聽,防止內存泄漏

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

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

相關文章

GPX文件的元素內容詳解

GPX文件的來源 GPX文件&#xff08;GPS eXchange Format&#xff09;是一種用于存儲GPS數據的開放標準格式&#xff0c;它可以包含航路點、軌跡和路線等信息。這些文件通常來源于GPS設備、戶外活動追蹤應用程序、地圖服務或用戶之間的數據共享。用戶可以通過各種軟件和硬件設備…

Python爬蟲:基礎爬蟲架構及爬取證券之星全站行情數據!

爬蟲成長之路&#xff08;一&#xff09;里我們介紹了如何爬取證券之星網站上所有A股數據&#xff0c;主要涉及網頁獲取和頁面解析的知識。爬蟲成長之路&#xff08;二&#xff09;里我們介紹了如何獲取代理IP并驗證&#xff0c;涉及了多線程編程和數據存儲的知識。此次我們將在…

網絡編程學習之tcp

按下*&#xff08;星號&#xff09;可以搜索當前光標下的單詞。 Tcp編程的過程 打開網絡設備 Bind&#xff1a;給服務地址把ip號和端口號連接進去 Tcp是有狀態的 Listen是進入監聽狀態&#xff0c;看有沒有客戶端來連接服務器 Tcp比udp消耗過多資源 Upd類似于半雙工&#…

D50SB100-ASEMI逆變焊機專用D50SB100

編輯&#xff1a;ll D50SB100-ASEMI逆變焊機專用D50SB100 型號&#xff1a;D50SB100 品牌&#xff1a;ASEMI 封裝&#xff1a;DSB-5 批號&#xff1a;2024 現貨&#xff1a;50000 正向電流&#xff08;Id&#xff09;&#xff1a;50A 反向耐壓&#xff08;VRRM&#xf…

編程語言沒落了?揭開真相的四大謎團、五大趨勢、六大挑戰與七大未來

編程語言沒落了&#xff1f;揭開真相的四大謎團、五大趨勢、六大挑戰與七大未來 在科技飛速發展的今天&#xff0c;有人宣稱編程語言已經沒落&#xff0c;這一觀點似乎讓人困惑不已。然而&#xff0c;真相究竟如何&#xff1f;本文將從四個方面揭示編程語言的現狀&#xff0c;…

【AIGC】二、mac本地采用GPU啟動keras運算

mac本地采用GPU啟動keras運算 一、問題背景二、技術背景三、實驗驗證本機配置安裝PlaidML安裝plaidml-keras配置默認顯卡 運行采用 CPU運算的代碼step1 先導入keras包&#xff0c;導入數據cifar10&#xff0c;這里可能涉及外網下載&#xff0c;有問題可以參考[keras使用基礎問題…

echarts中tooltip添加點擊事件代碼示例

echarts中tooltip添加點擊事件代碼示例_javascript技巧_腳本之家 點擊事件無法使用this 或者 this無法使用&#xff1a;

Qt圖形編輯類使用總結

Qt的圖形編輯通常會涉及以下三個類:QGraphicsView類、QGraphicsScene類及QGraphicsItem類。 QGraphicsView 是構建復雜圖形用戶界面的強大工具,尤其適用于那些需要動態更新、可交互的2D圖形化應用程序,如圖表繪制、流程圖編輯器、游戲地圖顯示等等。通過結合使用 QGraphics…

13--memcache與redis

前言&#xff1a;數據庫讀取速度較慢一直是無法解決的問題&#xff0c;大型網站應對的方式主要是使用緩存服務器來緩解這種情況&#xff0c;減少數據庫訪問次數&#xff0c;以提高動態Web等應用的速度、提高可擴展性。 1、簡介 Memcached/redis是高性能的分布式內存緩存服務器…

ret2csu簡單總結

一個比較進階的rop利用方式。 Why ret to csu&#xff1f; 當程序給的gadget不夠&#xff0c;或者輸入長度受限時&#xff0c;可以考慮利用csu中的眾多gadget以及一個call指令來劫持控制流。 __libc_csu_init 匯編源碼: .text:0000000000400790 ; void __fastcall _libc_c…

無人直播賺錢的底層邏輯是什么?一文揭曉!

當前&#xff0c;網絡直播已經成為各類商家提高曝光和引流獲客的主要渠道之一&#xff0c;這在為商家帶來新機遇的同時&#xff0c;也讓他們因人手不足或資金匱乏等原因而陷入無人問津窘境之中。在此背景下&#xff0c;無人直播軟件一經出現&#xff0c;便引起了眾多商家的關注…

多器官功能障礙綜合征

多器官功能障礙綜合征&#xff08;Multiple Organ Dysfunction Syndrome&#xff0c;MODS&#xff09;是指機體在遭受嚴重感染、創傷、休克、大手術等急性疾病過程中&#xff0c;同時或序貫發生兩個或兩個以上器官功能障礙&#xff0c;以致不能維持內環境穩定的臨床綜合征。 MO…

28V飛機庫維修電源在飛機庫中的作用

飛機庫作為飛機停放和維護的重要場所&#xff0c;其設施的完善和電源系統的穩定運行是保證飛機正常運行的前提。隨著我國航空事業的飛速發展&#xff0c;飛機維修行業面臨著越來越大的挑戰。在飛機維修過程中&#xff0c;電源系統作為關鍵組成部分&#xff0c;其穩定性和可靠性…

網絡服務與應用-廣域網技術(華為ip認證學習筆記)

網絡服務與應用 FTP&#xff1a;文件傳輸協議 TCP 傳輸 20 端口發送&#xff0c;21 接收端口 1. 采用 C/S 結構 2. 傳輸模式 &#xff08;1&#xff09;ASCII 模式&#xff1a;傳輸文本 &#xff08;2&#xff09;二進制模式&#xff1a;傳輸非文本 3. 工作模式 &#xff08;1&…

LeetCode題練習與總結:尋找旋轉排序數組中的最小值--153

一、題目描述 已知一個長度為 n 的數組&#xff0c;預先按照升序排列&#xff0c;經由 1 到 n 次 旋轉 后&#xff0c;得到輸入數組。例如&#xff0c;原數組 nums [0,1,2,4,5,6,7] 在變化后可能得到&#xff1a; 若旋轉 4 次&#xff0c;則可以得到 [4,5,6,7,0,1,2]若旋轉 …

【MIT 6.5840/6.824】Lab1 MapReduce

MapReduce MapReduce思想實現思路感受 6.5840/6.824 Lab與筆記匯總 本文對應的Lab版本為MIT6.5840-Spring2024的Lab1 本博客只提供思路&#xff0c;不會公開任何代碼 本lab耗時約6h&#xff0c;碼量約500行 MapReduce思想 MapReduce的思想屬于是比較簡單的&#xff0c;分為兩…

3. 排序算法代碼-python

目錄 1.冒泡排序2.快速排序3.插入排序4.希爾排序5.選擇排序6.堆排序7.歸并排序8. 二分查找 1.冒泡排序 冒泡排序""" def BubbleSort(nums):listLength len(nums)while listLength > 0:for i in range(listLength - 1):if nums[i] > nums[i1]:nums[i], n…

References in code to package

【IntelliJ IDEA】IDE學習使用&#xff08;不時更新&#xff09;_idea references in code to class-CSDN博客

【筆記】從零開始做一個精靈龍女-畫貼圖階段(上)

此文只是我的筆記&#xff0c;不包全看懂&#xff0c;有問題可評論 PS貼圖加工 1.打開ps 拖入uv圖&#xff0c;新建圖層&#xff0c;設置背景色為灰色&#xff0c;改一下圖層名字 2.按z縮小一下uv圖層&#xff0c;拖入實體uv圖片&#xff08;目的是更好上色&#xff0c;比如…

鴻蒙語言基礎類庫:【@ohos.util.Vector (線性容器Vector)】

線性容器Vector 說明&#xff1a; 本模塊首批接口從API version 8開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。開發前請熟悉鴻蒙開發指導文檔&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md點擊或者復制轉到。 Vect…