jQuery无缝轮播图思路详解-唯品会
效果图如上:
需求:图片自动轮播,鼠标移上停止播放,离开恢复播放,箭头切换图片。
html代码
<!--轮播图大盒子开始--> <div class="wrap"> <!--大盒子上部分轮播图--> <div class="wrapUp"> <ul> <li class="cur"><a href="#"><img src="images/banner/banner01.jpg" alt=""></a></li> <li><a href="#"><img src="images/banner/banner02.jpg" alt=""></a></li> <li><a href="#"><img src="images/banner/banner03.jpg" alt=""></a></li> <li><a href="#"><img src="images/banner/banner04.jpg" alt=""></a></li> </ul> <span class="btn left"><</span> <span class="btn right">></span> </div> <!--大盒子下部分标题--> <div class="wrapDown"> <ol> <li class="cur">大牌特惠</li> <li>住进北欧</li> <li>绵绵爱意</li> <li>母婴盛宴</li> </ol> <!--底部红色下划线--> <span class="line"></span> </div> </div>
CSS样式代码
<style> *{margin: 0;padding:0;list-style: none} /*设置页面图片背景*/ body{background:url("images/banner/bg.jpg")no-repeat center top;} /*大盒子样式宽高,盒子投影,内边距*/ .wrap{width: 1170px;height: 452px;background:rgba(255,255,255,0.5);margin:30px auto; padding:12px 12px 0;box-sizing:border-box;box-shadow:0 0 10px rgba(0,0,0,0.4);overflow: hidden} /*图片盒子宽高,定位样式*/ .wrapUp{width: 1146px;height: 400px;position: relative;} .wrapUp li{position:absolute;left:0;top:0;display: none;} .wrapUp .cur{display: block;} /*盒子两边箭头样式*/ .wrapUp .btn{width: 33px;height: 66px;background:rgba(0,0,0,0.2); position: absolute;color:#ffffff;font-size: 40px;line-height: 66px;text-align: center; font-family:"黑体";border-radius:5px;top:50%;transform:translateY(-50%);cursor: pointer;transition:0.3s} /*盒子左箭头样式*/ .wrapUp .left{left: -45px} .wrapUp .right{right: -45px} /*盒子移入显示*/ .wrap:hover .wrapUp .left{left:0} .wrap:hover .wrapUp .right{right:0} /*盒子不透明度变化*/ .wrapUp .btn:hover{background:rgba(0,0,0,0.4);} /*大盒子下部分标题样式*/ .wrapDown{width: 800px;height: 40px;margin:0 auto;position: relative} /*大盒子下部分内容li样式*/ .wrapDown li{width: 200px;height: 40px;font-size: 15px;line-height: 40px;float: left;text-align: center;color: #666666;position: relative;cursor: pointer} /*每个li后面的分割线样式*/ .wrapDown li:after{content:"|";position: absolute;right: 0;top:0;color: #cccccc} /*设置第一个li字样式*/ .wrapDown .cur{color:red;} /*最后一个li不需要分割线*/ .wrapDown li:last-child:after{display: none} /*底部红色下划线相对于底部盒子定位*/ .wrapDown .line{width: 200px;height: 2px;background:deeppink;left: 0;bottom:-1px;position: absolute} </style>
jQuery代码
<script> //鼠标以上通过索引值切换 //图片 //当前文字颜色 $(".wrapDown li").mouseenter(function () { //定义变量接收索引值 var index=$(this).index(); console.log(index); play(index); //根据索引值图片 /* $(".wrapUp li").eq(index).stop().fadeIn().siblings().stop().fadeOut(); //文字切换 $(".wrapDown li").eq(index).addClass("cur").siblings().removeClass("cur"); //滑动线切换 $(".line").stop().animate({left:index*200},100)*/ }); //把切换封装成一个函数 //自动播放 //定义播放 function play(aaa){ $(".wrapUp li").eq(aaa).stop().fadeIn().siblings().stop().fadeOut(); //文字切换 $(".wrapDown li").eq(aaa).addClass("cur").siblings().removeClass("cur"); //滑动线切换 $(".line").stop().animate({left:aaa*200},100) } var timer=null;//先设置个定时器timer 让值为空 var num=0;//需要有一个索引数字控制它动,初始为0 var len=$(".wrapDown li").length;//需要有一个索引值和num对比,为li的个数。 //封装自定义播放动画 function autoplay() { timer=setInterval(function () {//此处的timer是给定时器赋值 num++; if(num>len-1){num=0;} play(num); console.log(num); },1000); } //鼠标以上停止,鼠标离开调用自动播放 $(".wrap").hover(function () { clearInterval(timer); },function () { autoplay(); }); //箭头点击切换图片 $(".right").click(function () { num++; if(num>len-1){num=0;} play(num); }); $(".left").click(function () { num--; if(num<0){num=len-1;} play(num); }); </script>
html部分步骤:
1、新建大盒子,上部分包裹轮播图和底部四个标题选项和红色 下划线。
1.1轮播图div盒子部分包含两个箭头用两个span包裹。
1.2轮播图部分div用ul插入四张图。
2、大盒子下部分是标题部分。
css样式步骤分析:
版心大盒子样式
版心部分,要给高和内边距,背景色为白色半透明,盒子投影。
盒子内边距部分,给图片一个宽,增加图片的内边距后,盒子宽度增加所以要用border-box内减去。半透明背景rgba(255,255,255,0.5);
盒子投影:box-shadow:0 0 5px rgba(0,0,0,0.3) }
第一个值是水平,第二值是垂直,第三个值模糊程度,第四个值是颜色。
图片盒子样式
四张图是淡入淡出可以用绝对定位将所有图片放在一起。
给图片盒子设置图片的宽高,然后给盒子相对定位,给li绝对定位,left,top为0。显示在第一张的是最后一个li的图片,因为层级关系。
给所有li设置隐藏。给第一个li添加类名设置display显示。
箭头盒子样式
箭头span相对于图片盒子定位后宽高才可以生效,有圆角和宽高,黑色半透明。
箭头变大设置font-family:"黑体"。
箭头盒子居中top:50%和transform:translateY(-50%);X是水平偏移,Y垂直偏移
箭头盒子是在外面,鼠标进入大盒子箭头显示,.wrap:hover .wrapUp .left{left:0}意思是
鼠标进入大盒子wrap控制左边箭头。然后给箭头盒子设置过渡动画。
鼠标移上,箭头盒子不透明度变化,调整不透明值。
图片底部标题样式
根据标题数量设置盒子的宽度高度,然后用伪类元素after和定位设置每个li后面的分割线。
JS代码部分
通过底部li的索引切换图片、文字颜色和底部红色滑动线位置。
1、鼠标移入底部li,var index=$(this).index();
2、根据索引值图片切换
$(".wrapUp li").eq(index).stop().fadeIn().siblings().stop().fadeOut();
图片、绑定的索引、淡入、其它兄弟淡出
3、文字切换,第一个li文字添加样式类名
$(".wrapDown li").eq(index).addClass("cur").siblings().removeClass("cur");
4、滑动线滑动切换
$(".line").stop().animate({left:index*200},100)
往右边滑动,移动index*滑动线宽度的距离。
用户触发的一般都要加stop()
定时器自动播放
格式:
需要一个变量var Timer=null;
然后再需要一个变量var num=0;需要有一个数字控制图片动,初始为0
一共4个图,所以要num++;而且要在定时器里面做一个如果num大于索引值最大为3的判断,num就变成0,这样图片会从第一张重新开始播放。
setInterval为定时调用的函数,调用执行文字图片滑动线的切换。