vue 自制列表,循环滚动

news2025/3/21 1:14:51

需求人员表示,超过高度的表格内容需要滚动展示,所以效果图如下:

自定义列表样式,主要是通过flex布局,控制 类th 与 类td 的宽度保持一致,标签结构还是参考了table的结构,由thead与tbody包裹tr再包裹最小单元th,td,但是自定义的列表在样式修改、结构调整上会更加灵活。

.th {
    &:nth-child(1) {
        width: 60px;
    }

    &:nth-child(2) {
        width: 90px;
    }

    &:nth-child(3) {
        width: 0;
        flex: 1;
    }

    &:nth-child(4) {
        width: 90px;
    }
}

.td {
    &:nth-child(1) {
        width: 60px;
    }

    &:nth-child(2) {
        width: 90px;
    }

    &:nth-child(3) {
        width: 0;
        flex: 1;
    }

    &:nth-child(4) {
        width: 90px;
    }
}

this.stopAutoScroll() 与 this.startAutoScroll() 都是AI生成的JS代码修改而来

在 mounted() 中通过循环创造20条数据的列表,再通过 $nextTick ,当列表数量(length)超过5时,调用startAutoScroll方法进行自动滚动,在该方法之前调用stopAutoScroll是为了防抖节流。如果有主要思路想法,可以借助通义千问等AI工具进行JS代码的快速生成,节约时间。

mounted() {
    for (let i = 0; i < 20; i++) {
        let obj = {
            id: 'tableData00' + i,
            td1: i + 1,
            td2: 'td2',
            td3: i % 3 == 0 ? '测试测试测试' : i % 3 == 1 ? '测试测试' : '测试',
            td4: '99'
        }
        this.tableData.push(obj)
    }

    this.$nextTick(function () {
        // 当列表超过5条,自动滚动,可自行修改
        if (this.tableData.length > 5) {
            // 自动滚动
            this.stopAutoScroll();
            this.startAutoScroll();
        }
    })
},

【完整代码】

<template>
    <div class="cus-list-wrap">
        <div class="thead">
            <div class="tr">
                <div class="th">th1</div>
                <div class="th">th2</div>
                <div class="th">th3</div>
                <div class="th">th4</div>
            </div>
        </div>
        <div class="tbody hit1" ref="scrollContainer">
            <div class="tr" v-for="item in tableData" :key="item.id">
                <div class="td">
                    {{ item.td1 }}
                </div>
                <div class="td">
                    {{ item.td2 }}
                </div>
                <div class="td">
                    {{ item.td3 }}
                </div>
                <div class="td">
                    {{ item.td4 }}
                </div>
            </div>
        </div>
    </div>
</template>

<script>
export default {
    data() {
        return {
            tableData: [],
            isScrollingDown: true,
            scrollAnimationFrameId: null,
            isAutoScrollRunning: false,
        }
    },
    mounted() {
        for (let i = 0; i < 20; i++) {
            let obj = {
                id: 'tableData00' + i,
                td1: i + 1,
                td2: 'td2',
                td3: i % 3 == 0 ? '测试测试测试' : i % 3 == 1 ? '测试测试' : '测试',
                td4: '99'
            }
            this.tableData.push(obj)
        }

        this.$nextTick(function () {
            // 当列表超过5条,自动滚动,可自行修改
            if (this.tableData.length > 5) {
                // 自动滚动
                this.stopAutoScroll();
                this.startAutoScroll();
            }
        })
    },
    methods: {
        // 自动滚动
        startAutoScroll() {

            if (this.isAutoScrollRunning) return;
            this.isAutoScrollRunning = true;
            const scrollContainer = this.$refs.scrollContainer;
            let scrollSpeed = 1; // 控制滚动速度

            const autoScroll = () => {
                if (!this.isAutoScrollRunning) return;

                if (this.isScrollingDown) {
                    scrollContainer.scrollTop += scrollSpeed;

                    if (scrollContainer.scrollTop + scrollContainer.clientHeight >= scrollContainer.scrollHeight) {
                        // 到达底部后切换方向,并设置一个小延时模拟“回到顶部”
                        this.isScrollingDown = false;
                        scrollContainer.scrollTop = 0;

                        setTimeout(() => {
                            this.isScrollingDown = true;

                        }, 300); // 延迟时间可以根据需要调整
                    }
                } else {
                    scrollContainer.scrollTop -= scrollSpeed;
                    if (scrollContainer.scrollTop <= 0) {
                        this.isScrollingDown = true;
                    }
                }
                this.scrollAnimationFrameId = requestAnimationFrame(autoScroll);
            };

            autoScroll(); // 启动自动滚动
        },

        stopAutoScroll() {
            if (this.scrollAnimationFrameId !== null) {
                cancelAnimationFrame(this.scrollAnimationFrameId);
                this.isAutoScrollRunning = false;
            }
        },
    },
    beforeDestroy() {
        // 清除定时器以避免内存泄漏
        this.stopAutoScroll();
    },
}
</script>

<style lang="less" scoped>
.cus-list-wrap {
    margin: 0 16px;
    padding-top: 4px;
}

.hit1 {
    overflow-x: hidden;
    overflow-y: auto;
    height: 400px;
}

.th {
    &:nth-child(1) {
        width: 60px;
    }

    &:nth-child(2) {
        width: 90px;
    }

    &:nth-child(3) {
        width: 0;
        flex: 1;
    }

    &:nth-child(4) {
        width: 90px;
    }
}

.td {
    &:nth-child(1) {
        width: 60px;
    }

    &:nth-child(2) {
        width: 90px;
    }

    &:nth-child(3) {
        width: 0;
        flex: 1;
    }

    &:nth-child(4) {
        width: 90px;
    }
}

.thead {
    .tr {
        display: flex;
        align-items: center;
        height: 30px;
    }

    .th {
        text-align: center;
        font-size: 14px;
        color: #666;
    }
}

.tbody {

    .tr {
        display: flex;
        align-items: center;
        background: #D3DCE6;

        &:nth-child(odd) {
            background: #E9EEF3;
        }
    }

    .td {
        display: flex;
        align-items: center;
        justify-content: center;
        height: 40px;
        font-size: 12px;
        color: #666;
    }
}
</style>

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

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

相关文章

Windows主机、虚拟机Ubuntu、开发板,三者之间文件互传

以下内容源于日常学习的整理&#xff0c;欢迎交流。 下图是Windows主机、虚拟机Ubuntu、开发者三者之间文件互传的方式示意图&#xff1a; 注意&#xff0c;下面谈及的所有方式&#xff0c;都要求两者的IP地址处于同一网段&#xff0c;涉及到的软件资源见felm。 一、Windows主…

Windows Docker 报错: has no HTTPS proxy,换源

pull python 3.7报错&#xff1a; 尝试拉取Docker 测试库hello world也失败 尝试使用临时镜像源&#xff0c;可以成功拉取&#xff1a; sudo docker pull docker.m.daocloud.io/hello-world说明确实是网络问题&#xff0c;需要配置镜像源&#xff0c;为了方便&#xff0c;在d…

Java:Arrays类:操作数组的工具类

文章目录 Arrays类常见方法SetAll(); 代码排序如果数组中存储的是自定义对象 Arrays类 常见方法 SetAll(); 注意&#xff1a; 不能用新的数组接是因为修改的是原数组&#xff0c;所以完了要输出原数组发现会产生变化参数是数组下标变成灰色是因为还能简化&#xff08;Lambda…

只是“更轻更薄”?不!遨游三防平板还选择“更强更韧”

当消费电子领域普遍追求“更轻更薄”的设计美学时&#xff0c;遨游三防平板不止于此&#xff0c;还选择了另一条道路——“更强更韧”。在智能制造的复杂场景中&#xff0c;三防平板需直面高温、油污、撞击与极端气候的考验。普通消费级平板因防护性能不足&#xff0c;常因环境…

基于RAGFlow本地部署DeepSeek-R1大模型与知识库:从配置到应用的全流程解析

作者&#xff1a;后端小肥肠 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; DeepSpeek服务器繁忙&#xff1f;这几种替代方案帮你流畅使用&#xff01;&#xff08;附本地部署教程&#xff09;-CSDN博客 10分钟上手…

[蓝桥杯 2023 省 B] 飞机降落(不会dfs的看过来)

[蓝桥杯 2023 省 B] 飞机降落 题目描述 N N N 架飞机准备降落到某个只有一条跑道的机场。其中第 i i i 架飞机在 T i T_{i} Ti​ 时刻到达机场上空&#xff0c;到达时它的剩余油料还可以继续盘旋 D i D_{i} Di​ 个单位时间&#xff0c;即它最早可以于 T i T_{i} Ti​ 时刻…

信创系统极速文件查找:locate 命令详解

原文链接&#xff1a;信创系统极速文件查找&#xff1a;locate 命令详解 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇信创终端操作系统上 locate 命令详解的文章。在 Linux 及信创终端操作系统&#xff08;如 统信 UOS、麒麟 KOS&#xff09;中&#xff0c;查找…

C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原)

C# | 超简单CSV表格读写操作&#xff08;轻松将数据保存到CSV&#xff0c;并支持读取还原&#xff09; 文章目录 C# | 超简单CSV表格读写操作&#xff08;轻松将数据保存到CSV&#xff0c;并支持读取还原&#xff09;一、上位机开发中的CSV应用背景二、CSV读写实战教学1. 基本对…

PostgreSQL:语言基础与数据库操作

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

蓝桥杯学习——二叉树+奇点杯题目解析

基础认知 一、二叉树种类&#xff1a; 1.满二叉树。记深度k&#xff0c;节点数量2^k-1。 2.完全二叉树&#xff1a;除了底层&#xff0c;其余全满&#xff0c;底部从左到右连续。 3&#xff0c;平衡二叉搜索树&#xff1a;左子树和右子树高度差不大于1。 二、存储方式&…

基于django+vue的购物商城系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 热卖商品 优惠资讯 个人中心 后台登录 管理员功能界面 用户管理 商品分类管理…

AI安全、大模型安全研究(DeepSeek)

DeepSeek 点燃AI应用革命之火,但安全 “灰犀牛” 正在逼近 DeepSeek-R1国产大模型的发布,以技术创新惊艳了全球,更是极致的性价比推动国内千行百业接入 AI,政府、企业竞速开发智能业务处理、智能客服、代码生成、营销文案等应用,“落地效率” 成为第一关键词。然而与此相…

卷积神经网络 - 汇聚层

卷积神经网络一般由卷积层、汇聚层和全连接层构成&#xff0c;本文我们来学习汇聚层。 汇聚层(Pooling Layer)也叫子采样层(Subsampling Layer)&#xff0c;其作用是进 行特征选择&#xff0c;降低特征数量&#xff0c;从而减少参数数量。 卷积层虽然可以显著减少网络中连接的…

论文分享:PL-ALF框架实现无人机低纹理环境自主飞行

在室内仓库、地下隧道等低纹理复杂场景中&#xff0c;无人机依赖视觉传感器进行自主飞行时&#xff0c;往往会遇到定位精度低、路径规划不稳定等难题。针对这一问题&#xff0c;重庆邮电大学计算机学院雷大江教授团队在IEEE Trans期刊上提出了一种新型自主飞行框架&#xff1a;…

Nodejs使用redis

框架&#xff1a;koa&#xff0c;通过koa-generator创建 redis: 本地搭建&#xff0c;使用默认帐号&#xff0c;安装说明地址以及默认启动设置&#xff1a;https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/ 中间件&#x…

GitHub 超火的开源终端工具——Warp

Warp 作为近年来 GitHub 上备受瞩目的开源终端工具&#xff0c;以其智能化、高性能和协作能力重新定义了命令行操作体验。以下从多个维度深入解析其核心特性、技术架构、用户评价及生态影响力&#xff1a; 一、背景与核心团队 Warp 由前 GitHub CTO Jason Warner 和 Google 前…

计算机视觉技术探索:美颜SDK如何利用深度学习优化美颜、滤镜功能?

时下&#xff0c;计算机视觉深度学习正在重塑美颜技术&#xff0c;通过智能人脸检测、AI滤镜、深度美肤、实时优化等方式&#xff0c;让美颜效果更加自然、精准、个性化。 那么&#xff0c;美颜SDK如何结合深度学习来优化美颜和滤镜功能&#xff1f;本文将深入解析AI在美颜技术…

应用商店上新:Couchbase Enterprise Server集群

可移植的冗余数据平台&#xff0c;这往往是创建可扩展的云原生应用程序的先决条件。而不依赖特定平台的工具可用于为多云、多区域工作负载提供企业级应用所需的灵活性。 ​Couchbase是一种高性能NoSQL数据库&#xff0c;专为当今复杂的云生态系统所需的动态扩展能力而设计。最近…

Redis解决缓存击穿问题——两种方法

目录 引言 解决办法 互斥锁&#xff08;强一致&#xff0c;性能差&#xff09; 逻辑过期&#xff08;高可用&#xff0c;性能优&#xff09; 设计逻辑过期时间 引言 缓存击穿&#xff1a;给某一个key设置了过期时间&#xff0c;当key过期的时候&#xff0c;恰好这个时间点对…

集成学习之随机森林

目录 一、集成学习的含义 二、集成学习的代表 三、集成学习的应用 1、分类问题集成。&#xff08;基学习器是分类模型&#xff09; 2、回归问题集成。&#xff08;基学习器是回归模型&#xff09; 3、特征选取集成。 四、Bagging之随机森林 1、随机森林是有多个决策树&a…