js之div盒子的移动和网页轮播图

目录

一、盒子的移动

1.匀速运动

2.缓动运动

二、网页轮播图

节流阀


一、盒子的移动

1.匀速运动

通过函数封装代码段

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>盒子的移动</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        .box{
            width: 200px;
            height: 200px;
            background-color: blue;
            position: absolute;
            left: 0px;
        }
        .box2{
            background-color: red;
            margin-top: 210px;
        }
    </style>
</head>
<body>
    <div class="box box1"></div>
    <div class="box box2"></div>
    <script>
        var box1=document.querySelector('.box1');
        var box2=document.querySelector('.box2');
        // var myInter=setInterval(function () {
        //     var offsetLeft=box1.offsetLeft;
        //     // console.log(offsetLeft);
        //     var num=10;//每次都移动10个像素
        //     var target=100;
        //     if(offsetLeft==target){
        //         clearInterval(myInter);
        //     }else{
        //         box1.style.left=offsetLeft+num+'px';
        //     }
        // },1000)
        //匀速运动  封装上面的代码块设计一个匀速运动的函数
        function move(obj,target){
            obj.myInter=setInterval(function () {
            var offsetLeft=obj.offsetLeft;
            // console.log(offsetLeft);
            var num=10;//每次都移动10个像素
            // var target=100;
            if(offsetLeft==target){
                clearInterval(obj.myInter);
            }else{
                obj.style.left=offsetLeft+num+'px';
            }
        },1000)
        }
        box1.onclick=function(){
            move(this,100);
        }

        
    </script>
</body>
</html>

2.缓动运动

注意:有一个滑动效果,每次移动的距离都是由大到小

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>盒子的移动</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        .box{
            width: 200px;
            height: 200px;
            background-color: blue;
            position: absolute;
            left: 0px;
        }
        .box2{
            background-color: red;
            margin-top: 210px;
        }
    </style>
</head>
<body>
    <div class="box box1"></div>
    <div class="box box2"></div>
    <script>
        var box1=document.querySelector('.box1');
        var box2=document.querySelector('.box2');
        // var myInter=setInterval(function () {
        //     var offsetLeft=box1.offsetLeft;
        //     // console.log(offsetLeft);
        //     var num=10;//每次都移动10个像素
        //     var target=100;
        //     if(offsetLeft==target){
        //         clearInterval(myInter);
        //     }else{
        //         box1.style.left=offsetLeft+num+'px';
        //     }
        // },1000)
        //匀速运动  封装上面的代码块设计一个匀速运动的函数
        function move(obj,target){
            obj.myInter=setInterval(function () {
            var offsetLeft=obj.offsetLeft;
            // console.log(offsetLeft);
            var num=10;//每次都移动10个像素
            // var target=100;
            if(offsetLeft==target){
                clearInterval(obj.myInter);
            }else{
                obj.style.left=offsetLeft+num+'px';
            }
        },1000)
        }
        box1.onclick=function(){
            move(this,100);
        }

        //缓动运动 有个滑动效果  每次移动的距离 由大到小改变
        //思路  要移动100 可以先走40  再走30 再走20 最后走10 这样移动越来越慢

        function slow(obj,target){
            obj.myInter=setInterval(function(){
                var offsetLeft=obj.offsetLeft;
                var num=(target-offsetLeft)/10;
                num>0?num=Math.ceil(num):num=Math.floor(num);
                //注意 随着定时器的运行 num数值会由大到小变化
                //因为offsetLeft的值在变大
                if(offsetLeft==target){
                    clearInterval(obj.myInter);//清除定时器
                }else{
                    obj.style.left=offsetLeft+num+'px';
                }
            },1000)
        }
        box2.onclick=function(){
            slow(this,100);
        }
    </script>
</body>
</html>

二、网页轮播图

节流阀

防止轮播图按钮连续点击造成播放过快。

节流阀目的:当上一个函数动画内容执行完毕,再去执行下一个函数动画,让事件无法连续触发。

核心实现思路:利用回调函数,添加一个变量来控制,锁住函数和解锁函数。


<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<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{
                /* width: 2600px; */
                /* left: -1240px; */
				 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: green;
				 display: block;
				 border-radius: 50%;
				 opacity: .8;
				 float: left;
				 margin-right: 10px;
                 cursor: pointer;
			}
			.circle a.hover{
				background: black;
				 opacity: .7;
			}
		</style>
	</head>
	<body>
		<div class="banner">
			
			<ul class="imgList">
				<li><img src="./img/1.png"/></li>
				<li><img src="./img/2.jpg"/></li>
				<li><img src="./img/3.jpg"/></li>
				<li><img src="./img/4.jpg"/></li>
				
			</ul>
			<div class="circle">
				<!-- <a href="javascript:;"></a>
				<a href="javascript:;"></a>
				<a href="javascript:;"></a> -->
			</div>
		</div>
        <!-- 节流阀理解 -->
		<!-- 点击圆圈    是不是有个动画
			再点击圆圈   是不是有个动画
			自动切换   是不是又是一个动画
			那么这些动画再同时执行时 可能会出问题
			怎么解决? ->  一个动画执行完 再去执行另外一个动画
			
			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
				})
				这是个动画
			} -->	
        
        <!-- 实现 点击小圆点 图片滑动  小圆点样式改变 -->
		<script type="text/javascript">
			// 确定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>
	</body>
</html>

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值