原生JS实现无缝轮播

什么叫无缝轮播

无缝轮播是网页中比较常见的一种轮播方式,很多网站首页都应用了无缝轮播,这种效果使页面看起来更顺滑。

先来看一下我实现的效果图:
在这里插入图片描述

无缝轮播的实现

下面用示意图清楚的展现了无缝轮播的原理:
在这里插入图片描述
一共有3张图片轮播,但是为什么有5张图片呢?这是因为要想实现无缝轮播的效果,就要用“障眼法”。

每当图片滚动到最后一张或者第一张时,都会自动回到第一张或最后一张,加入这两张图片有一个过渡的效果。

原理分析

好了,在介绍了无缝轮播之后,小伙伴们是不是跃跃欲试了呢,别着急,在正式写代码之前让我们先把逻辑理清楚。

假设当前正在播放的图片是1,令currentIndex = 1,当前left = 实际运动过程中距离左边的长度,目标left = 要切换的图片距离左边的长度,且这两个均为负数。

在这里插入图片描述

如果当前图片移动方向是向左,当目标left < 当前left时,假设是从0移动到2:

//目标left,index是要切换的图片的索引,imgWidth是图片宽度
var newLeft = index * imgWidth;
//计算需要移动的总距离
var distance = newLeft - marginLeft;

目标left > 当前left时,假设是从2移动到0:

//3张图片总宽
var totalWidth = 3 * igmWidth;
distance = -(totalWidth - Math.abs(newLeft - marginLeft));

接下来分析图片向右移动的情况
在这里插入图片描述
目标left > 当前left时,这时候移动的就是正数了

distance = newLeft - marginLeft;

目标left < 当前left

distance = totalWidth - Math.abs(newLeft - marginLeft);

设置动画效果

好的,既然逻辑清楚了,接下来就是愉快的写代码环节。

/**
 * 切换到某一个图片的索引
 * @param {*} index 要切换到目标的图片的索引
 * @param {*} direction 图片移动的方向 "left" "right"
 */
function switchTo(index, direction) {
   
    if (index == config.currentIndex) {
   
        return;
    }
    if (!direction) {
   
        direction = "left";
    }
    //最终的marginLeft
    var newLeft = (-index - 1) * config.imgWidth;
    animateSwitch();
    //重新设置当前索引
    config.currentIndex = index;
    //设置小圆点的选中状态
    setDotsActiveStatus();

    /**
     * 逐步改变marginLeft
     */
    function animateSwitch() {
   
        //先停止之前的动画
        stopAnimate();
        //1、计算运动的次数
        var number = Math.ceil(config.timer.total / config.timer.duration);
        //当前的运动次数
        var currentNum = 0;

        //2、计算需要移动总距离
        var distance;
        //获取当前的left值
        var marginLeft = parseFloat(getComputedStyle(config.doms.divImgs).marginLeft);
        var totalWidth = config.imgsNum * config.imgWidth;
        if (direction == "left") {
   
            if (newLeft < marginLeft) {
   
                distance = newLeft - marginLeft;
            } else {
   
                distance = -(totalWidth - Math.abs(newLeft - marginLeft));
            }
        } else {
   
            if (newLeft > marginLeft) {
   
                distance = newLeft -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值