Jquery轮播效果实现过程解析


Posted in Javascript onMarch 30, 2016

轮播是学习jquery开始的第二个实现的动效,也是学习时间最久的一个。在实现轮播的过程中总是会遇到各种各样的问题,请教过很多人,也多次问过度娘。今天,也不敢果敢的说,可以马上写好一个轮播。希望是通过随笔的方式,记录下一些思维过程。

首先是html结构,一个简单的轮播,单张图片无缝轮播,主要分为三大层:div>ul>li,li里面的img图片。

其次,css样式:div固定住宽高,overflow:hidden;ul的宽度建议是动态获取(下一步会讲是怎么获取);关于li我习惯使用浮动,让他们依次排列,在ul上要记得清楚浮动(clear:both)。

重要的是jquery的方法,主要有用到的有animate(),setInterval(),hover()。在写方法之前,缕清一下动效的逻辑:图片依次循环自右向左滑过,当滑完最后一张时,第一张显示,如此重复。

1、获取li的个数length和宽度width 

var len=$('li').length,
  liWidth=$('li').width,
 

因为是无缝轮播,要实现自然的过渡,我们还得做点什么,当图片滑到最后一张时,怎么样才会很自然的过渡到第一张,这个时候,如果第一张就在最后一张的后面,就可以了,所以,我们需要将第一张clone后append到li的最后

$('li:first').clone().appendTo('ul')
2、获取ul的宽度:ul的宽度等于所有li的宽度加上克隆的li的宽度

ulWidth=liWidth*(len+1)
似乎准备工作都做好了,那下一步我们就尝试让他动起来,首先想到是animate()方法:

animate( properties [, duration ] [, easing ] [, complete ] ),

第一个参数properties:css的属性和值的对象,决定动画的效果,是上下还是左右等;

第二个参数duration:完成一个动画的时间,默认是400,单位是毫秒;

第三个参数easing:动画过渡使用的缓动函数,默认是swing(linear,swing),一般不用这个参数;

第四个参数complete:是指完成动画后执行的操作。

我们的动效是自右向左,所以通过改变ul的margin-left值来实现

$('ul').animate({
  'marign-left': -liWidth*index
},3000,function(){
  if(index==len){
   index=0;
   $('ul').css({'margin-left':'0px'})
  } 
})

其中index指的是li的索引值,当li的索引值等于li的length值的时候,也就是动画执行到了最后一张,那么直接让ul的margin-left为0,li的索引值也为0。

这样还存在一个隐患,暂时不提。

下一步,当鼠标离开div的时候,图片自动播放。这是要用到hover()和setInterval()

setInterval()在W3C是这样解释的:按照指定的周期(以毫秒计)来调用函数或计算表达式。不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。

var autoPlay;
$('div').hover(function(){
  clearInterval(autoPlay); 
},function(){
  autoPlay=setInterval(function(){

$('ul').animate({

'marign-left': -liWidth*index
},3000,function(){
  if(index==len){
   index=0;
   $('ul').css({'margin-left':'0px'});

index++;
  } 
});
},3000) 
}).trigger('mouseleave');

这样,一个自动播放的功能似乎就实现了,可是我们还可以发现一个bug,第一帧停留的时间似乎有些长,为什么呢?

这个问题还是昨天得到了解决,当图片执行到最后一张时,他的index马上变为0,然后会执行两次,因此在这个判断中,我们需要当index为0时,让它自加1,index++,放到判断条件下。

还有一个问题,是昨天发现的,在这个轮播里面有两个时间,一个是动画执行时间,一个是播放时间,前者的时间一定要比后者的时间小,原因是js的执行顺序呢是自上而下的,,如果时间一致或者后者时间小于前者,那么,在这个时差里,动画将进不到判断条件里来,会一直播放,那么轮播就失败了。今天就分享到这里,下一次分享加上左右箭头和hover圆点的轮播效果。

附上完整的代码:

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>轮播</title>
  <style>
    body,p,form,input,button,dl,dt,dd,ul,ol,li,h1,h2,h3,h4{margin:0;padding:0;list-style:none;}
    body,button,input,select,textarea{font:12px Arial, Helvetica, sans-serif;color:#333;}
    input,select,textarea{font-size:100%;}
    .clearfix:after{display:block;content:".";height:0;visibility:hidden;clear:both;font-size:0;line-height:0;}
    .clearfix{*zoom:1;}
    .big-screen{width: 100%; height: 400px; overflow: hidden; margin: 40px 0;}
    .pic-list{height: 400px;}
    .pic-list li{float: left; width: 1920px; height: 400px;}
   </style>
</head>
<body>
  <div class="big-screen">
    <ul class="pic-list clearfix">
      <li>
        <a href="javascript:;">
          <img src="http://fed.yhd.cn:9000/1920x400/27ae60xfff" alt="picture" width="1920" height="400"/>
        </a>
      </li>
      <li>
        <a href="javascript:;">
          <img src="http://fed.yhd.cn:9000/1920x400/ae273axfff" alt="picture" width="1920" height="400"/>
        </a>
      </li>
      <li>
        <a href="javascript:;">
          <img src="http://fed.yhd.cn:9000/1920x400/2757aexfff" alt="picture" width="1920" height="400"/>
        </a>
      </li>
      <li>
        <a href="javascript:;">
          <img src="http://fed.yhd.cn:9000/1920x400/ae7d27xfff" alt="picture" width="1920" height="400"/>
        </a>
      </li>
    </ul>
  </div>
</body>
<script type="text/javascript" src="http://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var ul=$('.pic-list'),
      li=ul.find('li'),
      liW=li.outerWidth(true),
      liLen=li.length,
      index=0,
      autoPlay;
    li.first().clone().appendTo(ul);
    ul.css({'width':liW*(liLen+1),'margin-left':-liW*index});
    function play(){
      if(!ul.is('animated')){
        ul.stop().animate({
          'margin-left':-liW*index
        },480,function(){
          if(index>liLen){
            index=0;
            ul.css({'margin-left':-liW*index});
            index++;
          }
        });
      }
    }
    $('.big-screen').hover(function(){
      clearInterval(autoPlay);
    },function(){
      autoPlay=setInterval(function(){
        play();
        index++;
      },500)
    }).trigger('mouseleave');

})
</script>
</html>

以上就是为大家分享的jquery轮播效果完整代码,希望对大家的学习有所帮助。

Javascript 相关文章推荐
js 内存释放问题
Apr 25 Javascript
javascript天然的迭代器
Oct 29 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
May 13 Javascript
全面解析Bootstrap表单使用方法(表单样式)
Nov 24 Javascript
WebApi+Bootstrap+KnockoutJs打造单页面程序
May 16 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
Dec 13 Javascript
网页中右键功能的实现方法之contextMenu的使用
Feb 20 Javascript
基于Vue2.0的分页组件
Mar 16 Javascript
基于rem的移动端响应式适配方案(详解)
Jul 07 Javascript
react redux入门示例
Apr 19 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
Apr 26 Javascript
JS如何实现封装列表右滑动删除收藏按钮
Jul 23 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
Mar 30 #Javascript
JavaScript 经典实例日常收集整理(常用经典)
Mar 30 #Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
Mar 30 #Javascript
JavaScript 不支持 indexof 该如何解决
Mar 30 #Javascript
React.js入门学习第一篇
Mar 30 #Javascript
Node.js操作mysql数据库增删改查
Mar 30 #Javascript
基于React.js实现原生js拖拽效果引发的思考
Mar 30 #Javascript
You might like
随时给自己贴的图片加文字的php代码
2007/03/08 PHP
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
2011/07/27 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
微信小程序 canvas API详解及实例代码
2016/10/08 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
jQuery复合事件用法示例
2017/06/10 jQuery
js传递数组参数到后台controller的方法
2018/03/29 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
AngularJS实现动态切换样式的方法分析
2018/06/26 Javascript
详解vue中使用vue-quill-editor富文本小结(图片上传)
2019/04/24 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
ES11新增的这9个新特性,你都掌握了吗
2020/10/15 Javascript
python django 访问静态文件出现404或500错误
2017/01/20 Python
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
python 移除字符串尾部的数字方法
2018/07/17 Python
Django 视图层(view)的使用
2018/11/09 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
2019/08/20 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
python实现控制台输出颜色
2021/03/02 Python
夏尔巴人登珠峰品牌:Sherpa Adventure Gear
2018/02/08 全球购物
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
团员学习总结的自我评价范文
2013/10/14 职场文书
给公司的建议书范文
2014/05/13 职场文书
电子商务专业毕业生求职信
2014/06/12 职场文书
群众路线剖析材料(四风问题)
2014/10/08 职场文书