jQuery实现无缝轮播

1 思路

1.1 思路

模仿多人跳绳,一个跳进去,再跳出来,第二个人跳进去,第一个人马上回来排队,除此类推。运用到轮播的方式:分为三种状态,展示状态currentImg、离开状态leavingImg、排队状态enterImg,图片状态顺序切换,形成循环。

1.2 效果图

no-cap-slide.gif

2. html和css布局

<!doctype html>
<html lang="zh-Hans">
<head>
    <meta charset="UTF-8">
    <title>无缝的轮播</title>
    <style>
        * {margin: 0;padding: 0;}
        * {box-sizing: border-box;}
        .window {width: 400px;height: 300px;margin: 20px auto;overflow: hidden;}
        .images {position: relative;}
        .images > img {width: 100%;position: absolute;top: 0;transition: all 1500ms;}  /*注意img为absolute*/ 
        .images > img.current {left: 0;transform: translateX(0);z-index: 1;} /*设置z-index达到视觉效果*/ 
        .images > img.leave {transform: translateX(-100%);z-index: 1;}
        .images > img.enter {transform: translateX(100%);}
    </style>
</head>
<body>
<div class="window">
    <div class="images">
        <img src="./images/1.png" alt="图片" width="400" height="300" >
        <img src="./images/2.png" alt="图片" width="400" height="300">
        <img src="./images/3.png" alt="图片" width="400" height="300">
        <img src="./images/4.png" alt="图片" width="400" height="300">
        <img src="./images/5.png" alt="图片" width="400" height="300">
    </div>
</div>
<script src="jquery-3.3.1.min.js"></script>
</body>
</html>

3. js代码

3.1 原始代码

$('.images > img:nth-child(1)').addClass('current')  // 初始化,第一张图片添加current类
$('.images > img:nth-child(2)').addClass('enter')    // 后面图片添加enter类
$('.images > img:nth-child(3)').addClass('enter')
$('.images > img:nth-child(4)').addClass('enter')
$('.images > img:nth-child(5)').addClass('enter')

let n = 1
setInterval(()=>{
    let currentImg = $(`.images > img:nth-child(${x(n)})`)     // 获得正在显示的img元素
    let nextImg = $(`.images > img:nth-child(${x(n + 1)}`)     // 获得准备进入的img元素

    currentImg.removeClass('current').addClass('leave')        // 3s后,显示图片离开
    .one('transitionend', (e)=>{                               // 过渡动画结束时,此时图片类为leave,改变图片的类为enter
        $(e.currentTarget).removeClass('leave').addClass('enter')
})
    nextImg.removeClass('enter').addClass('current')           // 下一张图片进入
n++
},3000)

// 以下为封装函数
function x(n) {   // 保证n在1-5循环
    if (n > 5) {
        n = n % 5
        if (n === 0) {  // 3的倍数设置为3,对应第3张图
            n = 5
        }
    }
    return n
}

3.2 优化后

let n

init()                                // 初始化,第一张图片current显示,其余图片enter排队
setInterval(()=>{
    makeLeave( getImage(n))           // 通过改变类,让current图片离开,变为leave状态
    .one('transitionend', (e)=>{      // 达到leave状态那一刻,马上向enter状态过渡
    makeEnter($(e.currentTarget))
})
    makeCurrent(getImage(n+1))        // 让下一张图片显示
n++
},3000)

function init() {
    n = 1
    $(`.images > img:nth-child(${x(n)})`).addClass('current')
        .siblings().addClass('enter')
}
function x(n) {
    if (n > 5) {
        n = n % 5
        if (n === 0) {  // 3的倍数设置为3,对应第3张图
            n = 5
        }
    }
    return n
}
function getImage(n) {
    return  $(`.images > img:nth-child(${x(n)})`)
}
function makeCurrent($node){
    return $node.removeClass('enter leave').addClass('current')
}
function makeLeave($node){
    return $node.removeClass('enter current').addClass('leave')
}
function makeEnter($node){
    return $node.removeClass('leave current').addClass('enter')
}

4. 总结

4.1 思路

css负责提供所有的状态,js负责切换状态。

4.2 jQuery相关api

  • $()
  • removeClass()
  • addClass()
  • siblings()
  • one(‘transitionend’,fn)

5 参考衔接

饥人谷jQuery相关课程https://xiedaimala.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值