React Carousel (カルーセル) の概要
Ignite UI for React カルーセルは、レスポンシブで軽量なコンポーネントであり、テキスト スライド、リンク、およびその他の html 要素を含む画像のコレクションを前後に移動するユーザーに、スライドショーのような Web エクスペリエンスを作成する最も柔軟な方法を提供します。
React カルーセル コンポーネントを使用すると、アニメーション、スライド トランジション、およびカスタマイズを使用できるため、インターフェイスを簡単に微調整して React カスタム カルーセルを構築できます。
React Carousel の例
以下に示す React カルーセルのデモは、画像のみを含むスライドを示しています。
EXAMPLE
TSX
CarouselOverview.css
index.css
import React from "react";
import ReactDOM from "react-dom/client";
import {
IgrCarousel,
IgrCarouselModule,
IgrCarouselSlide,
} from "@infragistics/igniteui-react";
import "igniteui-webcomponents/themes/light/bootstrap.css";
import "./CarouselOverview.css";
import "./index.css";
IgrCarouselModule.register();
export default function CarouselOverview() {
return (
<div className="carousel-container">
<IgrCarousel>
<IgrCarouselSlide key="slide-1">
<div className="image-container" key="image-container">
<img src="https://www.infragistics.com/angular-demos-lob/assets/images/carousel/ignite-ui-angular-indigo-design.png" />
</div>
</IgrCarouselSlide>
<IgrCarouselSlide key="slide-2">
<div className="image-container" key="image-container">
<img src="https://www.infragistics.com/angular-demos-lob/assets/images/carousel/slider-image-chart.png" />
</div>
</IgrCarouselSlide>
<IgrCarouselSlide key="slide-3">
<div className="image-container" key="image-container">
<img src="https://www.infragistics.com/angular-demos-lob/assets/images/carousel/ignite-ui-angular-charts.png" />
</div>
</IgrCarouselSlide>
</IgrCarousel>
</div>
);
}
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<CarouselOverview />);
tsx
.carousel-container {
padding: 16px;
}
.image-container {
display: flex;
align-items: center;
justify-content: center;
}
img {
object-fit: fill;
max-width: 90%;
}
igc-carousel {
margin-inline: auto;
max-width: 75%;
height: 450px;
}
igc-carousel-slide::part(base) {
display: flex;
justify-content: center;
align-items: center;
max-width: 75%;
margin-inline: auto;
}
css
このサンプルが気に入りましたか? 完全な Ignite UI for Reactツールキットにアクセスして、すばやく独自のアプリの作成を開始します。無料でダウンロードできます。
使用方法
まず、次のコマンドを実行して、対応する Ignite UI for React npm パッケージをインストールする必要があります:
npm install igniteui-react
cmd
次に、以下のように、IgrCarousel
とそれに必要な CSS をインポートし、そのモジュールを登録する必要があります:
import { IgrCarouselModule, IgrCarousel, IgrCarouselSlide } from 'igniteui-react';
import 'igniteui-webcomponents/themes/light/bootstrap.css';
IgrCarouselModule.register();
tsx
Ignite UI for React の完全な概要については、作業の開始トピックを参照してください。
Ignite UI for React カルーセルがインポートされたので、IgrCarousel
とそのボタンの基本構成を開始できます。
IgrCarousel
セレクターを使用してスライドをラップします。スライドに有効な HTML コンテンツ、その他のコンポーネントなども含めることができます。
<IgrCarousel>
<IgrCarouselSlide key="first">
<img src="assets/images/carousel/ignite-ui-angular-indigo-design.png" key="img"/>
</IgrCarouselSlide>
<IgrCarouselSlide key="second">
<img src="assets/images/carousel/slider-image-chart.png" key="img"/>
</IgrCarouselSlide>
<IgrCarouselSlide key="third">
<img src="assets/images/carousel/ignite-ui-angular-charts.png" key="img"/>
</IgrCarouselSlide>
</IgrCarousel>
tsx
スライドをデフォルトでアクティブにしたい場合は、Active
属性を使用します。
<IgrCarousel>
...
<IgrCarouselSlide key="first">
...
</IgrCarouselSlide>
<IgrCarouselSlide active={true} key="second">
...
</IgrCarouselSlide>
</IgrCarousel>
tsx
アクティブなスライドが設定されていない場合は、最初のスライドがデフォルトで設定されます。最初のレンダリングまたは後続の更新時にアクティブなスライドが複数ある場合は、最後のスライドだけが考慮されます。
例
カルーセルの構成
デフォルトでは、IgrCarousel
の disableLoop
プロパティは false に設定されています (ループは、Next 動作でナビゲートするときに最初のスライドが最後のスライドの後に来るか、Previous 動作を使用して最後のスライドが最初のスライドの後に来るときに起こります)。ループ動作を無効にするには、disableLoop
プロパティの値を true に設定します。
<IgrCarousel disableLoop={true}>
...
</IgrCarousel>
tsx
各スライド インデックスを追跡するために、カルーセルには、デフォルトでカルーセルの end
に配置されるインジケーターがあります。この動作を変更するには、indicatorsOrientation
プロパティを使用して、start
に割り当てる必要があります。
<IgrCarousel indicatorsOrientation={CarouselIndicatorsOrientation.Start}>
...
</IgrCarousel>
tsx
デフォルトでは、IgrCarousel
にはナビゲーション ボタンとインジケーターが表示されます。インジケーターを非表示にするには hideIndicators
プロパティを使用し、ナビゲーション ボタンを非表示にするには hideNavigation
プロパティを使用します。
<IgrCarousel hideNavigation={true} hideIndicators={true}>
...
</IgrCarousel>
tsx
IgrCarousel
は垂直モードをサポートしています。これを有効にするには、vertical
プロパティを使用します。
<IgrCarousel vertical={true}>
...
</IgrCarousel>
tsx
カスタム インジケーター
React カスタム カルーセル インジケーターを追加するには、IgrCarouselIndicator
を使用します:
<IgrCarousel>
<IgrCarouselIndicator key="first-indicator">
<span key="empty">🤍</span>
<span slot="active" key="active">❤️</span>
</IgrCarouselIndicator>
<IgrCarouselIndicator key="second-indicator">
<span key="empty">🤍</span>
<span slot="active" key="active">❤️</span>
</IgrCarouselIndicator>
<IgrCarouselSlide key="first">
<img src="assets/images/card/media/the_red_ice_forest.jpg" key="img"/>
</IgrCarouselSlide>
<IgrCarouselSlide key="second">
<img src="assets/images/card/media/yosemite.jpg" key="img"/>
</IgrCarouselSlide>
</IgrCarousel>
tsx
Ignite UI for React カルーセル コンポーネントを使用すると、ユーザーは単一のインジケーターのアクティブ状態と非アクティブ状態に異なる要素を使用できます。インジケーターを宣言するときは、たとえ同じであっても、スロットごとに 2 つの要素 (空とアクティブ) を提供することが必須です。
カスタム ナビゲーション ボタン
これを実現するには、previous-button
スロットと next-button
スロットを使用します。
<IgrCarousel>
<IgrIcon slot="previous-button" name="previous" collection="material" key="previous"></IgrIcon>
<IgrIcon slot="next-button" name="next" collection="material" key="next"></IgrIcon>
...
</IgrCarousel>
tsx
他のコンポーネントを含むスライド
このカルーセルには、フォームと画像を含むスライドが含まれます。
<IgrCarousel>
<IgrCarouselSlide key="slide-1">
<div key="slide-content">
<img src="assets/images/svg/carousel/SignUp.svg"/>
<form>
<IgrInput type="text" placeholder="Username">
<IgrIcon slot="prefix" name="person" key="icon"></IgrIcon>
</IgrInput>
<IgrInput type="password" placeholder="Password">
<IgrIcon slot="prefix" name="password" key="icon"></IgrIcon>
</IgrInput>
<IgrButton type="reset">
<span key="button-span">Sign In</span>
</IgrButton>
</form>
</div>
</IgrCarouselSlide>
<IgrCarouselSlide key="slide-2">
<div key="slide-content">
<img src="assets/images/svg/carousel/Route.svg"/>
<form>
<IgrInput type="text" placeholder="Search">
<IgrIcon slot="prefix" name="search" key="icon"></IgrIcon>
</IgrInput>
<IgrButton type="reset">
<span key="button-span">Search</span>
</IgrButton>
</form>
</div>
</IgrCarouselSlide>
</IgrCarousel>
tsx
サンプル
EXAMPLE
TSX
CarouselComponents.css
index.css
import React, { useEffect } from "react";
import ReactDOM from "react-dom/client";
import {
IgrButton,
IgrButtonModule,
IgrCarousel,
IgrCarouselModule,
IgrCarouselSlide,
IgrIcon,
IgrIconModule,
IgrInput,
IgrInputModule,
registerIconFromText,
} from "@infragistics/igniteui-react";
import "igniteui-webcomponents/themes/light/bootstrap.css";
import "./CarouselComponents.css";
import "./index.css";
IgrButtonModule.register();
IgrCarouselModule.register();
IgrIconModule.register();
IgrInputModule.register();
const icons = [
{
name: "person",
iconText:
'<svg width="24" height="24" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><path d="M16 15.503A5.041 5.041 0 1 0 16 5.42a5.041 5.041 0 0 0 0 10.083zm0 2.215c-6.703 0-11 3.699-11 5.5v3.363h22v-3.363c0-2.178-4.068-5.5-11-5.5z"/></svg>',
},
{
name: "password",
iconText:
'<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.25 10.0546V8C5.25 4.27208 8.27208 1.25 12 1.25C15.7279 1.25 18.75 4.27208 18.75 8V10.0546C19.8648 10.1379 20.5907 10.348 21.1213 10.8787C22 11.7574 22 13.1716 22 16C22 18.8284 22 20.2426 21.1213 21.1213C20.2426 22 18.8284 22 16 22H8C5.17157 22 3.75736 22 2.87868 21.1213C2 20.2426 2 18.8284 2 16C2 13.1716 2 11.7574 2.87868 10.8787C3.40931 10.348 4.13525 10.1379 5.25 10.0546ZM6.75 8C6.75 5.10051 9.10051 2.75 12 2.75C14.8995 2.75 17.25 5.10051 17.25 8V10.0036C16.867 10 16.4515 10 16 10H8C7.54849 10 7.13301 10 6.75 10.0036V8ZM14 16C14 17.1046 13.1046 18 12 18C10.8954 18 10 17.1046 10 16C10 14.8954 10.8954 14 12 14C13.1046 14 14 14.8954 14 16Z"/></svg>',
},
{
name: "search",
iconText:
'<svg width="24" height="24" viewBox="0 0 24 24"><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" /></svg>',
},
];
export default function CarouselComponents() {
useEffect(() => {
icons.forEach((icon) => {
registerIconFromText(icon.name, icon.iconText);
});
}, []);
return (
<div className="carousel-container">
<IgrCarousel>
<IgrCarouselSlide key="slide-1">
<div key="slide-content">
<img src="https://www.infragistics.com/angular-demos-lob/assets/images/svg/carousel/SignUp.svg" />
<form>
<IgrInput type="text" placeholder="Username">
<IgrIcon slot="prefix" name="person" key="icon"></IgrIcon>
</IgrInput>
<IgrInput type="password" placeholder="Password">
<IgrIcon slot="prefix" name="password" key="icon"></IgrIcon>
</IgrInput>
<IgrButton type="reset">
<span key="button-span">Sign In</span>
</IgrButton>
</form>
</div>
</IgrCarouselSlide>
<IgrCarouselSlide key="slide-2">
<div key="slide-content">
<img src="https://www.infragistics.com/angular-demos-lob/assets/images/svg/carousel/Route.svg" />
<form>
<IgrInput type="text" placeholder="Search">
<IgrIcon slot="prefix" name="search" key="icon"></IgrIcon>
</IgrInput>
<IgrButton type="reset">
<span key="button-span">Search</span>
</IgrButton>
</form>
</div>
</IgrCarouselSlide>
</IgrCarousel>
</div>
);
}
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<CarouselComponents />);
tsx
.carousel-container {
padding: 16px;
}
igc-carousel {
margin-inline: auto;
max-width: 75%;
height: 500px;
}
igc-carousel-slide {
display: flex;
justify-content: center;
align-items: center;
}
igc-carousel-slide div {
text-align: center;
max-width: 40%;
margin-inline: auto;
}
igc-carousel-slide div * {
margin-block: 8px;
}
css
アニメーション
アニメーション化されたスライド遷移により、エンドユーザーはカルーセルを操作しているときに高いエクスペリエンスを得ることができます。
デフォルトでカルーセルは slide
アニメーションを使用するように設定されていますが、代替アニメーションとして fade
もサポートしています。
アニメーションを変更するには、animationType
プロパティを使用します。
<IgrCarousel animationType={CarouselAnimationType.Fade}>
...
</IgrCarousel>
tsx
animationType
プロパティに none
を設定すると、アニメーションが無効になります。
サンプル
以下のデモは、カルーセルがサポートするさまざまなタイプのアニメーションを示しています。
EXAMPLE
TSX
CarouselAnimations.css
index.css
import React, { useRef } from "react";
import ReactDOM from "react-dom/client";
import {
CarouselAnimationType,
CheckboxBaseLabelPosition,
IgrButton,
IgrButtonModule,
IgrCard,
IgrCardActions,
IgrCardContent,
IgrCardHeader,
IgrCardMedia,
IgrCardModule,
IgrCarousel,
IgrCarouselModule,
IgrCarouselSlide,
IgrSelect,
IgrSelectItem,
IgrSelectModule,
IgrSwitch,
IgrSwitchModule,
} from "@infragistics/igniteui-react";
import "igniteui-webcomponents/themes/light/bootstrap.css";
import "./CarouselAnimations.css";
import "./index.css";
IgrButtonModule.register();
IgrCarouselModule.register();
IgrSelectModule.register();
IgrSwitchModule.register();
IgrCardModule.register();
export default function CarouselComponents() {
const carouselRef = useRef<IgrCarousel>(null);
function onSelectChange(s: IgrSelect) {
switch (s.value) {
case "slide":
carouselRef.current.animationType = CarouselAnimationType.Slide;
break;
case "fade":
carouselRef.current.animationType = CarouselAnimationType.Fade;
break;
default:
carouselRef.current.animationType = CarouselAnimationType.None;
break;
}
}
function onSwitchChange(s: IgrSwitch) {
carouselRef.current.vertical = s.checked;
}
return (
<div className="carousel-wrapper">
<div className="action-wrapper">
<div className="action">
<span>Animation type</span>
<IgrSelect change={onSelectChange}>
<IgrSelectItem value="slide" selected={true} key="slide">
<span key="select-span">Slide</span>
</IgrSelectItem>
<IgrSelectItem value="fade" key="fade">
<span key="select-span">Fade</span>
</IgrSelectItem>
<IgrSelectItem value="none" key="none">
<span key="select-span">None</span>
</IgrSelectItem>
</IgrSelect>
</div>
<div className="action">
<IgrSwitch
change={onSwitchChange}
labelPosition={CheckboxBaseLabelPosition.Before}
>
<span key="switch-span">Vertical alignment</span>
</IgrSwitch>
</div>
</div>
<IgrCarousel hideIndicators={true} ref={carouselRef}>
<IgrCarouselSlide key="slide-1">
<div className="slide-wrapper" key="card-wrapper">
<IgrCard>
<IgrCardHeader key="card-header">
<h3 slot="title" key="header-title">
Ignite UI for Angular
</h3>
</IgrCardHeader>
<IgrCardContent key="card-content">
<p key="content">
30+ Material-based Angular components to code speedy web apps
faster.
</p>
</IgrCardContent>
<IgrCardMedia key="card-media">
<img
src="https://www.infragistics.com/angular-demos-lob/assets/images/carousel/slide1-angular.png"
key="img"
/>
</IgrCardMedia>
<IgrCardActions key="card-actions">
<IgrButton
slot="start"
href="https://www.infragistics.com/products/ignite-ui-angular"
target="_blank"
rel="noopener"
key="button"
>
<span key="button-span">Visit Page</span>
</IgrButton>
</IgrCardActions>
</IgrCard>
</div>
</IgrCarouselSlide>
<IgrCarouselSlide key="slide-2">
<div className="slide-wrapper" key="card-wrapper">
<IgrCard>
<IgrCardHeader key="card-header">
<h3 slot="title" key="header-title">
Ignite UI for Javascript
</h3>
</IgrCardHeader>
<IgrCardContent key="card-content">
<p key="content">
A complete JavaScript UI library empowering you to build
data-rich responsive web apps.
</p>
</IgrCardContent>
<IgrCardMedia key="card-media">
<img
src="https://www.infragistics.com/angular-demos-lob/assets/images/carousel/slide2-ignite.png"
key="img"
/>
</IgrCardMedia>
<IgrCardActions key="card-actions">
<IgrButton
slot="start"
href="https://www.infragistics.com/products/ignite-ui"
target="_blank"
rel="noopener"
key="button"
>
<span key="button-span">Visit Page</span>
</IgrButton>
</IgrCardActions>
</IgrCard>
</div>
</IgrCarouselSlide>
<IgrCarouselSlide key="slide-3">
<div className="slide-wrapper" key="card-wrapper">
<IgrCard>
<IgrCardHeader key="card-header">
<h3 slot="title" key="header-title">
Ultimate UI for ASP.NET
</h3>
</IgrCardHeader>
<IgrCardContent key="card-content">
<p key="content">
Build full-featured business apps with the most versatile set
of ASP.NET AJAX UI controls.
</p>
</IgrCardContent>
<IgrCardMedia key="card-media">
<img
src="https://www.infragistics.com/angular-demos-lob/assets/images/carousel/slide3-aspnet.png"
key="img"
/>
</IgrCardMedia>
<IgrCardActions key="card-actions">
<IgrButton
slot="start"
href="https://www.infragistics.com/products/aspnet"
target="_blank"
rel="noopener"
key="button"
>
<span key="button-span">Visit Page</span>
</IgrButton>
</IgrCardActions>
</IgrCard>
</div>
</IgrCarouselSlide>
</IgrCarousel>
</div>
);
}
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<CarouselComponents />);
tsx
.carousel-wrapper {
height: 600px;
width: 90%;
margin: 20px auto;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.action-wrapper {
height: 40px;
width: 500px;
display: flex;
justify-content: space-between;
margin-bottom: 10px;
}
.action {
display: flex;
align-items: center;
}
.slide-wrapper {
display: flex;
align-items: center;
justify-content: center;
padding: 10px;
}
igc-carousel {
border: 0.5px solid #dde0e4;
}
igc-select {
width: 150px;
margin-left: 10px;
--ig-size: var(--ig-size-small);
}
igc-card {
border: none;
}
igc-card-header {
padding: 8px 16px;
}
css
ナビゲーション
トランジションとナビゲーションは、最も重要なカルーセル機能です。
カルーセル内のナビゲーションは、モバイル デバイスでのナビゲーション ボタン、キーボード ナビゲーション、パン操作を通じてユーザーが処理できます。
タッチ ジェスチャー
デフォルトでカルーセルはあらゆるタッチ対応デバイスに使用できます。
カルーセル アニメーションはタッチ デバイスで完全にサポートされているため、プラットホームに合わせてプログレッシブ Web アプリケーション (PWA) を構築するための完璧なツールです。
キーボード ナビゲーション
- ナビゲーション ボタン
Space
/Enter
キー - 次のスライド/前のスライドに移動します。
- インジケーター
左矢印
キー - 前のスライド (右から左モードでは次) に移動します。
右矢印
キー - 次のスライド (右から左モードでは前へ) に移動します。
Home
キー - 最初のスライド (右から左モードでは最後) に移動します。
End
キー - 最後のスライド (右から左モードでは最初) に移動します。
自動的なトランジション
IgrCarousel
は、ユーザーの操作なしでスライドを自動的に変更するように簡単に構成できます。この方法では、トランジション間隔 を interval
プロパティに設定するだけで、スライドショーを作成できます。このプロパティは、スライド トランジション間の間隔 (ミリ秒)を決定します。
カルーセル コンテンツの上にマウスを移動するか、キーボード フォーカスをいずれかのカルーセル コンテンツに移動すると、自動トランジションが一時停止されます。マウスがカルーセルから離れるか、キーボード フォーカスがカルーセル コンテンツから移動すると、自動トランジションが再開されます。 この動作は、disablePauseOnInteraction プロパティを true に設定することでこれを防ぐことができます。
<IgrCarousel interval={2000} disablePauseOnInteraction={true}>
...
</IgrCarousel>
tsx
高度な例
ループを有効にして完全に自動化されたカルーセルを作成しましょう。各スライドのサムネイル表示になるようにインジケーターを設定します。
これを実現するには、カルーセルを以下のように構成する必要があります。
カルーセル テンプレートは以下のようになります。
const images = [
{
src: "assets/images/carousel/WonderfulCoast.png",
alt: "Wonderful Coast",
},
{
src: "assets/images/carousel/CulturalDip.png",
alt: "Cultural Dip",
},
{
src: "assets/images/carousel/GoldenBeaches.png",
alt: "Golden Beaches",
},
{
src: "assets/images/carousel/IslandOfHistory.png",
alt: "Island Of History",
},
{
src: "assets/images/carousel/AmazingBridge.png",
alt: "Amazing Bridge",
},
];
<IgrCarousel
disablePauseOnInteraction={true}
hideNavigation={true}
interval={2000}
vertical={true}
animationType={CarouselAnimationType.Fade}
>
{images.map((image, index) => {
return (
<React.Fragment key={index}>
<IgrCarouselSlide key={`slide-${index}`}>
<img src={image.src} alt={image.alt} key="slide-img" />
</IgrCarouselSlide>
<IgrCarouselIndicator key={`indicator-${index}`}>
<img
key="img-blur"
className="blurred"
src={image.src.replace(".png", "Thumb.png")}
alt={`${image.alt} Thumb`}
width="50"
height="60"
/>
<img
key="img-active"
slot="active"
src={image.src.replace(".png", "Thumb.png")}
alt={`${image.alt} Thumb Active`}
width="50"
height="60"
/>
</IgrCarouselIndicator>
</React.Fragment>
);
})}
</IgrCarousel>
tsx
これらの構成の結果は以下のようになります。
EXAMPLE
TSX
CarouselThumbnail.css
index.css
import React from "react";
import ReactDOM from "react-dom/client";
import {
CarouselAnimationType,
IgrCarousel,
IgrCarouselIndicator,
IgrCarouselModule,
IgrCarouselSlide,
} from "@infragistics/igniteui-react";
import "igniteui-webcomponents/themes/light/bootstrap.css";
import "./CarouselThumbnail.css";
import "./index.css";
IgrCarouselModule.register();
export default function CarouselThumbnail() {
const images = [
{
src: "https://www.infragistics.com/angular-demos-lob/assets/images/carousel/WonderfulCoast.png",
alt: "Wonderful Coast",
},
{
src: "https://www.infragistics.com/angular-demos-lob/assets/images/carousel/CulturalDip.png",
alt: "Cultural Dip",
},
{
src: "https://www.infragistics.com/angular-demos-lob/assets/images/carousel/GoldenBeaches.png",
alt: "Golden Beaches",
},
{
src: "https://www.infragistics.com/angular-demos-lob/assets/images/carousel/IslandOfHistory.png",
alt: "Island Of History",
},
{
src: "https://www.infragistics.com/angular-demos-lob/assets/images/carousel/AmazingBridge.png",
alt: "Amazing Bridge",
},
];
return (
<div className="container sample">
<IgrCarousel
disablePauseOnInteraction={true}
hideNavigation={true}
interval={2000}
vertical={true}
animationType={CarouselAnimationType.Fade}
>
{images.map((image, index) => {
return (
<React.Fragment key={index}>
<IgrCarouselSlide key={`slide-${index}`}>
<img src={image.src} alt={image.alt} key="slide-img" />
</IgrCarouselSlide>
<IgrCarouselIndicator key={`indicator-${index}`}>
<img
key="img-blur"
className="blurred"
src={image.src.replace(".png", "Thumb.png")}
alt={`${image.alt} Thumb`}
width="50"
height="60"
/>
<img
key="img-active"
slot="active"
src={image.src.replace(".png", "Thumb.png")}
alt={`${image.alt} Thumb Active`}
width="50"
height="60"
/>
</IgrCarouselIndicator>
</React.Fragment>
);
})}
</IgrCarousel>
</div>
);
}
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<CarouselThumbnail />);
tsx
igc-carousel {
margin-inline: auto;
max-width: 75%;
}
igc-carousel::part(indicators) {
border-radius: 2px;
}
.blurred {
filter: blur(2px);
opacity: 0.5;
}
css
ユーザー補助
WAI-ARIA の役割、状態、およびプロパティ
- カルーセルの基本要素の役割は
region
です。これは、ユーザーが簡単にナビゲートできるようにしたい特定の目的に関連するコンテンツを含むセクションです。
- カルーセル インジケーターの役割は
tab
です。これは、ユーザーに描画されるタブ コンテンツを選択するためのメカニズムを提供するグループ化ラベルです。
- タブのセット (カルーセル インジケーター) 役割のコンテナーとして機能する要素は、
tablist
に設定されます。
- 各スライド要素には、
tabpanel
の役割が設定されています。
ARIA のサポート
Carousel コンポーネント
- 属性
- aria-roledescription を 「carousel」 に設定します。
- aria-live - スクリーン リーダーがライブ リージョンの更新を処理する優先度を設定するために使用されます。可能な設定は off おとび polite です。デフォルト設定は polite であり、スライド セットのコンテナーとして機能する要素に設定されています。
interval
オプションが設定され、カルーセルが再生状態の場合、aria-live 属性は off に設定されます。
- aria-label (ナビゲーション ボタン) - 「前のスライド」/「次のスライド」。
Slide コンポーネント
- 属性
- id - 「igc-carousel-slide-${incremented_number}」 のパターンに従います。
- aria-roledescription を 「slide」 に設定します。
- aria-label は 「${index + 1} of ${total}」 のパターンに従います。
Indicator コンポーネント
API リファレンス
その他のリソース