原生 JS 实现一个简单轮播图

这篇具有很好参考价值的文章主要介绍了原生 JS 实现一个简单轮播图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在动手实现轮播图之前,我们先来明确一下要实现的效果。

  1. 默认自动轮播,每隔4秒切换一张图片
  2. 鼠标点击任一个小圆点即可切换到对应的图片
  3. 鼠标移入轮播区域时,两侧出现切换图片的按钮,点击按钮分别切换到上(下)一张图片

因此,轮播图可以分为三个主要部分,首先是我们的主体区域,用来展示图片;其次是图片导航区域,也就是上面说的小圆点;最后是两侧按钮,用于切换上一张、下一张图片。那么现在有几个问题需要考虑。

  1. 如何切换图片?也就是说如何在同一个区域显示不同的图片?
  2. 如何实现点击小圆点切换到对应的图片?如何实现点击左右两侧按钮切换前一张或后一张图片?

如何在同一区域显示不同图片?可以采用以下几种方法,亲测可用

  1. 图片区域放置一个 img 元素用于展示图片,改变 src 属性值切换图片
  2. 图片区域将所有需要展现的图片用相应数量的 img 元素展示,设置 css 样式隐藏 img 元素,opacity: 0 或 z-index: 0 均可。将需要展示的 img 样式改为 opacity: 1 或 z-index: 10 即可

如何实现点击小圆点切换对应图片呢?其实很简单,找到小圆点与图片的对应关系。因为图片和小圆点都可以视作数组,所以我的做法是将小圆点的索引位置跟图片的索引位置一一对应,比如第一个小圆点对应第一张图片,第二个小圆点对应第二张图片……以此类推,小圆点与图片之间的对应关系就建立起来啦。确定好对应关系之后,给小圆点绑定点击事件,当触发点击事件时,先将所有图片 opacity 重置为 0,然后将对应图片的 opacity 设为 1 即可。切换上(下)一张图片也是类似的,给左右按钮绑定点击事件,触发事件时先将所有图片 opacity 置 0,再将当前图片的上(下)一张图片显示出来。其实本质上就是要显示图片数组中指定位置的那张图片,所以我们只要知道需要显示的那张图片在图片数组中的位置就好啦。下面我们开始一步一步地用代码来实现。
先将页面元素绘制出来,代码如下。

<!-- 整个轮播图区域 -->
<div id="area">
	<!-- 展示图片的区域 -->
	<div id="imgs">
		<img src="../img/ts01.jpg" class="active">
		<img src="../img/ts02.jpg">
		<img src="../img/ts03.jpg">
		<img src="../img/ts04.jpg">
		<img src="../img/ts05.jpg">
	</div>
	<!-- 小圆圈用js代码动态生成 -->
	<ol id="items"></ol>
	<!-- 左右两侧按钮 -->
	<div id="direction">
		<div id="left">&lt;</div>
		<div id="right">&gt;</div>
	</div>
</div>

接下来用 css 样式绘制轮播图样式,这里将图片显示、小圆圈高亮以及左右两侧按钮显示的样式单独写出来了,用 active 类来标识。也就是说只要给需要显示的图片加上类 active ,要隐藏的图片删掉 active 类即可,小圆圈的高亮和左右按钮的显示与隐藏也同理。代码如下。

* {
	margin: 0;
	padding: 0;
	list-style: none;
}
#area {
	width: 600px;
	height: 400px;
	margin: 0 auto;
	position: relative;
	overflow: hidden;
}
#imgs {
	width: 100%;
	height: 100%;
	position: absolute;
	top: 0;
	left: 0;
}
#imgs > img {
	width: 100%;
	height: 100%;
	position: absolute;
	top: 0;
	left: 0;
	opacity: 0;
	transition: all .3s;
}
/* 当前显示的图片 */
#imgs > img.active {
	opacity: 1;
}
/* 小圆圈 */
#items {
	width: 200px;
	height: 30px;
	line-height: 30px;
	text-align: center;
	position: absolute;
	bottom: 0;
	right: 0;
}
#items > li {
	display: inline-block;
	cursor: pointer;
	width: 12px;
	height: 12px;
	margin: 0 5px;
	border-radius: 50%;
	border: 1px solid rgba(255, 255, 255, 0.9);
}
/* 当前高亮的小圆圈 */
#items > li.active {
	background-color: rgba(255, 255, 255, 0.9);
}
/* 左右箭头 */
#direction {
	width: 100%;
	height: 100%;
	display: none;
}
/* 显示左右箭头 */
#direction.active {
	display: block;
}
#direction > div {
	width: 25px;
	height: 50px;
	line-height: 50px;
	font-size: 18px;
	text-align: center;
	cursor: pointer;
	/* 垂直居中 */
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	color: rgba(255, 255, 255, 0.9);
	background-color: rgba(0, 0, 0, 0.5);
}
#direction > #left {
	left: 0;
}
#direction > #right {
	right: 0;
}

接下来就是重头戏了,js 部分的代码,咱们分步骤来。首先要获取我们后续需要用到的元素。

var nowIndex = 0;	// 当前图片的索引,默认第一张图片
var box = document.getElementById("area");	// 获取整个轮播图区域
var imgList = document.getElementById("imgs").children;	// 获取图片列表
var olList = document.getElementById("items");	// 获取小圆圈列表
var btnBox = document.getElementById("direction");	// 获取包含左右两侧按钮的区域

现在我们给轮播图加上小圆圈,注意有小技巧,我们可以利用文档碎片,先将所有待添加 li 元素放到一个文档碎片中,待所有 li 元素添加完成后,一次性添加到真正的 DOM 中,这样有效地减少了对真实 DOM 的操作。代码如下。

function addList(){
    // 根据图片数量,生成对应数量的小圆圈
    var dom = document.createDocumentFragment();
    var len = imgList.length;
    for (var i = 0; i < len; i++) {
        var olLi = document.createElement("li");
        // 默认第一个小圆圈高亮
        if (i == 0) {
            olLi.className = "active";
        }
        // 给每个 li 元素添加 index 属性,表示当前小圆圈的索引
        olLi.index = i;
        dom.appendChild(olLi);
    }
    olList.appendChild(dom);
}
// 调用函数,生成小圆圈
addList();
// 获取小圆圈列表,以备后面使用
var list = olList.children;

现在小圆圈都已经生成了,接下来就给它们绑定事件,点击任意小圆圈显示对应的图片。注意,这里我们的小圆圈是动态生成的,怎么给动态生成的元素绑定事件呢?一个方法是在生成元素的同时,给元素绑定事件,还有一种更好的做法就是利用事件委托,给父元素绑定事件。判断当前点击的是第几个小圆圈就显示第几张图片,我选择用事件委托的方式,代码如下。

olList.addEventListener("click", function(e){
	// e.target 就是当前点击的元素,直接获取它的 index 属性就知道是第几个小圆圈啦,也是要显示的第几张图片
    nowIndex = e.target.index;
    showThisImg(nowIndex);
});

其实经过上面的操作,图片与小圆圈的对应关系基本上就确定了,已经获取到了要显示的图片的索引,那么接下来我们来完成显示指定图片的功能,将其封装成函数,传入图片的索引值即可,代码如下。

function showThisImg(thisIndex){
    var len = imgList.length;
    for (var i = 0; i < len; i++) {
        // 给指定图片应用 active 样式,其它不需要显示的图片则删除 active 类
        if (i == thisIndex && imgList[i].className == "") {
            imgList[i].className = "active";
            list[i].className = "active";
        } else if (i != thisIndex && imgList[i].className != "") {
            imgList[i].className = "";
            list[i].className = "";
        }
    }
}

既然显示对应图片的功能做好了,也就意味着自动轮播也可以完成啦。自动轮播其实就是定时更改当前显示的图片,那么只需要定时修改当前图片的索引即可,代码如下。

var interval = setInterval(autoChange, 4000);
function autoChange(){
    nowIndex++;
    // 所有图片都已经显示过一遍,又从第一张开始
    if (nowIndex >= imgList.length) {
        nowIndex = 0;
    }
    showThisImg(nowIndex);
}

自动轮播也已经完成了,接下来继续完成左右两侧按钮切换图片的功能。鼠标移入移出分别触发 mouseenter 和 mouseleave 事件,鼠标移入轮播区域时,清空定时器即可取消自动轮播,且将按钮区域的 display 属性设为 block 将其显示出来,移出则重新定时,并将 display 设为 none 隐藏。给左右按钮绑定点击事件我也利用事件委托的方式,代码如下。

// 鼠标移入轮播图区域时,显示两边的按钮,且停止自动轮播
box.addEventListener("mouseenter", function(){
    btnBox.className = "active";
    clearInterval(interval);
    interval = null;
});
// 鼠标离开轮播图区域时,隐藏两边的按钮,再次开启自动轮播
box.addEventListener("mouseleave", function(){
    btnBox.className = "";
    interval = setInterval(autoChange, 4000);
});
btnBox.addEventListener("click", function(e){
    if (e.target.id == "left") {
    	// 点击的是左侧按钮,需要显示上一张图片,nowIndex 减一。若当前图片已经是第一张则显示最后一张
        nowIndex = nowIndex == 0 ? imgList.length - 1 : nowIndex - 1;
    } else if (e.target.id == "right") {
    	// 点击的是右侧按钮,需要显示下一张图片,nowIndex 加一。若当前图片已经是最后一张则从第一张开始
        nowIndex = nowIndex == imgList.length - 1 ? 0 : nowIndex + 1;
    }
    // 显示 nowIndex 对应的图片
    showThisImg(nowIndex);
});

至此,一个简单的轮播图就完成啦!来看看效果图(Taylor 美图来袭!)
原生 JS 实现一个简单轮播图
JS 部分的整体代码如下。文章来源地址https://www.toymoban.com/news/detail-485286.html

var nowIndex = 0;
var imgList = document.getElementById("imgs").children;
var olList = document.getElementById("items");
var btnBox = document.getElementById("direction");
var box = document.getElementById("area");

var interval = setInterval(autoChange, 4000);

// 动态生成小圆圈,利用事件委托,给父元素ol绑定事件,判断当前点击的是第几个小圆圈,则显示对应的第几张图片
addList();
var list = olList.children;
olList.addEventListener("click", function(e){
	nowIndex = e.target.index;
	showThisImg(nowIndex);
});

// 鼠标移入轮播图区域时,显示两边的按钮,且停止自动轮播
box.addEventListener("mouseenter", function(){
	btnBox.className = "active";
	clearInterval(interval);
	interval = null;
});
// 鼠标移出轮播图区域时,隐藏两边的按钮,开启自动轮播
box.addEventListener("mouseleave", function(){
	btnBox.className = "";
	interval = setInterval(autoChange, 4000);
});
// 给按钮绑定事件,点击左侧按钮显示上一张,点击右侧按钮显示下一张
btnBox.addEventListener("click", function(e){
	if (e.target.id == "left") {
		nowIndex = nowIndex == 0 ? imgList.length - 1 : nowIndex - 1;
	} else if (e.target.id == "right") {
		nowIndex = nowIndex == imgList.length - 1 ? 0 : nowIndex + 1;
	}
	showThisImg(nowIndex);
});

function addList(){
	// 根据图片数量,生成对应数量的小圆圈
	var dom = document.createDocumentFragment();
	var len = imgList.length;
	for (var i = 0; i < len; i++) {
		var olLi = document.createElement("li");
		if (i == 0) {
			olLi.className = "active";
		}
		olLi.index = i;
		dom.appendChild(olLi);
	}
	olList.appendChild(dom);
}

function showThisImg(thisIndex){
	var len = imgList.length;
	for (var i = 0; i < len; i++) {
		// 修改图片样式
		if (i == thisIndex && imgList[i].className == "") {
			imgList[i].className = "active";
			list[i].className = "active";
		} else if (i != thisIndex && imgList[i].className != "") {
			imgList[i].className = "";
			list[i].className = "";
		}
	}
}

function autoChange(){
	nowIndex++;
	if (nowIndex >= imgList.length) {
		nowIndex = 0;
	}
	showThisImg(nowIndex);
}

到了这里,关于原生 JS 实现一个简单轮播图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ❤️创意网页:打造简洁美观的网页轮播图(HTML简单实现轮播图)操作简单可以直接使用

    ✨ 博主: 命运之光 🌸 专栏: Python星辰秘典 🐳 专栏: web开发(简单好用又好看) ❤️ 专栏: Java经典程序设计 ☀️ 博主的其他文章: 点击进入博主的主页 前言: 欢迎踏入我的Web项目专栏,一段神奇而令人陶醉的数字世界! 🌌 在这里,我将带您穿越时空,揭开属于

    2024年02月17日
    浏览(47)
  • js实现左右切换轮播图效果

    实现效果: 自动向右循环播放 鼠标悬停,移出继续播放 点击向右按钮,跳到下一张 点击向左按钮,跳到上一张 保证图片的过渡效果完整呈现后,才能跳到下一张 底部圆点随图片位置切换激活状态 实现思路: 把第一张图片复制到最后一张 当播放到最后一张时,无缝切换到

    2024年01月20日
    浏览(57)
  • JS常用插件 Swiper插件 实现轮播图

    Swiper 是一款免费以及轻量级的移动设备触控滑块的js框架 中文官网地址: https://www.swiper.com.cn/ 点击查看 Swiper演示 ,里面的功能和样式十分丰富,根据自己的需求选择 中文教程 中详细介绍了如何使用Swiper API文档 中介绍了各个模块以及参数的详细信息,遇到不明白的参数可以

    2024年02月01日
    浏览(65)
  • 使用JS来实现轮播图的效果

    最好今天分享一个使用JS制作的轮播图效果 个人名片:  😊 作者简介:一名大一在校生,web前端开发专业  🤡  个人主页:几何小超  🐼 座右铭:懒惰受到的惩罚不仅仅是自己的失败,还有别人的成功。  🎅**学习目标:  坚持每一次的学习打卡 ,学好前端 首先是HTML部分

    2024年01月20日
    浏览(49)
  • 如何使用CSS实现一个响应式轮播图?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月11日
    浏览(42)
  • 使用vant+video.js实现轮播图图片和视频轮播播放

    先上效果图 1. 安装 2. 在需要用到的页面引入 3. 具体页面使用 假设传给子组件的数组结构 按照步骤来使用,其他地方视频播放情况都还好,至少安卓是好的,只是点击播放和暂停时候,ios需要点击多下才能触发点击事件; 然后以为是video.js插件可能没更新,ios版本迭代超过

    2023年04月08日
    浏览(46)
  • 前端轮播图最简单实现(小白也能学会)

    轮播图大家肯定都不陌生,因为这是前端最为常见的一个功能,现在随着框架和一些插件的兴起,很少人会去原生的去写轮播图,所以今天带大家写一下原生的轮播图来熟悉一下 最为主要的就是得知道这张图片的宽度,因为每一次移动的距离就是这张图片的宽度,但是宽度我

    2024年02月04日
    浏览(38)
  • 基于html+js实现轮播图(自动轮播、左右按钮、小圆点点击及切换图片)

    使用html和js实现的一个简单小练习轮播图。大概功能主要是: 1、使用时间函数自动切换图片; 2、在图片及按钮及小圆点的父节点身上绑定事件代理,添加mouseenter及mouseleave事件类型,让鼠标移入,图片暂停,移出,图片恢复轮播; 3、在按钮的父节点身上绑定事件代理,事

    2024年02月11日
    浏览(43)
  • 微信小程序(原生)——轮播图swiper、1秒切换、自动轮播、无缝切换

    微信小程序的轮播图制作,且图片不变形。1秒切换、自动轮播、无缝切换 index.wxml文件: index.wxss文件: 完整示意图 swiper网址:https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html image网址:https://developers.weixin.qq.com/miniprogram/dev/component/image.html 图片处理方面: mode=\\\"aspectFi

    2024年02月15日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包