目录
jQ实现轮播
思路:
1.轮播图在网页内运用的非常常见。今天我就来总结一下jQ轮播图。
2.我们通常将img套在ul li中,放在一个大的div中,并放在页面的固定位置。我们可以加大ul的宽度,并让li浮动起来(如果你是上下移动,就加大ul的高度),我们让ul移动,带着li移动,而不是只让li移动。
3.当ul超出div的部分,我们就隐藏,那么问题来了,我们赢该怎样隐藏超出div的部分呢?哈哈!!相信聪明的你一定想起来怎样隐藏了, 对!!! 就是在div中设置他的overflow:hidden 。
4.这样我们就是基本的思路了。至于轮播图的两耳和下方的1 2 3 4·····,这个不难吧!!
jQ思路:
前面已经说了,要用ul带动li的方式来实现移动,那么我们当然要先获取ul了, 通过父相子绝的定位方式,调节子元素的left值,来完成轮播图。
用定时器setInterval()自动的该变图片的left(或top),的值 。 那么问题又来了。当移动到最后一张咋办?直接到达第一张图?NO!!!! NO!! NO!!!! ,那样真的太难看了。我们要在最后一个图片下面设置一个猫腻图,把第一张图片在复制一个放下最后一张的下面,当轮播到猫腻图,我们就瞬移到最前面,这样我们就能“欺骗”大众的眼睛。
$(function () {
var obtn = $('.nav ol li');
var oul = $('.nav ul');
var oli = oul.find('li');
var flag =false;//这个暂时没有
/*当前显示图片的*/
var iNow = 0;//设置图片的初始是第一个图片
console.log(obtn.size());//打印现在图片的总个数
//注册当点击下面序号的事件
obtn.click(function () {
iNow = $(this).index();
tab();
});
//启用定时器
var timer =null;
timer = setInterval(function () {
iNow++;
tab()
},2000);
//注册鼠标移入事件
$('.nav').mouseenter(function () {
clearInterval(timer);
$(".nav-l").css("display","block");
$(".nav-r").css("display","block");
});
//注册鼠标移出事件
$(".nav").mouseleave(function () {
$(".nav-l").css("display","none");
$(".nav-r").css("display","none");
timer = setInterval(function () {
iNow++;
tab()
},2000);
});
//注册右耳的点击事件
$('.nav-r').click(function () {
// iNow++;
// tab()
//改变信号量
iNow++;
obtn.attr("class",'').eq(iNow).attr("class",'active');
if(iNow==obtn.size()) {
obtn.eq(0).attr('class', 'active');
}
if(iNow>obtn.size()){
//让其展示第一张图片
iNow =0;
}
flag =true;
oul.stop(true,true).animate({
//该对象描述的是动画的目标值
left: -520 *iNow
},500,function () {
//动画执行完毕执行
if(iNow == obtn.size()){
flag=false;
oul.css("left",0);
iNow=0;
}
});
});
//注册左侧的点击事件
$('.nav-l').click(function () {
// iNow--;
// obtn.attr("class",'').eq(iNow).attr("class",'active');
// if(iNow==obtn.size()){
// obtn.eq(0).attr('class','active');
// }
// oul.animate({
// left:-520*iNow
// },500,function () {
// //判断是否是最后一张图片
// if(iNow<=0){
// iNow = obtn.size();
// oul.css("left",-520*iNow);
// }
// });
iNow--;
obtn.attr("class",'').eq(iNow).attr("class",'active');
if(iNow==obtn.size()) {
obtn.eq(0).attr('class', 'active');
}
if(iNow<0){
oul.css('left',-520*obtn.size());
//改变信号量
iNow = obtn.size()-1;
}
oul.stop(true,true).animate({
left:-520*iNow
},500);
});
//设置自动滚动的函数,增加复用性
function tab() {
//让序号跟着移动
obtn.attr("class",'').eq(iNow).attr("class",'active');
if(iNow==obtn.size()){
obtn.eq(0).attr('class','active');
}
oul.animate({
left:-520*iNow
},500,function () {
//判断是否是最后一张图片
if(iNow==obtn.size()){
iNow = 0;
oul.css("left",0);
}
});
}
});
关于轮播图加快点击bug问题
我的解决办法是在动画的animate()前加上一个stop(true,true)来防止由于加快点击出现的bug。
源码记录
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jQ轮播图</title>
<style>
*{
margin: 0;
padding: 0;
}
.nav{
position: relative;
width: 520px;
height: 280px;
margin: 100px auto;
/*border: 1px solid red;*/
overflow: hidden;
}
.nav ul{
position: absolute;
top: 0;
left: 0;
width: 9999px;
height: 280px;
}
.nav li{
float: left;
list-style: none;
}
.nav li img{
width: 520px;
height: 280px;
}
.nav-l{
position: absolute;
display: none;
top: 50%;
left: 0;
width: 20px;
height: 20px;
transform: translateY(-50%);
background-color: rgba(0,0,0,.2);
z-index: 1;
cursor: pointer;
text-align: center;
}
.nav-r{
position: absolute;
display: none;
top: 50%;
right: 0;
width: 20px;
height: 20px;
transform: translateY(-50%);
background-color: rgba(0,0,0,.2);
z-index: 1;
cursor: pointer;
text-align: center;
}
.nav ol{
position: absolute;
bottom: 5px;
right: 5px;
}
.nav ol li{
float: left;
width: 20px;
text-align: center;
margin-right: 7px;
display: inline;;
cursor: pointer;
background-color: #fcf2cf;
border: 1px solid #f47500;
}
.active{
/*padding: 3px 8px;*/
font-weight: bold; color: #0080db;
background-color: #0080db;
position: relative;
bottom: 2px;
color: red;
}
</style>
<script type="text/javascript" src="http://libs.baidu.com/jquery/2.0.0/jquery.js"></script>
<script>
$(function () {
var obtn = $('.nav ol li');
var oul = $('.nav ul');
var oli = oul.find('li');
var flag =false;
/*当前显示图片的*/
var iNow = 0;
console.log(obtn.size());
obtn.click(function () {
iNow = $(this).index();
tab();
});
//启用定时器
var timer =null;
timer = setInterval(function () {
iNow++;
tab()
},2000);
//注册鼠标移入事件
$('.nav').mouseenter(function () {
clearInterval(timer);
$(".nav-l").css("display","block");
$(".nav-r").css("display","block");
});
//注册鼠标移出事件
$(".nav").mouseleave(function () {
$(".nav-l").css("display","none");
$(".nav-r").css("display","none");
timer = setInterval(function () {
iNow++;
tab()
},2000);
});
$('.nav-r').click(function () {
// iNow++;
// tab()
//改变信号量
iNow++;
obtn.attr("class",'').eq(iNow).attr("class",'active');
if(iNow==obtn.size()) {
obtn.eq(0).attr('class', 'active');
}
if(iNow>obtn.size()){
//让其展示第一张图片
iNow =0;
}
flag =true;
oul.stop(true,true).animate({
//该对象描述的是动画的目标值
left: -520 *iNow
},500,function () {
//动画执行完毕执行
if(iNow == obtn.size()){
flag=false;
oul.css("left",0);
iNow=0;
}
});
});
$('.nav-l').click(function () {
// iNow--;
// obtn.attr("class",'').eq(iNow).attr("class",'active');
// if(iNow==obtn.size()){
// obtn.eq(0).attr('class','active');
// }
// oul.animate({
// left:-520*iNow
// },500,function () {
// //判断是否是最后一张图片
// if(iNow<=0){
// iNow = obtn.size();
// oul.css("left",-520*iNow);
// }
// });
iNow--;
obtn.attr("class",'').eq(iNow).attr("class",'active');
if(iNow==obtn.size()) {
obtn.eq(0).attr('class', 'active');
}
if(iNow<0){
oul.css('left',-520*obtn.size());
//改变信号量
iNow = obtn.size()-1;
}
oul.stop(true,true).animate({
left:-520*iNow
},500);
});
function tab() {
obtn.attr("class",'').eq(iNow).attr("class",'active');
if(iNow==obtn.size()){
obtn.eq(0).attr('class','active');
}
oul.animate({
left:-520*iNow
},500,function () {
//判断是否是最后一张图片
if(iNow==obtn.size()){
iNow = 0;
oul.css("left",0);
}
});
}
});
</script>
</head>
<body>
<div class="nav" >
<div class="nav-l" id="nav-l"><</div>
<div class="nav-r" id="nav-r">></div>
<ul>
<li><img src="images/nav1.jpg" alt=""></li>
<li><img src="images/nav2.jpg" alt=""></li>
<li><img src="images/nav3.jpg" alt=""></li>
<li><img src="images/nav4.jpg" alt=""></li>
<li><img src="images/nav5.jpg" alt=""></li>
<li><img src="images/nav1.jpg" alt=""></li>
</ul>
<ol>
<li class="active">1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ol>
</div>
</body>
</html>
ps:可能某些地方还有小bug,以后有时间再看看吧,毕竟比较忙