从函数外部控制 BX Slider
Control BX Slider from outside of function
我在一个页面上有多个 BX 滑块。我不想在 JavaScript (as the documentation suggests) 中给每个人一个明确的 ID,因为可能会有未知数量的滑块。每个轮播在标记中都有一个 ID。
滑块也会在特定断点处更改配置。
我希望能够告诉滑块在页面加载时转到某个幻灯片(类似于 $('#slider1').goToSlide(2)
)。
然而,.goToSlide()
方法不会像那样公开,因为它尚未分配给该 ID(仅 class .js-carousel
)。
那么我该如何实现呢?
$ ->
$('.js-carousel').each ->
# Flags and selector cachine
id = '#' + $(this).attr('id')
sliderLoaded = false
$slider = $( id )
$wrapper = $slider.closest('.js-carousel-wrapper')
$body = $('body')
# Load different options based on the breakpoint
sliderOptions = ( breakpoint ) ->
switch breakpoint
when 'large'
bxLargeOptions =
mode: 'fade'
pagerCustom: id + '_pager'
controls: false
video: true
adaptiveHeight: true
# captions: true
onSliderLoad: onSliderLoad
when 'multi'
bxMultiSmallOptions =
controls: false
minSlides: 2
maxSlides: 6
slideWidth: 128
slideMargin: 0
onSliderLoad: onSliderLoad
infiniteLoop: false
pager: false
else
bxSmallOptions =
pagerCustom: '#pager'
controls: false
easing: 'cubic-bezier(0.645, 0.045, 0.355, 1.000)'
video: true
adaptiveHeight: true
# captions: true
onSliderLoad: onSliderLoad
# Call on every slider load event
onSliderLoad = ->
# Set a flag
sliderLoaded = true
# get the custom next control
sliderNext =
$wrapper.find('.js-carousel-next')
# Get the custom prev control
sliderPrev =
$wrapper.find('.js-carousel-prev')
# Add active class to show controls
$wrapper.addClass('is-active')
# Return the slider type or false
sliderType = ( type ) ->
if $slider.data('carousel-type') == type
return true
else
return false
# Init or reload the slider
slider = ( option, reload ) ->
if reload
$slider.reloadSlider sliderOptions( option )
else
$slider.bxSlider sliderOptions( option )
# Load different sliders for small screens
enquire.register "screen and (max-width:767px)",
match: ->
if !sliderType( 'multi' )
if !sliderLoaded
slider()
else
slider( false, true )
else
if !sliderLoaded
slider( 'multi' )
else
slider( 'multi', true )
# Destroy multi sliders at larger screen sizes
unmatch: ->
if sliderType( 'multi' )
$slider.destroySlider()
# Load different sliders for large screens
enquire.register "screen and (min-width:768px)",
match: ->
if !sliderType( 'multi' )
if !sliderLoaded
slider('large')
else
slider('large', true)
# Custom slider controls
$wrapper.on 'click', '.js-carousel-control', (e) ->
# Prevent normal behaviour in case it's a link
# Although it should be a <button>
e.preventDefault()
# Get the direction stored in the data attribute
slide = $(this).data().slide
# Move the carousel
# Default is to move to a specific slide number
switch slide
when 'prev' then $slider.goToPrevSlide()
when 'next' then $slider.goToNextSlide()
else $slider.goToSlide slide
所以我玩了一把,只需要一点 乐趣 就可以让它发挥作用。说这是你的 HTML:
<h3>Slideshow 1</h3>
<ul id="slider1" class="slider">
<li><img src="http://bxslider.com/images/730_200/hill_trees.jpg" /></li>
<li><img src="http://bxslider.com/images/730_200/me_trees.jpg" /></li>
<li><img src="http://bxslider.com/images/730_200/houses.jpg" /></li>
</ul>
<h3>Slideshow 2</h3>
<ul id="slider2" class="slider">
<li><img src="http://bxslider.com/images/730_200/tree_root.jpg" /></li>
<li><img src="http://bxslider.com/images/730_200/trees.jpg" /></li>
<li><img src="http://bxslider.com/images/730_200/hill_road.jpg" /></li>
</ul>
<h3>Slideshow 3</h3>
<ul id="slider3" class="slider">
<li><img src="http://bxslider.com/images/730_200/tree_root.jpg" /></li>
<li><img src="http://bxslider.com/images/730_200/trees.jpg" /></li>
<li><img src="http://bxslider.com/images/730_200/hill_road.jpg" /></li>
</ul>
这是你的 JS:
var sliders = [];
$('.slider').each(function () {
sliders.push($(this).bxSlider({
mode: 'fade',
auto: true,
autoControls: true,
pause: 2000
}));
});
sliders[1].goToSlide(1);
诀窍是在初始化每个滑块之前进入一个循环,然后您拥有对每个 slider
的引用,允许您选择一个并访问其 API。看这个例子:http://jsfiddle.net/wosszb0w/3/
我在一个页面上有多个 BX 滑块。我不想在 JavaScript (as the documentation suggests) 中给每个人一个明确的 ID,因为可能会有未知数量的滑块。每个轮播在标记中都有一个 ID。
滑块也会在特定断点处更改配置。
我希望能够告诉滑块在页面加载时转到某个幻灯片(类似于 $('#slider1').goToSlide(2)
)。
然而,.goToSlide()
方法不会像那样公开,因为它尚未分配给该 ID(仅 class .js-carousel
)。
那么我该如何实现呢?
$ ->
$('.js-carousel').each ->
# Flags and selector cachine
id = '#' + $(this).attr('id')
sliderLoaded = false
$slider = $( id )
$wrapper = $slider.closest('.js-carousel-wrapper')
$body = $('body')
# Load different options based on the breakpoint
sliderOptions = ( breakpoint ) ->
switch breakpoint
when 'large'
bxLargeOptions =
mode: 'fade'
pagerCustom: id + '_pager'
controls: false
video: true
adaptiveHeight: true
# captions: true
onSliderLoad: onSliderLoad
when 'multi'
bxMultiSmallOptions =
controls: false
minSlides: 2
maxSlides: 6
slideWidth: 128
slideMargin: 0
onSliderLoad: onSliderLoad
infiniteLoop: false
pager: false
else
bxSmallOptions =
pagerCustom: '#pager'
controls: false
easing: 'cubic-bezier(0.645, 0.045, 0.355, 1.000)'
video: true
adaptiveHeight: true
# captions: true
onSliderLoad: onSliderLoad
# Call on every slider load event
onSliderLoad = ->
# Set a flag
sliderLoaded = true
# get the custom next control
sliderNext =
$wrapper.find('.js-carousel-next')
# Get the custom prev control
sliderPrev =
$wrapper.find('.js-carousel-prev')
# Add active class to show controls
$wrapper.addClass('is-active')
# Return the slider type or false
sliderType = ( type ) ->
if $slider.data('carousel-type') == type
return true
else
return false
# Init or reload the slider
slider = ( option, reload ) ->
if reload
$slider.reloadSlider sliderOptions( option )
else
$slider.bxSlider sliderOptions( option )
# Load different sliders for small screens
enquire.register "screen and (max-width:767px)",
match: ->
if !sliderType( 'multi' )
if !sliderLoaded
slider()
else
slider( false, true )
else
if !sliderLoaded
slider( 'multi' )
else
slider( 'multi', true )
# Destroy multi sliders at larger screen sizes
unmatch: ->
if sliderType( 'multi' )
$slider.destroySlider()
# Load different sliders for large screens
enquire.register "screen and (min-width:768px)",
match: ->
if !sliderType( 'multi' )
if !sliderLoaded
slider('large')
else
slider('large', true)
# Custom slider controls
$wrapper.on 'click', '.js-carousel-control', (e) ->
# Prevent normal behaviour in case it's a link
# Although it should be a <button>
e.preventDefault()
# Get the direction stored in the data attribute
slide = $(this).data().slide
# Move the carousel
# Default is to move to a specific slide number
switch slide
when 'prev' then $slider.goToPrevSlide()
when 'next' then $slider.goToNextSlide()
else $slider.goToSlide slide
所以我玩了一把,只需要一点 乐趣 就可以让它发挥作用。说这是你的 HTML:
<h3>Slideshow 1</h3>
<ul id="slider1" class="slider">
<li><img src="http://bxslider.com/images/730_200/hill_trees.jpg" /></li>
<li><img src="http://bxslider.com/images/730_200/me_trees.jpg" /></li>
<li><img src="http://bxslider.com/images/730_200/houses.jpg" /></li>
</ul>
<h3>Slideshow 2</h3>
<ul id="slider2" class="slider">
<li><img src="http://bxslider.com/images/730_200/tree_root.jpg" /></li>
<li><img src="http://bxslider.com/images/730_200/trees.jpg" /></li>
<li><img src="http://bxslider.com/images/730_200/hill_road.jpg" /></li>
</ul>
<h3>Slideshow 3</h3>
<ul id="slider3" class="slider">
<li><img src="http://bxslider.com/images/730_200/tree_root.jpg" /></li>
<li><img src="http://bxslider.com/images/730_200/trees.jpg" /></li>
<li><img src="http://bxslider.com/images/730_200/hill_road.jpg" /></li>
</ul>
这是你的 JS:
var sliders = [];
$('.slider').each(function () {
sliders.push($(this).bxSlider({
mode: 'fade',
auto: true,
autoControls: true,
pause: 2000
}));
});
sliders[1].goToSlide(1);
诀窍是在初始化每个滑块之前进入一个循环,然后您拥有对每个 slider
的引用,允许您选择一个并访问其 API。看这个例子:http://jsfiddle.net/wosszb0w/3/