JS特效——轮播图

1.原生JS普通轮播图

效果:
在这里插入图片描述
实现:

<div class="box">
	<ul class="imgs">
		<li class="active" ><img src="imgs/kasa0.jpg" ></li>
		<li ><img src="imgs/kasa1.jpg" ></li>
		<li><img src="imgs/kasa2.jpg" ></li>
		<li><img src="imgs/kasa3.jpg" ></li>
		<li><img src="imgs/kasa4.jpg" ></li>
		<li><img src="imgs/kasa5.jpg" ></li>
		<li><img src="imgs/kasa6.jpg" ></li>
		<li><img src="imgs/kasa7.jpg" ></li>
	</ul>
	<ul class="dots">
		<li class="active" value="0"></li>
		<li value="1"></li>
		<li value="2"></li>
		<li value="3"></li>
		<li value="4"></li>
		<li value="5"></li>
		<li value="6"></li>
		<li value="7"></li>
	</ul>
	<div class="next">
		<span><</span>
		<span>></span>
	</div>
</div>
*{
	padding:0;
	margin: 0;
}
li{
	list-style: none;
}
a{
text-decoration: none;
}
div.box{
	width: 1100px;
	height: 550px;
	margin: 20px auto;
	border: 2px solid purple;
	position: relative;
}
div.box>ul.imgs>li img{
	width: 1100px;
	height: 550px
}
div.box>ul.imgs>li{
	position: absolute;
	display: none;
}

.box .imgs .active{
	display: block;
}
div.box>ul.dots{
	display: flex;
	position: absolute;

	right: 100px;
	bottom: 10px;
}
div.box>ul.dots>li{
	margin: 10px;
	width: 10px;

	height: 10px;
	background-color: white;
	border-radius: 50%;
}
div.box>ul.dots>li.active{
	background-color: #dc18c3;
}

div.box> .next>span{
	position: absolute;
	display: block;
	width: 40px;
	height: 80px;
	color: white;
	text-align: center;
	background-color: rgba(0,0,0,0.5);
	line-height: 80px;
	font-size: 20px;
}
div.box> .next>span:first-child{
	left: 0;
	top: 230px;
}
div.box> .next>span:last-child{
	right: 0;
	top: 230px;
}
var num=0;
var imgList=document.querySelectorAll('.imgs li');
var dotList=document.querySelectorAll('.dots li');
var box=document.querySelector('.box');
var span=document.querySelectorAll('.next span');

function run(){
	for(var k=0;k<imgList.length;k++){
		imgList[k].removeAttribute('class')
		dotList[k].removeAttribute('class')
	}
	num++
	var n=num%imgList.length
	imgList[n].setAttribute('class','active')
	dotList[n].setAttribute('class','active')
		//console.log(n)
}

var time=setInterval(function(){
	run()
},1000)

//鼠标移入暂停循环图片
box.onmouseover=function(){
	clearInterval(time)
}

box.onmouseout=function(){
	time=setInterval(function(){run()},1000)
}

//点击小圆点
for(var l=0;l<dotList.length;l++){
	dotList[l].onclick=function(){
	console.log(this.value)
	num=this.value-1
	run()
	}
}

//上下一张
span[0].onclick=function(){
	console.log('num:'+num)
	if(num<=0){
		num=imgList.length-2
	}else{
		num-=2
	}
	run()
}	
span[1].onclick=function(){
	run()
}

将上例修改为用jQuery编写:

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
	var num=0
	var imgList=$('.imgs li')
	var dotsList=$('.dots li')
	var span=$('.next span')
	var time;
	
	function run(){
		num++
		num%=imgList.length
		//图片动
		imgList.eq(num).siblings().removeAttr("class")
		imgList.eq(num).attr({class:"active"})
		//小圆点动
		dotsList.eq(num).siblings().removeAttr("class")
		dotsList.eq(num).attr({class:"active"})
	}
	
	//图片轮播
	time=setInterval(run,1000)
	
	//鼠标移入暂停轮播
	$('.box').mouseenter(function(){
		clearInterval(time)
	})
	$('.box').mouseleave(function(){
		time=setInterval(run,1000)
	})
	
	//点击小圆点
	dotsList.click(function(){
		//获取当前点击远点的属性value的值
		num=$(this).index()-1
		run()
	})
	//点击上下张
	span.eq(0).click(function(){
		if(num<=0){
			num=imgList.length-2
		}else{
			num-=2
		}
		run()
	})
	span.eq(1).click(function(){
		run()
	})
	
})
</script>

2.原生JS无缝轮播

效果:


实现:

<div class="warp">
	<div class="imglength">
		<img src="imgs/kasa0.jpg" >
		<img src="imgs/kasa1.jpg" >
		<img src="imgs/kasa2.jpg" >
		<img src="imgs/kasa3.jpg" >
		<img src="imgs/kasa0.jpg" >
	</div>
</div>
.warp{
		position: relative;
		width: 800px;
		height: 400px;
		margin:  50px auto;
		overflow: hidden;
	}
	.imglength{
		display: flex;
		width: 500%;
		height: 400px;;
		position: absolute;
		left: 0;
	}
	img{
		display: block;
		width: 800px;
		height: 400px;
	}
var imglength=document.querySelector('.warp .imglength')
	var timer
	var sideleft;
	var side=0;
	
function run(){
	side-=8
	imglength.style.left=side+'px'
	if(side<=-800*4){
		side=0
	}
	if(side%800==0){
		clearInterval(timer)
		setTimeout(function(){
			timer= setInterval(run,10)
		},1000)
	}
}
timer= setInterval(run,10)

3.jQuery无缝轮播图

效果:

实现方式一:(注意本方法布局时多加了一张初始图片)

<div class="warp">
	<div class="imglength">
		<img src="imgs/kasa0.jpg" >
		<img src="imgs/kasa1.jpg" >
		<img src="imgs/kasa2.jpg" >
		<img src="imgs/kasa3.jpg" >
		<img src="imgs/kasa0.jpg" >
	</div>
	<div class="dot">
		<ul>
			<li class="active">1</li>
			<li>2</li>
			<li>3</li>
			<li>4</li>
		</ul>
	</div>
</div>
.warp{
	position: relative;
	width: 800px;
	height: 400px;
	margin:  50px auto;
	overflow: hidden;
	
}
.imglength{
	display: flex;
	width: 500%;
	height: 400px;;
	position: absolute;
	left: 0;
}

img{
	
	display: block;
	width: 800px;
	height: 400px;
}
.warp ul {
	position: absolute;
	z-index: 10;
	list-style: none;
	display: flex;
	bottom: 10px;
}
.warp ul li{
	background-color: #1f0b2c;
	margin: 5px;
	width: 14px;
	height: 14px;
	font-size: 12px;
	text-align: center;
	color: white;
	line-height: 14px;
	border-radius: 50%;
}
.warp ul li.active{
	background-color: #a51dbd;
	color: #faf6ff;
}
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
	var side=0;
	var timer;
	var i=0;
	timer=setInterval(run,2000)
	 
	function run(){
		if(side<=-800*4){
			side=0
			//到达边界值时,立即完成当前动画
			$('.warp .imglength').animate({left:side+'px'},1000).stop(true,true)
		}
		side-=800;
		//先让图片滚动起来
		$('.warp .imglength').animate({left:side+'px'},1000)
		
		//设置小圆点跟随图片
		i++
		i%=$('ul li').length
		$('ul li').eq(i).addClass('active').siblings().removeClass('active')
	}
})
</script>

方法二:(布局同方法一)

$(function(){
	var i=0;
	var side=0;
setInterval(function(){
	i++
	$('.imglength').animate({left:-$('.imglength img').width()*i+'px'},500,function(){
		if(i>=$('.imglength img').length-1){
			i=0
			$('.imglength').css({left:'0px'})
		}
		
		//小圆点
		$('ul li').eq(i).addClass('active').siblings().removeClass('active')
	})
},2000)
})

方法三:(布局略有不同,此时没有要多的初始图片)

本方法的主要思路为:在图片轮播到第三张时,把第一张图append到盒子最后一张去,这时就能够实现每次切换图片时只是在切换最后两张的位置。

<div class="warp">
	<div class="imglength">
		<img src="imgs/kasa0.jpg" >
		<img src="imgs/kasa1.jpg" >
		<img src="imgs/kasa2.jpg" >
		<img src="imgs/kasa3.jpg" >
	</div>
	<div class="dot">
		<ul>
			<li class="active">1</li>
			<li>2</li>
			<li>3</li>
			<li>4</li>
		</ul>
	</div>
</div>
$(function(){
	var i=0;
	var side=0;
	var num=0setInterval(function(){
	i++
	$('.imglength').animate({left:-$('.imglength img').width()*i+'px'},500,function(){
		if(i>=3){
			i=2
			
			// 控制后面两个交替
			$('.imglength').append($('.imglength img').eq(0))
			$('.imglength').css({left:-$('.imglength img').width()*i+'px'})
		}
		
		//小圆点
		num++
		num%=$('.imglength img').length
		$('ul li').eq(num).addClass('active').siblings().removeClass('active')
	})	
},2000)
})

方法四:(此方法与方法三类似,只不过是切换第一二张图)

$(function(){
	var i=0;
	var side=0;
	var num=0;
setInterval(function(){
	i++
	$('.imglength').animate({left:-$('.imglength img').width()*i+'px'},500,function(){
			i=0
			
			// 控制后面两个交替
			$('.imglength').append($('.imglength img').eq(0))
			$('.imglength').css({left:-$('.imglength img').width()*i+'px'})
		
		//小圆点
		num++
		num%=$('.imglength img').length
		$('ul li').eq(num).addClass('active').siblings().removeClass('active')
	})	
},2000)
})

4.jQuery淡入淡出轮播图

效果:

<!-- 轮播图 -->
<div class="swiper">
	<div class="imgs">
		<img src="imgs/index/nav0.jpg" >
		<img src="imgs/index/nav1.jpg" >
		<img src="imgs/index/nav2.jpg" >
		<img src="imgs/index/nav3.jpg" >
	</div>
	<div class="dots">
		<div>
			<p class="active"></p>
			<p></p>
			<p></p>
			<p></p>
		</div>
	</div>
</div>
/* 轮播图 */
 .swiper{
	width: 1518px;
	height:522px;
	margin: 0 auto;
	position: relative;
}
 .swiper .imgs img{
	 position: absolute;
	 width: 1518px;
	 height:522px;
	 opacity: 0;
 }
.swiper .imgs img:first-child{
	opacity: 1;
}
.swiper .dots{
	position: absolute;
	width: 100%;
	height: 50px;
	display: flex;
	justify-content: center;
	align-items: center;
	bottom: 0;
}
.swiper .dots div{
	width: 100px;
	display: flex;
	justify-content: space-evenly;
}
.swiper .dots p{
	width: 15px;
	height: 15px;
	border-radius: 50%;
	background: #f9f9f9;
}
.swiper .dots .active{
	background: #40a944;
}
//控制轮播图
$(function(){
	var num=0
	var timer
	
	timer=setInterval(function(){
		//计数,dots跟着变化
		num++
		num%=$('.swiper .imgs img').length
		$('.swiper .dots p').eq(num).addClass('active').siblings().removeClass('active')
		$('.swiper .imgs img').eq(1).animate({opacity:'1'},1500,function(){
			//第二张图片显示完之后,把第一张append到最后去
			$('.swiper .imgs img').eq(1).siblings().css({opacity:'0'})
			$('.swiper .imgs').append($('.swiper .imgs img').eq(0))
		})
	},3000)
	
})

5.jQuery实现炫酷轮播图

效果:

该轮播图的实现过程比较复杂,先分析一下需要实现的有哪些功能:

  1. 首先布局3张图放一个大盒子,用定位布局成效果中的样子
  2. 理解图片顺时针动起来的原理:图1到最后,图2到最前,图3到中间切z-index值最大
  3. 通过animate实现图片顺时针循环转动转动,逆时针是同理的
  4. 接下来就实现左右两边的点击切换特效
  5. 最后一步是最麻烦的,需要实现的功能是:每一次切换图片之后,都只能让中间的图片有a标签的点击跳转界面的作用
  6. 有了上面的思路之后,就可以开始编码了
<div class="top_swipper">
	<div class="top_header">
		<p>精挑细选</p>
	</div>
	<div class="imgsBox">
		<div><img src="../imgs/morestuff/stuffswipper01.png" ></div>
		<div><a href="details.html"><img src="../imgs/morestuff/stuffswipper02.png" ></a></div>
		<div><img src="../imgs/morestuff/stuffswipper03.png"></div>
	</div>
	<div class="imgsider">
		<p><</p>
		<p>></p>
	</div>
</div>
.top_swipper{
	width: 1200px;
	height: 500px;
	position: relative;
}
.top_header{
	height: 60px;
	font-size: 20px;
	text-align: center;
	line-height: 60px;
}

.imgsider p{
	position: absolute;
	top: 230px;
	z-index: 6;
	font-size: 20px;
	width: 40px;
	height: 40px;
	line-height: 40px;
	border-radius: 50%;
	text-align: center;
	background-color: rgba(255, 255, 255, 0.3);
	box-shadow: 1px 2px 30px rgba(0,0,0,0.1);
	color: #40a944;	
}
.imgsider p:hover{
	background-color: rgba(64, 169, 68, 0.7);
	box-shadow: 1px 2px 30px rgba(0,0,0,0.5);
	color: #ffffff;	
}
.imgsider p:last-child{
	right: 0;
}

.top_swipper .imgsBox{
	width: 1200px;
	height: 400px;
	position: relative;
}
.top_swipper .imgsBox div{
	position: absolute;
}

.top_swipper .imgsBox div img{
	box-shadow: 1px 2px 20px rgba(0,0,0,0.2);
}
.top_swipper .imgsBox div:first-child{
	left: 0;
	z-index: 2;
}
.top_swipper .imgsBox div:nth-child(2){
	left: 100px;
	z-index: 5;
}
.top_swipper .imgsBox div:last-child{
	right: 0;
	z-index: 2;
}
// 控制轮播图
$(function(){
//全局变量a标签和定时器timer
var a
var timer

// 逆时针转动
function runClockwise(){
	$('.imgsBox div').eq(0).animate({left:200+'px'},500)
	$('.imgsBox div').eq(1).animate({zIndex:2,left:0},500,function(){
		//每次移动后要移除当前的a标签
		$(this).append($(this).children().children())
		a=$(this).children().eq(0)
		$(this).children().eq(0).remove()
	
	})
	$('.imgsBox div').eq(2).css({}).animate({zIndex:5,left:100+'px'},500,function(){
			//给该盒子追加a标签
			$(this).append(a)
			// 再把当前图片追加到新建的a标签中
			$(this).children().eq(1).eq(0).append($(this).children().eq(0))
	})
	$('.imgsBox').append($('.imgsBox div').eq(0))
}
// 顺时针转动
function runAnticlockwise(){
	$('.imgsBox div').eq(1).animate({zIndex:2,left:200+'px'},500,function(){
		//每次移动后要移除当前的a标签
		$(this).append($(this).children().children())
		a=$(this).children().eq(0)
		$(this).children().eq(0).remove()
	})
	
	$('.imgsBox div').eq(0).animate({zIndex:5,left:100+'px'},500,function(){
		// 给该盒子追加a标签
		$(this).append(a)
		// 再把当前图片追加到新建的a标签中
		$(this).children().eq(1).eq(0).append($(this).children().eq(0))
	})
	
	$('.imgsBox div').eq(2).css({}).animate({zIndex:2,left:0},500)
	$('.imgsBox').prepend($('.imgsBox div').eq(2))
}


timer=setInterval(runAnticlockwise,3000)


$('.imgsBox ').mouseenter(function(){
	clearInterval(timer)
})
$('.imgsBox ').mouseleave(function(){
	timer=setInterval(runClockwise,3000)
})

$('.imgsider p').eq(0).click(function(){
	runAnticlockwise()
	//阻止连续点击出现的bug
	$(this).hide()
	setTimeout(function(){
		$('.imgsider p').eq(0).show()
	},1000)
	
})
$('.imgsider p').eq(1).click(function(){
	runClockwise()
	//阻止连续点击出现的bug
	$(this).hide()
	setTimeout(function(){
		$('.imgsider p').eq(1).show()
	},1000)
})

})

6,总结

从原生JS的转到用jQuery来编写轮播图的特效,我们是在将一个实现起来比较麻烦的功能,逐渐地改良得书写起来更加简单。但是在通过jQuery注重逻辑性的编写的过程中,我们也可以将轮播图的特效写的更加的华丽,多样。总的来说,不管是哪种轮播图的实现都是基于我们写的第一版原生JS 来进行改良,优化的。只要我们在写之前慢慢分析需要实现的特效功能,再按部就班的编写,那么不管是什么轮播图,我们都可以将它实现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值