vue非插件实现列表无限循环滚动

这篇具有很好参考价值的文章主要介绍了vue非插件实现列表无限循环滚动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

最近刚好有个功能需要实现列表的无限循环滚动,在网上找到vue-seamless-scroll组件,使用起来很方便,也实现我需要的功能。我去查看了插件源码,实现原理还是比较有趣的,所以就参考了一下,自己手动实现个例子(有鼠标移入停止滚动,移出开始滚动功能)。

二、实现效果

vue 循环滚动,vue,vue.js,前端,javascript

三、功能分析

将一个 div 所有列表项包裹起来。用定时器控制 transform 来实现 div 自身的位移,代码中我是通过scrollTop参数开控制 y 方向的滚动,以此实现滚动的效果。关键在于将包裹列表的父元素设置 overflow: hidden; 属性。

<div class="scroll_list" :style="{ transform: `translate(0px,-${scrollTop}px)` }">
               <div ref="scrollItemBox">
                    <div class="scroll_item" v-for="(item, index) in listData" :key="index">
                        {{item.title}}
                    </div>
                </div>
            <div v-html="copyHtml"></div>
   </div>

动态控制 div 盒子的移动还是比较简单的,关键是无缝循环开始滚动,原理就是在所有列表项滚动完成后,将 div 的自身位移设置为0,也就是transform: translate(0px,0px),此时的移动是一瞬间的,所以肉眼是看不出来的。我的代码逻辑就是先获取所有列表项的高度,判断scrollTop是否大于等于列表的高度,如果大于等于,就将 scrollTop 设置为0。

      this.scrollTop++
            // 获取需要滚动的盒子的高度
            let scrollItemBox = this.$refs.scrollItemBox.offsetHeight
            // 当判断滚动的高度大于等于盒子高度时,从头开始滚动
            if (this.scrollTop >= scrollItemBox) {
                this.scrollTop = 0
            }

由于列表一直滚动到最后,会出现短暂的区域空白,然后再从头开始滚动。解决这种问题也很简单,那就是在列表后面放一个一模一样的列表。如下实现。

//在页面中
 <div v-html="copyHtml"></div>
//获取列表的html并设置
 this.copyHtml = this.$refs.scrollItemBox.innerHTML

鼠标移入停止,移出开始滚动就比较简单了,控制定时器就可以了。文章来源地址https://www.toymoban.com/news/detail-607468.html

        // 鼠标移入停止滚动
        mEnter() {
            clearInterval(timer);
        },
        // 鼠标移出继续滚动
        mLeave() {
            this.startScroll()
        },
        // 开始滚动
        startScroll() {
            timer = setInterval(this.scroll, this.speed);
        },

四、代码实现

<template>
    <div class="InfiniteScroll">
        <div class="scroll_parent_box" @mouseenter="mEnter" @mouseleave="mLeave">
            <div class="scroll_list" :style="{ transform: `translate(0px,-${scrollTop}px)` }">
                <div ref="scrollItemBox">
                    <div class="scroll_item" v-for="(item, index) in listData" :key="index">
                        {{item.title}}
                    </div>
                </div>
                <div v-html="copyHtml"></div>
            </div>
        </div>
    </div>
</template>

<script>
let timer = null;
export default {
    name: "InfiniteScroll",
    data() {
        return {
            scrollTop: 0, //列表滚动高度
            speed: 15, //滚动的速度

            listData: [{
                'title': '无缝滚动第一行',
            }, {
                'title': '无缝滚动第二行',
            }, {
                'title': '无缝滚动第三行',
            }, {
                'title': '无缝滚动第四行',
            }, {
                'title': '无缝滚动第五行',
            }, {
                'title': '无缝滚动第六行',
            }, {
                'title': '无缝滚动第七行',
            }, {
                'title': '无缝滚动第八行',
            }, {
                'title': '无缝滚动第九行',
            },{
                'title': '无缝滚动第十行',
            },{
                'title': '无缝滚动第十一行',
            }], //表示有多少个列表项
            copyHtml: '', //复制多一份防止滚动到后面出现空白
        };
    },
    mounted() {
        // 如果列表数据是异步获取的,记得初始化在获取数据后再调用
        this.initScroll()
    },
    methods: {
        initScroll() {
            this.$nextTick(() => {
                this.copyHtml = this.$refs.scrollItemBox.innerHTML
                this.startScroll()
            })
        },
        // 鼠标移入停止滚动
        mEnter() {
            clearInterval(timer);
        },
        // 鼠标移出继续滚动
        mLeave() {
            this.startScroll()
        },
        // 开始滚动
        startScroll() {
            timer = setInterval(this.scroll, this.speed);
        },
        // 滚动处理方法
        scroll() {
            this.scrollTop++
            // 获取需要滚动的盒子的高度
            let scrollItemBox = this.$refs.scrollItemBox.offsetHeight
            // 当判断滚动的高度大于等于盒子高度时,从头开始滚动
            if (this.scrollTop >= scrollItemBox) {
                this.scrollTop = 0
            }
        }

    },
};
</script>

<style scoped>
.InfiniteScroll {
    box-sizing: border-box;
    padding: 50px;
}

.scroll_parent_box {
    width: 300px;
    height: 400px;
    border: 1px solid #ebeef5;
    overflow: hidden;
    box-sizing: border-box;
    padding: 0 10px;
}

.scroll_list {
    transition: all 0ms ease-in 0s
}

.scroll_item {
    height: 40px;
    line-height: 40px;
    text-align: center;
    font-size: 14px;
}
</style>

到了这里,关于vue非插件实现列表无限循环滚动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用CSS实现一个无限循环滚动的图片轮播效果?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月11日
    浏览(43)
  • 博客无限滚动加载(html、css、js)实现

    这是一个简单实现了类似博客瀑布流加载功能的页面,使用html、css、js实现。简单易懂,值得学习借鉴。👍 演示地址:https://i_dog.gitee.io/easy-web-projects/infinite_scroll_blog/index.html index.html style.css script.js 该项目从github中的vanillawebprojects仓库收集。 原始代码: 原始代码地址 https

    2024年02月07日
    浏览(39)
  • Vue组件滚动加载、懒加载功能的实现,无限滚动加载组件实例演示

    效果图如下: 可以看到随着不断的滚动,页面组件的数量不断的加载。 其实加载的是后端返回的数据,因为涉及隐私,没有给显示出来。 利用懒加载,可以防止大量渲染造成卡顿降低用户体验。 页面的动态加载这块可以看上一篇文章: Vue 动态添加和删除组件的实现,子组

    2024年02月01日
    浏览(60)
  • vue最强table vxe-table 虚拟滚动列表 前端导出

    最近遇到个问题。后台一次性返回2万条列表数据。 并且需求要求所有数据必须全部展示,不能做假分页(不能优化了)。 这些数据的直接来源就是CS客户端。 他们做CS客户端就是一次性加载几万条数据不分页(说这是客户的要求)。 我体验了一把CS客户端,数万条数据放在

    2024年02月12日
    浏览(38)
  • Unity - 无限循环列表

    效果和UI结构 效果 Tips:免费的视频转GIF网站 UI结构 父节点为一个Panel Panel的Vertical Layout Group方便快捷调整Panel下的Image子物体的位置,使用时取消组件 Image是列表的子物体,只有一个Text子物体。 Scroll New代码 实现思路 动态更改所有子节点的y轴位置实现上下移动 改变超过位置

    2024年02月12日
    浏览(40)
  • 〖大前端 - 基础入门三大核心之JS篇⑰〗- JavaScript的流程控制语句「while循环语句」

    当前子专栏 基础入门三大核心篇 是免费开放阶段 。 推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 大前端全栈架构白宝书专栏, 目前阶段免费开放 , 购买任意白宝书体系化专栏可加入 TFS-CLUB 私域社区。 福利:除了通过订阅\\\"白宝书系列专

    2024年02月04日
    浏览(90)
  • vue3+element-plus 通过v-infinite实现下拉滚动无限加载

    v-infinite官网 v-infinite-scroll无限滚动组件使用详解  官网给到的基础案例: 自己写了一个简单的demo: 当使用v-infinite时,控制台会报错:  原因: 官方上的Issues解释是需要nextTick()之后再去显示 解决方法是组件挂载完成再去显示el-select组件 所以在上面demo中select组件加了v-if,

    2024年02月09日
    浏览(51)
  • 〖大前端 - 基础入门三大核心之JS篇⑯〗- JavaScript的流程控制语句「for循环语句及算法题」

    当前子专栏 基础入门三大核心篇 是免费开放阶段 。 推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 大前端全栈架构白宝书专栏, 目前阶段免费开放 , 购买任意白宝书体系化专栏可加入 TFS-CLUB 私域社区。 福利:除了通过订阅\\\"白宝书系列专

    2024年02月07日
    浏览(50)
  • web前端【3】JS基础-轮播图【JavaScript、定时器、鼠标动作、自动轮播、增加和减少li列表】

    一、实验题目: 轮播图 二、实验内容简介 1.整体布局:图片、左右按钮、数字列表、添加删除按钮 2、左右箭头滚动 3、小圆点滚动 4、自动轮播 5、鼠标动作:指向和离开 6、添加与删除 三、实验过程 1. 需求分析 整体布局:设计一个轮播图,中间部分为自动轮播的图片展示

    2024年02月04日
    浏览(53)
  • vue实现音频audio列表循环,实现暂停播放切换

    功能界面如下 功能使用如下: 首先根据后端返回的音频地址进行渲染,其中playAudioSrc字段用来控制暂停样式还是播放样式,audio进行隐藏 vue处理逻辑如下

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包