原生JavaScript实现自适应轮播图插件

作者:闭包旅人时间:2026-10-24 16:38:42浏览:577

本文详细介绍如何使用原生JavaScript制作一个轻量级的自适应轮播图插件。通过简单的HTML结构配置和JS函数调用,传入DOM元素及包含图片链接与跳转地址的对象数组,即可实现自动切换、角标显示及手动点击功能。代码包含完整的初始化逻辑与定时器控制,无需依赖第三方库,适合前端开发者快速集成到项目中。

原生JavaScript实现自适应轮播图插件

本文分享了一个使用原生JavaScript编写的轮播图插件的具体实现代码,供读者参考学习。

原生JavaScript实现自适应轮播图插件

在实际调用时,只需在HTML中创建一个DIV容器即可使用。

原生JavaScript实现自适应轮播图插件

以下是调用该插件时所需的JavaScript配置部分说明。

第一个参数用于指定轮播图显示的目标区域(即指定的DIV元素)。

第二个参数是一个数组,其中每个元素代表一张图片及其对应的点击跳转链接。

接下来直接展示相关代码实现。

HTML结构配置

HTML结构部分


<div id="banner"></div>

在HTML文档的<script>标签内配置轮播图参数。该函数接收两个参数:第一个是显示轮播图的DIV元素,第二个是配置数组。数组中的每个对象包含两个属性:imgUrl用于指定图片地址,link用于指定点击图片后的跳转链接。

数组中的每个元素对应一张图片,数量不限,插件会自动适应图片数量进行布局。


<script>
        bannerArea(document.getElementById("banner"),[
            {imgUrl:"图片",
            link:"跳转链接"
        },
            {imgUrl:"图片",
            link:"跳转链接"
        },
            {imgUrl:"图片",
            link:"跳转链接"
        }
        ])
</script> 

JavaScript插件核心代码

以下是JavaScript插件的核心代码部分。


// 两个参数,第一个轮播图区域,第二个是配置
function bannerArea(areaDom, options) {
    var imgArea = document.createElement("div");
    var numberArea = document.createElement("div");
    var curIndex = 0;//第几张轮播图
    var changeTimer = null;
    var changeDuration = 1000;//间隔
    var timer = null;
    
    initImg();//创建一个区域来显示图片
    
    initNumber();//创建区域显示角标
    
    setStatus();//设置状态
    
    autoChange();//自动切换
 
    //下面是局部函数
 
    //创建图片,并且设置样式
    function initImg() {
        imgArea.style.width = "100%";
        imgArea.style.height = "100%";
        imgArea.style.display = "flex";
        imgArea.style.overflow = "hidden";
        for (let i = 0; i < options.length; i++) {
            var obj = options[i];
            var img = document.createElement("img");
            img.src = obj.imgUrl;
            img.style.width = "100%";
            img.style.height = "100%";
            img.style.margin = "0";
            img.addEventListener("click", function () {
                location.href = options[i].link;
            })
            imgArea.appendChild(img);
        }
        imgArea.addEventListener("mouseenter", function () {
            clearInterval(changeTimer);
            changeTimer = null;
        })
        imgArea.addEventListener("mouseleave", function () {
            autoChange();
        })
        areaDom.appendChild(imgArea);
    }
    //创建角标元素和设置样式
    function initNumber() {
        numberArea.style.textAlign = "center";
        numberArea.style.marginTop = "-25px";
        for (let i = 0; i < options.length; i++) {
            var sp = document.createElement("span");
            sp.style.width = "12px";
            sp.style.height = "12px";
            sp.style.background = "lightgray";
            sp.style.display = "inline-block";
            sp.style.margin = "0 7px";
            sp.style.borderRadius = "50%";
            sp.style.cursor = "pointer";
            sp.addEventListener("click", function () {
                curIndex = i;
                setStatus();
            })
            numberArea.appendChild(sp);
        }
        areaDom.appendChild(numberArea);
    }
 
    //设置角标区域状态
    function setStatus() {
        //设置圆圈的背景颜色
        for (var i = 0; i < options.length; i++) {
            if (i === curIndex) {
                //设置背景颜色为选择
                numberArea.children[i].style.background = "rgb(222 57 57)";
            } else {
                //非选择
                numberArea.children[i].style.background = "lightgray";;
            }
 
        }
        //显示图片
        var start = parseInt(imgArea.children[0].style.marginLeft);
        var end = curIndex * -100;
        var dis = end - start;
        var duration = 500;
        var speed = dis / duration;
        if (timer) {
            clearInterval(timer);
        }
        timer = setInterval(function () {
            start += speed * 20;
            imgArea.children[0].style.marginLeft = start + "%";
            if (Math.abs(end - start) < 1) {
                imgArea.children[0].style.marginLeft = end + "%";
                clearInterval(timer);
            }
        }, 20)
    }
    //自动切换
    function autoChange() {
        if (changeTimer) {
            return;
        }
        changeTimer = setInterval(function () {
            if (curIndex === options.length - 1) {
                curIndex = 0;
            } else {
                curIndex++;
            }
            setStatus();
        }, changeDuration)
    }
 
}

轮播图的切换速度(即图片间隔时间)可以在插件代码中通过修改变量 changeDuration = 1000; 的值来调整,单位为毫秒。

以上就是原生JS轮播图插件的完整实现内容,希望能为读者的学习提供有益帮助,欢迎继续支持本站获取更多技术资源。

作者最新文章