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.mzph.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…