【HTML+CSS+jQuery】实现轮播图详细代码及详解(带左右切换和分页)

1 篇文章 0 订阅
1 篇文章 0 订阅

效果

 代码实现

var init_time = 0
    // 获取图片区域
var img_box = document.querySelector(".img_box")
    // 获取轮播容器
var silder_box = document.querySelector(".silder_box")

// 获取图片的容器
var li_list = document.querySelectorAll(".silder_box .img_box li")

img_box.style.left = "-100%"
    // 初始化辅助无缝轮播图片
var last_li = img_box.firstChild.nextSibling.cloneNode(true)
var first_li = img_box.lastChild.previousSibling.cloneNode(true)
img_box.insertBefore(first_li, img_box.firstChild)
img_box.appendChild(last_li)
    //轮播核心代码
function change(offset) {
    var newoffset = parseInt(img_box.style.left) + offset
    var step = 10
    var speed = offset / step

    var animate = function() {
            img_box.style.left = parseInt(img_box.style.left) + speed + "%"

            if (speed < 0 && parseInt(img_box.style.left) > newoffset || speed > 0 && parseInt(img_box.style.left) < newoffset) {
                setTimeout(animate, 100)
            } else {

                if (newoffset <= -400) {
                    img_box.style.left = "-100%"
                } else if (newoffset >= 0) {
                    img_box.style.left = "-300%"
                }
            }

        }
    animate()
}

//创建左右切换容器
var ul = document.createElement("ul")

ul.className = "btns"
    //创建左右切换按钮
var left_li = document.createElement("li")
var right_li = document.createElement("li")
left_li.innerHTML = "<"
right_li.innerHTML = ">"

ul.appendChild(left_li)
ul.appendChild(right_li)
silder_box.appendChild(ul)

//创建图片对应按钮的容器
var dotts = document.createElement("ul")
dotts.className = "dotts"
    //批量生成图片对应的按钮
for (var i = 0; i < li_list.length; i++) {
    var li = document.createElement("li")
    li.innerHTML = i + 1
    li.setAttribute("index", i)
    if (i == 0) {
        li.className = "current"
    }
    dotts.appendChild(li)
}

//给轮播区域添加按钮容器
silder_box.appendChild(dotts)


//获取所有图片对应的按钮
var dotts_li = document.querySelectorAll(".dotts li")
    //定义游标记录当前图片对应按钮的索引值
var index = 0
    //定义高亮函数
function highlight() {
    for (var k = 0; k < dotts_li.length; k++) {
        dotts_li[k].className = ""
    }
    dotts_li[index].className = "current"
}

//给图片对应的按钮绑定点击事件
for (var h = 0; h < dotts_li.length; h++) {
    dotts_li[h].onclick = function() {
        var target_index = this.getAttribute("index")
        change((index - target_index) * 100)
        index = target_index
        highlight()
    }
}

//给左右按钮绑定点击事件
left_li.onclick = function() {
    if (init_time == 0) {
        index--
        if (index < 0) {
            index = 2
        }
        highlight()
        change(100)

        //辅助代码
        init_time = 1
        var timing = setInterval(function() {
            init_time--
            if (init_time == 0) {
                clearInterval(timing)
            }

        }, 1000)


    }

}
right_li.onclick = function() {
    if (init_time == 0) {
        index++
        if (index > 2) {
            index = 0
        }
        highlight()
        change(-100)
            //辅助代码
        init_time = 1
        var timing = setInterval(function() {
            init_time--
            if (init_time == 0) {
                clearInterval(timing)
            }

        }, 1000)
    }
}

//定时器开启
var timer = setInterval(right_li.onclick, 3000)

//放到轮播容器上,停止自动轮播
silder_box.onmouseenter = function() {
        clearInterval(timer)
    }
    //离开轮播容器上,开始自动轮播
silder_box.onmouseleave = function() {
    timer = setInterval(right_li.onclick, 3000)
}

代码解释:

  1. 在HTML中,使用了一个 .silder_box 容器来包裹轮播图片,使用 .img_box 容器来放置图片,以及两个按钮 .btns 和圆点导航 .dotts 来实现左右切换和图片对应的圆点导航。

  2. JavaScript代码中,定义了 change(offset) 函数来实现图片区域的滑动效果。在函数内部使用了 animate 函数来处理图片的动画滑动,实现了无缝轮播的效果。

  3. 在图片初始化时,使用了 insertBefore()appendChild() 方法,在图片列表的首尾分别插入了复制的图片,实现无缝轮播的效果。

  4. 创建了图片对应的圆点导航按钮,并为每个按钮绑定了点击事件,点击按钮时通过 change(offset) 函数来切换图片,并高亮显示对应的按钮。

  5. 创建了左右切换按钮,并为其绑定了点击事件,通过点击按钮来切换图片。

  6. 使用定时器 setInterval() 实现自动轮播功能,每隔3000毫秒(3秒)切换到下一张图片。

  7. 通过 onmouseenteronmouseleave 事件来在鼠标悬停在轮播容器上时停止自动轮播,离开时重新开始自动轮播。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

去码头整点薯条​⁢⁢⁢⁡

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值