JS轮播图小练习

HTML代码

<div class="banner">	
    <ul class="imgList">
      <li><img src="img/a的副本.jpeg"/></li>
      <li><img src="img/d的副本.jpeg"/></li>
      <li><img src="img/q的副本2.jpeg"/></li>
      
    </ul>
    <div class="circle"></div>
    </div>

CSS代码

  <style>
			*{
				padding: 0px;
				margin: 0px;
			}
			.banner{
				 width: 600px;
				 margin: auto;
				 border: 10px solid green;
				 height: 350px;
				 position: relative;
				 overflow: hidden; 
			}
			.imgList img{
				width: 600px;
				 height: 350px;
			}
			.imgList{
				/* 绝对定位 */
				 position: absolute;
				/* left:-600px; */
				/* width: 2600px; */
			}
			.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: green;
				 display: block;
				 border-radius: 50%;
				 opacity: .8;
				 float: left;
				 margin-right: 10px;
			}
			.circle a.hover{
				background: black;
				 opacity: .7;
			}
		</style>

<!-- 节流阀理解 -->

<!-- 点击圆圈 是不是有个动画

再点击圆圈 是不是有个动画

自动切换 是不是又是一个动画

那么这些动画再同时执行时 可能会出问题

怎么解决? -> 一个动画执行完 再去执行另外一个动画

flag = true;

a动画

if(flag){这里面再执行动画

flag = false

move(a,b,function(){

flag = true 函数执行完后将flag改成true

})这是个动画

}

b动画

if(flag){是true时执行动画

flag = false

move(a,b,function(){

flag = true 函数执行完后将flag改成true

})

这是个动画

} -->

<!-- 实现 点击小圆点 图片滑动 小圆点样式改变 -->

JS代码

 <script>
      // 确定ul的宽度 动态的创建小圆点
			var imgList = document.querySelector('.imgList');
			var circle = document.querySelector('.circle');
			var circleA = circle.children;
			var imgListli = imgList.children;
			// console.log(imgListli);
			// thisIndex默认索引值是0
			var thisIndex = 0;
			// console.log(imgList.children.length);
			// window.onload延迟加载函数
			var flag = true;//再全局设置flag为true 让所有动画都可执行
			window.onload = function(){
				//给ui标签设置宽度
				 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);
				 }
				 
				 
				 // a动画
				 //给小圆点加点击事件
				circle.addEventListener('click',function(e){
					
					//这里给a标签点击事件有个小bug 就是我们鼠标点击到.circle标签时候图片也滑动了 
					//解决上面小bug的方法
					if(e.target.nodeName !='A'){
						return false;
					}
					
					if(flag){
						flag = false;
						// e.target指向的是a标签
						console.log(e.target);
						// console.log(e.target.nodeName);
						// 获得索引值
						 thisIndex = e.target.getAttribute('index');
						// console.log(thisIndex);
						//图片移动的规则 0索引值 ->0  1 ->-1*620  2 ->-2*620 
						
						// 这里的图片移动 我们可以用封装好的缓动动画来实现
						// imgList.style.left = -thisIndex*620+'px';
						slow(imgList,-thisIndex*620,function(){
							flag = true;
						});
						//调用小圆点改变样式的函数
						circlechange();
					}
				
				})
				
				// b动画
				//自动切换动画
				function autoChange(){
					// 设置定时器
					setInterval(function(){
						if(flag){
							flag = false;
							if(thisIndex>=imgListli.length){
								thisIndex = 0;
							}
							
							
							slow(imgList,-thisIndex*620,function(){
								flag = true;
							});
							circlechange();
							// console.log(thisIndex);
							//利用缓动函数 让图片动起来
							//注意 这里先图片移动 再thisIndex自增
							 thisIndex++;
						}
						
						
						
					},2000)
					
				}
				
				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>

效果图

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值