【vue2】实现自动轮播+滚轮控制

前言
有一个无缝轮播+滚轮控制的需求,找了很多的方法发现都没办法完美的实现这种效果。
用原生的js实现不是无缝滚动
用无缝滚动插件实现,发现pc端无法实现滚轮控制

目标

1 实现表格表无缝循环滚动
2 实现滚轮控制表格表数据滚动
3 掌握vue-seamless-scroll使用方式

一些思考
如何去完美的实现无缝轮播+滚轮控制效果呢?,查询了很多资料都没有很完美的兼容两者优点的解决方法。推荐最多的方式就是以下两个:
写JS实现,但实现的思路无外乎用定时+scrollTop去实现(若有其他的方案,欢迎留言),这种scrollTop方式必然导致闪动,不是无缝的。
第三方组件vue-seamless-scroll可以完美的实现无缝自动滚动,但是pc端却也无法通过滚轮去控制滚动。

vue-seamless-scroll无缝滚动的很完美,我就在想能不能试着改动或者操作vue-seamless-scroll组件去实现滚轮控制呢。于是开始了以下的尝试

前期工作

1 安装

npm install vue-seamless-scroll --save

2 引入并注册

import VueSeamlessScroll from "vue-seamless-scroll";
export default {
   
  name: "SeamleScroll",
  components: {
   
    VueSeamlessScroll,
  },
}

3 使用组件

<vue-seamless-scroll ref="seamleScroll" class="seamlessScroll" :data="tableData" :class-option="scrollOptions">
// 要滚动的内容
</vue-seamless-scroll>

在开始之前,先看一下这个第三方组件有哪些参数或者属性

官方源代码:vue-seamless-scroll
vue-seamless-scroll文档
configure

key 描述 默认值 类型
step 滚动速度 1 Number
limitMoveNum 开始无缝滚动的最小数据量 5 Number
hoverStop 是否开启鼠标悬停stop true Boolean
direction 方向:0向下 1向上 2向左 3向右 1 Number
openTouch 是否开启移动端触屏 true Boolean
waitTime 单步运动停止的时间(默认值1000ms) 1000 Boolean

基本属性配置

  data() {
   
    return {
   
      scrollOptions:{
   
        step: 1,
        limitMoveNum: 2, // 开始无缝滚动的最小数据量
        hoverStop: true, // 是否开启鼠标悬停stop
        openTouch: true, 
        direction: 1, // 0向下 1向上 2向左 3向右
        openWatch: true, // 开启数据实时监控刷新dom
        singleHeight: 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动) direction => 0/1
        singleWidth: 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
        waitTime: 1000, // 单步运动停止的时间(默认值1000ms)
      }
    };
  },

将基本配置scrollOptions传递给第三方组件vue-seamless-scroll


                
Vue 2 中实现无缝轮播可以通过以下步骤进行: 1. 创建一个 Vue 组件,命名为`Carousel`。 2. 在`Carousel`组件中,定义一个数组来存储需要轮播的图片列表。 3. 在`mounted`生命周期钩子函数中,初始化轮播的一些参数,例如当前显示的图片索引、定时器等。 4. 在模板中,使用`v-for`指令循环渲染图片列表,并设置每个图片项的样式,使其水平排列。 5. 使用`transform: translateX()`样式属性,对轮播项进行水平移动,实现轮播效果。可以通过计算当前索引和图片宽度来设置移动的距离。 6. 添加一个定时器,在一定时间间隔内更新当前显示的图片索引,实现自动轮播效果。 7. 监听鼠标滑入和滑出事件,在鼠标滑入时清除定时器,在鼠标滑出时重新启动定时器,实现鼠标悬停时暂停轮播的效果。 以下是一个简单示例代码: ```html <template> <div class="carousel"> <div class="carousel-wrapper" :style="{ transform: `translateX(${translateX}px)` }"> <div v-for="(item, index) in images" :key="index" class="carousel-item"> <img :src="item" alt="carousel item" /> </div> </div> </div> </template> <script> export default { data() { return { images: [ 'image1.jpg', 'image2.jpg', 'image3.jpg', 'image4.jpg', ], currentIndex: 0, translateX: 0, intervalId: null, }; }, mounted() { this.startCarousel(); }, beforeDestroy() { clearInterval(this.intervalId); }, methods: { startCarousel() { this.intervalId = setInterval(() => { this.nextSlide(); }, 3000); }, nextSlide() { if (this.currentIndex === this.images.length - 1) { this.currentIndex = 0; this.translateX = 0; } else { this.currentIndex++; this.translateX -= this.$refs.carouselItem.offsetWidth; } }, }, }; </script> <style> .carousel { width: 100%; overflow: hidden; } .carousel-wrapper { display: flex; transition: transform 0.5s; } .carousel-item { flex-shrink: 0; } </style> ``` 以上代码是一个简单的示例,实现了简单的无缝轮播效果。你可以根据需求进行进一步的样式和功能定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的小学究

愿你有所收获

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值