jQuery插件实现图片轮播特效


Posted in Javascript onJune 16, 2016

好了废话不多说了,先看看效果图。

 jQuery插件实现图片轮播特效

HTML部分: 

<div class="slider">
 <div class="ul-box">
  <ul>
  <li><a href="javascript:;"><img src="img/1.jpg"/></a></li>
  <li><a href="javascript:;"><img src="img/2.jpg"/></a></li>
  <li><a href="javascript:;"><img src="img/3.jpg"/></a></li>
  <li><a href="javascript:;"><img src="img/4.jpg"/></a></li>
  <li><a href="javascript:;"><img src="img/5.jpg"/></a></li>
  <li><a href="javascript:;"><img src="img/6.jpg"/></a></li>
  </ul>
 </div>
 <div class="mask"></div>
 <div class="prev"><img src="img/btn_l.png"/></div>
 <div class="next"><img src="img/btn_r.png"/></div>
 </div>
 <script src="js/jquery-1.11.3.js"></script>
 <script src="js/slider.js"></script>
 <script>
 $('.slider').slider({
  width : 640, 
  height : 270, 
  during : 2000, //动画执行间隔
  speed : 500, //动画速度
  btnSize : 20, //底部遮罩层的按钮大小
  btnSpace : 10, //底部的按钮间隙
  direction : 1 //轮播方向默认为1,图片向左移动
 });
 </script>

CSS部分: 

*{
 margin: 0;
 padding: 0;
 box-sizing: border-box;
}
.slider{
 position: relative;
 overflow: hidden;
}
.slider ul{
 list-style: none;
 float: left;
}
.slider ul li{
 float: left;
}
.slider .mask{
 position: absolute;
 bottom: 0;
 width: 100%;
 background-color: rgba(0, 0, 0, .3);
}
.slider .mask .sliderBtn{
 position: absolute;
 border-radius: 50%;
 background-color: #fff;
 cursor: pointer;
 background: radial-gradient(white 20%, transparent 50%);
}
.slider .prev, .slider .next{
 position: absolute;
 width: 45px; 
 height: 100%;
 background-color: rgba(0, 0, 0, .2);
 cursor: pointer;
 top: 0;
 display: none;
}
.slider .prev{
 left: 0;
}
.slider .next{
 right: 0;
}
.slider .prev img, .slider .next img{
 position: absolute;
 top: 50%;
 left: 50%;
 margin-top: -22.5px;
 margin-left: -22.5px;
}

JS部分: 

(function ($) {
 $.fn.slider = function (setting) { //给jQuery的实例对象绑定一个slider方法
 var defaultSetting = {
  width : 640,
  height : 270,
  during : 3000,
  speed : 500,
  btnSize : 30,
  btnSpace : 10,
  direction : 1
 }
 setting = $.extend(true, {}, defaultSetting, setting); //用传入的参数替换掉默认的设置 
 return this.each(function (i, item) { 
  var _setInterval = window.setInterval; 
  window.setInterval = function (callback, timer, param) { //重写setInterval函数,让其可以传参
  var args = Array.prototype.slice.call(arguments, 2); 
  var _fn = function () {
   callback.apply(null, args);
  }
  return _setInterval(_fn, timer);
  }

  var _this = $(this),
  ulBox = $('.ul-box', this),
  ul = $('ul', this),
  li = $('li', ul),
  img = $('img', li),
  len = li.size(),
  mask = $('.mask', this),
  index = 0,   //用来控制按钮的下标
  flag = true,   //标识动画是否执行完成
  gap,    //执行动画的按钮下标和当前按钮的下标的差
  timer;    //计时器

  _this.width(setting.width).height(setting.height);
  ulBox.width(setting.width * 3 * len).height(setting.height).css({
  marginLeft: -setting.width * len
  });
  ul.width(setting.width * len).height(setting.height);
  img.width(setting.width).height(setting.height);
  mask.height(setting.btnSize + 2 * setting.btnSpace);

  //添加btn
  for(var i = 0, str = ''; i < len; i++){
  str += '<div class="sliderBtn"></div>';
  }
  mask.html(str);
  var ulFir = ul.clone(true);
  var ulSec = ul.clone(true);
  var sliderBtn = $('.sliderBtn', '.mask');
  ulBox.append(ulFir);
  ulBox.append(ulSec);
  sliderBtn.each(function (i, item) {
  $(item).css({
   width : setting.btnSize,
   height : setting.btnSize,
   top : setting.btnSpace,
   left : parseInt(setting.width - (setting.btnSize + setting.btnSpace *2) *len, 10) /2 + setting.btnSize * i + setting.btnSpace * i * 2 + setting.btnSpace
  });
  $(item).mouseenter(function () {
   gap = Math.abs(i - index);
   i > index ? (flag && ani(1, gap)) : (flag && ani(0, gap));
  })
  });
  btnAni(0);
  //按钮样式变化
  function btnAni (index) {
  $('.sliderBtn').css('background', 'radial-gradient(white 20%, transparent 50%)');
  $('.sliderBtn').eq(index).css('background', 'radial-gradient(white 10%, transparent 30%, white 70%)');
  }
  //动画
  function ani (direction, num) {
  if(flag){
   //默认1向左运动,0向右运动
   flag = false;
   var ulfir = $('ul', ulBox).eq(0);
   var left = parseInt(ulfir.css('margin-left'), 10);
   if(direction){
   index += num;
   index = index % len;
   left = left - num * setting.width;
   ulfir.animate({
    marginLeft: left
   }, setting.speed, function () {
    if(left <= -len * setting.width){
    ulfir = ulfir.remove(); 
    ulfir.css('margin-left', 0);
    ulBox.append(ulfir);
    }
    flag = true;
   });
   }else{
   index -= num;
   index = index <= -1 ? len - 1 : index;
   left = left + num * setting.width;
   ulfir.animate({
    marginLeft: left
   }, setting.speed, function () {
    if(left >= len * setting.width){
    var ulLast = $('ul', ulBox).eq(2).remove();
    ulLast.css('margin-left', 0);
    ulBox.prepend(ulLast);
    ulfir.css('margin-left', 0);
    }
    flag = true
   })
   }
   btnAni(index)
  }
  }
  //定时器
  timer = setInterval(ani, setting.during, setting.direction, 1);
  _this.hover(function () {
  $('.prev', this).css('display', 'block');
  $('.next', this).css('display', 'block');
  clearInterval(timer);

  }, function () {
  $('.prev', this).css('display', 'none');
  $('.next', this).css('display', 'none');
  timer = setInterval(ani, setting.during, setting.direction, 1);
  })
  $('.next').click(function () {
  flag && ani(1, 1);
  })
  $('.prev').click(function () {
  flag && ani(0, 1);
  })
 })
 }
})(jQuery)

以上就是差不多所有的代码了,一些比较关键的地方已经用注释好了,这里就不再叙述。

源码下载:https://github.com/wwervin72/jQuery/tree/master/slider-2

精彩专题分享:jQuery图片轮播 JavaScript图片轮播 Bootstrap图片轮播

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery侧边栏随窗口滚动实现方法
Mar 04 Javascript
jQuery动态添加删除select项(实现代码)
Sep 03 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
Nov 22 Javascript
js使用ajax读博客rss示例
May 06 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
Oct 19 Javascript
jQuery progressbar通过Ajax请求实现后台进度实时功能
Oct 11 Javascript
深入对Vue.js $watch方法的理解
Mar 20 Javascript
Vue源码之关于vm.$delete()/Vue.use()内部原理详解
May 01 Javascript
微信小程序实现多行文字超出部分省略号显示功能
Oct 23 Javascript
vue中在vuex的actions中请求数据实例
Nov 08 Javascript
JS出现404错误原理及解决方案
Jul 01 Javascript
使用AutoJs实现微信抢红包的代码
Dec 31 Javascript
javascript正则表达式之分组概念与用法实例
Jun 16 #Javascript
js学习阶段总结(必看篇)
Jun 16 #Javascript
原生js封装二级城市下拉列表的实现代码
Jun 16 #Javascript
jQuery获取剪贴板内容的方法
Jun 16 #Javascript
javascript作用域、作用域链(菜鸟必看)
Jun 16 #Javascript
全面理解JavaScript中的继承(必看)
Jun 16 #Javascript
深入浅析JS的数组遍历方法(推荐)
Jun 15 #Javascript
You might like
无数据库的详细域名查询程序PHP版(4)
2006/10/09 PHP
php 获取客户端的真实ip
2009/11/30 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
2014/07/25 PHP
PHP利用header跳转失效的解决方法
2014/10/24 PHP
php将图片文件转换成二进制输出的方法
2015/06/10 PHP
基于Swoole实现PHP与websocket聊天室
2016/08/03 PHP
PHP截取发动短信内容的方法
2017/07/04 PHP
phpStorm2020 注册码
2020/09/17 PHP
JS代码优化技巧之通俗版(减少js体积)
2011/12/23 Javascript
JS localStorage实现本地缓存的方法
2013/06/22 Javascript
js获得页面的高度和宽度的方法
2014/02/23 Javascript
老司机带你解读jQuery插件开发流程
2016/05/16 Javascript
jquery插件格式实例分析
2016/06/16 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
js实现拖拽功能
2017/03/01 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
2017/06/17 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
2019/04/02 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
Python中列表、字典、元组、集合数据结构整理
2014/11/20 Python
详解python时间模块中的datetime模块
2016/01/13 Python
Python实现计算两个时间之间相差天数的方法
2017/05/10 Python
Flask项目中实现短信验证码和邮箱验证码功能
2019/12/05 Python
浅谈TensorFlow中读取图像数据的三种方式
2020/06/30 Python
django有哪些好处和优点
2020/09/01 Python
CSS3 中filter(滤镜)属性使用详解
2020/04/07 HTML / CSS
HTML5实现无刷新修改URL的方法
2019/11/14 HTML / CSS
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
大学毕业生的自我鉴定
2013/11/30 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
教师党员整改措施
2014/10/24 职场文书
围城读书笔记
2015/06/26 职场文书