0
0
mirror of https://github.com/twbs/bootstrap.git synced 2025-02-26 23:54:23 +01:00

add js support for carousel indicators

This commit is contained in:
fat 2012-12-19 23:25:25 -08:00
parent e9eff0cbff
commit 7f9ff0ba5b
8 changed files with 73 additions and 25 deletions

View File

@ -28,6 +28,7 @@
var Carousel = function (element, options) { var Carousel = function (element, options) {
this.$element = $(element) this.$element = $(element)
this.$indicators = this.$element.find('.carousel-indicators')
this.options = options this.options = options
this.options.pause == 'hover' && this.$element this.options.pause == 'hover' && this.$element
.on('mouseenter', $.proxy(this.pause, this)) .on('mouseenter', $.proxy(this.pause, this))
@ -44,13 +45,17 @@
return this return this
} }
, getActiveIndex: function () {
this.$active = this.$element.find('.item.active')
this.$items = this.$active.parent().children()
return this.$items.index(this.$active)
}
, to: function (pos) { , to: function (pos) {
var $active = this.$element.find('.item.active') var activeIndex = this.getActiveIndex()
, children = $active.parent().children()
, activePos = children.index($active)
, that = this , that = this
if (pos > (children.length - 1) || pos < 0) return if (pos > (this.$items.length - 1) || pos < 0) return
if (this.sliding) { if (this.sliding) {
return this.$element.one('slid', function () { return this.$element.one('slid', function () {
@ -58,11 +63,11 @@
}) })
} }
if (activePos == pos) { if (activeIndex == pos) {
return this.pause().cycle() return this.pause().cycle()
} }
return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
} }
, pause: function (e) { , pause: function (e) {
@ -92,6 +97,7 @@
, isCycling = this.interval , isCycling = this.interval
, direction = type == 'next' ? 'left' : 'right' , direction = type == 'next' ? 'left' : 'right'
, fallback = type == 'next' ? 'first' : 'last' , fallback = type == 'next' ? 'first' : 'last'
, $nextIndicator
, that = this , that = this
, e , e
@ -107,6 +113,14 @@
if ($next.hasClass('active')) return if ($next.hasClass('active')) return
if (this.$indicators.length) {
this.$indicators.find('.active').removeClass('active')
this.$element.one('slid', function () {
$nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
$nextIndicator && $nextIndicator.addClass('active')
})
}
if ($.support.transition && this.$element.hasClass('slide')) { if ($.support.transition && this.$element.hasClass('slide')) {
this.$element.trigger(e) this.$element.trigger(e)
if (e.isDefaultPrevented()) return if (e.isDefaultPrevented()) return

View File

@ -60,8 +60,7 @@
that.$element.appendTo(document.body) //don't move modals dom position that.$element.appendTo(document.body) //don't move modals dom position
} }
that.$element that.$element.show()
.show()
if (transition) { if (transition) {
that.$element[0].offsetWidth // force reflow that.$element[0].offsetWidth // force reflow

View File

@ -289,6 +289,7 @@
var Carousel = function (element, options) { var Carousel = function (element, options) {
this.$element = $(element) this.$element = $(element)
this.$indicators = this.$element.find('.carousel-indicators')
this.options = options this.options = options
this.options.pause == 'hover' && this.$element this.options.pause == 'hover' && this.$element
.on('mouseenter', $.proxy(this.pause, this)) .on('mouseenter', $.proxy(this.pause, this))
@ -305,13 +306,17 @@
return this return this
} }
, getActiveIndex: function () {
this.$active = this.$element.find('.item.active')
this.$items = this.$active.parent().children()
return this.$items.index(this.$active)
}
, to: function (pos) { , to: function (pos) {
var $active = this.$element.find('.item.active') var activeIndex = this.getActiveIndex()
, children = $active.parent().children()
, activePos = children.index($active)
, that = this , that = this
if (pos > (children.length - 1) || pos < 0) return if (pos > (this.$items.length - 1) || pos < 0) return
if (this.sliding) { if (this.sliding) {
return this.$element.one('slid', function () { return this.$element.one('slid', function () {
@ -319,11 +324,11 @@
}) })
} }
if (activePos == pos) { if (activeIndex == pos) {
return this.pause().cycle() return this.pause().cycle()
} }
return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
} }
, pause: function (e) { , pause: function (e) {
@ -353,6 +358,7 @@
, isCycling = this.interval , isCycling = this.interval
, direction = type == 'next' ? 'left' : 'right' , direction = type == 'next' ? 'left' : 'right'
, fallback = type == 'next' ? 'first' : 'last' , fallback = type == 'next' ? 'first' : 'last'
, $nextIndicator
, that = this , that = this
, e , e
@ -368,6 +374,14 @@
if ($next.hasClass('active')) return if ($next.hasClass('active')) return
if (this.$indicators.length) {
this.$indicators.find('.active').removeClass('active')
this.$element.one('slid', function () {
$nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
$nextIndicator && $nextIndicator.addClass('active')
})
}
if ($.support.transition && this.$element.hasClass('slide')) { if ($.support.transition && this.$element.hasClass('slide')) {
this.$element.trigger(e) this.$element.trigger(e)
if (e.isDefaultPrevented()) return if (e.isDefaultPrevented()) return
@ -832,8 +846,7 @@
that.$element.appendTo(document.body) //don't move modals dom position that.$element.appendTo(document.body) //don't move modals dom position
} }
that.$element that.$element.show()
.show()
if (transition) { if (transition) {
that.$element[0].offsetWidth // force reflow that.$element[0].offsetWidth // force reflow

File diff suppressed because one or more lines are too long

View File

@ -1422,6 +1422,11 @@ $('#myCollapsible').on('hidden', function () {
<p>The slideshow below shows a generic plugin and component for cycling through elements like a carousel.</p> <p>The slideshow below shows a generic plugin and component for cycling through elements like a carousel.</p>
<div class="bs-docs-example"> <div class="bs-docs-example">
<div id="myCarousel" class="carousel slide"> <div id="myCarousel" class="carousel slide">
<ol class="carousel-indicators">
<li class="active"></li>
<li></li>
<li></li>
</ol>
<div class="carousel-inner"> <div class="carousel-inner">
<div class="item active"> <div class="item active">
<img src="assets/img/bootstrap-mdo-sfmoma-01.jpg" alt=""> <img src="assets/img/bootstrap-mdo-sfmoma-01.jpg" alt="">

View File

@ -1352,6 +1352,11 @@ $('#myCollapsible').on('hidden', function () {
<p>{{_i}}The slideshow below shows a generic plugin and component for cycling through elements like a carousel.{{/i}}</p> <p>{{_i}}The slideshow below shows a generic plugin and component for cycling through elements like a carousel.{{/i}}</p>
<div class="bs-docs-example"> <div class="bs-docs-example">
<div id="myCarousel" class="carousel slide"> <div id="myCarousel" class="carousel slide">
<ol class="carousel-indicators">
<li class="active"></li>
<li></li>
<li></li>
</ol>
<div class="carousel-inner"> <div class="carousel-inner">
<div class="item active"> <div class="item active">
<img src="assets/img/bootstrap-mdo-sfmoma-01.jpg" alt=""> <img src="assets/img/bootstrap-mdo-sfmoma-01.jpg" alt="">

View File

@ -28,6 +28,7 @@
var Carousel = function (element, options) { var Carousel = function (element, options) {
this.$element = $(element) this.$element = $(element)
this.$indicators = this.$element.find('.carousel-indicators')
this.options = options this.options = options
this.options.pause == 'hover' && this.$element this.options.pause == 'hover' && this.$element
.on('mouseenter', $.proxy(this.pause, this)) .on('mouseenter', $.proxy(this.pause, this))
@ -44,13 +45,17 @@
return this return this
} }
, getActiveIndex: function () {
this.$active = this.$element.find('.item.active')
this.$items = this.$active.parent().children()
return this.$items.index(this.$active)
}
, to: function (pos) { , to: function (pos) {
var $active = this.$element.find('.item.active') var activeIndex = this.getActiveIndex()
, children = $active.parent().children()
, activePos = children.index($active)
, that = this , that = this
if (pos > (children.length - 1) || pos < 0) return if (pos > (this.$items.length - 1) || pos < 0) return
if (this.sliding) { if (this.sliding) {
return this.$element.one('slid', function () { return this.$element.one('slid', function () {
@ -58,11 +63,11 @@
}) })
} }
if (activePos == pos) { if (activeIndex == pos) {
return this.pause().cycle() return this.pause().cycle()
} }
return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
} }
, pause: function (e) { , pause: function (e) {
@ -107,6 +112,14 @@
if ($next.hasClass('active')) return if ($next.hasClass('active')) return
if (this.$indicators.length) {
this.$indicators.find('.active').removeClass('active')
this.$element.one('slid', function () {
var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
$nextIndicator && $nextIndicator.addClass('active')
})
}
if ($.support.transition && this.$element.hasClass('slide')) { if ($.support.transition && this.$element.hasClass('slide')) {
this.$element.trigger(e) this.$element.trigger(e)
if (e.isDefaultPrevented()) return if (e.isDefaultPrevented()) return

View File

@ -60,8 +60,7 @@
that.$element.appendTo(document.body) //don't move modals dom position that.$element.appendTo(document.body) //don't move modals dom position
} }
that.$element that.$element.show()
.show()
if (transition) { if (transition) {
that.$element[0].offsetWidth // force reflow that.$element[0].offsetWidth // force reflow