轮播图练习

84 阅读1分钟

下载.gif
用易烊千玺图片做的轮播图切换。
图片可设置每隔3秒自动切换,也可手动点击图片下面的方块进行手动切换

HTML文件:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style>
			*{
				margin: 0;
				padding: 0;
			}
			#outer{
				width: 520px;
				height: 500px;
				margin: 50px auto;
				background-color: gold;
				padding: 10px 0;
				position: relative;
				overflow: hidden;
			}
			#imgList{
				list-style: none;
				/*width: 2600px;*/
				position: absolute;
				left: 0;
				
			}
			#imgList li{
				float: left;
				margin: 0 10px;
			}
			#navDiv{
				position: absolute;
				bottom: 15px;
			}
			#navDiv a{
				float: left;
				width: 15px;
				height: 15px;
				background-color: red;
				/*设置透明*/
				opacity: 0.5;
				/*兼容IE8的透明*/
				filter: alpha(opacity=50);
				margin: 0 5px;
			}
			#navDiv a:hover{
				background-color: black;
			}
		</style>
	</head>
	<body>
		<!--创建一个大div,作为大容器-->
		<div id="outer">
			<ul id="imgList">
				<li><img src="img/1.jpg" /></li>
				<li><img src="img/2.jpg" /></li>
				<li><img src="img/3.jpg" /></li>
				<li><img src="img/4.jpg" /></li>
				<li><img src="img/5.jpg" /></li>
				<li><img src="img/1.jpg" /></li>
			</ul>
			<!--创建导航按钮-->
			<div id="navDiv">
				<a href="javascript:;"></a>
				<a href="javascript:;"></a>
				<a href="javascript:;"></a>
				<a href="javascript:;"></a>
				<a href="javascript:;"></a>
			</div>
		</div>
	</body>
	<script type="text/javascript" src="js/move.js"></script>
	<script>
		var imgList=document.getElementById("imgList");
		var imgArr=document.getElementsByTagName("img");
		//设置imgList的宽度
		imgList.style.width=520*imgArr.length+"px";
		
		var navDiv=document.getElementById("navDiv");
		var outer=document.getElementById("outer");
		navDiv.style.left=(outer.offsetWidth-navDiv.offsetWidth)/2+"px";
		//默认显示图片的索引
		var index=0;
		var allA=document.getElementsByTagName("a");
		//设置默认选中的效果
		allA[index].style.backgroundColor="black";
		//为所有的超链接绑定单击响应函数
		for(var i=0;i<allA.length;i++){	
			//为每一个超链接都添加一个num属性
			allA[i].num=i;
			allA[i].onclick=function(){
				//关闭自动切换的定时器
				clearInterval(timer);
				//获取点击超链接的索引,并将其设置为index
				index=this.num;
				//切换图片
				/*
				 *        索引  left
				 * 第一张    0    0
				 * 第二张    1   -520
				 * 第三张    2   -1040
				 */
				//imgList.style.left=-520*index+"px";
				//设置选中的a
				setA();
				//使用move函数切换图片
				move(imgList,"left",-520*index,20,function(){
					//动画执行完毕,开启自动切换图片
					autoChange();
				});
			};
		}
		//开启自动切换图片
		autoChange();
		//创建一个方法来设置选中的a
		function setA(){
			//判断当前索引是否是最后一张图片
			if(index>=imgArr.length-1){
				//将index设置为0
				index=0;
				//此时显示最后一张图片,最后一张图片和第一张一模一样
				//通过CSS将最后一张图片切换为第一张
				imgList.style.left=0;
			}
			//遍历所有的a,并将它们的背景颜色设置为红色,使用样式表里的样式
			for(var i=0;i<allA.length;i++){
				allA[i].style.backgroundColor="";
			}
			//将选中的a的背景颜色设置为黑色
			allA[index].style.backgroundColor="black";
		};
		//定义一个自动切换的定时器的标识
		var timer;
		//创建一个函数,用来自动切换图片
		function autoChange(){
			//开启一个定时器,定时切换图片
			timer=setInterval(function(){
				//索引自增
				index++;
				//判断index的值
				index%=imgArr.length;
				//执行动画,切换图片
				move(imgList,"left",-520*index,20,function(){
					//修改导航按钮
					setA();
				});
			},3000);
		};
	</script>
</html>

js文件:

//定义一个函数,获取当前样式
function getStyle(obj, name) {
	if(window.getComputedStyle) {
		//正常浏览器
		return getComputedStyle(obj, null)[name];
	} else {
		//IE8
		return obj.currentStyle[name];
	}
};

//定义一个变量,用来标识定时器
//var timer;
//创建一个可以执行简单动画的函数
/*
 * 参数:
 * obj:要执行动画的对象
 * attr:要执行动画的样式 比如:left top height width
 * target:执行动画的目标位置
 * speed:移动的速度(正数向右移动,负数向左移动)
 * callback:回调函数,将会在动画执行完毕后执行
 */
function move(obj, attr, target, speed, callback) {
	//关闭上一个定时器
	clearInterval(obj.timer);
	//获取元素目前的位置
	var current = parseInt(getStyle(obj, attr));
	//判断速度的正负值
	if(current > target) {
		//此时速度为负值
		speed = -speed;
	}
	//开启一个定时器,执行动画效果
	//想执行动画的对象中添加一个timer属性,保存它自己的定时器标识
	obj.timer = setInterval(function() {
		//获取box1原来的left值
		var oldValue = parseInt(getStyle(obj, attr));
		//在旧值基础上增加
		var newValue = oldValue + speed;
		//向左移动,判断newValue是否小于target
		//向右移动,判断newValue是否大于target
		if((speed < 0 && newValue < target) || (speed > 0 && newValue > target)) {
			newValue = target;
		}
		//将新值设置给obj
		obj.style[attr] = newValue + "px";
		//当obj移动到target时,停止移动
		if(newValue == target) {
			//达到目标,关闭定时器
			clearInterval(obj.timer);
			//动画执行完毕,调用回调函数
			callback && callback();
		}
	}, 30);

};