【问题标题】:Can a bootstrap carousel rotate through only some of the slides?bootstrap carousel 可以只通过一些幻灯片旋转吗?
【发布时间】:2017-02-22 21:30:05
【问题描述】:

我有一个直接来自引导站点的香草轮播。

$('.carousel').carousel({
  interval: 2000
})

它有 5 张幻灯片和 5 个指标:

1 2 3 A B

我希望轮播自动循环播放幻灯片 1、2 和 3,然后重复。但是,如果我单击幻灯片 A 或 B 的指示器,我想移动到该幻灯片并暂停轮播。

如何将自动旋转限制为仅幻灯片 1 2 和 3?

【问题讨论】:

    标签: jquery twitter-bootstrap carousel


    【解决方案1】:
    1. 您需要在幻灯片事件开始后点击幻灯片事件,如果当前活动的幻灯片是应该重置滑块的幻灯片,则告诉它转到第一张幻灯片。
    2. 如果当前幻灯片事件是自动播放幻灯片还是由滑块控件启动,您还需要存储,因为您希望允许控件转到不受限制的幻灯片
    3. 此外,您需要在到达任何经过循环重置点的幻灯片后暂停滑块,如果您低于循环重置点,则播放滑块(以使其在您从暂停的幻灯片返回后重新开始自动播放)。

    但显然,Bootstrap 轮播不喜欢从现有幻灯片中启动新的幻灯片事件,因此我们需要在当前幻灯片上调用 .preventDefault() 才能启动另一个。

    aP (autoPlaying) 变量存储如果当前滑动事件是通过与滑块控件交互启动的,
    cR (cycleReset) 存储应该重置循环的幻灯片的索引和
    sL (selector) 应该是您的滑块的选择器。

    这里是:

    var sL = '#z', // slider selector
        aP = true, // autoPlaying
        cR = 2;    // cycleReset
    
    $(sL)
        .on('click', '.carousel-indicators,.carousel-control', function() {
            // autoplaying off when a control is clicked
            aP = false;
        })
        .on('slide.bs.carousel', function(e) {
            // if on the cycle reset slide and auto-playing...
            if (($(sL + ' .active').index() == cR) && aP) {
                // ...we stop the current slide event...
                e.preventDefault();
                // ...turn off autoplaying (to prevent an infinite loop)...
                aP = false;
                // ...and go to first slide;
                $(sL).carousel(0)
            } else {
                // or we set auto-playing true (for next slide event).
                aP = true;
            }
        })
        .on('slid.bs.carousel', function(e) {
            // when a slide event finished, if we arrived on a slide
            // that's after the cycle reset slide, we pause the slider
            // otherwise we play (cycle) it
            $(sL).carousel($(sL + ' .active').index() > cR ? 'pause' : 'cycle');
        });
    

    工作示例:

    var sL = '#z',
        aP = true,
        cR = 2;
    
    $(sL)
        .on('click', '.carousel-indicators,.carousel-control', function() {
            aP = false;
        })
        .on('slide.bs.carousel', function(e) {
            if (($(sL + ' .active').index() == cR) && aP) {
                e.preventDefault();
                aP = false;
                $(sL).carousel(0)
            } else {
                aP = true;
            }
        })
        .on('slid.bs.carousel', function(e) {
            $(sL).carousel($(sL + ' .active').index() > cR ? 'pause' : 'cycle');
        });
    body {margin: 0;}
    .item img {
      width: 100%;
      height: auto;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <div id="z" class="carousel slide" data-ride="carousel">
      <!-- Indicators -->
      <ol class="carousel-indicators">
        <li data-target="#z" data-slide-to="0" class="active"></li>
        <li data-target="#z" data-slide-to="1"></li>
        <li data-target="#z" data-slide-to="2"></li>
        <li data-target="#z" data-slide-to="3"></li>
        <li data-target="#z" data-slide-to="4"></li>
      </ol>
    
      <!-- Wrapper for slides -->
      <div class="carousel-inner" role="listbox">
        <div class="item active">
          <img src="http://lorempixel.com/g/600/210/fashion" alt="Chania">
        </div>
    
        <div class="item">
          <img src="http://lorempixel.com/g/600/210/fashion" alt="Chania">
        </div>
    
        <div class="item">
          <img src="http://lorempixel.com/g/600/210/fashion" alt="Flower">
        </div>
    
        <div class="item">
          <img src="http://lorempixel.com/g/600/210/fashion" alt="Flower">
        </div>
        
        <div class="item">
          <img src="http://lorempixel.com/g/600/210/fashion" alt="Flower">
        </div>
      </div>
    
      <!-- Left and right controls -->
      <a class="left carousel-control" href="#z" role="button" data-slide="prev">
        <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
        <span class="sr-only">Previous</span>
      </a>
      <a class="right carousel-control" href="#z" role="button" data-slide="next">
        <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
        <span class="sr-only">Next</span>
      </a>
    </div>

    【讨论】:

    • 工作得很好,我喜欢你在代码中留下的 cmets。附带说明一下,第三个功能在“幻灯片”上缺少一个 E。
    • @PaulRuocco 真的不是:)。 Bootstrap Carousel 会为每个 slide 事件发出两个事件:slide.bs.carousel 在过渡开始之前发出,此时 active 类仍在 "previous" 幻灯片上,另一个 @987654333 @ 在转换结束时发出,此时 active 类已经在 "next" 幻灯片上。这就是您需要用来停止/播放滑块的事件。 carousel events documentation 这里。
    • 是的。当它停止正常工作时,我发现了这一点。我的错! :) 感谢您的解释
    猜你喜欢
    • 2012-03-20
    • 1970-01-01
    • 2015-11-07
    • 2017-09-27
    • 2013-04-29
    • 2019-02-15
    • 2015-10-15
    • 2016-07-11
    • 2013-02-05
    相关资源
    最近更新 更多