Bootstrap5 轮播(Carousel)

半兽人 发表于: 2020-07-02   最后更新时间: 2021-09-22 00:30:01  
{{totalSubscript}} 订阅, 4,586 游览

一个幻灯片组件,用于循环浏览元素(图片)或文本幻灯片,就像一个旋转木马。

例子

轮播不会自动规范幻灯片大小。因此,您可能需要使用额外的工具或自定义样式来适当地调整内容的大小。虽然轮播支持上一个/下一个控件和指示器,但并不是明确要求的。可以根据自己的需要进行添加和定制。

需要将.active类添加到其中一个幻灯片中,否则轮播将不可见。另外,请确保在.carousel上为可选控件设置一个唯一的id,特别是当你在一个页面上使用多个轮播时。控件和指示器元素必须有一个data-bs-target属性(或链接的href),该属性与.carousel元素的id相匹配。

只有幻灯片

这里是一个只带幻灯片的轮播。请注意轮播图像上存在.d-block.w-100,以防止浏览器默认的图像对齐。

<div id="carouselExampleSlidesOnly" 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>

在线运行

带控制的轮播

添加上一个下一个的控件:

<div id="carouselExampleControls" 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>
  <a class="carousel-control-prev" href="#carouselExampleControls" role="button" data-bs-slide="prev">
    <span class="carousel-control-prev-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Previous</span>
  </a>
  <a class="carousel-control-next" href="#carouselExampleControls" role="button" data-bs-slide="next">
    <span class="carousel-control-next-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Next</span>
  </a>
</div>

在线运行

有指示器的

同时,也可以在轮播上添加指示器。

<div id="carouselExampleIndicators" class="carousel slide" data-bs-ride="carousel">
  <ol class="carousel-indicators">
    <li data-bs-target="#carouselExampleIndicators" data-bs-slide-to="0" class="active"></li>
    <li data-bs-target="#carouselExampleIndicators" data-bs-slide-to="1"></li>
    <li data-bs-target="#carouselExampleIndicators" data-bs-slide-to="2"></li>
  </ol>
  <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>
  <a class="carousel-control-prev" href="#carouselExampleIndicators" role="button" data-bs-slide="prev">
    <span class="carousel-control-prev-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Previous</span>
  </a>
  <a class="carousel-control-next" href="#carouselExampleIndicators" role="button" data-bs-slide="next">
    <span class="carousel-control-next-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Next</span>
  </a>
</div>

在线运行

有字幕

使用任何.carousel-item中的.carousel-caption元素,可以很容易地将字幕添加到你的幻灯片中。他们可以很容易地在较小的视口上隐藏起来,如下所示,可以使用可选的显示工具。我们最初用.d-none隐藏它们,然后用.d-md-block在中等尺寸的设备上显示。

<div id="carouselExampleCaptions" class="carousel slide" data-bs-ride="carousel">
  <ol class="carousel-indicators">
    <li data-bs-target="#carouselExampleCaptions" data-bs-slide-to="0" class="active"></li>
    <li data-bs-target="#carouselExampleCaptions" data-bs-slide-to="1"></li>
    <li data-bs-target="#carouselExampleCaptions" data-bs-slide-to="2"></li>
  </ol>
  <div class="carousel-inner">
    <div class="carousel-item active">
      <img src="..." class="d-block w-100" alt="...">
      <div class="carousel-caption d-none d-md-block">
        <h5>First slide label</h5>
        <p>Nulla vitae elit libero, a pharetra augue mollis interdum.</p>
      </div>
    </div>
    <div class="carousel-item">
      <img src="..." class="d-block w-100" alt="...">
      <div class="carousel-caption d-none d-md-block">
        <h5>Second slide label</h5>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
      </div>
    </div>
    <div class="carousel-item">
      <img src="..." class="d-block w-100" alt="...">
      <div class="carousel-caption d-none d-md-block">
        <h5>Third slide label</h5>
        <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur.</p>
      </div>
    </div>
  </div>
  <a class="carousel-control-prev" href="#carouselExampleCaptions" role="button" data-bs-slide="prev">
    <span class="carousel-control-prev-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Previous</span>
  </a>
  <a class="carousel-control-next" href="#carouselExampleCaptions" role="button" data-bs-slide="next">
    <span class="carousel-control-next-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Next</span>
  </a>
</div>

在线运行

淡入淡出

.carousel-fade 添加到您的幻灯片中,以使用淡入淡出动画过渡。

<div id="carouselExampleFade" class="carousel slide carousel-fade" 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>
  <a class="carousel-control-prev" href="#carouselExampleFade" role="button" data-bs-slide="prev">
    <span class="carousel-control-prev-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Previous</span>
  </a>
  <a class="carousel-control-next" href="#carouselExampleFade" role="button" data-bs-slide="next">
    <span class="carousel-control-next-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Next</span>
  </a>
</div>

在线运行

单独的.carousel-item间隔时间

.carousel-item中添加data-interval=""来改变自动循环到下一个item的延迟时间。

<div id="carouselExampleInterval" class="carousel slide" data-bs-ride="carousel">
  <div class="carousel-inner">
    <div class="carousel-item active" data-interval="10000">
      <img src="..." class="d-block w-100" alt="...">
    </div>
    <div class="carousel-item" data-interval="2000">
      <img src="..." class="d-block w-100" alt="...">
    </div>
    <div class="carousel-item">
      <img src="..." class="d-block w-100" alt="...">
    </div>
  </div>
  <a class="carousel-control-prev" href="#carouselExampleInterval" role="button" data-bs-slide="prev">
    <span class="carousel-control-prev-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Previous</span>
  </a>
  <a class="carousel-control-next" href="#carouselExampleInterval" role="button" data-bs-slide="next">
    <span class="carousel-control-next-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Next</span>
  </a>
</div>

在线运行

禁用触摸滑动

轮播支持在触摸屏设备上向左/向右滑动以在幻灯片之间移动。可以使用 data-bs-touch 属性禁用。下面的示例也不包含 data-bs-ride 属性并且具有 data-bs-interval="false" 所以它不会自动播放。

<div id="carouselExampleControlsNoTouching" class="carousel slide" data-bs-touch="false" data-bs-interval="false">
  <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>
  <button class="carousel-control-prev" type="button" data-bs-target="#carouselExampleControlsNoTouching" data-bs-slide="prev">
    <span class="carousel-control-prev-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Previous</span>
  </button>
  <button class="carousel-control-next" type="button" data-bs-target="#carouselExampleControlsNoTouching" data-bs-slide="next">
    <span class="carousel-control-next-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Next</span>
  </button>
</div>

在线运行

黑暗变体(Dark variant)

.carousel中添加.carousel-dark,使控件、指示器和标题更深。控件已经用filterCSS属性从其默认的白色填充中倒置。标题和控件有额外的Sass变量来定制colorbackground-color

<div id="carouselExampleDark" class="carousel carousel-dark slide" data-bs-ride="carousel">
  <div class="carousel-indicators">
    <button type="button" data-bs-target="#carouselExampleDark" data-bs-slide-to="0" class="active" aria-current="true" aria-label="Slide 1"></button>
    <button type="button" data-bs-target="#carouselExampleDark" data-bs-slide-to="1" aria-label="Slide 2"></button>
    <button type="button" data-bs-target="#carouselExampleDark" data-bs-slide-to="2" aria-label="Slide 3"></button>
  </div>
  <div class="carousel-inner">
    <div class="carousel-item active" data-bs-interval="10000">
      <img src="..." class="d-block w-100" alt="...">
      <div class="carousel-caption d-none d-md-block">
        <h5>First slide label</h5>
        <p>Some representative placeholder content for the first slide.</p>
      </div>
    </div>
    <div class="carousel-item" data-bs-interval="2000">
      <img src="..." class="d-block w-100" alt="...">
      <div class="carousel-caption d-none d-md-block">
        <h5>Second slide label</h5>
        <p>Some representative placeholder content for the second slide.</p>
      </div>
    </div>
    <div class="carousel-item">
      <img src="..." class="d-block w-100" alt="...">
      <div class="carousel-caption d-none d-md-block">
        <h5>Third slide label</h5>
        <p>Some representative placeholder content for the third slide.</p>
      </div>
    </div>
  </div>
  <button class="carousel-control-prev" type="button" data-bs-target="#carouselExampleDark" data-bs-slide="prev">
    <span class="carousel-control-prev-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Previous</span>
  </button>
  <button class="carousel-control-next" type="button" data-bs-target="#carouselExampleDark" data-bs-slide="next">
    <span class="carousel-control-next-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Next</span>
  </button>
</div>

在线运行

自定义过渡(Custom transition)

.carousel-item 的过渡持续时间可以在编译之前使用 $carousel-transition-duration Sass 变量进行更改,如果您使用的是编译后的 CSS,则可以自定义样式。 如果应用了多个转换,请确保首先定义转换转换(例如,transition: transform 2s ease, opacity .5s ease-out转换:转换 2 秒缓动,不透明度 .5 秒缓动」)。

Sass

变量(Variables)

$carousel-control-color:             $white;
$carousel-control-width:             15%;
$carousel-control-opacity:           .5;
$carousel-control-hover-opacity:     .9;
$carousel-control-transition:        opacity .15s ease;

$carousel-indicator-width:           30px;
$carousel-indicator-height:          3px;
$carousel-indicator-hit-area-height: 10px;
$carousel-indicator-spacer:          3px;
$carousel-indicator-opacity:         .5;
$carousel-indicator-active-bg:       $white;
$carousel-indicator-active-opacity:  1;
$carousel-indicator-transition:      opacity .6s ease;

$carousel-caption-width:             70%;
$carousel-caption-color:             $white;
$carousel-caption-padding-y:         1.25rem;
$carousel-caption-spacer:            1.25rem;

$carousel-control-icon-width:        2rem;

$carousel-control-prev-icon-bg:      url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$carousel-control-color}'><path d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/></svg>");
$carousel-control-next-icon-bg:      url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$carousel-control-color}'><path d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/></svg>");

$carousel-transition-duration:       .6s;
$carousel-transition:                transform $carousel-transition-duration ease-in-out; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)

$carousel-dark-indicator-active-bg:  $black;
$carousel-dark-caption-color:        $black;
$carousel-dark-control-icon-filter:  invert(1) grayscale(100);

使用

通过数据属性(Via data attributes)

使用数据属性来轻松控制轮播的位置。data-bs-slide接受关键字prev或next,它可以改变幻灯片相对于其当前位置的位置。另外,使用data-bs-slide-to向轮播传递一个原始的幻灯片索引data-bs-slide-to="2",它将幻灯片的位置转移到一个从0开始的特定索引。

data-bs-ride="carousel"属性用于标记一个旋转木马在页面加载时开始动画。如果你不使用data-bs-ride="carousel"来初始化你的旋转木马,你必须自己初始化它。它不能与同一旋转木马的(多余的和不必要的)显式JavaScript初始化结合使用

通过JavaScript

手动调用旋转木马:

var myCarousel = document.querySelector('#myCarousel')
var carousel = new bootstrap.Carousel(myCarousel)

选项

选项可以通过数据属性或JavaScript传递。对于数据属性,将选项名称附加到data-,如data-interval=""

Name Type Default Description
interval number 5000 自动循环item之间延迟的时间量。如果是false,旋转木马将不会自动循环。
keyboard boolean true 旋转木马是否应该对键盘事件做出反应。
pause string / boolean "hover" 如果设置为 "hover",在鼠标进入时暂停旋转木马的循环,在鼠标离开时恢复旋转木马的循环。如果设置为false,在旋转木马上悬停不会暂停。

在支持触摸的设备上,当设置为 "hover "时,循环将在touchchend(一旦用户完成与旋转木马的互动)时暂停两个间隔,然后自动恢复。请注意,这是对上述鼠标行为的补充。
slide string / boolean false 在用户手动循环第一个项目后自动显示旋转木马。如果是 "旋转木马",则在加载时自动显示旋转木马。
wrap boolean true 旋转木马是否应该连续循环或有硬停。
touch boolean true 旋转木马是否应该支持触摸屏设备上的左/右滑动互动。

方法

异步方法和转换

所有 API 方法都是异步的并开始转换。 一旦转换开始,它们就会在转换结束之前返回给调用者。 此外,过渡组件上的方法调用将被忽略。

有关更多信息,请参阅我们的 JavaScript 文档。

例如,您可以使用 carousel 构造函数创建 carousel 实例,以使用其他选项进行初始化并开始循环遍历项目:

var myCarousel = document.querySelector('#myCarousel')
var carousel = new bootstrap.Carousel(myCarousel, {
  interval: 2000,
  wrap: false
})
Method Description
cycle 从左到右循环旋转木马的item。
pause 停止旋转木马循环。
prev 循环到上一个项目。在前一个项目被显示之前(例如,在slid.bs.carousel事件发生之前)返回给调用者。
next 循环到下一个项目。在下一个项目被显示之前(例如,在slid.bs.carousel事件发生之前)返回给调用者。
nextWhenVisible 将旋转木马循环到某一帧(基于0,类似于一个数组)。在目标项目被显示之前(例如,在slid.bs.carousel事件发生之前)返回给调用者。
getInstance 静态方法,允许你获得与DOM元素相关的旋转木马实例。

事件

Bootstrap的carousel类暴露了两个事件,用于挂钩carousel功能。这两个事件都有以下附加属性:

  • direction: 旋转木马滑动的方向("左"或 "右")。
  • relatedTarget: 作为活动项目被滑动到位的DOM元素。
  • from: 当前项目的索引
  • to: 下一个项目的索引

所有的旋转木马事件都是在旋转木马本身(即在<div class="carousel">)触发的。

Event type Description
slide.bs.carousel 当幻灯片实例方法被调用时,立即触发。
slid.bs.carousel 当旋转木马完成它的滑动过渡时触发。
var myCarousel = document.getElementById('myCarousel')

myCarousel.addEventListener('slide.bs.carousel', function () {
  // do something...
})
更新于 2021-09-22

查看bootstrap5更多相关的文章或提一个关于bootstrap5的问题,也可以与我们一起分享文章