HTML之轮播

最近学了网页多张图片的轮播,图片轮播对于大多数网页来说是必不可少的。

04e0cb65610d0c22ee5f7aeeb5f3d9b1059.jpg

要实现的效果是:按下前、后按钮,显示的图片改变,按下 1 2 3 4 按钮会显示对应的图片,当鼠标移到图片外面,图片在每隔一定时间就变成另一张。

大概思路:

1.创建ul下4个li标签放到div标签,li标签里面放img标签,用于存放照片,创建另外1个ul下四个li标签放到同个div标签里,用于做底部的按钮。

    <div id="slider">
		<ul id="list">
			<li id='item'><img src="./imgs/1.jpg" alt=""</li>
			<li id='item'><img src="./imgs/2.jpg" alt=""</li>
			<li id='item'><img src="./imgs/3.jpg" alt=""</li>
			<li id='item'><img src="./imgs/4.jpg" alt=""</li>
		</ul>
		<button type="button" class="prev">prev</button>
		<button type="button" class="next">next</button>
		<ul id="block">
			<li class="bullet focus">1</li>
			<li class="bullet">2</li>
			<li class="bullet">3</li>
			<li class="bullet">4</li>
		</ul>
	</div>

然后给个个标签加上CSS样式

把ul标签的默认样式去掉

ul{
	list-style: none;
}
           #slider{//设置DIV样式
				width: 700px; 
				height: 330px;
				border: 5px solid red;
				position: relative;
			}
			#slider #list #item{ //设置存照片的li的样式
				position: absolute;
				left: 70px;
				top:50px;
				opacity: 0;//透明度设为0
			}
			#slider #list #item:first-of-type{
				opacity: 1;//第一张图片的透明度设为1,这样全部图片就只显示第一张。
			}
			#slider .prev, #slider .next{//设置“下一张”按钮的样式
				position: absolute;
				top: 150px;
				
			}
			#slider .next{
				right:0;//right设为0,将“下一张”按钮放到DIV右边框左边缘
			}
			#block .bullet{//设置4个按钮块的样式
				width: 50px;
				height: 50px;
				margin-left: 5px;
				position: relative;
				border: 2px solid #000000;
				float: left;
				top: 300px;
				left: 250px;
				cursor: pointer; /*光标放上去会变成一只手*/
				line-height: 50px;
				text-align: center;
			}
			#block .bullet.focus{//设置选中的按钮块样式
				background-color: #FF0000;
			}

做好这些准备后,接下来就是写JS代码实现轮播。

在此之前,要先屡清楚,想让JS代码实现什么? 实现图片的转换,就是点击按钮要显示对应的图片,实质是将要显示的图片的透明度置为1,将当前的图片透明度置为0。

先定义一个函数,用来获取到保存图片的标签的样式(浏览器兼容性问题)

function getStyle(el, property){//el为标签对象,property为el对应style的属性
	if(getComputedStyle){
		return getComputedStyle(el)[property];
	}else{
		return el.currentStyle[property];
	}
}

接下来写让图片显示和消失(opacity=0||1)的函数

function animate(el, properties ){//el为标签对象,properties对象有多个修改el标签style的属性
	
	clearInterval(el.timerId);// 清除定时器,防止重复调用造成的元素越来越快
	el.timerId = setInterval(function(){//定义一个定时调用的函数
		
		for(var property in properties){遍历properties的属性
			var current = null;
			var target = properties[property];//获取要修改的property;
			if(property === 'opacity'){//如果属性是opacity就将当前的opacity值扩大100倍,方便运算(opacity取值只在0到1之间)
				current = Math.round(parseFloat(getStyle(el,'opacity'))*100);
			}else{//要修改的属性不是opacity
				current = parseInt(getStyle(el,property));
			}
			var speed = (target - current) /30;//设置变化的速度
			speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);//设置这条语句是为了避免speed在-1到1以内直接变为0
			if(property === 'opacity'){
				el.style.opacity = (current + speed) / 100;
			}else{
				el.style[property] = current + speed + 'px';
			}	
		}
	},20)	
}

完成这部分JS代码后,我们来实现按按钮实现图片的转换:

创建一个立即执行函数(function(){})()

首先我们要有变量来保存当前图片和下一张图片:prevIndex, nextIndex,保存有多少张照片的变量:len

var prevIndex, nextIndex,len;

接下来写图片变换的函数slidePrev(),slideNext(),slideTo(prev , next)

function slideNext(){
	prevIndex = nextIndex;
	nextIndex++;
	if(nextIndex === len ){
	nextIndex = 0;
	}
	slideTo(prevIndex, nextIndex);
}
function slidePrev(){
	prevIndex = nextIndex;//记录当前照片
	nextIndex--;//next索引指向上一张照片
	if(nextIndex === -1 ){如果索引超出第一张照片,就转到最后一张
	nextIndex =len-1;
	}
	slideTo(prevIndex, nextIndex);
}
function slideTo(prev , next){
	var lis = document.querySelectorAll('#list #item');//获取所有存照片的li标签
	animate(lis[prev],{opacity:0});//将存当前照片的li标签透明度设为0
	animate(lis[next],{opacity:100});//将存要显示的照片的li标签透明度设为1
}

然后在立即执行函数定义函数 init(),用来执行点击prev、next按钮的操作

function init(){
	prevIndex = nextIndex = 0;//初始化照片的定位,当前为第一张
	len = document.querySelectorAll('#list #item').length;
			//上一张图片
	document.querySelector('.prev').onclick = function(){
		slidePrev();
	}
			//上一张图片
	document.querySelector('.next').onclick = function(){
		slideNext();
	}
}

接下来实现点击小方块显示对应图片:效果是点击对应方块会变色,并且显示对应照片;上面我们已经将第一个小方块的classname设为bullet focus,只要将点击的方块的classname设为bullet focus,然后其他小方块classname设为bullet就行了。在init()函数内添加代码:

var bullets = document.querySelectorAll('#block .bullet');//获取全部小方块
	//点击方框切换图片
for(var i=0;i<bullets.length;i++){//遍历所有小方块
    bullets[i].index = i;//记录小方块对应的图片
    bullets[i].onclick = function(){//点击后执行slideTo函数,显示点击小方块对应的图片
        prevIndex = nextIndex;
        nextIndex = this.index;
        slideTo(prevIndex,nextIndex);
    }
}

然后要在slideTo()函数中处理点击后将点击的小方块设为选中:

var bullets = document.querySelectorAll('#block .bullet');
bullets[prev].className = 'bullet';//取消当前的小方块的焦点
bullets[next].className = 'bullet focus';设置点击的小方块为焦点

设置完后基本功能就实现了,就差自动轮播效果:

var id;
function auto(){
	clearInterval(id);
	id = setInterval(function(){
	    slideNext();
	},2000)
}
function stop(){
	clearInterval(id);
}

实现自动轮播的功能,之后在init()函数中调用auto()就行了,此外我们可以实现鼠标停在图片上停止轮播,移出图片后轮播,在init()中添加

var slider = document.querySelector('#slider');
slider.onmouseover = function(){
	stop();
}
	var cu=0;
slider.onmouseout = function(){
	auto();
}
	//自动轮播
auto();

至此,所有功能全部实现。

轮播.html代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>轮播</title>
		<style type="text/css">
			*{
				margin: 0;
				padding: 0;
			}
			ul{
				list-style: none;
			}
			
			#slider{
				width: 700px;
				height: 330px;
				border: 5px solid red;
				position: relative;
			}
			#slider #list #item{
				position: absolute;
				left: 70px;
				top:50px;
				opacity: 0;
			}
			#slider #list #item:first-of-type{
				opacity: 1;
			}
			#slider .prev, #slider .next{
				position: absolute;
				top: 150px;
				
			}
			#slider .next{
				right:0;
			}
			#block .bullet{
				width: 50px;
				height: 50px;
				margin-left: 5px;
				position: relative;
				border: 2px solid #000000;
				float: left;
				top: 300px;
				left: 250px;
				cursor: pointer; /*光标放上去会变成一只手*/
				line-height: 50px;
				text-align: center;
			}
			#block .bullet.focus{
				background-color: #FF0000;
			}
		</style>
	</head>
	<body>
		<div id="slider">
			<ul id="list">
				<li id='item'><img src="./imgs/1.jpg" alt=""</li>
				<li id='item'><img src="./imgs/2.jpg" alt=""</li>
				<li id='item'><img src="./imgs/3.jpg" alt=""</li>
				<li id='item'><img src="./imgs/4.jpg" alt=""</li>
			</ul>
			<button type="button" class="prev">prev</button>
			<button type="button" class="next">next</button>
			<ul id="block">
				<li class="bullet focus">1</li>
				<li class="bullet">2</li>
				<li class="bullet">3</li>
				<li class="bullet">4</li>
			</ul>
		</div>
		<script src="animate.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			(function (){
				var prevIndex, nextIndex;
				var len;
				var id;
				init();
				function init(){
					prevIndex = nextIndex = 0;
					len = document.querySelectorAll('#list #item').length;
					//上一张图片
					document.querySelector('.prev').onclick = function(){
						slidePrev();
					}
					//上一张图片
					document.querySelector('.next').onclick = function(){
						slideNext();
					}
					var bullets = document.querySelectorAll('#block .bullet');
					//点击方框切换图片
					for(var i=0;i<bullets.length;i++){
						bullets[i].index = i;
						bullets[i].onclick = function(){
							prevIndex = nextIndex;
							nextIndex = this.index;
							slideTo(prevIndex,nextIndex);
						}
					}
					var slider = document.querySelector('#slider');
					
					slider.onmouseover = function(){
						stop();
					}
					var cu=0;
					slider.onmouseout = function(){
						auto();
						cu++;
						console.log(cu);
						
					}
					//自动轮播
					auto();
				}
				function slidePrev(){
					prevIndex = nextIndex;
					nextIndex--;
					if(nextIndex === -1 ){
						nextIndex =len-1;
					}
					slideTo(prevIndex, nextIndex);
				}
				function slideNext(){
					prevIndex = nextIndex;
					nextIndex++;
					if(nextIndex === len ){
						nextIndex = 0;
					}
					slideTo(prevIndex, nextIndex);
				}
				function slideTo(prev , next){
					
					var bullets = document.querySelectorAll('#block .bullet');
					var lis = document.querySelectorAll('#list #item');
					
					bullets[prev].className = 'bullet';
					bullets[next].className = 'bullet focus';
					
					animate(lis[prev],{opacity:0});
					animate(lis[next],{opacity:100});
				}
				
				function auto(){
					clearInterval(id);
					id = setInterval(function(){
						slideNext();
					},2000)
				}
				function stop(){
					clearInterval(id);
				}
			})()
		</script>
	</body>
</html>

 

转载于:https://my.oschina.net/u/4069817/blog/3029995

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值