jquery制作多功能轮播图插件


Posted in Javascript onApril 02, 2015

这是一款多功能幻灯片插件,支持多种配置,css样式是扒的网上的,里面的代码原创,轻喷~

;(function($) {
  "use strict";
  var methods = {
    o : {
      next: "#cycle-next",
      prev: "#cycle-prev",
      pager : "#cycle-nav",
      slider : "#beauty-slider",
      timeLine : "#timeLine",
      innerTimeLine : "#inner-timeLine",
      timeLineNode : "#timeLine-node",
      sliderItemClass : "sliderItem",
      nodeActive : "node_active",
      displays : {fade : "fade",left : "left",right : "right",top : "top",bottom : "bottom"},
      navHtml : "<a href='javascript:;' class='&'>?</a>",
      navConfig : {navBoxClass : "cycle-nav", navActiveClass: "activeSlide" ,showNum : true}
    },
    generateId : function(){
      return "-" + new Date().getTime();
    },
    generateTemplate : function(id,settings){
      var htmls = new Array();
      htmls.push('<div class="slider-wrap">');
      htmls.push('<div class="cycleslider-wrap">');
      htmls.push('<div id="beauty-slider' + id + '" class="cycleslider"></div>');
      if(settings.isArrow) {
        htmls.push('<a id="cycle-prev' + id + '" class="cycle-prev" href="javascript:;" title="试试左方向键翻页">Prev</a>');
        htmls.push('<a id="cycle-next' + id + '" class="cycle-next" href="javascript:;" title="试试右方向键翻页">Next</a>');
      }
      if(settings.showTimeLine) {
        htmls.push('<div class="timeLine" id="timeLine' + id + '">');
        htmls.push('<div class="innerTimeLine" id="inner-timeLine' + id + '" style="width:0px;"> </div>');
        htmls.push('<div id="timeLine-node' + id + '"></div>');
        htmls.push('</div>');
      }
      if(settings.isNav) {
        htmls.push('<div id="cycle-nav' + id + '" class="cycle-nav"></div>');
      }
      htmls.push('</div>');
      htmls.push('<div class="loader"></div>');
      htmls.push('</div>');
      return htmls;
    },
    init : function(dom, options) {
      var s = this;
      var defaults = { url : "", data : {} , auto : false ,time : 2000, overLay : false, isArrow : true, isNav : true ,showTimeLine : false,showTip : false, keyboard : true, display : s.o.displays.fade,navConfig : s.o.navConfig};
      var settings = $.extend({},defaults, options);
      var id = s.generateId();
      $(".slider-wrap .loader").show();
      var imgArray = s.returnImgArray(dom, settings);
      if (imgArray != null && imgArray.length > 0) {
        s["imgcnt" + id] = imgArray.length;
        $(dom).html(s.generateTemplate(id,settings).join('')).show();
        var slider = $(s.o.slider + id);
        var pager = $(s.o.pager + id);
        var timeLineNode = $(s.o.timeLineNode + id);
        s.o.innerW = $(dom).width() - 20;
        var imgHtml = "";
        var pageHtml = "";
        var timeHtml = "";
        $.each(imgArray,function(index,item){
          var picClass = index == 0 ? s.o.sliderItemClass : s.o.sliderItemClass + " none";
          var navClass = index == 0 ? settings.navConfig.navActiveClass : "";
          imgHtml +='<div class="' + picClass + '"><a href="'+ ( s.isParamValid(item.picUrl) ? item.picUrl : "javascript:;" ) +'"><img src="' + item.picPath + '" width="'+item.width+'" height="' +item.height+ '" title="' + item.title + '"/></a></div>';
          pageHtml += s.o.navHtml.replace("?", settings.navConfig.showNum ? index + 1 : "").replace("&", navClass);
          var left = s.o.innerW * index / s["imgcnt" + id] - 13;
          var nodeClass = index == 0 ? s.o.nodeActive : "";
          timeHtml +='<div class="node ' + nodeClass + '" style="left: ' + left + 'px;">';
          if(settings.showTip) {
            timeHtml +='<div class="tooltip">' + item.title + '</div>';
          }
          timeHtml +='</div>';
        });
        slider.html(imgHtml);
        if(settings.isNav) {
          if(settings.navConfig.navBoxClass) {
            pager.removeClass(s.o.navConfig.navBoxClass).addClass(settings.navConfig.navBoxClass);
          }
          pager.html(pageHtml);
        }
        if(settings.showTimeLine) {
          timeLineNode.html(timeHtml);
        }
        slider.width(s.o.innerW);
        slider.find("." + s.o.sliderItemClass).width(s.o.innerW);
        $(s.o.timeLine + id).width(s.o.innerW);
        if(settings.overLay) {
          if($.fn.layerModel) {
            $(dom).layerModel({staySame : true, blurClose : true});
          } else {
            alert("请先引入layerModel插件!");
          }
        }
        s.initBind(id, settings);
        s["currentIndex" + id] = 0;
        var totalTime = settings.time / 1000 * s["imgcnt" + id];
        if(settings.auto) {
          if(settings.showTimeLine) {
            s.startTimeLine(id , totalTime,settings);
          } else {
            s.o.timeInterval = window.setInterval(function(){
              $("#cycle-next" + id).click();
            }, settings.time);
          }
        }
      } else {
        return;
      }
      return dom;
    },
    startTimeLine : function(id ,time, settings) {
      var s = this;
      var $innerTimeLine = $(s.o.innerTimeLine + id);
      var crnW = $innerTimeLine.width();
      for (var i = 0; i < s["imgcnt" + id]; i++) {
        var autoW = Math.floor(s.o.innerW * i / s["imgcnt" + id]);
        if(crnW == autoW) {
          s["currentIndex" + id] = i;
          s.updateImgLink(id, settings);
          $(s.o.timeLineNode + id).find("div.node").eq(i).addClass(s.o.nodeActive).siblings().removeClass(s.o.nodeActive);
        }
      }
      if(crnW < s.o.innerW) {
        $innerTimeLine.animate({width : "+=1px"}, time , 'linear', function(){
          s.startTimeLine(id, time, settings);
        });
      } else {
        $innerTimeLine.width(0);
        s.startTimeLine(id, time, settings);
      }
    },
    initBind :function(id, settings) {
      var s = this;
      var isEasing = $.easing.def;
      if(settings.isArrow) {
        $("#cycle-prev" + id + ", #cycle-next" + id).css({opacity: "0"});
        $(".cycleslider-wrap").hover(function(){
          $("#cycle-prev" + id).stop().animate({left: "-31", opacity: "1"},200,isEasing ? "easeOutCubic" : "");
          $("#cycle-next" + id).stop().animate({right: "-31", opacity: "1"},200,isEasing ?"easeOutCubic" : "");  
        }, function() {
          $("#cycle-prev" + id).stop().animate({left: "-50", opacity: "0"},400,isEasing ?"easeInCubic" : "");
          $("#cycle-next" + id).stop().animate({right: "-50", opacity: "0"},400,isEasing ?"easeInCubic" : "");    
        });
        $("#cycle-prev" + id).bind("click",function(){
          s["currentIndex" + id] = s["currentIndex" + id] <= 0 ? s["imgcnt" + id] - 1 : s["currentIndex" + id] - 1;
          s.updateImgLink(id,settings);
        });
        $("#cycle-next" + id).bind("click",function(){
          s["currentIndex" + id] = s["currentIndex" + id] < s["imgcnt" + id] - 1 ? s["currentIndex" + id] + 1 : 0;
          s.updateImgLink(id,settings);
        });
      }
      $(".slider-wrap .loader").hide();
      $("a",s.o.pager + id).bind("click",function(){
        if ($(this).hasClass(s.o.navConfig.navActiveClass)){
          return false;
        }
        s["currentIndex" + id] = $(this).index();
        s.updateImgLink(id,settings);
      });
       
      if(settings.auto && settings.showTimeLine) {
        $("div.node",s.o.timeLineNode + id).bind({
          click : function(){
            if($(this).hasClass(s.o.nodeActive)){
              return false;
            }
            s["currentIndex" + id] = $(this).index();
            s.updateImgLink(id,settings);
          },
          mouseover : function(){
            if(settings.showTip) {
              $(this).find(".tooltip").fadeIn();
            }
          },
          mouseout : function(){
            if(settings.showTip) {
              $(this).find(".tooltip").fadeOut();
            }
          }
        });
      }
      // 键盘操作
      if(settings.keyboard){
        $(window).keydown(function(event){
          //<---
          if(event.keyCode == 37){
            $("#cycle-prev" + id).click();
          }
          //--->
          if(event.keyCode == 39){
            $("#cycle-next" + id).click();
          }
        });
      }
    },
    updateImgLink : function(id, settings){
      var s = this;
      var index = s["currentIndex" + id];
      var display = settings.display;
      var isEasing = $.easing.def;
      var $items = $("div." + s.o.sliderItemClass,s.o.slider + id);
      switch (display) {
        case s.o.displays.fade :
          $items.eq(index).show().siblings().hide();
          break;
        case s.o.displays.left :
          $items.css({ position : "absolute", top : 0, left : s.o.innerW }).hide();
          $items.eq(index).animate({ left : 0 }, 100, isEasing ? "easeOutCubic" : "").show();
          $(s.o.slider + id).height(s.getImgMaxHeight(id));
          break;
        case s.o.displays.right :
          $items.css({ position : "absolute", top : 0, right : s.o.innerW }).hide();
          $items.eq(index).animate({ right : 0 }, 100, isEasing ? "easeOutCubic" : "").show();
          $(s.o.slider + id).height(s.getImgMaxHeight(id));
          break;
        case s.o.displays.top :
          break;
        case s.o.displays.bottom : 
          break;
        default :
          break;
      }
      $("a",s.o.pager + id).eq(index).addClass(settings.navConfig.navActiveClass).siblings().removeClass(settings.navConfig.navActiveClass);
      // 更新进度条的信息
      if(settings.auto && settings.showTimeLine) {
        var indexWidth = Math.floor(s.o.innerW * index / s["imgcnt" + id]);
        $(s.o.innerTimeLine + id).animate({width : indexWidth +"px"}, 500 , 'linear', function(){
          $(s.o.timeLineNode + id).find("div.node").eq(index).addClass(s.o.nodeActive).siblings().removeClass(s.o.nodeActive);
        });
      }
    },
    getImgMaxHeight : function(id) {
      var s = this;
      var slider = $(s.o.slider + id);
      var maxHeight = 0;
      $.each(slider.find("img"),function(index,item){
        var imgHeight = this.height;
        maxHeight = Math.max(maxHeight,imgHeight);
      });
      return maxHeight;
    },
    returnImgArray : function(dom,settings){
      var s = this;
      var imgArray = new Array();
      var url = settings.url;
      if (s.isParamValid(url)) {
        $.ajax({
          url : url + "?t=" + new Date().getTime(),
          type : 'POST',
          async : false,
          data : settings.data,
          dataType : 'json',
          success : function(data) {
            if (s.isParamValid(data)) {
              $.each(data, function(index, item) {
                imgArray.push(item);
              });
            }
          },
          error : function() {
            alert("图片数据源地址无效...");
            return null;
          },
          complete : function(XHR, TS) { XHR = null; }
        });
      } else {
        var imgs = $(dom).find("img");
        if (imgs != null && imgs.length > 0) {
          $.each(imgs,function(i,o){
            var pic = new Object();
            pic.picUrl = $(o).parent("a").attr("href");
            pic.picPath = $(o).attr("src");
            pic.width = $(o).attr("width");
            pic.height = $(o).attr("height");
            pic.title = $(o).attr("title");
            imgArray.push(pic);
          });
        }
      }
      return imgArray;
    },
    isParamValid : function(v) {
      return !(v == "" || v == null || v == undefined);
    }
  };
  $.fn.beautyFocus = function(options) {
    return this.each(function(index,item) {
      methods.init(item, options);  
    });
  };
})(jQuery);

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
谈谈JavaScript中的函数与闭包
Apr 14 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
May 19 Javascript
JS操作Cookie写入和读取实例代码
Oct 20 Javascript
微信小程序 教程之条件渲染
Oct 18 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
Nov 21 Javascript
Vue.js事件处理器与表单控件绑定详解
Mar 20 Javascript
JS实现动态添加DOM节点和事件的方法示例
Apr 28 Javascript
微信小程序实现滴滴导航tab切换效果
Jul 24 Javascript
iphone刘海屏页面适配方法
May 07 Javascript
layui数据表格实现重载数据表格功能(搜索功能)
Jul 27 Javascript
vue多个元素的样式选择器问题
Nov 29 Javascript
vue深度监听(监听对象和数组的改变)与立即执行监听实例
Sep 04 Javascript
Javascript中3个需要注意的运算符
Apr 02 #Javascript
原生JS实现响应式瀑布流布局
Apr 02 #Javascript
Javascript变量的作用域和作用域链详解
Apr 02 #Javascript
JavaScript中连接操作Oracle数据库实例
Apr 02 #Javascript
JavaScript中操作Mysql数据库实例
Apr 02 #Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
Apr 02 #Javascript
JavaScript实现重置表单(reset)的方法
Apr 02 #Javascript
You might like
判断PHP数组是否为空的代码
2011/09/08 PHP
深入php常用函数的使用汇总
2013/06/08 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
jQuery中add实现同时选择两个id对象
2010/10/22 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
2016/03/18 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
2016/10/27 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
2017/01/13 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
2017/05/19 jQuery
本地存储localStorage用法详解
2017/07/31 Javascript
JS中的Replace()传入函数时的用法详解
2017/09/11 Javascript
微信小程序实现左侧滑栏过程解析
2019/08/26 Javascript
使用p5.js临摹动态图形
2019/10/23 Javascript
[04:55]完美世界副总裁蔡玮:DOTA2的自由、公平与信任
2013/12/18 DOTA
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
pandas.loc 选取指定列进行操作的实例
2018/05/18 Python
python用post访问restful服务接口的方法
2018/12/07 Python
django 信号调度机制详解
2019/07/19 Python
Django restframework 框架认证、权限、限流用法示例
2019/12/21 Python
tensorflow 实现数据类型转换
2020/02/17 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
PyTorch的torch.cat用法
2020/06/28 Python
python rsa-oaep加密的示例代码
2020/09/23 Python
如何查看在weblogic中已经发布的EJB
2012/06/01 面试题
珍珠鸟教学反思
2014/02/01 职场文书
《初涉尘世》读后感3篇
2020/01/10 职场文书
python 安全地删除列表元素的方法
2022/03/16 Python
Python 第三方库 openpyxl 的安装过程
2022/12/24 Python