jquery中$.fn和图片滚动效果实现的必备知识总结


Posted in jQuery onApril 21, 2017

前言

图片滚动效果相信对大家来说都不陌生,烂大街的效果图如下所示,js实现代码很短,不过如果想做的话,必须掌握jquery、IIFE、setInterval等基础以及$.fn用法:

jquery中$.fn和图片滚动效果实现的必备知识总结

jquery中$.fn用法

$.fn是jquery的命名空间,如果对jquery源码有过学习,就不难发现源码中有如下代码:

jquery.fn=jquery.prototype={
 init:function(selector,context){
 /*
 *code
 */
 }
}

所以说jquery.fn也就是jquery.prototype的简写。我们的源码调用的构造函数jquery()实例实际是jquery.fn.init()的实例。

代码如下:

jQuery = function( selector, context ) {
 //jqeruy内部使用new创建返回另一个构造函数实力是为了省去调用jquery时前面的new,并在后面定义了别名$;
 //构造函数jquery()调用的是构造函数jQuery.fn.init()的实例
 return new jQuery.fn.init( selector, context );
},/*code*/

之后后续代码有执行了jquery.fn.init.prototype=jquery.fn,用构造函数jquery的原型对象覆盖jquery.fn.init()的原型对象,使得jquery.fn.init实例也能访问到jquery()的原型方法和属性。

开发插件的方法:$.fn扩展jquery生成新的方法。

      1、可以使用jquery.extend(object)扩展jquery类本身,为类添加新的方法。

      2、用jquery.fn.extend(object)给jquery对象添加方法。

下面用jquery.extend(object)扩展jquery类,添加类方法:

$.extent({ 
 add: function(a,b){
 return a+b;
 }
})

以后就可以直接使用$.add(1,2);//3

下面用jquery.fn.extend(object)jquery.prototype扩展一个方法。

$.fn.extend({
 [函数名]:fucntion(){
 /*code*/
 }
});

以后可以直接使用$(“div”).函数名()。

使用jquery中的$.fn封装一个图片滚动插件

这是一个使用到烂大街的一个插件了,不用说也知道是什么。不过具体是怎么实现的,继续往下看。这个插件最主要的部分也就是js的实现,html和css很简单,不赘述。如果下面一些知识点已经熟悉,可以选择性跳过。

setInterval()

setInterval()可以按指定时间不停的调用函数,直到调用clearInterval或者关闭窗口。

setInterval(fucntion(){/*code*/},[time])
clearInterval(val_of_seInterval)//参数为setInterval的返回值

所以当我们制作图片滚动时,当鼠标指针在图片上时,要停止图片滚动,这里设置很简单,只要添加一个on(‘mouseup,mouseover',fucntion(){})事件即可;

具体实现代码如下:

var time=setInterval(picTime,par.time);
/*
*code
*/
$(this).on('mouseup,mouseover',fucntion(){
 clearInterval(time);
 })

保证图片能够一直循环滚动

在设计时,我们肯定不想图片滚动完li.length张就没了。所以要设置一个哨兵index。

var index=0;
fucntion picTime(){
 index++;
 if(index=li.length){
 index=0;
 }
 showpicture(index);
}

相同的在点击上一张,下一张图片时,我们也要设置一个哨兵,让其能够一直循环下去。

IIFE

你肯定想要当插件在定义调用完,加载浏览器时,这个插件效果可以立即呈现出来。那就要用到IIFE来构造这个插件,从来达到快速加载,不受其他代码干扰的作用。由于js中,在括号中进行函数声明无效,所以被括号包起来的函数称之为函数表达式。

IIFE的两种形式如下:当圆括号出现在匿名函数的末尾想要调用函数时,它会默认将函数当成是函数声明。当圆括号包裹函数时,它会默认将函数作为表达式去解析,而不是函数声明。

(function(){}());
(function(){})();

下面先来用牛客的一道题目来理解一下IIFE:

var myObject = { 
 foo: "bar", 
 func: function() { 
 var self = this; 
 console.log(this.foo); 
 console.log(self.foo); 
 (function() { 
 console.log(this.foo); 
 console.log(self.foo); 
 }()); 
}};
 myObject.func();

因为this指代的是myObject对象,所以第一个肯定输出bar,而self是this的变量,等于是this,所以第二个输出的还是bar,下面出现的就是我们上文定义的第一种IIFE形式,此时必须立即执行匿名函数,它的this指向的是window,所以输出undefined,最后的self在自己的块级作用域没有定义,所以向上找到父级作用域的self,因此第四个输出的还是bar。

低配版图片特效js代码

很多都加了注释:如果jquery、js上文的知识掌握扎实,肯定不是很难。

//$()调用jquery对象 ,IIFE
$(function () {
 $.fn.ScrollPic = function (params) {
 //
 return this.each(function () {
 var defaults = {
 ele: '.slider',//切换对象
 Time: '2000',//自动切换时间
 speed: '1000',//图片切换速度
 scroll: true,//是否滚动图片,虽然肯定是让它滚动的,但是我们还是设置一个意思一下。
 arrow: false,//是否设置箭头
 number: true//是否添加右下角数字
 };
 //定义默认参数,其中若在html页面设置了param是,这里的params会替换defaults
 var par = $.extend({}, defaults, params);
 var scrollList = $(this).find('ul');//找到ul标签元素
 var listLi = $(this).find('li');//找到li标签元素
 var index = 0;
 var pWidth = $(this).width();
 var pHeight = $(this).height();
 var len = $(this).find("li").length;//<li>标签数量
 //设置li标签和img的宽、高
 listLi.css({ "width": pWidth, "height": pHeight });
 listLi.find('img').css({ "width": pWidth, "height": pHeight });
 //设置ul标签的宽值为li的len倍/overflow:hidden
 scrollList.css("width", pWidth * len);
 //图片循环滚动的关键所在
 function picTimer() {
 index++;
 if (index == len) { index = 0; }
 showPics(index);
 }
 //自动切换函数
 if (par.scroll)
 {
 var time = setInterval(picTimer, par.Time);
 } else {
 $(".page-btn").hide();
 }
 function showPics(index) {
 var nowLeft = -index * pWidth;
 //添加向左移动的特效
 $(this).find(scrollList).animate({ "left": nowLeft }, par.speed);
 //找到与index相等的那个按钮,添加类名current,并将每个同胞元素移除类名current
 $(this).find(paging).eq(index).addClass('current').siblings().removeClass('current');
 }
 //鼠标经过数字按钮的效果
 if (par.number) {
 $(this).append('<div class="page-btn"></div>');
 for (i = 1; i <= len; i++) {
 $(this).find('.page-btn').append('<span>' + i + '</span>')
 }
 var paging = $(this).find(".page-btn span");
 paging.eq(index).addClass('current');
 $(this).find(paging).on('mouseup mouseover',function (e) {
 e.preventDefault();
 //获取按钮之间的相对位置,注意这里的$(this)。
 index = $('div').find(paging).index($(this));
 showPics(index)
 });
 }
 //上一张,下一张效果
 if (par.arrow) {
 $(this).append('<span class="leftarrow"></span><span class="rightarrow"></span>')
 var prev = $(this).find('span.leftarrow');
 var next = $(this).find('span.rightarrow');
 prev.on('click',function (e){
 e.preventDefault();
 index -= 1;
 if (index == -1) { index = len - 1; }
 showPics(index);
 });//上一页
 next.on('click',function (e){
 e.preventDefault();
 index += 1;
 if (index == len) { index = 0; }
 showPics(index);
 });
 }
 //停止图片的滚动
 $(this).on('moveseup mouseover',function (e) {
 clearInterval(time);
 });
 //清除计时器
 $(this).on('mouseleave',function (e) {
 if (par.scroll) { time = setInterval(picTimer, par.Time); } else { clearInterval(time); $(this).find('$(".page-btn")').hide() }
 });
 })
}
});

下面是完整的html、css+js代码链接。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

jQuery 相关文章推荐
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
Apr 21 jQuery
jQuery实现菜单栏导航效果
Aug 15 jQuery
jQuery中each循环的跳出和结束实例
Aug 16 jQuery
简单实现jQuery轮播效果
Aug 18 jQuery
jquery动态赋值id与动态取id方法示例
Aug 21 jQuery
jQuery动态添加.active 实现导航效果代码思路详解
Aug 29 jQuery
jQuery中extend函数简单用法示例
Oct 11 jQuery
jQuery实现鼠标移入移出事件切换功能示例
Sep 06 jQuery
在vue项目中使用Jquery-contextmenu插件的步骤讲解
Jan 27 jQuery
jQuery实现的导航条点击后高亮显示功能示例
Mar 04 jQuery
jquery实现烟花效果(面向对象)
Mar 10 jQuery
jQuery实现购物车全功能
Jan 11 jQuery
jQuery+pjax简单示例汇总
Apr 21 #jQuery
基于jQuery实现文字打印动态效果
Apr 21 #jQuery
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
Apr 20 #jQuery
jquery将标签元素的高设为屏幕的百分比
Apr 19 #jQuery
jQuery Plupload上传插件的使用
Apr 19 #jQuery
jQuery ajax请求struts action实现异步刷新
Apr 19 #jQuery
jQuery加密密码到cookie的实现代码
Apr 18 #jQuery
You might like
一个用于mysql的数据库抽象层函数库
2006/10/09 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
Yii中创建自己的Widget实例
2016/01/05 PHP
PHP生成静态HTML文档实现代码
2016/06/23 PHP
php自定义时间转换函数示例
2016/12/07 PHP
实例分析PHP将字符串转换成数字的方法
2019/01/27 PHP
JS location几个方法小姐
2008/07/09 Javascript
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
JavaScript代码复用模式实例分析
2012/12/02 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
最简单的tab切换实例代码
2016/05/13 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
jQuery点击导航栏选中更换样式的实现代码
2017/01/23 Javascript
jQuery插件ContextMenu自定义图标
2017/03/15 Javascript
vue 引用自定义ttf、otf、在线字体的方法
2019/05/09 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
python使用datetime模块计算各种时间间隔的方法
2015/03/24 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
python如何实现内容写在图片上
2018/03/23 Python
Django框架视图函数设计示例
2019/07/29 Python
Python+opencv+pyaudio实现带声音屏幕录制
2019/12/23 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
python爬取天气数据的实例详解
2020/11/20 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
捐献物资倡议书范文
2014/05/19 职场文书
个人查摆剖析材料
2014/10/04 职场文书
2015年大学元旦晚会活动策划书
2014/12/09 职场文书
导游词之五台山
2019/10/11 职场文书
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript