輪播 (Carousel)
用於循環顯示圖片元素、幻燈片或包含文本的輪播元件。
如何運作
輪播是一個用於循環顯示一系列內容的幻燈片,由 CSS 的 3D transform 以及一些 JavaScript 建構而成。它適用於一系列圖片、文本或自定義的標記,並包括對上一個 / 下一個控制項和指示器的支援。
在支持 Page Visibility API 的瀏覽器中,當網頁對用戶不可見時,輪播將避免滑動(例如瀏覽器分頁不是啟用狀態、瀏覽器視窗最小化時等)。
prefers-reduced-motion
media queries。請參考 reduced motion section of our accessibility documentation
請注意巢狀輪播並不支援,且輪播通常不符合無障礙標準。
範例
輪播不會自動標準化幻燈片的尺寸。因此,您可能需要使用額外的通用類別或自定義樣式將內容調整成適當的大小。雖然輪播支持上一個/下一個控制項和指示器,但是它們不是必備項目。可依照需求添加和自定義。
需要將 .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>
來當作 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
的時間間隔
在 .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>
Disable touch swiping
Carousels support swiping left/right on touchscreen devices to move between slides. This can be disabled using the data-bs-touch
attribute. The example below also does not include the data-bs-ride
attribute and has data-bs-interval="false"
so it doesn’t autoplay.
<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>
Custom transition
The transition duration of .carousel-item
can be changed with the $carousel-transition-duration
Sass variable before compiling or custom styles if you’re using the compiled CSS. If multiple transitions are applied, make sure the transform transition is defined first (eg. 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-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" |
如果設定為 當在觸控裝置上設定為 |
ride |
string | boolean | false |
當使用者手動循環第一個元件之後,輪播將自動循環。如果為 'carousel' , 則在載入後自動播放 |
wrap |
boolean | true |
輪播是否應該連續循環,或是會停止。 |
touch |
boolean | true |
在觸控裝置上輪播是否支持向左/向右的交互滑動。 |
方法
Asynchronous methods and transitions
All API methods are asynchronous and start a transition. They return to the caller as soon as the transition is started but before it ends. In addition, a method call on a transitioning component will be ignored.
可以使用輪播建構函式來建立一個範例。如下例,使用額外的選項初始化,並讓項目開始循環。
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...
})