Bootstrap v5.0 Carousel stop autoplay after a carousel item is selected (clicked)

Viewed 1483

I am trying to stop the carousel autoplay with jQuery after I click on a carousel item. But none of my attempts works. Can anyone help me with it?

Thanks!

This is my attempt 1:

 $(".carousel-item .card-selection").on("click", function (){
        $("#carouselExampleControls").attr("data-bs-interval", "false");
})

I have also tried (after removing the data-bs-ride="carousel" attribute in HTML):

 $(".carousel-item .card-selection").on("click", function (){
        $("#carouselExampleControls").carousel({
            pause: true,
            interval: false
        });
})

This is the carousel:

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.1/dist/umd/popper.min.js"></script>

<div id="carouselExampleControls" class="carousel slide" data-bs-ride="carousel" data-bs-interval="2000">
  <div class="carousel-inner">
    <div class="carousel-item active">
      <div class="row selection-wrapper">
        <div class="mb-2 col-6">
          <div class="card card-selection h-100">
            <label for="selected-item-4" class="mx-2 selected-label">
                                            <input type="radio" name="G1" id="selected-item-4">
                                            <span class="icon"></span>
                                            <div class="card-body">
                                                <h5 class="card-title">1</h5>
                                                <p class="card-text">This is a wider card with supporting text below as a natural
                                                    lead-in to additional content. This content is a little bit longer.</p>
                                            </div>

                                            </label>
          </div>
        </div>
      </div>
    </div>
    <div class="carousel-item">
      <div class="row selection-wrapper">
        <div class="mb-2 col-6">
          <div class="card card-selection h-100">
            <label for="selected-item-5" class=" border-light mx-1 selected-label">
                                                <input type="radio" name="G2" id="selected-item-5">
                                                <span class="icon"></span>
                                                <div class="card-body">
                                                    <h5 class="card-title">2</h5>
                                                    <p class="card-text">This card has supporting text below as a natural lead-in to
                                                        additional content.</p>
                                                </div>
                                            </label>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

2 Answers

I've got it to work like this, there might be a better "bootstrap" way of doing this.

var myCarousel = document.querySelector('#carouselExampleControls')
var carousel = new bootstrap.Carousel(myCarousel, {
  ride: 'carousel',
  interval: 100,
});

let paused = false;
$('.card-body').on('click', () => {
  if (paused) {
    carousel.cycle()
    paused = false;
  } else {
    carousel.pause();
    paused = true;
  }
});
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.1/dist/umd/popper.min.js"></script>

<div id="carouselExampleControls" class="carousel slide">
  <div class="carousel-inner">
    <div class="carousel-item active">
      <div class="row selection-wrapper">
        <div class="mb-2 col-6">
          <div class="card card-selection h-100">
            <label for="selected-item-4" class="mx-2 selected-label">
                                            <input type="radio" name="G1" id="selected-item-4">
                                            <span class="icon"></span>
                                            <div class="card-body">
                                                <h5 class="card-title">1</h5>
                                                <p class="card-text">This is a wider card with supporting text below as a natural
                                                    lead-in to additional content. This content is a little bit longer.</p>
                                            </div>

                                            </label>
          </div>
        </div>
      </div>
    </div>
    <div class="carousel-item">
      <div class="row selection-wrapper">
        <div class="mb-2 col-6">
          <div class="card card-selection h-100">
            <label for="selected-item-5" class=" border-light mx-1 selected-label">
                                                <input type="radio" name="G2" id="selected-item-5">
                                                <span class="icon"></span>
                                                <div class="card-body">
                                                    <h5 class="card-title">2</h5>
                                                    <p class="card-text">This card has supporting text below as a natural lead-in to
                                                        additional content.</p>
                                                </div>
                                            </label>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

If I understand your comment about “after a card is selected” — you’re looking for the user to be able to click the radio button on the card, and doing so will stop the carousel from cycling (at least until the user clicks the radio button again to deselect the card).

You can do this with just JavaScript. Bootstrap 5 doesn’t need jQuery, and since Bootstrap 5 only supports modern browsers (no IE), you shouldn’t need jQuery.

You can use Bootstrap’s carousel instance to stop and restart the carousel.

var myCarousel = document.getElementById("carouselExampleControls");
var radios = document.querySelectorAll("input[type=radio]");
var cycling = true;

radios.forEach(function(radio) {
    radio.checked = false;
    radio.addEventListener("click", function(e) {
        var carousel = bootstrap.Carousel.getInstance(myCarousel);

        if (cycling === true) {
            carousel.pause();
            cycling = false;
        } else {
            carousel.cycle();
            cycling = true;
            e.target.checked = false;
        }
    });
});
.carousel-item {
    height: 12.5rem;
}
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/js/bootstrap.bundle.min.js"></script>

<div class="container">
    <div class="row selection-wrapper">
        <div class="col-6 mb-2 ">
            <div id="carouselExampleControls" class="carousel slide" data-bs-ride="carousel" data-bs-interval="1000">
                <div class="carousel-inner">
                    <div class="carousel-item active">
                        <div class="card card-selection h-100">
                            <label for="selected-item-4" class="mx-2 selected-label">
                                <input type="radio" name="G1" id="selected-item-4">
                                <span class="icon"></span>
                            </label>
                            <div class="card-body">
                                <h5 class="card-title">1</h5>
                                <p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
                            </div>
                        </div>
                    </div>

                    <div class="carousel-item">
                        <div class="card card-selection h-100">
                            <label for="selected-item-5" class=" border-light mx-1 selected-label">
                                <input type="radio" name="G2" id="selected-item-5">
                                <span class="icon"></span>
                            </label>
                            <div class="card-body">
                                <h5 class="card-title">2</h5>
                                <p class="card-text">This card has supporting text below as a natural lead-in to additional content.</p>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

I did move your div out of the label (divs aren’t supposed to be a child of a label) and I wasn’t sure why you had a row and col-6 inside the carousel-item, so I changed those. I also added a fixed height to the cards.

Related