原生JS实现无缝轮播效果(自动/手动/焦点)

原生JS实现无缝轮播效果

以下是效果图:
原生JS实现无缝轮播效果(自动/手动/焦点)_第1张图片
以下是代码部分

html结构:

<body>
	
	<div class="carousel">
		
		<div class="cal_list">
			
			<ul class="move_ul">
				<li>1li>
				<li>2li>
				<li>3li>
				<li>1li>
			ul>

			
			<span class="left_btn"><span>
			<span class="right_btn">>span>
			
			<div class="circle_list">
				<span class="circle active">span>
				<span class="circle">span>
				<span class="circle">span>
			div>
		div>
	div>
body>

css样式:


js代码(重点)

<script type="text/javascript">
		/*
			让一个元素移动的功能
				ele 移动的元素
				target 要移动到的目标值
		*/
		function move(ele,target){
     
			//防止连续点击按钮开启多个定时器,先进行清除定时器
			clearInterval(ele.timer)

			//把定时器存储到了元素属性中
			ele.timer = setInterval(function(){
     
				// 当等于目标距离清除定时器
				if(ele.offsetLeft == target){
     
					clearInterval(ele.timer);
				}else{
     

					/*
						这里使用缓动动画
						让速度等于目标值和当前位置之差/10,
						二者之差会越来越小,即速度sped也会越来越小

					*/
					// 目标值-当前值/10
					var step = (target - ele.offsetLeft)/10;

					/*
						二者之差除以十并不总是整数,
						可能会导致物体位置和目标值不能完全相等,
						所以需要对speed进行取整,大于0向上取整,小于0向下取整;
					*/
					step = step > 0?Math.ceil(step):Math.floor(step);
					// 然后把计算好的值赋给元素的left值使其移动
					ele.style.left = ele.offsetLeft +step+'px';
				}
			},10);
		}

		/*
			这里使用了一种思想————排他思想:
				就是先清空所有的,然后单独设置当前的
		*/
		/*
			排他功能
				eles 要操作的元素集合
				num 操作的第几个
		*/ 
		function exclusive(eles,num){
     
			// 小圆点排他
			for(var i = 0; i < eles.length; i++){
     
				eles[i].className = 'circle';
			}
			// 添加样式
			eles[num].className = 'circle active';
		}

		/*
			获取相关的DOM元素
		*/
		var oRight = document.querySelector('.right_btn');// 右边按钮
		var oLeft = document.querySelector('.left_btn');// 左边按钮
		var oMoveUl = document.querySelector('.move_ul');// 获取移动的ul
		var oCircles = document.querySelectorAll('.circle');// 获取小圆点

		var flag = 0;//记录小圆点的位置(看成下标)
		var count = 0;//记录图片移动到第几张(看成下标)

		// 右边按钮绑定单击事件(需要ul往左移动)
		oRight.addEventListener('click',function(){
     
			// 当点击一次进行自加
			flag++;
			count++;

			// 小圆点判断(如果这次的点击是最后一个小圆点,就让这个标记重置)
			if(flag == oCircles.length){
     
				flag = 0;
			}

			// 图片判断(如果这次的点击是最后一张图片(代表第一张))
			if(count == oMoveUl.children.length){
     
				// 让ul迅速拉回
				oMoveUl.style.left = '0px';
				count = 1;//让图片的下标指向第二张
			}

			// 小圆点排他(调用排他功能 传入所有小圆点及当前点击的是第几个)
			exclusive(oCircles,flag);

			// 计算移动到的目标值
			var target = count * -oMoveUl.children[0].offsetWidth;
			// 调用移动方法 传入移动元素ul(oMoveUl) 和目标值
			move(oMoveUl,target);
		});

		// -----------------------------
		// 左边按钮绑定单击事件(需要ul往右移动)
		oLeft.addEventListener('click',function(){
     
			// 如果当前是第一张就拉回到倒数第二张
			if(count == 0){
     
				count = oMoveUl.children.length - 1;
				oMoveUl.style.left = (count * -600) +'px';
			}

			// 当点击一次进行自减
			count--;
			flag--;
			//判断小圆点此时的状态
			if(flag < 0){
     
				flag = oCircles.length -1;
			}
			// 小圆点排他
			exclusive(oCircles,flag);

			//设置移动的距离
			var target = count * -oMoveUl.children[0].offsetWidth;
			move(oMoveUl,target);
		});

		// 鼠标移入清除自动轮播
		document.querySelector('.cal_list').addEventListener('mouseover',function(){
     
			clearInterval(oMoveUl.clear);
		});

		// 鼠标移出则继续轮播
		document.querySelector('.cal_list').addEventListener('mouseout',function(){
     
			auto();
		})

	// 自动轮播功能
	function auto(){
     
		oMoveUl.clear = setInterval(function(){
     
			oRight.click(); //相当于手动点击了右边按钮
		},2000);
	}
	// 界面载入先进行自动轮播
	auto();


	// 焦点轮播
	for(var i = 0; i < oCircles.length; i++){
     
		(function(index){
     
			oCircles[index].addEventListener('click',function(){
     
				// 使焦点轮播的和自动轮播同步(标记改变为点击的那个下标)
				flag = index;
				count = index;

				exclusive(oCircles,index);
				var target = index * -oMoveUl.children[0].offsetWidth;
				move(oMoveUl,target);
			});
		})(i);
	}
</script>

如有错误还请指出,希望这篇文章能给予你们帮助!

你可能感兴趣的:(笔记,javascript,css3,html5)