Is there any way to stop auto-playing of bootstrap carousel slide?

Viewed 138

I'm making a carousel slide with Bootstrap carousel. I want to stop auto-playing of slides and I would like to make a button, which controls to toggle the auto-playing on/off.

I've searched about it already and it recommended me to add an attribute data-interval=false for the carousel div or to add a script: $('.carousel').carousel({ interval: false, }).

It stops auto-playing when the above values are set as default value but when I want to toggle the auto-playing on/off, it doesn't work and keeps auto-playing.

Here's the script I have so far:

var total = $('.carousel-item').length;
var currentIndex = $('div.active').index() + 1;
$('.current_slide').html(currentIndex + ' / ' + total);

$('.carousel').on('slid.bs.carousel', function() {
currentIndex = $('div.active').index() + 1;

var text = currentIndex + ' / ' + total;
$('.current_slide').html(text);
});

function navAutoplay() {
    if ($('.if_paused').hasClass('carousel_now')) {
        $('*.carousel_now').removeClass('carousel_now');
        $('.if_started').addClass('carousel_now');
    }

    else {    
        $('*.carousel_now').removeClass('carousel_now');
        $('.if_paused').addClass('carousel_now');
    }
}

$(document).ready(function() {
    if ($('.if_started').hasClass('carousel_now')) {
        $('.carousel').carousel({
            interval: 7000
        });
    }

    else {
        $('.carousel').carousel({
            interval: false
        });
    }
})    

The html code:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="carouselExampleFade" data-interval="7000" class="carousel slide carousel-fade" data-ride="carousel">
    <div class="carousel-inner">
    <div class="carousel-item active">
        <img src="https://p.bigstockphoto.com/GeFvQkBbSLaMdpKXF1Zv_bigstock-Aerial-View-Of-Blue-Lakes-And--227291596.jpg" class="d-block w-100" alt="...">
    </div>
    <div class="carousel-item">
        <img src="https://p.bigstockphoto.com/GeFvQkBbSLaMdpKXF1Zv_bigstock-Aerial-View-Of-Blue-Lakes-And--227291596.jpg" class="d-block w-100" alt="...">
    </div>
    </div>
    <div class="carousel_nav">
        <div class="current_slide">

        </div>
        <a class="carousel-control-prev" href="#carouselExampleFade" role="button" data-slide="prev">
            <span class="carousel-control-prev-icon" aria-hidden="true"></span>
            <span class="sr-only">Previous</span>
        </a>
        <div class="corousel_nav_autoplay">
            <a class="if_paused">
                <span onclick="navAutoplay()"></span>
            </a>
            <a class="if_started carousel_now">
                <span onclick="navAutoplay()"></span>
            </a>
        </div>
        <a class="carousel-control-next" href="#carouselExampleFade" role="button" data-slide="next">
            <span class="carousel-control-next-icon" aria-hidden="true"></span>
            <span class="sr-only">Next</span>
        </a>
    </div>
    </div>

    <div id="carouselExampleFade" data-interval="7000" class="carousel slide carousel-fade" data-ride="carousel">
    <div class="carousel-inner">
    <div class="carousel-item active">
    <img src="img/slide01_01.png" class="d-block w-100" alt="...">
    </div>
    <div class="carousel-item">
    <img src="img/slide02_01.png" class="d-block w-100" alt="...">
    </div>
    </div>
    <div class="carousel_nav">
    <div class="current_slide">

    </div>
    <a class="carousel-control-prev" href="#carouselExampleFade" role="button" data-slide="prev">
        <span class="carousel-control-prev-icon" aria-hidden="true"></span>
        <span class="sr-only">Previous</span>
    </a>
    <div class="corousel_nav_autoplay">
        <a class="if_paused">
            <span onclick="navAutoplay()"></span>
        </a>
        <a class="if_started carousel_now">
            <span onclick="navAutoplay()"></span>
        </a>
    </div>
    <a class="carousel-control-next" href="#carouselExampleFade" role="button" data-slide="next">
        <span class="carousel-control-next-icon" aria-hidden="true"></span>
        <span class="sr-only">Next</span>
    </a>
    </div>
    </div>
    <script>
    var total = $('.carousel-item').length;
    var currentIndex = $('div.active').index() + 1;
    $('.current_slide').html(currentIndex + '&nbsp;/&nbsp;' + total);

    $('.carousel').on('slid.bs.carousel', function() {
    currentIndex = $('div.active').index() + 1;

    var text = currentIndex + '&nbsp;/&nbsp;' + total;
    $('.current_slide').html(text);
    });
    </script>
    <script>
    function navAutoplay() {
    if ($('.if_paused').hasClass('carousel_now')) {
        $('*.carousel_now').removeClass('carousel_now');
        $('.if_started').addClass('carousel_now');
    }

    else {    
        $('*.carousel_now').removeClass('carousel_now');
        $('.if_paused').addClass('carousel_now');
    }
    }

    $(document).ready(function() {
    if ($('.if_started').hasClass('carousel_now')) {
        $('.carousel').carousel({
            interval: 7000
        });
    }

    else {
        $('.carousel').carousel({
            interval: false
        });
    }
})
</script>
3 Answers

Hi according to docs you should be able to toggle carusel using those methods:

.carousel('cycle')
// to enable cycling

.carousel('pause')
// to stop cycling thru items

I think if you call .carusel() with options object it initilizes it again and may not work as you expect

You just have to read the docs from bootstrap, it's documented there.

Here's an example on how you would implement it.

function navAutoplay() {
  const isAutoPlayEnabled = $('#toggle-auto-play').text() === 'Pause';

  if (isAutoPlayEnabled) {
    // Pause carousel if autoplay is enabled
    $('#carouselExampleIndicators').carousel('pause');
    $('#toggle-auto-play').text('Auto Play');
  } else {
    // Enable Auto Play if it's paused
    $('#carouselExampleIndicators').carousel({
      interval: 500,  // Your choice of interval
    });
    $('#toggle-auto-play').text('Pause');
  }
}
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
        <link
            rel="stylesheet"
            href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
            integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
            crossorigin="anonymous"
        />
        <script
            src="https://code.jquery.com/jquery-3.2.1.slim.min.js"
            integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN"
            crossorigin="anonymous"
        ></script>
        <script
            src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
            integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
            crossorigin="anonymous"
        ></script>
        <script
            src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
            integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
            crossorigin="anonymous"
        ></script>
    </head>
    <body>
        <div
            id="carouselExampleIndicators"
            class="carousel slide"
            data-ride="carousel"
        >
            <ol class="carousel-indicators">
                <li
                    data-target="#carouselExampleIndicators"
                    data-slide-to="0"
                    class="active"
                ></li>
                <li
                    data-target="#carouselExampleIndicators"
                    data-slide-to="1"
                    class=""
                ></li>
                <li
                    data-target="#carouselExampleIndicators"
                    data-slide-to="2"
                    class=""
                ></li>
            </ol>
            <div class="carousel-inner">
                <div class="carousel-item active">
                    <img
                        class="d-block w-100"
                        data-src="holder.js/800x400?auto=yes&amp;bg=777&amp;fg=555&amp;text=First slide"
                        alt="First slide [800x400]"
                        src="data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22800%22%20height%3D%22400%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20400%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_178a69a8120%20text%20%7B%20fill%3A%23555%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A40pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_178a69a8120%22%3E%3Crect%20width%3D%22800%22%20height%3D%22400%22%20fill%3D%22%23777%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22285.9140625%22%20y%3D%22218.3%22%3EFirst%20slide%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E"
                        data-holder-rendered="true"
                    />
                </div>
                <div class="carousel-item">
                    <img
                        class="d-block w-100"
                        data-src="holder.js/800x400?auto=yes&amp;bg=666&amp;fg=444&amp;text=Second slide"
                        alt="Second slide [800x400]"
                        src="data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22800%22%20height%3D%22400%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20400%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_178a69a8120%20text%20%7B%20fill%3A%23444%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A40pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_178a69a8120%22%3E%3Crect%20width%3D%22800%22%20height%3D%22400%22%20fill%3D%22%23666%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22247.3125%22%20y%3D%22218.3%22%3ESecond%20slide%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E"
                        data-holder-rendered="true"
                    />
                </div>
                <div class="carousel-item">
                    <img
                        class="d-block w-100"
                        data-src="holder.js/800x400?auto=yes&amp;bg=555&amp;fg=333&amp;text=Third slide"
                        alt="Third slide [800x400]"
                        src="data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22800%22%20height%3D%22400%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20400%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_178a69a8120%20text%20%7B%20fill%3A%23333%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A40pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_178a69a8120%22%3E%3Crect%20width%3D%22800%22%20height%3D%22400%22%20fill%3D%22%23555%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22276.9921875%22%20y%3D%22218.3%22%3EThird%20slide%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E"
                        data-holder-rendered="true"
                    />
                </div>
            </div>
            <a
                class="carousel-control-prev"
                href="#carouselExampleIndicators"
                role="button"
                data-slide="prev"
            >
                <span class="carousel-control-prev-icon" aria-hidden="true"></span>
                <span class="sr-only">Previous</span>
            </a>
            <a
                class="carousel-control-next"
                href="#carouselExampleIndicators"
                role="button"
                data-slide="next"
            >
                <span class="carousel-control-next-icon" aria-hidden="true"></span>
                <span class="sr-only">Next</span>
            </a>
        </div>

        <!-- Toggle button -->
        <div>
            <button id="toggle-auto-play" class="btn btn-primary" onclick="navAutoplay()">Pause</button>
        </div>
    </body>
</html>

I've already tried .carousel('pause'); and .carousel('cycle'); to toggle the auto-playing, and it didn't work.

function navAutoplay() {
            if ($('.if_paused').hasClass('carousel_now')) {
                $('*.carousel_now').removeClass('carousel_now');
                $('.if_started').addClass('carousel_now');
                $('.carousel').carousel('cycle');
            }

            else {    
                $('*.carousel_now').removeClass('carousel_now');
                $('.if_paused').addClass('carousel_now');
                $('.carousel').carousel('pause');
            }
        }
Related