用原生js写轮播图(并实现手动及自动切换图片)

显示效果在页面底部

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			*{
				padding: 0px;
				margin: 0px;
			}
			h1{
				text-align: center;
			}
			.banner{
				width: 600px;
				height: 350px;
				margin: auto;
				border: 5px solid #aaffff;
				border-radius: 10px;
				position: relative;
				overflow: hidden;
			}
			.imgList img{
				width: 600px;
				height: 350px;
				border-radius: 5px;
				
			}
			.imgList{
				position: absolute;
			}
			.imgList li{
				float: left;
				margin-right: 20px;
				list-style: none;
			}
			.circle{
				position: absolute;
				bottom: 15px;
				left: 50%;
				transform: translateX(-50%);
			}
			.circle a{
				width: 15px;
				height: 15px;
				background: #ECECEC;
				display: block;
				border-radius: 50%;
				opacity: .8;
				float: left;
				margin-left: 10px;
				cursor: pointer;
			}
			.circle a.hover{
				background: black;
				opacity: .7;
			}
		</style>
	</head>
	<body>
		<h1>轮播图(原生js实现手动及自动切换)</h1>
		<div class="banner">
			
			<ul class="imgList">
				<li><img src="banner/1.webp" ></li>
				<li><img src="banner/2.webp" ></li>
				<li><img src="banner/3.webp" ></li>
				<li><img src="banner/4.webp" ></li>
			</ul>
			<div class="circle">
				
			</div>
		</div>
		<!-- 实现点击小圆点,图片滑动,小圆点样式改变 -->
		<script type="text/javascript">
			//确定ul的宽度,创建动态的小圆点
			var imgList = document.querySelector('.imgList');
			var circle = document.querySelector('.circle');
			var circleA = circle.children;
			var imgListli = imgList.children;
			//thisIndex默认索引值是0
			var thisIndex = 0;
			var flag = true;
			//window.onload延迟加载函数
			// 再全局设置flag为true 让使用动画都可执行
			window.onload = function(){
				//给ul标签设置宽度
				imgList.style.width = imgList.children.length*620+'px';
				//下面动态创建a标签
				for(var i = 0;i < imgList.children.length;i++){
					var aNode = document.createElement('a');
					//我们在这里创建index属性来记录索引值
					aNode.setAttribute('index',i);
					circle.appendChild(aNode);
				}
				// 动画1
				// 给小圆点加点击事件
				circle.addEventListener('click',function(e){
					// 这里给a标签点击事件有个小bug
					// 解决小bug的方法
					if(e.target.nodeName !='A'){
						return false;
					}
					if(flag){
						flag = false;
						// e.target指向的是a标签
						console.log(e.target);
						//获得索引值
						thisIndex = e.target.getAttribute('index');
						//图片移动的规则 0索引值->0 1 >1*620 2 >2*620
						// 这里的图片移动 我们可以用封装好的缓动动画来实现
						slow(imgList,-thisIndex*620,function(){
							flag = true;
						});
						circlechange();
					}
				})
				//动画2
				//自动切换动画
				function autoChange(){
					//设置定时器
					setInterval(function(){
						if(flag){
							flag = false;
							if(thisIndex>=imgListli.length){
								thisIndex = 0;
							}
							slow(imgList,-thisIndex*620,function(){
								flag = true;
							});
							circlechange();
							// 利用缓动函数 让图片动起来
							// 注意 这里先让图片移动,再thisIndex自增
							thisIndex++;
						}
					},1000)
				}
				autoChange();
				function circlechange(){
					for(var i = 0; i < circleA.length;i++){
						circleA[i].className = '';
					}
					circleA[thisIndex].className = 'hover';
				}
				// 缓动动画
				function slow(obj,target,getflag){
					obj.myInter = setInterval(function(){
						var offsetLeft = obj.offsetLeft;
						var num = (target-offsetLeft)/10;
						//Math.ceil向上取整 Math.floor向下取整
						num>0?num = Math.ceil(num):num=Math.floor(num);
						//注意随着定时器的运行 num数值会由大到小发生变化
						//下面是固定写法
						//因为offsetLeft的值在变大
						if(offsetLeft==target){
							clearInterval(obj.myInter);//清除定时器
							//在动画执行完了 执行将flag改为true的函数
							//下面是固定写法
							getflag && getflag();
						}else{
							obj.style.left = offsetLeft+num+'px';
						}
					},10)
				}
			}
		</script>
	</body>
</html>


浏览器显示效果

 

 

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的JS原生轮播图实现方法: HTML部分: ```html <div class="slider"> <ul class="slider-images"> <li><img src="image1.jpg"></li> <li><img src="image2.jpg"></li> <li><img src="image3.jpg"></li> <li><img src="image4.jpg"></li> </ul> </div> ``` CSS部分: ```css .slider { position: relative; width: 100%; height: 300px; overflow: hidden; } .slider-images { position: absolute; width: 400%; height: 100%; left: 0; top: 0; margin: 0; padding: 0; list-style: none; } .slider-images li { float: left; width: 25%; height: 100%; margin: 0; padding: 0; } .slider-images img { width: 100%; height: 100%; display: block; } ``` JavaScript部分: ```javascript var sliderImages = document.querySelector('.slider-images'); var sliderImagesList = document.querySelectorAll('.slider-images li'); var sliderImageWidth = sliderImagesList[0].offsetWidth; var currentIndex = 0; var timer; sliderImages.style.width = sliderImageWidth * sliderImagesList.length + 'px'; function slide() { currentIndex++; if (currentIndex === sliderImagesList.length) { currentIndex = 0; } var newPosition = -sliderImageWidth * currentIndex; sliderImages.style.transform = 'translateX(' + newPosition + 'px)'; } timer = setInterval(slide, 3000); ``` 代码解析: 首先,我们获取轮播图的容器和图片列表,以及每张图片的宽度和当前索引值。 然后,我们设置轮播图容器的宽度为所有图片宽度的总和,以便让所有图片在同一行排列。 接着,我们定义一个 slide 函数,用于切换图片。每次调用该函数,我们将当前索引值加一,并且检查是否已经到达图片列表的末尾。如果是,则将索引值重置为 0。 最后,我们根据当前索引值计算出新的位置,并将轮播图容器移动到该位置。我们使用 setInterval 函数每隔一定的时间调用一次 slide 函数,从而让轮播图自动循环播放。 注意:该代码只是一个简单的轮播图实现,可能还需要进行优化和进,例如添加左右箭头和圆点导航等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值