欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js实现轮播图

程序员文章站 2022-06-02 11:22:50
...

 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<link rel="stylesheet" type="text/css" href="css/reset.css" />
		<link rel="stylesheet" type="text/css" href="font/iconfont.css" />
		<style>
			.banner {
				width: 730px;
				height: 454px;
				margin: 1em auto;
				overflow: hidden;
				position: relative;
			}

			.banner .images {
				width: 700%;
				height: 454px;
				position: absolute;
				left: 0;
				bottom: 0;
			}

			.banner .images img {
				width: 730px;
				height: 454px;
				float: left;
			}

			.banner .left,
			.banner .right {
				height: 50px;
				position: absolute;
				top: 0;
				bottom: 0;
				margin: auto;
				cursor: pointer;
				line-height: 50px;
				background-color: rgb(0, 0, 0, .2);
				color: #fff;
			}

			.banner .left {
				float: left;
				left: 0px;
			}

			.banner .right {
				float: right;
				right: 0px;
			}

			.banner .right i,
			.banner .left i {
				font-size: 30px;
			}

			.banner .tb {
				display: none;
			}

			.banner .modal {
				width: 730px;
				height: 40px;
				line-height: 40px;
				position: absolute;
				left: 0;
				bottom: 0;
				margin: auto;
				color: #FFFFFF;
				box-sizing: border-box;
			}

			.banner .modal .circle {
				text-align: center;
			}

			.banner .modal ul.circle li {
				width: 20px;
				height: 20px;
				background: #333333;
				display: inline-block;
				border-radius: 50%;
				margin: 0 2px;
				color: #fff;
				font-size: 10px;
				line-height: 20px;
				cursor: pointer;
			}

			.banner .modal ul li.selected {
				background-color: orange;
			}
		</style>
	</head>
	<body>
		<div class="banner">
			<div class="images">
				<ul>
					<li><img src="./img/adver01.jpg" alt=""></li>
					<li><img src="./img/adver02.jpg" alt=""></li>
					<li><img src="./img/adver03.jpg" alt=""></li>
					<li><img src="./img/adver04.jpg" alt=""></li>
					<li><img src="./img/adver05.jpg" alt=""></li>
					<li><img src="./img/adver06.jpg" alt=""></li>
				</ul>
			</div>
			<div class="left">
				<i class="iconfont icon-jiantouarrow487-copy"></i>
			</div>
			<div class="right">
				<i class="iconfont icon-jiantouarrow487"></i>
			</div>

			<div class="modal">
				<ul class="circle">
					<!-- <li class="selected">1</li>
					<li>2</li>
					<li>3</li>
					<li>4</li>
					<li>5</li>
					<li>6</li> -->
				</ul>
			</div>
		</div>

		<script>
			// 1. 获取元素
			var banner = document.querySelector('.banner');
			var bannerWidth = banner.offsetWidth;
			var left = document.querySelector('.left');
			var right = document.querySelector('.right');
			// 2. 鼠标经过focus 就显示隐藏左右按钮
			banner.addEventListener('mouseenter', function() {
				left.style.display = 'block';
				right.style.display = 'block';
				clearInterval(auto);
				auto = null; // 清除定时器变量
			});
			banner.addEventListener('mouseleave', function() {
				left.style.display = 'none';
				right.style.display = 'none';
				//手动调用点击事件
				auto = setInterval(function() {
					right.click();
				}, 2000);
			});
			var images = document.querySelector('.images');
			var modal = document.querySelector('.modal');
			// 3. 动态生成小圆圈  有几张图片,我就生成几个小圆圈
			var imgul = images.querySelector('ul');
			var modul = modal.querySelector('.circle');
			for (var i = 0; i < imgul.children.length; i++) {
				// 创建一个小li 
				var li = document.createElement('li');
				// 记录当前小圆圈的索引号 通过自定义属性来做
				li.setAttribute('index', i);
				li.innerHTML = i + 1;
				// 把小li插入到modul 里面
				modul.appendChild(li);
				// 4. 小圆圈的排他思想 我们可以直接在生成小圆圈的同时直接绑定点击事件
				li.addEventListener('click', function() {
					for (var j = 0; j < modul.children.length; j++) {
						modul.children[j].className = '';
					}
					this.className = 'selected';
					// 5. 点击小圆圈,移动图片 当然移动的是 images 
					// images 的移动距离 小圆圈的索引号 乘以 图片的宽度 注意是负值
					// 当我们点击了某个小li 就拿到当前小li 的索引号
					var index = this.getAttribute('index');
					// 当我们点击了某个小li 就要把这个li 的索引号给 num 
					num = index;
					// 当我们点击了某个小li 就要把这个li 的索引号给 c 
					c = index;
					animate(images, -index * bannerWidth);
				});
			}
			// 把modul里面的第一个小li设置类名为 selected
			modul.children[0].className = 'selected';
			// 6. 克隆第一张图片(li)放到ul 最后面
			var first = imgul.children[0].cloneNode(true);
			imgul.appendChild(first);
			// 7. 点击右侧按钮, 图片滚动一张
			var num = 0;
			// circle 控制小圆圈的播放
			var c = 0;
			// flag 节流阀
			var flag = true;
			// 9. 左侧按钮做法
			left.addEventListener('click', function() {
				if (flag) {
					flag = false; // 关闭节流阀
					// 如果走到了最后复制的一张图片,此时 我们的images 要快速复原 left 改为 0
					if (num == 0) {
						num = imgul.children.length - 1;
						images.style.left = -num * bannerWidth;
					}
					num--;
					c--;
					// 如果c < 0  说明第一张图片,则小圆圈要改为第6个小圆圈(5)
					if (c < 0) {
						c = modul.children.length - 1;
					}
					for (var k = 0; k < modul.children.length; k++) {
						modul.children[k].className = '';
					}
					modul.children[c].className = 'selected';
					animate(images, -num * bannerWidth, function() {
						flag = true; // 打开节流阀
					});
				}
			});

			right.addEventListener('click', function() {
				if (flag) {
					flag = false;
					if (num == imgul.children.length - 1) {
						images.style.left = 0;
						num = 0;
					}
					num++;
					c++;
					// 如果c == 6 说明走到最后我们克隆的这张图片了 我们就复原
					if (c == imgul.children.length - 1) {
						c = 0;
					}
					for (var k = 0; k < modul.children.length; k++) {
						modul.children[k].className = '';
					}
					modul.children[c].className = 'selected';
					animate(images, -num * bannerWidth, function() {
						flag = true;
					});
				}

			});
			// 10. 自动播放轮播图
			var auto = setInterval(function() {
				//手动调用点击事件
				right.click();
			}, 2000);

			function animate(obj, target, callback) {
				clearInterval(obj.timer);
				obj.timer = setInterval(function() {
					var step = (target - obj.offsetLeft) / 10;
					step = step > 0 ? Math.ceil(step) : Math.floor(step);
					if (obj.offsetLeft == target) {
						clearInterval(obj.timer);
						if (callback) {
							callback();
						}
					}
					obj.style.left = obj.offsetLeft + step + 'px';
				}, 15);
			}
		</script>
	</body>
</html>

图片:

js实现轮播图

js实现轮播图

js实现轮播图

js实现轮播图

js实现轮播图

js实现轮播图

相关标签: JavaScript