jQuery焦点图切换简易插件制作过程全纪录


Posted in Javascript onAugust 27, 2014

首页经常是需要一个焦点图切换的效果,最近做的项目也正好需要,所以在网上搜索,后面查到了一个半成品的插件,这里我自己修改了一下。

js文件夹下面有两个文件夹jquery.jslide.js与jquery.jslides.js,前面一个是我改写的,第二个是原作者的文件。下图是效果图:

jQuery焦点图切换简易插件制作过程全纪录

一、静态效果

<div class="slide_wrap">
 <ul id="slides2" class="slide">
  <li style="background:url('images/01.jpg') no-repeat center top"><a href="https://3water.com/" target="_blank">pwstrick1</a></li>
  <li style="background:url('images/02.jpg') no-repeat center top"><a href="https://3water.com/" target="_blank">pwstrick2</a></li>
  <li style="background:url('images/03.jpg') no-repeat center top"><a href="https://3water.com/" target="_blank">pwstrick3</a></li>
  <li style="background:url('images/04.jpg') no-repeat center top"><a href="https://3water.com/" target="_blank">pwstrick4</a></li>
 </ul>
</div>
1.现在比较流行宽屏的焦点图切换,以前标签都是用img来显示图片的,现在得换成background做背景图,这样就不会出现横向滚动条啦。

2.最外面套个slide_wrap用来做限制里面图片的绝对定位

3.ul中的class原先我是在插件初始化的时候添加上去的,现在我预先就加上了,显示效果比后面添加要好一点,大家可以在改写插件的时候做修改

.slide_wrap {width:100%;height:400px;position:relative}
.slide_wrap .slide { display:block; width:100%; height:400px; list-style:none; padding:0; margin:0; position:relative;}
.slide_wrap .slide li { display:block; width:100%; height:100%; list-style:none; padding:0; margin:0; position:absolute;}
.slide_wrap .slide li a { display:block; width:100%; height:100%; text-indent:-9999px;}
.slide_wrap .pagination { display:block; list-style:none; position:absolute; left:50%; top:340px; z-index:9900;padding:5px 15px 5px 0; margin:0}
.slide_wrap .pagination li { display:block; list-style:none; width:10px; height:10px; float:left;margin-left:15px; border-radius:5px; background:#FFF }
.slide_wrap .pagination li a { display:block; width:100%; height:100%; padding:0; margin:0; text-indent:-9999px;outline:0}
.slide_wrap .pagination li.current { background:#0092CE}

1、slide_wrap与slide中的height属性可以根据实际情况修改

2、pagination是图中的按钮样式,用来控制显示第几张图,也是绝对定位left与top可以根据实际情况修改

3、样式中的各个颜色也可以根据想要的效果做个性化修改

4、上面的样式写的有点??拢?谇度胱约旱南钅恐校?梢允实本??/p>

二、调用方式

<script type="text/javascript">
 $('#slides2').jslide();
</script>

1、将ul设置成焦点图插件

2、下面的各个操作都将围绕着ul转

三、jQuery插件通用格式

;(function (factory) {
 'use strict';
 // Register as an AMD module, compatible with script loaders like RequireJS.
 if (typeof define === 'function' && define.amd) {
  define(['jquery'], factory);
 }
 else {
  factory(jQuery);
 }
}(function ($, undefined) {
 'use strict';

 //中间插件代码

 $.fn.jslide = function (method) {
  return _init.apply(this, arguments);
 };
}));

1、第一个分号是为了防止在与其他代码压缩到一起的时候合在一行中,这样会出现语法错误。例如var i=0(function(factory){......}(..);

2、'use strict'是开启严格模式,使Javascript解释器可以用"严格"的语法来解析代码,以帮助开发人员发现错误

3、如果使用了requirejs模块载入框架,define(['jquery'], factory)这句就是让插件支持AMD规范

4、function ($, undefined) 这里面的undefined是为了防止在引入其他js文件的时候,使用被重写了的undefined

5、_init是用于初始化效果

四、插件初始化

var defaults = {
  speed : 3000,
  pageCss : 'pagination',
  auto: true //自动切换
 };
 
 var nowImage = 0;//现在是哪张图片
 var pause = false;//暂停
 var autoMethod;

/**
  * @method private
  * @name _init
  * @description Initializes plugin
  * @param opts [object] "Initialization options"
  */
 function _init(opts) {
  opts = $.extend({}, defaults, opts || {});
  // Apply to each element
  var $items = $(this);
  for (var i = 0, count = $items.length; i < count; i++) {
   _build($items.eq(i), opts);
  }
  return $items;
 }

1、defaults是暴露出来的自定义参数,这里我就写了三个自动切换的速度、选择按钮样式、是否自动化

2、三个全局参数,nowImage是当前显示图片的序号、pause是控制图片是切换还是暂停,autoMethod是定时函数的编号

3、_init中有合并自定义参数,调用_build做创建操作

五、创建插件各个操作

/**
  * @method private
  * @name _getSlides
  * @description 获取幻灯片对象
  * @param $node [jQuery object] "目标对象"
  */
 function _getSlides($node) {
  return $node.children('li');
 }
  /**
  * @method private
  * @name _build
  * @description Builds each instance
  * @param $node [jQuery object] "目标对象"
  * @param opts [object] "插件参数"
  */
 function _build($node, opts) {
  var $slides = _getSlides($node);
  $slides.eq(0).siblings('li').css({'display':'none'});
  var numpic = $slides.size() - 1;
  
  $node.delegate('li', 'mouseenter', function() {
   pause = true;//暂停轮播
   clearInterval(autoMethod);
  }).delegate('li', 'mouseleave', function() {
   pause = false;
   autoMethod = setInterval(function() {
    _auto($slides, $pages, opts);
   }, opts.speed);
  });
  //console.log(autoMethod)
  var $pages = _pagination($node, opts, numpic);
  
  if(opts.auto) {
   autoMethod = setInterval(function() {
    _auto($slides, $pages, opts);
   }, opts.speed);
  }
 }

1、_getSlides用于获取ul这个对象的li子标签,ul也就是这个焦点图插件

2、将除了第一个li标签,其他标签设置为隐藏

3、获取切换图片的数量,由于后面做循环是从下标0开始,做<=操作,所以减去一个1,其实这里不减也是可以的,看个人喜好

4、给li标签设置mouseenter与mouseleave的事件,分别是取消循环与继续循环

5、初始化选择按钮

6、参数auto如果为true,就激活自动切换

六、初始化选择按钮

/**
  * @method private
  * @name _pagination
  * @description 初始化选择按钮
  * @param $node [jQuery object] "目标对象"
  * @param opts [Object] "参数"
  * @param size [int] "图片数量"
  */
  function _pagination($node, opts, size) {
  var $ul = $('<ul>', {'class': opts.pageCss});
  for(var i = 0; i <= size; i++){
   $ul.append('<li>' + '<a href="javascript:void(0)">' + (i+1) + '</a>' + '</li>');
  }
  
  $ul.children(':first').addClass('current');//给第一个按钮选中样式
  var $pages = $ul.children('li');
  $ul.delegate('li', 'click', function() {//绑定click事件
   var changenow = $(this).index();
   _changePage($pages, $node, changenow);
  }).delegate('li', 'mouseenter', function() {
   pause = true;//暂停轮播
  }).delegate('li', 'mouseleave', function() {
   pause = false;
  });
  $node.after($ul);
  return $pages;
  }

1、动态添加按钮ul标签,赋上一个自定义class,将子标签li加上

2、将第一个按钮加上选中样式

3、给li标签加上click、mouseenter与mouseleave的事件,click事件绑定切换操作

4、把分页按钮放到插件对象ul的后面

5、返回分页按钮中的li对象,后面有用的

七、切换图片

/**
  * @method private
  * @name _change
  * @description 幻灯片显示与影藏
  * @param $slides [jQuery object] "图片对象"
  * @param $pages [jQuery object] "按钮对象"
  * @param next [int] "要显示的下一个序号"
  */
  function _fadeinout($slides, $pages, next){
  $slides.eq(nowImage).css('z-index','2');
  $slides.eq(next).css({'z-index':'1'}).show();
  $pages.eq(next).addClass('current').siblings().removeClass('current');
  $slides.eq(nowImage).fadeOut(400, function(){
   $slides.eq(next).fadeIn(500);
  });
 }

1、将当前的图片z-index加大,下一张图片的z-index也加大,显示下一张图,这样能做出一种渐变的效果,不加的话就会是很生硬的切换

2、选择按钮的下一个增加选中样式

3、应用jQuery的fadeOut与fadeIn做隐藏与显示的渐变特效

八、自动循环

/**
  * @method private
  * @name _auto
  * @description 自动轮播
  * @param $slides [jQuery object] "图片对象"
  * @param $pages [jQuery object] "按钮对象"
  * @param opts [Object] "参数"
  */
  function _auto($slides, $pages, opts){
  var next = nowImage + 1;
  var size = $slides.size() - 1;
  if(!pause) {
   if(nowImage >= size){
    next = 0;
   }
   
   _fadeinout($slides, $pages, next);
   
   if(nowImage < size){
    nowImage += 1;
   }else {
    nowImage = 0;
   }
  }else {
   clearInterval(autoMethod);//暂停的时候就取消自动切换
  }
  }

1、判断是暂停还是继续轮播

2、如果不是暂停,就根据条件做当前页与下一个按钮的序号设置

插件还有很多问题,比如不能在一个页面绑定两个不同的对象,还有巨大的修改空间。

通过这次的修改,自己有了一个可以控制的焦点图切换插件,虽然还有很多问题但可以一步一步解决。以后嵌入到自己的项目中,修改起来也方便很多。

demo:http://demo.3water.com/js/2014/jsilde/

下载: https://3water.com/jiaoben/210405.html

Javascript 相关文章推荐
关于Javascript 的 prototype问题。
Jan 03 Javascript
JavaScript+CSS控制打印格式示例介绍
Jan 07 Javascript
使用typeof方法判断undefined类型
Sep 09 Javascript
js网页滚动条滚动事件实例分析
May 05 Javascript
javascript判断并获取注册表中可信任站点的方法
Jun 01 Javascript
理解Javascript图片预加载
Feb 23 Javascript
实用jquery操作表单元素的简单代码
Jul 04 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
Mar 01 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
Mar 19 Javascript
vue将毫秒数转化为正常日期格式的实例
Sep 16 Javascript
老生常谈JavaScript获取CSS样式的方法(兼容各浏览器)
Sep 19 Javascript
vue $set 给数据赋值的实例
Nov 09 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
Aug 27 #Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
Aug 27 #Javascript
JavaScript实现的in_array函数
Aug 27 #Javascript
JavaScript AJAX之惰性载入函数
Aug 27 #Javascript
IE浏览器不支持getElementsByClassName的解决方法
Aug 27 #Javascript
JavaScript中使用stopPropagation函数停止事件传播例子
Aug 27 #Javascript
JavaScript闭包函数访问外部变量的方法
Aug 27 #Javascript
You might like
php ZipArchive压缩函数详解实例
2013/11/06 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
2016/11/21 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
2017/05/05 PHP
JS实现为排序好的字符串找出重复行的方法
2016/03/02 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
jQuery中图片展示插件highslide.js的简单dom
2018/04/22 jQuery
angular6开发steps步骤条组件
2019/07/04 Javascript
JS sort方法基于数组对象属性值排序
2020/07/10 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
python通过socket实现多个连接并实现ssh功能详解
2017/11/08 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
pytorch 实现tensor与numpy数组转换
2019/12/27 Python
Python print不能立即打印的解决方式
2020/02/19 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
HTML5自定义元素播放焦点图动画的实现
2019/09/25 HTML / CSS
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
Book Depository欧盟:一家领先的国际图书零售商
2019/05/21 全球购物
Nicole Miller官方网站:纽约女装品牌
2019/09/14 全球购物
英国发展最快的在线超市之一:Click Marketplace
2021/02/15 全球购物
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
水污染治理专业毕业生推荐信
2013/11/14 职场文书
校园招聘策划书
2014/01/09 职场文书
缴纳养老保险的证明
2014/01/10 职场文书
社会学专业学生职业规划书
2014/02/07 职场文书
幼儿园秋游感想
2014/03/12 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
销售员岗位职责
2015/02/10 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
赵氏孤儿观后感
2015/06/09 职场文书
2019军训心得体会
2019/06/27 职场文书
Django Paginator分页器的使用示例
2021/06/23 Python
基于Python实现射击小游戏的制作
2022/04/06 Python