Bxslider 未出现在选项卡中
Bxslider not appearing in tab
我的网站上有手风琴标签,我正尝试在其中使用 bxslider 制作我的幻灯片。问题是当幻灯片打开时,它显示滑块的高度为 0。
我试过使用 bxslider 提供的重新加载函数,但它一直告诉我这不是函数 - 我可能做错了什么。
我也尝试过向视口添加静态高度,但这只会弄乱图像。我创建了一个 JSFiddle
$(document).ready(function(){
$('.bxslider').bxSlider({
auto: 'true',
pager: 'false',
});
$('#accordion').find('.accordion-toggle').click(function (){
$(this).parent().toggleClass('active');
//Hide the other panels
$('#accordion section').not($(this).parent()).removeClass('active');
});
});
注意:我手动将 bxslider 的脚本和 CSS 复制粘贴到 JSFiddle 中,因为我无法弄清楚如何在不这样做的情况下添加它们。我的脚本可以在 bxslider 脚本下面找到
据此comment,
the bxSlider interface is only available on jQuery selectors that match a
single element
利用他的 example,我想出了这个解决方案。
$(function() {
var bxConfig = {
auto: 'true',
pager: 'false'
};
// cache elements that we will be re-using
var $accordion = $('#accordion'),
$sections = $accordion.find('section'),
$sliders = [];
// initialize sliders
$('.bxslider').each(function (i) {
$sliders[i] = $(this).bxSlider(bxConfig);
});
$accordion.find('.accordion-toggle').on('click', function() {
var $current = $(this).closest('section');
// close other sections
$sections.not($current).removeClass('active');
// toggle current section
$current.toggleClass('active');
// check if section is active
if ($current.hasClass('active')) {
// get the position of the current section among his siblings
var index = $sections.index($current);
// reload slider at the given position
$sliders[index].reloadSlider();
}
});
});
这是一个 demo 我缩小了图片只是为了更容易看。
我正在使用该部分的索引来确定要重新加载哪个滑块。因此,如果您在每个部分中有 2 个或更多滑块,或者如果不是所有部分都有滑块,则此解决方案将不起作用。另一种方法是遍历 所有 滑块并在您打开一个部分时重新加载它们——但这是浪费。
此问题已通过 redrawSlider()
method. It is specifically for when bxSlider is unhidden. It requires a repaint. This is only documented here 解决。不幸的是,它的用法似乎不准确,所以我想出了一些实际效果很好的东西。
我在每个 .accordion-toggle
中放置了锚点,并在锚点上委托了一个点击事件。最初,我试图将该方法放在手风琴的功能中,但它不起作用。 redrawSlider()
一开始没有用,经过一番研究后我什么也没发现...所以我猜一定是时机问题,BINGO!
顺便说一句,我知道它没有记录,但如果您有多个滑块,则每个滑块都必须唯一引用。因此,即使您的滑块共享一个公共 class,也可以为每个滑块添加一个唯一的 class 或者一个 id 也不错。每个滑块都应该有自己的设置,即使它们是相同的。
此外,布尔值不是字符串,有时 JavaScript 自动类型转换并不总能捕捉到它。所以在使用 true 和 false 值时要小心,让它们 不加引号 。如果引用,它在技术上是一个字符串。
$('a.trig1').on('click', function(e) {
e.preventDefault();
setTimeout(function() {
bx1.redrawSlider();
}, 0);
});
$('a.trig2').on('click', function(e) {
e.preventDefault();
setTimeout(function() {
bx2.redrawSlider();
}, 0);
});
片段
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Hidden bxSliders</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/bxslider/4.2.5/jquery.bxslider.css">
<style>
#accordion section .accordion-content {
display: none;
padding: 0 30px 30px 30px;
}
#accordion section.active .accordion-content {
display: block;
}
.bx img {
margin: 0 auto;
display: block;
}
</style>
</head>
<body>
<div id="accordion">
<section>
<h2 class="accordion-toggle"><a href="#" class="trig1">Test 1</a></h2>
<div class="accordion-content">
<p>slider 1</p>
<ul class="bxslider1 bx">
<li>
<img src="http://ichef.bbci.co.uk/images/ic/640x360/p02scs5q.jpg">
</li>
<li>
<img src="https://d2v9y0dukr6mq2.cloudfront.net/video/thumbnail/EhSddnV/black-and-white-tunnel-effect-turning-left-zoomed-video-background-for-a-transition-or-luma-key-spinning-left-tunnel-effect-zoomed-tunnel-hole-visual-effect_41rgnb8w__M0000.jpg">
</li>
<li>
<img src="https://i.vimeocdn.com/video/541094548_640x360.jpg">
</li>
</ul>
</div>
</section>
<section>
<h2 class="accordion-toggle"><a href="#" class="trig2">Test 2</a></h2>
<div class="accordion-content">
<p>slider 2</p>
<ul class="bxslider2 bx">
<li>
<img src="http://cache1.asset-cache.net/xd/513331420.jpg?v=1&c=IWSAsset&k=2&d=2DF30557A92EF68A79FB2FAE5DFF30DA4E7679DD01108BC64BBAD824103B0C3B9D10438B022685F4">
</li>
<li>
<img src="http://www.rantsports.com/clubhouse/files/2015/03/Arianny-Celeste-7.jpg">
</li>
<li>
<img src="http://breakingenergy.com/wp-content/uploads/sites/2/2013/04/72410727.jpg">
</li>
</ul>
</div>
</section>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/bxslider/4.2.3/jquery.bxslider.min.js"></script>
<script>
var bx1 = $('.bxslider1').bxSlider({
auto: true,
pause: 2000,
autoHover: true,
pager: false
});
var bx2 = $('.bxslider2').bxSlider({
auto: true,
pause: 2000,
autoHover: true,
pager: false
});
$('a.trig1').on('click', function(e) {
e.preventDefault();
setTimeout(function() {
bx1.redrawSlider();
}, 0);
});
$('a.trig2').on('click', function(e) {
e.preventDefault();
setTimeout(function() {
bx2.redrawSlider();
}, 0);
});
$('.accordion-toggle').click(function(e) {
e.preventDefault();
$(this).parent().toggleClass('active');
$('#accordion section').not($(this).parent()).removeClass('active');
});
</script>
</body>
</html>
我的网站上有手风琴标签,我正尝试在其中使用 bxslider 制作我的幻灯片。问题是当幻灯片打开时,它显示滑块的高度为 0。
我试过使用 bxslider 提供的重新加载函数,但它一直告诉我这不是函数 - 我可能做错了什么。
我也尝试过向视口添加静态高度,但这只会弄乱图像。我创建了一个 JSFiddle
$(document).ready(function(){
$('.bxslider').bxSlider({
auto: 'true',
pager: 'false',
});
$('#accordion').find('.accordion-toggle').click(function (){
$(this).parent().toggleClass('active');
//Hide the other panels
$('#accordion section').not($(this).parent()).removeClass('active');
});
});
注意:我手动将 bxslider 的脚本和 CSS 复制粘贴到 JSFiddle 中,因为我无法弄清楚如何在不这样做的情况下添加它们。我的脚本可以在 bxslider 脚本下面找到
据此comment,
the bxSlider interface is only available on jQuery selectors that match a single element
利用他的 example,我想出了这个解决方案。
$(function() {
var bxConfig = {
auto: 'true',
pager: 'false'
};
// cache elements that we will be re-using
var $accordion = $('#accordion'),
$sections = $accordion.find('section'),
$sliders = [];
// initialize sliders
$('.bxslider').each(function (i) {
$sliders[i] = $(this).bxSlider(bxConfig);
});
$accordion.find('.accordion-toggle').on('click', function() {
var $current = $(this).closest('section');
// close other sections
$sections.not($current).removeClass('active');
// toggle current section
$current.toggleClass('active');
// check if section is active
if ($current.hasClass('active')) {
// get the position of the current section among his siblings
var index = $sections.index($current);
// reload slider at the given position
$sliders[index].reloadSlider();
}
});
});
这是一个 demo 我缩小了图片只是为了更容易看。
我正在使用该部分的索引来确定要重新加载哪个滑块。因此,如果您在每个部分中有 2 个或更多滑块,或者如果不是所有部分都有滑块,则此解决方案将不起作用。另一种方法是遍历 所有 滑块并在您打开一个部分时重新加载它们——但这是浪费。
此问题已通过 redrawSlider()
method. It is specifically for when bxSlider is unhidden. It requires a repaint. This is only documented here 解决。不幸的是,它的用法似乎不准确,所以我想出了一些实际效果很好的东西。
我在每个 .accordion-toggle
中放置了锚点,并在锚点上委托了一个点击事件。最初,我试图将该方法放在手风琴的功能中,但它不起作用。 redrawSlider()
一开始没有用,经过一番研究后我什么也没发现...所以我猜一定是时机问题,BINGO!
顺便说一句,我知道它没有记录,但如果您有多个滑块,则每个滑块都必须唯一引用。因此,即使您的滑块共享一个公共 class,也可以为每个滑块添加一个唯一的 class 或者一个 id 也不错。每个滑块都应该有自己的设置,即使它们是相同的。
此外,布尔值不是字符串,有时 JavaScript 自动类型转换并不总能捕捉到它。所以在使用 true 和 false 值时要小心,让它们 不加引号 。如果引用,它在技术上是一个字符串。
$('a.trig1').on('click', function(e) {
e.preventDefault();
setTimeout(function() {
bx1.redrawSlider();
}, 0);
});
$('a.trig2').on('click', function(e) {
e.preventDefault();
setTimeout(function() {
bx2.redrawSlider();
}, 0);
});
片段
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Hidden bxSliders</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/bxslider/4.2.5/jquery.bxslider.css">
<style>
#accordion section .accordion-content {
display: none;
padding: 0 30px 30px 30px;
}
#accordion section.active .accordion-content {
display: block;
}
.bx img {
margin: 0 auto;
display: block;
}
</style>
</head>
<body>
<div id="accordion">
<section>
<h2 class="accordion-toggle"><a href="#" class="trig1">Test 1</a></h2>
<div class="accordion-content">
<p>slider 1</p>
<ul class="bxslider1 bx">
<li>
<img src="http://ichef.bbci.co.uk/images/ic/640x360/p02scs5q.jpg">
</li>
<li>
<img src="https://d2v9y0dukr6mq2.cloudfront.net/video/thumbnail/EhSddnV/black-and-white-tunnel-effect-turning-left-zoomed-video-background-for-a-transition-or-luma-key-spinning-left-tunnel-effect-zoomed-tunnel-hole-visual-effect_41rgnb8w__M0000.jpg">
</li>
<li>
<img src="https://i.vimeocdn.com/video/541094548_640x360.jpg">
</li>
</ul>
</div>
</section>
<section>
<h2 class="accordion-toggle"><a href="#" class="trig2">Test 2</a></h2>
<div class="accordion-content">
<p>slider 2</p>
<ul class="bxslider2 bx">
<li>
<img src="http://cache1.asset-cache.net/xd/513331420.jpg?v=1&c=IWSAsset&k=2&d=2DF30557A92EF68A79FB2FAE5DFF30DA4E7679DD01108BC64BBAD824103B0C3B9D10438B022685F4">
</li>
<li>
<img src="http://www.rantsports.com/clubhouse/files/2015/03/Arianny-Celeste-7.jpg">
</li>
<li>
<img src="http://breakingenergy.com/wp-content/uploads/sites/2/2013/04/72410727.jpg">
</li>
</ul>
</div>
</section>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/bxslider/4.2.3/jquery.bxslider.min.js"></script>
<script>
var bx1 = $('.bxslider1').bxSlider({
auto: true,
pause: 2000,
autoHover: true,
pager: false
});
var bx2 = $('.bxslider2').bxSlider({
auto: true,
pause: 2000,
autoHover: true,
pager: false
});
$('a.trig1').on('click', function(e) {
e.preventDefault();
setTimeout(function() {
bx1.redrawSlider();
}, 0);
});
$('a.trig2').on('click', function(e) {
e.preventDefault();
setTimeout(function() {
bx2.redrawSlider();
}, 0);
});
$('.accordion-toggle').click(function(e) {
e.preventDefault();
$(this).parent().toggleClass('active');
$('#accordion section').not($(this).parent()).removeClass('active');
});
</script>
</body>
</html>