轮播(Carousel)

一种幻灯片放映组件,用于在元素、图像或文本幻灯片(如旋转木马)之间循环播放。

工作原理

carousel是一个幻灯片,用于循环播放一系列内容,使用css3d转换和一点JavaScript构建。它可以处理一系列图像、文本或自定义标记。它还包括对上一个/下一个控件和指示器的支持。

在支持页面可见性API的浏览器中,当用户看不到网页时(例如浏览器选项卡处于非活动状态、浏览器窗口最小化等),轮播将避免滑动。

此组件的动画效果取决于“首选简化运动媒体”查询。请参阅我们的可访问性文档的简化运动部分。

请注意,不支持嵌套轮播,轮播通常不符合无障碍标准。

例子

轮播不会自动标准化幻灯片的尺寸。因此,您可能需要使用额外的通用类别或自定义样式将内容调整成适当的大小。虽然轮播支持上一个/下一个控件和指示器,但是它们不是必备项目。可依照需求添加和自定义。

需要将.active添加到其中一个轮播元素上,否则轮播将不可见。另外一定要在.carousel上为控件元件设置一个唯一的id,特别是当你在一个页面上使用多个轮播的时候。控件和指示器元素必须具有与.carousel元素之id符合的data-bs-target属性(或是连接的href)。

仅幻灯片

这是一个只有幻灯片的轮播。请注意在轮播图片上存在.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>

带控件

添加上一个和下一个控件。我们建议使用button元素,但也可以将a元素与 role="button"一起使用。.

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

带指示器

也可以将指示器与控件一起添加到轮播中。

<div id="carouselExampleIndicators" class="carousel slide" data-bs-ride="carousel">
<div 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>
<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="#carouselExampleIndicators" 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="#carouselExampleIndicators" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</button>
</div>

带字幕

在任意.carousel-item中使用.carousel-caption替幻灯片添加字幕。可以选择使用display通用类别轻易地在较小的viewport上隐藏它们,如下所示,一开始将会用.d-none隐藏,并使用.d-md-block让它们在中型的设备上重新显示。

<div id="carouselExampleCaptions" class="carousel slide" data-bs-ride="carousel">
<div class="carousel-indicators">
<button type="button" data-bs-target="#carouselExampleCaptions" data-bs-slide-to="0" class="active" aria-current="true" aria-label="Slide 1"></button>
<button type="button" data-bs-target="#carouselExampleCaptions" data-bs-slide-to="1" aria-label="Slide 2"></button>
<button type="button" data-bs-target="#carouselExampleCaptions" data-bs-slide-to="2" aria-label="Slide 3"></button>
</div>
<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>Some representative placeholder content for the first 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>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="#carouselExampleCaptions" 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="#carouselExampleCaptions" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</button>
</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>
<button class="carousel-control-prev" type="button" data-bs-target="#carouselExampleFade" 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="#carouselExampleFade" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</button>
</div>

在.carousel-item上添加data-bs-interval=""以更改自动循环至下一个项目的延迟时间。

<div id="carouselExampleInterval" class="carousel slide" data-bs-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active" data-bs-interval="10000">
<img src="..." class="d-block w-100" alt="...">
</div>
<div class="carousel-item" data-bs-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>
<button class="carousel-control-prev" type="button" data-bs-target="#carouselExampleInterval" 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="#carouselExampleInterval" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</button>
</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>

暗变型

在.carousel上添加.carousel-dark以获得暗色系的控制项、指示器及字幕。控件已透过CSS属性filter从它们预设的白色充填反转。字幕与控件具有用来自定义color及background-color的额外Sass变数。

<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>

自定义转换

.carousel项的转换持续时间可以在编译前使用$carousel-transition-duration Sass变量更改,如果使用已编译的CSS,则可以使用自定义样式更改。如果应用了多个变换,请确保首先定义变换变换(例如,transition: transform 2s ease, opacity .5s ease-out)。

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);

用法

通过数据属性

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

当页面加载的时候,data-bs-ride=“carousel”属性会被用来标记一个轮播是为动态的。如果不使用data-bs-ride=“carousel”来初始化轮播,你必须靠自己将其初始化。在同一个轮播中,data-bs-ride=“carousel”不能与JavaScript初始化同时使用(多余且不必要)

通过JavaScript

使用以下语法手动呼叫轮播:

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

选项

可以透过数据属性或JavaScript调整选项。对于数据属性,将选项名称附加到data-bs-,如data-bs-interval=""

Name Type Default Description
interval number 5000 在一个自动循环的轮播中,项目之间所延迟的时间。如果为false,轮播不会自动回放。
keyboard boolean true 轮播是否应该响应键盘事件
pause string | boolean 'hover'

如果设定为“hover”,轮播会因为mouseenter而暂停﹑并在mouseleave之时再度执行。如果设定为false,滑入时将不会停止轮播。

当在触控装置上设定为“hover”,则在回放恢复之前,轮播将会停止于touchend(直到用户完成与轮播的互动)。请注意,这是上述鼠标行为的扩充。

ride string | boolean false 当使用者手动循环第一个元件之后,轮播将自动循环。如果为“轮播”,则在加载后自动播放
wrap boolean true 轮播是否应该连续循环,或是会停止。
touch boolean true 在触控装置上轮播是否支持向左/向右的交互滑动。

方法

异步方法和转换

所有API方法都是异步的,并开始转换。转换一开始就返回到调用方,但在转换结束之前返回。此外,对转换组件的方法调用将被忽略。

See our JavaScript documentation for more information.

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

var myCarousel = document.querySelector('#myCarousel')
var carousel = new bootstrap.Carousel(myCarousel, {
interval: 2000,
wrap: false
})
Method Description
cycle 由左至右循环播放
pause 将物件的循环从轮播中停止
prev 将轮播指向前一个物件。在前一个物件显示前回传给调用者(e.g.,在slid.bs.carousel 事件发生之前).
next 将轮播指向下一个物件。在后一个物件显示前回传给调用者(e.g.,在slid.bs.carousel 事件发生之前).
nextWhenVisible 如果页面或是其父层不可见,就停止将轮播循环到下一个。在目标项目显示前回传给调用者
to 将轮播指向特定的索引。(与数组相同,从0开始).在目标项目显示前回传给调用者(e.g.,在slid.bs.carousel 事件发生之前).
dispose 销毁一个元素的轮播。(移除DOM元素上储存的数据)
getInstance 允许你取得与DOM元素关联之轮播示例的静态方法。

事件

Bootstrap提供了两个事件给予轮播使用。两个事件都具有以下附加属性:

  • direction: 轮播滑动的方向(“left”或“right”).
  • relatedTarget: 被作为启用的物件的DOM元素。
  • from: 当前物件的索引
  • to: 下一个物件的索引

所有轮播事件都在轮播本身(即<div class="carousel">)下被触发。

Event type Description
slide.bs.carousel 当调用slide方法时,此事件会立即触发。
slid.bs.carousel 轮播完成切换后,此事件就被触发。
var myCarousel = document.getElementById('myCarousel')

myCarousel.addEventListener('slide.bs.carousel', function () {
// do something...
})
返回顶部