无缝轮播的实现与封装

轮播图在网页搭建中经常遇到, 与轮播有关的卡片滑块也常见,  所以有必要理解其中的原理

轮播图HTML中应包含几个部分?

  1. 视觉窗口,即可见区域
  2. 包含所有图片的容器
  3. 具体的每一张轮播图片
  4. 锚点列表, 点击可跳到具体某一页
  5. 左右切换按钮

让每一个轮播页大小刚好等于视图窗口大小

  1. 设置视图窗口宽度,  让超过的部分隐藏
  2. 设置包含所有图片的容器的宽度为 10000%, 目的是为了让容器足够大.  因为如果容器不够大的话容器中每一张图片就算设定了固定宽度也还是会受到挤压导致一定程度的变形.
    这里设置的宽度10000%为相对与父div(视图窗口)的100倍, 即100% * 100;  所以这个轮播图最多可装下100个轮播页面
  3. 设置每一个轮播页面的宽度为父div (容器) 1%, 刚好等于爷爷div (视图窗口) 的大小, 即 100% =  100% * 100 * 1% .  这时视图窗口div中就刚好可见一个轮播页.

每一次滚动图片JS需要做什么?

  1. 改变索引, 添加class使对应锚点设为选中状态
  2. 计算这次滚动到终点时包含所有图片的容器需要相对与视图窗口左移的位置
  3. 清空定时器(防止开启多个重名定时器导致图片滚动速度收到影响)
  4. 开启定时器(刷新速度一般为10~20ms), 每一次将图片移动一定的距离,  直达到达这次移动重点时清空定时器

如何让轮播图自动滚动?

设置一个定时器(刷新速度没几秒一次), 每次调用一次轮播的移动函数

如何实现无缝轮播(最后一张转到第一张时的衔接)

  1. 在最后一张轮播图后复制一份第一张轮播图, 放到最后, 让第一页和最后一页完全相同
  2. 最后一张轮播图移动到终点时将包含所有图片的容器的左偏移量设为0, 即最后一张滚动到终点时瞬间将第一张轮播图放置于视图窗口中, 看起来就无缝了

让滚动速度为匀减速运动

因为匀速运动的轮播不是很好看, 所以可以通过JS控制移动速度

在定时器中每一次移动距离可以设置为  移动距离 = (终点 - 当前位置) / 15   

这个15是随便写的, 终点 -当前位置在除以一个大于一的数, 这个数每次计算时都会变小, 所以成功做到了变速运动.

HTML

<!--视图窗口 -->
<div id="container">
    <!-- 包含所有图片的容器 -->
    <div id="inner" class="clear">
        <img style="background:red;" src="#1#" alt="">
        <img style="background:orange;" src="#2#" alt="">
   
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值