Bootstrap轮播指标脱离主div不自动切换
Bootstrap carousel indicators out of the main div not switching automatically
我有最新的 Bootstrap,并且在我的页面某处有一个轮播,指示器在主轮播之外 div。
我的轮播:
<div class="background-carousel">
<div class="carousel slide carousel-fade" id="carousel-home" data-ride="carousel1">
<div class="carousel-inner" role="listbox" id="carousel-inner-home">
<div data-slide-no="0" class="item carousel-item active" style="background-image:url(<?php echo get_template_directory_uri(); ?>/assets/img/home-bg-1.png)">
</div>
<div data-slide-no="1" class="item carousel-item" style="background-image:url(<?php echo get_template_directory_uri(); ?>/assets/img/grass.jpg)">
</div>
<div data-slide-no="2" class="item carousel-item" style="background-image:url(<?php echo get_template_directory_uri(); ?>/assets/img/grass2.jpg)">
</div>
<div data-slide-no="3" class="item carousel-item" style="background-image:url(<?php echo get_template_directory_uri(); ?>/assets/img/grass3.jpg)">
</div>
</div>
</div> <!-- carousel -->
</div> <!-- /.background-carousel -->
然后我在页面的其他地方有我的指标:
<div class="home-carousel-indicators">
<ol class="carousel-indicators">
<li data-target="#carousel-home" data-slide-to="0" class="carousel-switcher active"></li>
<li data-target="#carousel-home" data-slide-to="1" class="carousel-switcher"></li>
<li data-target="#carousel-home" data-slide-to="2" class="carousel-switcher"></li>
<li data-target="#carousel-home" data-slide-to="3" class="carousel-switcher"></li>
</ol>
</div> <!-- /.home-caraousel-indicators -->
随着轮播切换图片,指示器没有变化。我还必须使用变通方法让他们在单击时更改轮播。
总结一下:
- 我的轮播效果很好。
- 我的轮播指示器在轮播之外 div。
- 轮播时指示灯不会自动切换。
- 我不得不使用 jQuery 解决方法来修复单击指示器时的问题。
您可以使用 bootstrap carousel
的 slide.bs.carousel
选项,并根据当前幻灯片制作相应的指标 active
,如下所示:
var $carousel = $('#myCarousel'); //get a reference
$carousel.carousel();
$carousel.bind('slide.bs.carousel', function (e) { //attach its event
var current=$(e.target).find('.item.active'); //get the current active slide
$('.carousel-indicators li').removeClass('active') //remove active class from all the li of carousel indicator
var indx=$(current).index(); //get its index
if((indx+2)>$('.carousel-indicators li').length)
indx=-1 //if index exceeds total length of indicators present set it to -1
$('.carousel-indicators li:nth-child('+(indx+2)+')').addClass('active');//set the respective indicator active
});
更新
上面给出的答案只是说明当它们放在carousel
之外时如何制作indicators active
。它在 click
时不工作,因为我没有处理轮播指示器的点击事件。下面的更新修复了相同的问题。
var $carousel = $('#myCarousel');
$carousel.carousel();
var handled=false;//global variable
$carousel.bind('slide.bs.carousel', function (e) {
var current=$(e.target).find('.item.active');
var indx=$(current).index();
if((indx+2)>$('.carousel-indicators li').length)
indx=-1
if(!handled)
{
$('.carousel-indicators li').removeClass('active')
$('.carousel-indicators li:nth-child('+(indx+2)+')').addClass('active');
}
else
{
handled=!handled;//if handled=true make it back to false to work normally.
}
});
$(".carousel-indicators li").on('click',function(){
//Click event for indicators
$(this).addClass('active').siblings().removeClass('active');
//remove siblings active class and add it to current clicked item
handled=true; //set global variable to true to identify whether indicator changing was handled or not.
});
Guruprasads 代码在移至上一张幻灯片时未激活正确的指示器。
这是我更通用的解决方案。
将 ol 元素上的数据目标属性设置为轮播的 ID:
<ol class="carousel-indicators" data-target="#myCarousel">
并包含以下js代码:
function initCarouselIndicators() {
$(".carousel-indicators[data-target]").each(function (i, indicators) {
var targetId = indicators.dataset.target;
if (targetId != "") {
var $carousel = $(targetId);
$carousel.bind('slide.bs.carousel', function (e) {
var $targetSlide = $(e.relatedTarget);
var index = $targetSlide.index();
$('.carousel-indicators[data-target="' + targetId + '"] li').removeClass('active')
$('.carousel-indicators[data-target="' + targetId + '"] li:nth-child(' + (index + 1) + ')').addClass('active');
});
}
});
}
$(document).ready(function () {
initCarouselIndicators();
}
您也可以将以下代码用于 bootstrap4
$('#your-slide-div').on('slide.bs.carousel', function () {
$holder = $( ".carousel-indicators li.active" );
$holder.next( "li" ).addClass("active");
if($holder.is(':last-child'))
{
$holder.removeClass("active");
$(".carousel-indicators li:first").addClass("active");
}
$holder.removeClass("active");
});
这里是 Guruprasad Rao 的一个更简化的示例,如果指标在主轮播之外 div,则可以使指标正常工作。它适用于具有 data-target
属性 的每个元素,而不仅仅是 li
$('.carousel').bind('slide.bs.carousel', function (e) {
var index = $(e.relatedTarget).index();
$('[data-target="#' + $(this).prop('id') + '"]').each(function (i) {
if (i === index) {
$(this).addClass('active');
} else {
$(this).removeClass('active');
}
});
});
对于Bootstrap 5
#myCarousel
是轮播的 ID,而 #indicators
是指标的父级 div 的 ID。
let myCarousel = document.querySelector('#myCarousel');
myCarousel.addEventListener('slide.bs.carousel', (event) => {
let elementChildrens = document.querySelector("#indicators").children;
elementChildrens.item(event.from).classList.remove("active");
elementChildrens.item(event.to).classList.add("active");
});
HTML 指标:
<div id="indicators" class="carousel-indicators">
<button type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide-to="0" class="active" aria-current="true" aria-label="Slide 1"></button>
<button type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide-to="1" aria-label="Slide 2"></button>
<button type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide-to="2" aria-label="Slide 3"></button>
</div>
HTML 轮播:
<div id="myCarousel" class="carousel slide" data-bs-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<img src="..." class="d-block w-100" alt="...">
</div>
<div class="carousel-item">
<img src="..." class="d-block w-100" alt="...">
</div>
<div class="carousel-item">
<img src="..." class="d-block w-100" alt="...">
</div>
</div>
</div>
这是一个使用 slid.bs.carousel
的简单解决方案
$('#myCarousel').on('slid.bs.carousel', function (e) {
$('.carousel-indicators li').removeClass('active')
var index = $(e.target).find('.active').index();
$('.carousel-indicators li').eq(index).addClass('active');
})
我有最新的 Bootstrap,并且在我的页面某处有一个轮播,指示器在主轮播之外 div。
我的轮播:
<div class="background-carousel">
<div class="carousel slide carousel-fade" id="carousel-home" data-ride="carousel1">
<div class="carousel-inner" role="listbox" id="carousel-inner-home">
<div data-slide-no="0" class="item carousel-item active" style="background-image:url(<?php echo get_template_directory_uri(); ?>/assets/img/home-bg-1.png)">
</div>
<div data-slide-no="1" class="item carousel-item" style="background-image:url(<?php echo get_template_directory_uri(); ?>/assets/img/grass.jpg)">
</div>
<div data-slide-no="2" class="item carousel-item" style="background-image:url(<?php echo get_template_directory_uri(); ?>/assets/img/grass2.jpg)">
</div>
<div data-slide-no="3" class="item carousel-item" style="background-image:url(<?php echo get_template_directory_uri(); ?>/assets/img/grass3.jpg)">
</div>
</div>
</div> <!-- carousel -->
</div> <!-- /.background-carousel -->
然后我在页面的其他地方有我的指标:
<div class="home-carousel-indicators">
<ol class="carousel-indicators">
<li data-target="#carousel-home" data-slide-to="0" class="carousel-switcher active"></li>
<li data-target="#carousel-home" data-slide-to="1" class="carousel-switcher"></li>
<li data-target="#carousel-home" data-slide-to="2" class="carousel-switcher"></li>
<li data-target="#carousel-home" data-slide-to="3" class="carousel-switcher"></li>
</ol>
</div> <!-- /.home-caraousel-indicators -->
随着轮播切换图片,指示器没有变化。我还必须使用变通方法让他们在单击时更改轮播。
总结一下:
- 我的轮播效果很好。
- 我的轮播指示器在轮播之外 div。
- 轮播时指示灯不会自动切换。
- 我不得不使用 jQuery 解决方法来修复单击指示器时的问题。
您可以使用 bootstrap carousel
的 slide.bs.carousel
选项,并根据当前幻灯片制作相应的指标 active
,如下所示:
var $carousel = $('#myCarousel'); //get a reference
$carousel.carousel();
$carousel.bind('slide.bs.carousel', function (e) { //attach its event
var current=$(e.target).find('.item.active'); //get the current active slide
$('.carousel-indicators li').removeClass('active') //remove active class from all the li of carousel indicator
var indx=$(current).index(); //get its index
if((indx+2)>$('.carousel-indicators li').length)
indx=-1 //if index exceeds total length of indicators present set it to -1
$('.carousel-indicators li:nth-child('+(indx+2)+')').addClass('active');//set the respective indicator active
});
更新
上面给出的答案只是说明当它们放在carousel
之外时如何制作indicators active
。它在 click
时不工作,因为我没有处理轮播指示器的点击事件。下面的更新修复了相同的问题。
var $carousel = $('#myCarousel');
$carousel.carousel();
var handled=false;//global variable
$carousel.bind('slide.bs.carousel', function (e) {
var current=$(e.target).find('.item.active');
var indx=$(current).index();
if((indx+2)>$('.carousel-indicators li').length)
indx=-1
if(!handled)
{
$('.carousel-indicators li').removeClass('active')
$('.carousel-indicators li:nth-child('+(indx+2)+')').addClass('active');
}
else
{
handled=!handled;//if handled=true make it back to false to work normally.
}
});
$(".carousel-indicators li").on('click',function(){
//Click event for indicators
$(this).addClass('active').siblings().removeClass('active');
//remove siblings active class and add it to current clicked item
handled=true; //set global variable to true to identify whether indicator changing was handled or not.
});
Guruprasads 代码在移至上一张幻灯片时未激活正确的指示器。 这是我更通用的解决方案。
将 ol 元素上的数据目标属性设置为轮播的 ID:
<ol class="carousel-indicators" data-target="#myCarousel">
并包含以下js代码:
function initCarouselIndicators() {
$(".carousel-indicators[data-target]").each(function (i, indicators) {
var targetId = indicators.dataset.target;
if (targetId != "") {
var $carousel = $(targetId);
$carousel.bind('slide.bs.carousel', function (e) {
var $targetSlide = $(e.relatedTarget);
var index = $targetSlide.index();
$('.carousel-indicators[data-target="' + targetId + '"] li').removeClass('active')
$('.carousel-indicators[data-target="' + targetId + '"] li:nth-child(' + (index + 1) + ')').addClass('active');
});
}
});
}
$(document).ready(function () {
initCarouselIndicators();
}
您也可以将以下代码用于 bootstrap4
$('#your-slide-div').on('slide.bs.carousel', function () {
$holder = $( ".carousel-indicators li.active" );
$holder.next( "li" ).addClass("active");
if($holder.is(':last-child'))
{
$holder.removeClass("active");
$(".carousel-indicators li:first").addClass("active");
}
$holder.removeClass("active");
});
这里是 Guruprasad Rao 的一个更简化的示例,如果指标在主轮播之外 div,则可以使指标正常工作。它适用于具有 data-target
属性 的每个元素,而不仅仅是 li
$('.carousel').bind('slide.bs.carousel', function (e) {
var index = $(e.relatedTarget).index();
$('[data-target="#' + $(this).prop('id') + '"]').each(function (i) {
if (i === index) {
$(this).addClass('active');
} else {
$(this).removeClass('active');
}
});
});
对于Bootstrap 5
#myCarousel
是轮播的 ID,而 #indicators
是指标的父级 div 的 ID。
let myCarousel = document.querySelector('#myCarousel');
myCarousel.addEventListener('slide.bs.carousel', (event) => {
let elementChildrens = document.querySelector("#indicators").children;
elementChildrens.item(event.from).classList.remove("active");
elementChildrens.item(event.to).classList.add("active");
});
HTML 指标:
<div id="indicators" class="carousel-indicators">
<button type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide-to="0" class="active" aria-current="true" aria-label="Slide 1"></button>
<button type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide-to="1" aria-label="Slide 2"></button>
<button type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide-to="2" aria-label="Slide 3"></button>
</div>
HTML 轮播:
<div id="myCarousel" class="carousel slide" data-bs-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<img src="..." class="d-block w-100" alt="...">
</div>
<div class="carousel-item">
<img src="..." class="d-block w-100" alt="...">
</div>
<div class="carousel-item">
<img src="..." class="d-block w-100" alt="...">
</div>
</div>
</div>
这是一个使用 slid.bs.carousel
$('#myCarousel').on('slid.bs.carousel', function (e) {
$('.carousel-indicators li').removeClass('active')
var index = $(e.target).find('.active').index();
$('.carousel-indicators li').eq(index).addClass('active');
})