先看bootstrap.carousel.js的结构

var Carousel = function (element, options){} //构造器
Carousel.prototype = {} // 构造器原型
$.fn.carousel = function ( option ) {} //jQuery原型上自定义的方法
$.fn.carousel.defaults ={} //默认参数
$.fn.carousel.Constructor = Carousel // 重写jQuery原型上自定义方法的构造器名
$(function (){}) // 初始化

HTML结构

<div id="myCarousel" class="carousel slide">
<div class="carousel-inner">
<div class="item">
<img alt="" src="http://wrongwaycn.github.io/bootstrap/docs/assets/img/bootstrap-mdo-sfmoma-01.jpg">
<div class="carousel-caption">
<h4>即使杀光所有报晓的公鸡,天,还是会亮的</h4>
<p> @shifeike: 昨天是李尚平被枪杀10周年,我发的那条纪念微博,成为我的新浪微博账号最后一条微博。这个2010年1月为反对红中抢笔而注册的微博,两年多时间里发了14538条微博,加上被删除的差不多近200万字,积累了96269条粉丝,自此灰飞烟灭。 </p>
</div>
</div>
<div class="item">
<img alt="" src="http://wrongwaycn.github.io/bootstrap/docs/assets/img/bootstrap-mdo-sfmoma-02.jpg">
<div class="carousel-caption">
<h4>如果人民不欢迎我们,就该我们下台了</h4>
<p> 【胡耀邦语录】①历史是混不过去的。②民主、自由、平等、博爱等观念是人类精神的一大解放。③如果人民不欢迎我们,就该我们下台了。④不懂的不要装懂,不通的不要装通,不服的不要装服。⑤中国的出路是民主和科学。⑥一个精神上、组织上被禁锢被压制的不自由民族怎么可能与其他国家进行自由竞争呢? </p>
</div>
</div>
<div class="item active">
<img alt="" src="http://wrongwaycn.github.io/bootstrap/docs/assets/img/bootstrap-mdo-sfmoma-03.jpg">
<div class="carousel-caption">
<h4>国家像需要空气一样需要变革</h4>
<p> 据戈尔巴乔夫基金会新闻处通报,俄总统梅德韦杰夫今天向前苏联总统戈尔巴乔夫颁发圣徒安德烈·佩尔沃兹万内勋章。戈尔巴乔夫在受勋时表示感谢,并称很激动。他坦言,对自己做过的事情问心无愧。他强调,他进行改革不是为了赢得敬重和荣誉,而是因为认识到,“国家像需要空气一样需要变革”。他承认犯过错误,并至今还在为这些错误而烦恼。但他认为:“短短几年所走过的路,使专制的过去永远成为了历史。” </p>
</div>
</div>
</div>
<a class="left carousel-control" data-slide="prev" href="#myCarousel">‹</a>
<a class="right carousel-control" data-slide="next" href="#myCarousel">›</a>
</div>

先从初始化开始

$(function () {
$('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
var $this = $(this), href
//获得整个控件的jQuery对象
, $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
, options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())//{slide:prev}或是{slide:next}
$target.carousel(options)//整个控件对象调用carousel方法
e.preventDefault()//阻止冒泡
})
})

根据HTML结构,为拥有data-slide属性的标签绑定click事件,如果我们点击向左按钮,代码会获取该标签的href,并获取整个控件的对象。接着让整个控件调用jQuery原型上的carousel方法。另外这个方法中,是阻止冒泡的。

/*
* jQuery原型上自定义的方法
* */
$.fn.carousel = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('carousel')
, options = typeof option == 'object' && option
if (!data) $this.data('carousel', (data = new Carousel(this, options)))//实例化构造器
if (typeof option == 'number') data.to(option)
else if (typeof option == 'string' || (option = options.slide)) data[option]()
else data.cycle()
})
}

初次调用carousel方法时,因为$(this).data('carousel')为未定义,实例化构造器,最后进过一些判断,我们执行data的cycle方法,实际上就是实例的方法cycle方法,先看构造器。

/*
* 构造器
* */
var Carousel = function (element, options) {
this.$element = $(element)
this.options = $.extend({}, $.fn.carousel.defaults, options)
this.options.slide && this.slide(this.options.slide)
this.options.pause == 'hover' && this.$element//为整个控件绑定事件
.on('mouseenter', $.proxy(this.pause, this))
.on('mouseleave', $.proxy(this.cycle, this))
}

这里实例化的时候,this是实例对象,这个注意一下,合并参数之后,执行原型上的slide方法,接着为整个控件绑定mouseenter和mouseleave事件,处理方法分别是原型上的pause和cycle方法。先看slide方法

slide: function (type, next) {
var $active = this.$element.find('.active')//找到当前显示的对象
, $next = next || $active[type]()//获取当前显示对象的前一个同级对象
, isCycling = this.interval
, direction = type == 'next' ? 'left' : 'right'//我们点击左边按钮时,direction = right
, fallback = type == 'next' ? 'first' : 'last'//同上,fallback = last
, that = this this.sliding = true//设置参数 isCycling && this.pause() $next = $next.length ? $next : this.$element.find('.item')[fallback]()//手动查找 if ($next.hasClass('active')) return//同级的对象上是没有active类的 if (!$.support.transition && this.$element.hasClass('slide')) { //整个控件拥有slide类
this.$element.trigger('slide')
$active.removeClass('active')//当前显示的对象去除active类
$next.addClass('active') //给前一个对象加上active类
this.sliding = false //参数被设置为false
this.$element.trigger('slid')
} else {
$next.addClass(type)
$next[0].offsetWidth // force reflow
$active.addClass(direction)
$next.addClass(direction)
this.$element.trigger('slide')
this.$element.one($.support.transition.end, function () {
$next.removeClass([type, direction].join(' ')).addClass('active')
$active.removeClass(['active', direction].join(' '))
that.sliding = false
setTimeout(function () { that.$element.trigger('slid') }, 0)
})
} isCycling && this.cycle() return this
}

slide方法主要的工作是这样的:找到当前显示的内容对象,并根据它找到它的前一个紧连的同级对象,接下来的操作是,将原来显示的对象去掉active类,而将前一个同级对象加上active类(这个第一次调用的情况,else部分一会看),去除active类,带来的效果,我们查看一下bootstrap.css可以发现。

.carousel-inner > .active,
.carousel-inner > .next,
.carousel-inner > .prev {
display: block; //show
} .carousel-inner > .active {
left: 0;
} .carousel-inner > .item {
position: relative;
display: none;//hide
-webkit-transition: 0.6s ease-in-out left;
-moz-transition: 0.6s ease-in-out left;
-o-transition: 0.6s ease-in-out left;
transition: 0.6s ease-in-out left;
}

又是显示和隐藏。。

这里注意一点,我们点击了向左移按钮,才去实例化构造器的,才去绑定控件的mouseenter和mouseleave事件的,也就是说,如果我们不点击的话,控件是不拥有这个事件的,如果你想让控件运动,你必须点击一下按钮,或者自己初始化。

ok,点击完之后,我们鼠标会移开,那就看一下mouseleave的事件吧。

/*
* 让控件自动翻页执行
* */
cycle: function () {
this.interval = setInterval($.proxy(this.next, this), this.options.interval)
return this
}

每5秒执行一下原型上的next方法,那有开启定时器,就有关闭定时器的方法。

/*
* 清除定时器
* */
, pause: function () {
clearInterval(this.interval)
this.interval = null
return this
}

看一下next方法

next: function () {
if (this.sliding) return
return this.slide('next')
}

之前在slide方法中,this.sliding值已经置为false,执行slide方法,在运行slide方法时,前一个同级节点换成了下一个同级节点。插件默认是自动向后翻页。最终执行完,this.sliding的值依旧是false,这样,定时器每5秒执行,都会执行slide方法,并传入'next'参数。

同理的prev方法

prev: function () {
if (this.sliding) return
return this.slide('prev')//由于没有this.slide的值,重新调用slide方法,传入'prev'
}

至此我们还有一个方法没有接触

to: function (pos) {
var $active = this.$element.find('.active')//this为控件对象,找到控件中拥有active类的对象
, children = $active.parent().children()//获得所有内容对象
, activePos = children.index($active) // 获得拥有active类的对象相对于内容组的位置,内容组有3块对象,默认的话,是2
, that = this if (pos > (children.length - 1) || pos < 0) return //如果你输入的数字大于内容组的子对象个数,或是小于0则不合法

if (this.sliding) {
return this.$element.one('slid', function () { //this.sliding为false
that.to(pos)
})
} if (activePos == pos) {
return this.pause().cycle()
} return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))//跳到指定页面
}

如果carousel方法中传入数字,就可以跳入这个方法执行。这个方法的作用主要是跳到指定页数的内容区。

内容不多,时间刚好,以上是我的一点读码体会,如有错误,请指出,大家共通学习。

bootstrap插件学习-bootstrap.carousel.js的更多相关文章

  1. bootstrap插件学习-bootstrap.dropdown.js

    bootstrap插件学习-bootstrap.dropdown.js 先看bootstrap.dropdown.js的结构 var toggle = '[data-toggle="drop ...

  2. bootstrap插件学习-bootstrap.modal.js

    bootstrap插件学习-bootstrap.modal.js 先从bootstrap.modal.js的结构看起. function($){ var Modal = function(){} // ...

  3. bootstrap插件学习-bootstrap.typehead.js

    先看bootstrap.typehead.js的结构 var Typeahead = function ( element, options ){} //构造器 Typeahead.prototype ...

  4. bootstrap插件学习-bootstrap.collapse.js

    先看bootstrap.collapse.js的结构 var Collapse = function ( element, options ){} // 构造器 Collapse.prototype ...

  5. bootstrap插件学习-bootstrap.alert.js

    我们先看bootstrap.alert.js的结构 var dismiss = '[data-dismiss="alert"]' //自定义属性 Alert = function ...

  6. bootstrap插件学习-bootstrap.button.js

    先看bootstrap.button.js的结构 var Button = function ( element, options ){} //构造器 Button.prototype = {} // ...

  7. bootstrap插件学习-bootstrap.popover.js

    先看bootstrap.popover.js的结构 var Popover = function ( element, options ){} //构造器 Popover.prototype = {} ...

  8. bootstrap插件学习-bootstrap.tooltip.js

    先看bootstrap-tooltip.js的结构 var Tooltip = function ( element, options ){} // 构造器 Tooltip.prototype ={} ...

  9. bootstrap插件学习-bootstrap.scrollspy.js

    先看bootstrap.dropdown.js的结构 function ScrollSpy(){} //构造函数 ScrollSpy.prototype = {} //构造器的原型 $.fn.scro ...

随机推荐

  1. HTML5之语义化标签

    HTML 5的革新之一:语义化标签一节元素标签. 在HTML 5出来之前,我们用div来表示页面章节,但是这些div都没有实际意义.(即使我们用css样式的id和class形容这块内容的意义).这些标 ...

  2. 画之国 Le tableau (2011)

    在佛斯特的肚子里,靠近幽门的地方,两只阿米巴原虫快乐地生活着.他们的日子过得很舒服,从来没饿过肚子,而且根本用不着干活:因为他们就是所谓的寄生虫.这两个好朋友相处得很愉快,但时不时也会争论不休,因为他 ...

  3. Mac地址绑定的wifi

    可以仿冒mac地址连接到wifi. 1.首先使用cdlinux扫描ssid,抓握手包--当捕获某个连接该wifi的client的时候,记下该client的mac地址. 2.用eswa解码抓包文件,获取 ...

  4. SSD性能对比

    SSD性能测试顺序写 16k iops 85061.08顺序写 8k iops 146250.93顺序写 4k iops 239816.69顺序写 2k iops 294540.87顺序写 1k io ...

  5. 私有云android客户端2.1.2最新版本(ownCloud简体中文优化版)

    通过安装Ubuntu16.04+LAMP+ownCloud9.1+SSL建立私有云,下载ownCloud android客户端最新源码,针对国际语言简体中文化,修改部分代码,并进行补充.优化,编译生成 ...

  6. runtime MethodSwizzle 实践之 奇怪crash : [UIKeyboardLayoutStar release]: message sent to deallocated instance

    情景: 使用MethodSwizzle 实现对数组.字典 等系统方法的安全校验.显然能达到预期效果,但实际发现当 键盘显示的情况下  home app 进入后台,再单击app  图标 切换回前台时 发 ...

  7. 源代码目录结构--AngularJS学习笔记(一)

    最近开始接触AngularJS,确实是一个相当不错的东西,可以把很多东西简化掉.又对于其中的双向绑定等的实现很好奇,加之正在学习Javascript的东西,所以觉得从源代码这块开始深入学习Angula ...

  8. DB系统预警联系人API

    Author:Skate Time:2014/12/16 DB系统预警联系人API 在我们维护系统时,须要把系统的报警信息即时传递给对应同学.假设把联系方式直接写到脚本里.对以后的维护变更将埋下祸根, ...

  9. 小试ijkplayer编译

    同步发表于 http://avenwu.net/ijkplayer/2015/05/07/hands_on_ijkplayer_preparation 谈到视频播放大家都知道ffmpeg,基于其的衍生 ...

  10. How to get URL parameters with Javascript?

    function getURLParameter(name) { return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '( ...