【性能优化】在大批量数据下使用 HTML+CSS实现走马灯,防止页面卡顿(二)

在这里插入图片描述

上一篇只是简单演示了’下一张’的操作和整体的设计思路,这两天把剩余功能补全了,代码经过精简,可封装当成轮播组件使用,详细如下.

代码

<template><div class="container"><button @click="checkNext('last')">上一张</button><button @click="checkNext('next')">下一张</button><div class="windows" @mousemove="stopPlay" @mouseleave="autoPlay"><div class="scrollBox"><div class="scrollItem"><div class="img"><el-image :src="initialData.imgUrl"></el-image></div><div class="messBox">{{ initialData.mess }}</div></div></div></div></div>
</template>
<script>
export default {data () {return {localData: [{ imgUrl: '', mess: '11111' },{ imgUrl: '', mess: '2222' },{ imgUrl: '../assets/dz.png', mess: '3333' },{ imgUrl: '../assets/logo.png', mess: '44444' },{ imgUrl: '', mess: '55555' },{ imgUrl: '', mess: '66666' }],initialData: '', // 初始展示数据nowIndex: 0, // 当前展示数据的索引progressControler: false, // 控制切换的变量autoPlayTimer: '', // 自动播放定时器idnextShowData: { imgUrl: '', mess: '' }// 下一批展示的数据}},mounted () {this.initData()},beforeRouteLeave (to, from, next) {// 清除定时器clearInterval(this.autoPlayTimer)console.log('离开当前页面')next()},methods: {initData () {// 初始赋值this.initialData = this.localData[this.nowIndex]// 自动播放this.autoPlay()},// 查看上一张/下一张checkNext (type) {// 信息展示列表无数据或只有一条数据时,不执行if (!this.localData || this.localData.length <= 1) return// 防止猛点if (this.progressControler) {console.log('当前操作过快')return}this.progressControler = true // 将当前操作进程锁死,完成后才允许下一次操作this.readyBox(type)// 准备新的dom元素let removeDomIndex = ''let createDomIndex = ''if (type === 'last') {console.log('查看上一张')removeDomIndex = 1createDomIndex = 0this.nowIndex--if (this.nowIndex < 0) { this.nowIndex = this.localData.length - 1 }// 循环播放}if (type === 'next') {console.log('查看下一张')removeDomIndex = 0createDomIndex = 1this.nowIndex++if (this.localData.length < this.nowIndex + 1) { this.nowIndex = 0 }// 循环播放}// 获取dom,准备移动和删除节点const fatherDom = document.querySelector('.windows')const moveDistanceX = fatherDom.offsetWidthconst domArr = fatherDom.querySelectorAll('.scrollBox')// 根据类名判断要移除的子盒子的偏移值const isRealDom = domArr[removeDomIndex].classList.contains('newScrollBox')const isRightCreatDom = domArr[removeDomIndex].classList.contains('RightnewScrollBox')const isLeftCreatDom = domArr[removeDomIndex].classList.contains('LeftnewScrollBox')// 实现走马灯移动效果if (!isRealDom) {domArr[removeDomIndex].style.transform = `translate(${type === 'next' ? -moveDistanceX : moveDistanceX}px,0px)`}if ((type === 'next' && isRightCreatDom) || (type === 'last' && isLeftCreatDom)) {domArr[removeDomIndex].style.transform = `translate(${type === 'next' ? -moveDistanceX * 2 : moveDistanceX * 2}px,0px)`}if ((type === 'next' && isLeftCreatDom) || (type === 'last' && isRightCreatDom)) {domArr[removeDomIndex].style.transform = 'translate(0px,0px)'}domArr[createDomIndex].style.transform = `translateX(${type === 'next' ? -moveDistanceX : moveDistanceX}px)`const timeId1 = setTimeout(() => {fatherDom.removeChild(domArr[removeDomIndex])this.progressControler = false // 允许进行下一次操作clearTimeout(timeId1)}, 501)},// 为下一次移动准备dom元素readyBox (type) {let nextShowData = ''// 上一张或下一张要展示的数据const fatherDom = document.querySelector('.windows')// 获取父元素const newDom = document.createElement('div')// 创建新元素// 设置新元素的样式newDom.className = 'scrollBox'newDom.classList.add('newScrollBox')newDom.style.width = '100%'newDom.style.height = '100%'newDom.style.position = 'absolute'newDom.style.transition = 'all 0.5s'// 上一张if (type === 'last') {// 确定下一条播放数据的取值if (this.nowIndex === 0) {nextShowData = this.localData[this.localData.length - 1]} else {nextShowData = this.localData[this.nowIndex - 1]}newDom.style.left = '-100%'newDom.classList.add('LeftnewScrollBox')// 插入子元素newDom.innerHTML = manageHtml(nextShowData)fatherDom.insertBefore(newDom, fatherDom.firstChild)}// 下一张的数据if (type === 'next') {// 确定下一条播放数据的取值if (this.localData.length === this.nowIndex + 1) {nextShowData = this.localData[0]} else {nextShowData = this.localData[this.nowIndex + 1]}newDom.style.left = '100%'newDom.classList.add('RightnewScrollBox')// 插入子元素newDom.innerHTML = manageHtml(nextShowData)fatherDom.appendChild(newDom)}// 管理动态页面结构function manageHtml (nextShowData) {// 新元素的内部结构const innerHtml = `<div class="scrollItem" style=" display: flex;  width: 100%; height: 100%; background-color: pink;"><div class="img" style="width:50%; height:100%" ><el-image src="${nextShowData.imgUrl}"></el-image></div><div class="messBox" style=" font-size: 16px; width:50%; height:100%; background-color: skyblue; ">${nextShowData.mess}</div></div>`return innerHtml}},// 自动播放autoPlay () {this.autoPlayTimer = setInterval(() => {this.checkNext('next')}, 3000)},// 暂停播放stopPlay () {if (this.progressControler) {console.log('鼠标移入时进程被打断')this.progressControler = !this.progressControler}clearInterval(this.autoPlayTimer)}}
}
</script>
<style lang='scss' scoped>
.container {width: 100%;height: 100%;
}.container .windows {position: relative;left: 30%;top: 30%;font-size: 0px;overflow: hidden;width: 40%;height: 40%;
}.scrollBox {position: absolute;width: 100%;height: 100%;transition: all 0.5s;
}.windows .scrollItem {display: flex;width: 100%;height: 100%;background-color: pink;
}.windows .scrollItem .img {width: 50%;height: 100%;
}.windows .messBox {font-size: 16px;width: 50%;height: 100%;background-color: skyblue;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1487769.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Vue Router基础

Router 的作用是在单页应用&#xff08;SPA&#xff09;中将浏览器的URL和用户看到的内容绑定起来。当用户在浏览不同页面时&#xff0c;URL会随之更新&#xff0c;但页面不需要从服务器重新加载。 1 Router 基础 RouterView RouterView 用于渲染当前URL路径对应的路由组件。…

Linux--Socket编程预备

目录 1. 理解源 IP 地址和目的 IP 地址 2.端口号 2.1端口号(port)是传输层协议的内容 2.2端口号范围划分 2.3理解 "端口号" 和 "进程 ID" 2.4理解 socket 3.传输层的典型代表 3.1认识 TCP 协议 3.2认识 UDP 协议 4. 网络字节序 5. socket 编程接…

边缘计算网关项目(含上报进程、32Modbus采集进程、设备搜索响应进程源码)

目录 边缘层 架构说明 包含知识点 数据上报进程 功能描述 功能开发 上报线程 数据存储线程 指令处理线程 项目源码 上报模块.c代码&#xff1a; 上报模块Makefile代码&#xff1a; STM32采集模块.c代码 设备搜索响应模块Linux部分.c代码 设备搜索响应模块Qt端代码.h …

流量录制与回放:jvm-sandbox-repeater工具详解

在软件开发和测试过程中&#xff0c;流量录制与回放是一个非常重要的环节&#xff0c;它可以帮助开发者验证系统在特定条件下的行为是否符合预期。本文将详细介绍一款强大的流量录制回放工具——jvm-sandbox-repeater&#xff0c;以及如何利用它来提高软件测试的效率和质量。 …

《Cross-Modal Dynamic Transfer Learning for Multimodal Emotion Recognition》

Multi-modal系列论文研读目录 文章目录 Multi-modal系列论文研读目录1.ABSTRACT2.INDEX TERMS3.INTRODUCTION4.RELATED WORKSA. MULTIMODAL EMOTION RECOGNITION 多模态情感识别1) CONVENTIONAL FUSION METHODS 常规融合方法2) TRANSFORMER-BASED FUSION METHODS 基于变压器的融…

C#测试控制台程序调用Quartz.NET的基本用法

Quartz.Net是常用的任务调用框架之一&#xff0c;既能在客户端程序中使用&#xff0c;也支持在网页程序后台调用。本文结合参考文献4中的示例代码学习其在控制台程序中的基本用法。   VS2022新建控制台项目&#xff0c;在Nuget包管理器中搜索并安装Quartz包&#xff0c;如下所…

IDEA在编译的时候报Error: java: 找不到符号符号: 变量 log lombok失效问题

错误描述 idea因为lombok的报错: java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled.Your processor is: com.sun.proxy.$Proxy8Lombok supports: sun/apple javac 1.6, ECJ 原因&#xff1a;这是由于Lombok的版本过低的…

若依 ruoyi poi Excel合并行的导入

本文仅针对文字相关的合并做了处理 &#xff0c;图片合并及保存需要另做处理&#xff01;&#xff01; 目标&#xff1a;Excel合并行内容的导入 结果&#xff1a; 1. ExcelUtil.java 类&#xff0c;新增方法&#xff1a;判断是否是合并行 /*** 新增 合并行相关代码&#xff1a;…

matlab 绘制参数方程

matlab 绘制参数方程 绘制参数方程绘制结果 绘制参数方程 clc; clear; close all;axis_length 100;% 定义参数t的范围 t 0:0.01:100;% 计算x和y的值 x t.^2 1; y 4*t - t.^2;% 绘制函数图像 plot(x, y); xlabel(x); ylabel(y); title(Plot of the curve xt^21, y4t-t^2…

Uprecise软件的基本功能

UPrecise 是和芯星通独立开发的评估软件&#xff0c; 旨在帮助用户便捷地对公司产品进行可视化操作。 用户可通过该软件以串口或端口的方式与接收机进行交互并直观地查看其状态信息&#xff0c;连接后 UPrecise 将自动识别接收机的波特率和类型&#xff0c;动态显示该类型接收机…

Python3网络爬虫开发实战(2)爬虫基础库

文章目录 一、urllib1. urlparse 实现 URL 的识别和分段2. urlunparse 用于构造 URL3. urljoin 用于两个链接的拼接4. urlencode 将 params 字典序列化为 params 字符串5. parse_qs 和 parse_qsl 用于将 params 字符串反序列化为 params 字典或列表6. quote 和 unquote 对 URL的…

FastAPI(七十三)实战开发《在线课程学习系统》接口开发-- 回复留言

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 之前文章分享FastAPI&#xff08;七十二&#xff09;实战开发《在线课程学习系统》接口开发-- 留言列表开发&#xff0c;这次我们分享如何回复留言 按…

Layui修改表格分页为英文

Layui修改表格分页为英文 1.前言2.Laypage属性 1.前言 主要记录初次使用Layui没有好好看官方文档踩坑&#xff0c;修改了源码才发现可以自定义 使用的Layui版本2.9.14 2.Laypage属性 Laypage属性中带的有自定义文本的属性 示例代码 table.render({.......page: {skipText: …

Linux:传输层(1) -- UDP协议

1. 端口号 同一台主机的不同端口号(Port)标记了主机上不同的进程&#xff0c;如下图所示&#xff1a; 在 TCP/IP 协议中 , 用 " 源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信 ( 可…

QT开发(QT的基本概述和环境的安装)

QT的概述 一.QT的介绍背景1.1 什么是QT1.2QT的发展史1.3 Qt支持的平台1.4QT版本1.5QT的优点1.6QT的应用场景 二.搭建QT开发环境2.1 QT的开发工具的下载2.2 QT环境变量配置 三.QT的三种基类四.QT Hello World程序4.1使用按钮实现4.1.1 代码方式实现4.1.2 可视化操作实现 一.QT的…

GO内存分配详解

文章目录 GO内存分配详解一. 物理内存(Physical Memory)和虚拟内存(Virtual Memory)二. 内存分配器三. TCMalloc线程内存(thread memory)页堆(page heap)四. Go内存分配器mspanmcachemcentralmheap五. 对象分配流程六. Go虚拟内存ArenaGO内存分配详解 这篇文章中我将抽丝剥茧,…

基于STM32瑞士军刀--【FreeRTOS开发】学习笔记(一)|| RISC / 底层代码执行步骤 / 汇编指令

本篇文章基于韦东山老师讲课笔记和自己理解编写。 RISC ARM芯片属于精简指令集计算机(RISC&#xff1a;Reduced Instruction Set Computing)&#xff0c;它所用的指令比较简单&#xff0c;有如下特点&#xff1a; ① 对内存只有读、写指令 ② 对于数据的运算是在CPU内部实现 …

2024.7.24 作业

1.二叉树的创建、遍历自己实现一遍 bitree.h #ifndef BITREE_H #define BITREE_H#include <myhead.h>typedef char datatype;typedef struct Node {datatype data;struct Node *left_child;struct Node *right_child; }Node,*BiTreePtr;//创建二叉树 BiTreePtr tree_cr…

MinerU、Magic-PDF、Magic-Doc

文章目录 一、关于 MinerU二、Magic-PDF1、简介2、项目全景3、流程图4、子模块仓库 三、Magic-PDF 上手指南1、配置要求2、安装配置1. 安装Magic-PDF2. 下载模型权重文件3. 拷贝配置文件并进行配置4. 使用CUDA或MPS加速推理CUDAMPS 3、使用说明1) 通过命令行使用直接使用更多用…

带您详细了解安全漏洞的产生和防护

什么是漏洞&#xff1f; 漏洞是 IT、网络、云、Web 或移动应用程序系统中的弱点或缺陷&#xff0c;可能使其容易受到成功的外部攻击。攻击者经常试图寻找网络安全中的各种类型的漏洞来组合和利用系统。 一些最常见的漏洞&#xff1a; 1.SQL注入 注入诸如 SQL 查询之类的小代…