<main class="main-wrapper">
<div class="carousel">
<div class="carousel__wrap">
<div class="carousel__frame">
<a href="#" id="panel1" class="carousel__content js-carousel-cont" role="tabpanel" aria-labelledby="prev next play pause tab1" aria-hidden="false" tabindex="0">
<picture>
<!-- WebP用画像-->
<source srcset="../../img/img_carousel_01.webp" type="image/webp">
<!-- 従来画像-->
<img src="../../img/img_carousel_01.jpg" class="carousel__img is-motioned" alt="スライドパネルのコンテンツ画像1" decoding="async">
</picture>
</a>
<a href="#" id="panel2" class="carousel__content js-carousel-cont" role="tabpanel" aria-labelledby="prev next play pause tab2" aria-hidden="true" tabindex="-1">
<picture>
<source srcset="../../img/img_carousel_02.webp" type="image/webp">
<img src="../../img/img_carousel_02.jpg" class="carousel__img" alt="スライドパネルのコンテンツ画像2" decoding="async">
</picture>
</a>
<a href="#" id="panel3" class="carousel__content js-carousel-cont" role="tabpanel" aria-labelledby="prev next play pause tab3" aria-hidden="true" tabindex="-1">
<picture>
<source srcset="../../img/img_carousel_03.webp" type="image/webp">
<img src="../../img/img_carousel_03.jpg" class="carousel__img" alt="スライドパネルのコンテンツ画像3" decoding="async">
</picture>
</a>
<a href="#" id="panel4" class="carousel__content js-carousel-cont" role="tabpanel" aria-labelledby="prev next play pause tab4" aria-hidden="true" tabindex="-1">
<picture>
<source srcset="../../img/img_carousel_04.webp" type="image/webp">
<img src="../../img/img_carousel_04.jpg" class="carousel__img" alt="スライドパネルのコンテンツ画像4" decoding="async">
</picture>
</a>
<a href="#" id="panel5" class="carousel__content js-carousel-cont" role="tabpanel" aria-labelledby="prev next play pause tab5" aria-hidden="true" tabindex="-1">
<picture>
<source srcset="../../img/img_carousel_05.webp" type="image/webp">
<img src="../../img/img_carousel_05.jpg" class="carousel__img" alt="スライドパネルのコンテンツ画像5" decoding="async">
</picture>
</a>
</div>
<button type="button" id="prev" class="carousel__control-prev js-carousel-prev" aria-label="前のスライドコンテンツへ" aria-controls="panel1 panel2 panel3 panel4 panel5"></button>
<button type="button" id="next" class="carousel__control-next js-carousel-next" aria-label="次のスライドコンテンツへ" aria-controls="panel1 panel2 panel3 panel4 panel5"></button>
<button type="button" id="play" class="carousel__control-play js-carousel-play" aria-label="オートスライド再生" aria-controls="panel1 panel2 panel3 panel4 panel5" aria-hidden="false"></button>
<button type="button" id="pause" class="carousel__control-pause js-carousel-pause" aria-label="オートスライド一時停止" aria-controls="panel1 panel2 panel3 panel4 panel5" aria-hidden="true"></button>
</div>
<ul class="carousel__thumbnail-list" role="tablist">
<li class="carousel__thumbnail-item" role="presentation">
<button type="button" id="tab1" class="carousel__thumbnail-btn js-carousel-thumb" role="tab" aria-controls="panel1" aria-selected="true">
<picture>
<source srcset="../../img/img_carousel_01.webp" type="image/webp">
<img src="../../img/img_carousel_01.jpg" class="carousel__thumbnail-img" alt="スライドパネル-サムネイル画像1" decoding="async">
</picture>
</button>
</li>
<li class="carousel__thumbnail-item" role="presentation">
<button type="button" id="tab2" class="carousel__thumbnail-btn js-carousel-thumb" role="tab" aria-controls="panel2" aria-selected="false">
<picture>
<source srcset="../../img/img_carousel_02.webp" type="image/webp">
<img src="../../img/img_carousel_02.jpg" class="carousel__thumbnail-img" alt="スライドパネル-サムネイル画像2" decoding="async">
</picture>
</button>
</li>
<li class="carousel__thumbnail-item" role="presentation">
<button type="button" id="tab3" class="carousel__thumbnail-btn js-carousel-thumb" role="tab" aria-controls="panel3" aria-selected="false">
<picture>
<source srcset="../../img/img_carousel_03.webp" type="image/webp">
<img src="../../img/img_carousel_03.jpg" class="carousel__thumbnail-img" alt="スライドパネル-サムネイル画像3" decoding="async">
</picture>
</button>
</li>
<li class="carousel__thumbnail-item" role="presentation">
<button type="button" id="tab4" class="carousel__thumbnail-btn js-carousel-thumb" role="tab" aria-controls="panel4" aria-selected="false">
<picture>
<source srcset="../../img/img_carousel_04.webp" type="image/webp">
<img src="../../img/img_carousel_04.jpg" class="carousel__thumbnail-img" alt="スライドパネル-サムネイル画像4" decoding="async">
</picture>
</button>
</li>
<li class="carousel__thumbnail-item" role="presentation">
<button type="button" id="tab5" class="carousel__thumbnail-btn js-carousel-thumb" role="tab" aria-controls="panel5" aria-selected="false">
<picture>
<source srcset="../../img/img_carousel_05.webp" type="image/webp">
<img src="../../img/img_carousel_05.jpg" class="carousel__thumbnail-img" alt="スライドパネル-サムネイル画像5" decoding="async">
</picture>
</button>
</li>
</ul>
<p style="margin: 2rem auto auto">※メインパネルと「前へ(<)」「次へ(>)」ナビゲーションにマウスオン/フォーカスしていると自動再生は停止します</p>
</div>
</main>
<main class="main-wrapper">
<div class="carousel">
<div class="carousel__wrap">
<div class="carousel__frame">
<a href="#" id="panel1" class="carousel__content js-carousel-cont" role="tabpanel" aria-labelledby="prev next play pause tab1" aria-hidden="false" tabindex="0">
<picture>
<!-- WebP用画像-->
<source srcset="{{ path '/img/img_carousel_01.webp' }}" type="image/webp">
<!-- 従来画像-->
<img src="{{ path '/img/img_carousel_01.jpg' }}" class="carousel__img is-motioned" alt="スライドパネルのコンテンツ画像1" decoding="async">
</picture>
</a>
<a href="#" id="panel2" class="carousel__content js-carousel-cont" role="tabpanel" aria-labelledby="prev next play pause tab2" aria-hidden="true" tabindex="-1">
<picture>
<source srcset="{{ path '/img/img_carousel_02.webp' }}" type="image/webp">
<img src="{{ path '/img/img_carousel_02.jpg' }}" class="carousel__img" alt="スライドパネルのコンテンツ画像2" decoding="async">
</picture>
</a>
<a href="#" id="panel3" class="carousel__content js-carousel-cont" role="tabpanel" aria-labelledby="prev next play pause tab3" aria-hidden="true" tabindex="-1">
<picture>
<source srcset="{{ path '/img/img_carousel_03.webp' }}" type="image/webp">
<img src="{{ path '/img/img_carousel_03.jpg' }}" class="carousel__img" alt="スライドパネルのコンテンツ画像3" decoding="async">
</picture>
</a>
<a href="#" id="panel4" class="carousel__content js-carousel-cont" role="tabpanel" aria-labelledby="prev next play pause tab4" aria-hidden="true" tabindex="-1">
<picture>
<source srcset="{{ path '/img/img_carousel_04.webp' }}" type="image/webp">
<img src="{{ path '/img/img_carousel_04.jpg' }}" class="carousel__img" alt="スライドパネルのコンテンツ画像4" decoding="async">
</picture>
</a>
<a href="#" id="panel5" class="carousel__content js-carousel-cont" role="tabpanel" aria-labelledby="prev next play pause tab5" aria-hidden="true" tabindex="-1">
<picture>
<source srcset="{{ path '/img/img_carousel_05.webp' }}" type="image/webp">
<img src="{{ path '/img/img_carousel_05.jpg' }}" class="carousel__img" alt="スライドパネルのコンテンツ画像5" decoding="async">
</picture>
</a>
</div>
<button type="button" id="prev" class="carousel__control-prev js-carousel-prev" aria-label="前のスライドコンテンツへ" aria-controls="panel1 panel2 panel3 panel4 panel5"></button>
<button type="button" id="next" class="carousel__control-next js-carousel-next" aria-label="次のスライドコンテンツへ" aria-controls="panel1 panel2 panel3 panel4 panel5"></button>
<button type="button" id="play" class="carousel__control-play js-carousel-play" aria-label="オートスライド再生" aria-controls="panel1 panel2 panel3 panel4 panel5" aria-hidden="false"></button>
<button type="button" id="pause" class="carousel__control-pause js-carousel-pause" aria-label="オートスライド一時停止" aria-controls="panel1 panel2 panel3 panel4 panel5" aria-hidden="true"></button>
</div>
<ul class="carousel__thumbnail-list" role="tablist">
<li class="carousel__thumbnail-item" role="presentation">
<button type="button" id="tab1" class="carousel__thumbnail-btn js-carousel-thumb" role="tab" aria-controls="panel1" aria-selected="true">
<picture>
<source srcset="{{ path '/img/img_carousel_01.webp' }}" type="image/webp">
<img src="{{ path '/img/img_carousel_01.jpg' }}" class="carousel__thumbnail-img" alt="スライドパネル-サムネイル画像1" decoding="async">
</picture>
</button>
</li>
<li class="carousel__thumbnail-item" role="presentation">
<button type="button" id="tab2" class="carousel__thumbnail-btn js-carousel-thumb" role="tab" aria-controls="panel2" aria-selected="false">
<picture>
<source srcset="{{ path '/img/img_carousel_02.webp' }}" type="image/webp">
<img src="{{ path '/img/img_carousel_02.jpg' }}" class="carousel__thumbnail-img" alt="スライドパネル-サムネイル画像2" decoding="async">
</picture>
</button>
</li>
<li class="carousel__thumbnail-item" role="presentation">
<button type="button" id="tab3" class="carousel__thumbnail-btn js-carousel-thumb" role="tab" aria-controls="panel3" aria-selected="false">
<picture>
<source srcset="{{ path '/img/img_carousel_03.webp' }}" type="image/webp">
<img src="{{ path '/img/img_carousel_03.jpg' }}" class="carousel__thumbnail-img" alt="スライドパネル-サムネイル画像3" decoding="async">
</picture>
</button>
</li>
<li class="carousel__thumbnail-item" role="presentation">
<button type="button" id="tab4" class="carousel__thumbnail-btn js-carousel-thumb" role="tab" aria-controls="panel4" aria-selected="false">
<picture>
<source srcset="{{ path '/img/img_carousel_04.webp' }}" type="image/webp">
<img src="{{ path '/img/img_carousel_04.jpg' }}" class="carousel__thumbnail-img" alt="スライドパネル-サムネイル画像4" decoding="async">
</picture>
</button>
</li>
<li class="carousel__thumbnail-item" role="presentation">
<button type="button" id="tab5" class="carousel__thumbnail-btn js-carousel-thumb" role="tab" aria-controls="panel5" aria-selected="false">
<picture>
<source srcset="{{ path '/img/img_carousel_05.webp' }}" type="image/webp">
<img src="{{ path '/img/img_carousel_05.jpg' }}" class="carousel__thumbnail-img" alt="スライドパネル-サムネイル画像5" decoding="async">
</picture>
</button>
</li>
</ul>
<p style="margin: 2rem auto auto">※メインパネルと「前へ(<)」「次へ(>)」ナビゲーションにマウスオン/フォーカスしていると自動再生は停止します</p>
</div>
</main>
/* No context defined. */
/* /js/modules/Carousel.js */
/**
* Carousel UI class
*/
export class Carousel {
constructor(triggerClass, img, thumb, prev, next, play, pause) {
this.current = 0; // 現在地を示すインデックス番号:初期値0=1番目
this.timerId; // setTimeout関数の戻り値(ID)。clearTimeoutに渡す用
// カルーセル関連のNodeListを取得して変数に格納
this.carouselCont = document.querySelectorAll(triggerClass); // .js-carousel-contをすべてカルーセルパネル(コンテンツ)とみなし、NodeList取得
this.contArray = Array(...this.carouselCont); // 上記NodeListオブジェクトを扱いやすいよう配列に変換
if(this.carouselCont.length > 0) {
this.carouselImg = document.querySelectorAll(img);
this.carouselThumb = document.querySelectorAll(thumb); // サムネイル(button要素 = role="tab")のDOM取得
}
// 前へボタンDOM取得変数
this.prev = document.querySelector(prev);
// 次へボタンDOM取得変数
this.next = document.querySelector(next);
// 再生ボタン、停止ボタンのDOM取得変数
this.play = document.querySelector(play);
this.pause = document.querySelector(pause);
this.runFlg = false; // オートスライド実行中フラグ初期値
}
// ---メソッド---
// カルーセルを表示([aria-hidden="false"]スタイル)
showCarousel() {
this.carouselCont[this.current].setAttribute('aria-hidden', 'false'); // 表示状態(ARIA)
this.carouselCont[this.current].setAttribute('tabindex', '0'); // キーボードフォーカス可に
// this.carouselImg[this.current].classList.add('is-motioned'); // スケールモーションclass付与 ※必要に応じてご利用ください
}
// カルーセルを非表示([aria-hidden="true"]スタイル)
hideCarousel() {
this.carouselCont[this.current].setAttribute('aria-hidden', 'true'); // 非表示状態(ARIA)
this.carouselCont[this.current].setAttribute('tabindex', '-1'); // キーボードフォーカス不可に
// this.carouselImg[this.current].classList.remove('is-motioned'); // スケールモーションclass削除 ※必要に応じてご利用ください
}
// サムネイル画像を非選択状態([aria-selected="false"]スタイル)
removeCurrent() {
this.carouselThumb[this.current].setAttribute('aria-selected', 'false'); // 非選択状態(ARIA)
}
// サムネイル画像を選択状態([aria-selected="false"]スタイル)
addCurrent() {
this.carouselThumb[this.current].setAttribute('aria-selected', 'true'); // 選択状態(ARIA)
}
// オートスライド再生
playCarousel() {
this.timerId = setTimeout(() => {
this.next.click(); // 次へボタンクリックイベント呼び出し(buttonオブジェクトのメソッド)
this.playCarousel(); // 再帰
}, 3500);
}
// オートスライド停止
stopCarousel() {
clearTimeout(this.timerId);
}
// ---イベントおよびメソッド実行処理----
setter() {
if(this.carouselCont.length > 0) {
// 格納したNodeListオブジェクトを配列として要素1つ1つにループ処理
for (let i = 0; i < this.contArray.length; i++) {
// カルーセルのメインコンテンツのマウンスエンターイベント
this.carouselCont[i].addEventListener('mouseenter', () => {
this.stopCarousel(); // 自動再生止める
});
// カルーセルのメインコンテンツのマウンスリーブイベント
this.carouselCont[i].addEventListener('mouseleave', () => {
// 再生ボタンオンなら再生、停止ボタンオンなら停止
if (this.runFlg === true) {
this.playCarousel();
} else {
this.stopCarousel();
}
});
// カルーセルのメインコンテンツのキーボードフォーカスインイベント
this.carouselCont[i].addEventListener('focus', () => {
this.stopCarousel(); // 自動再生止める
});
// カルーセルのメインコンテンツのキーボードフォーカスアウトイベント
this.carouselCont[i].addEventListener('blur', () => {
// 再生ボタンオンなら再生、停止ボタンオンなら停止
if (this.runFlg === true) {
this.playCarousel();
} else {
this.stopCarousel();
}
});
// thumbnailBtn(button要素)クリックイベント時に実行する関数群
this.carouselThumb[i].addEventListener('click', () => {
this.hideCarousel(this.contArray);
this.removeCurrent();
this.current = i; // currentにクリックされた要素のインデックス番号を格納
this.addCurrent();
this.showCarousel(this.contArray);
});
}
// カルーセル画像 前へ(<)ボタン・クリックイベント
this.prev.addEventListener('click', () => {
this.hideCarousel(this.contArray[this.current]);
this.removeCurrent(); // currentクラスを持つ要素から、currentクラスを削除する関数実行
this.current--; // currentを1つ引く
// currentが0未満の値になったときの戻る処理
if (this.current < 0) this.current = this.contArray.length - 1; // currentを最大値にする(最終番目に移動する)
this.addCurrent();
this.showCarousel(this.contArray[this.current]);
});
// 前へボタン・マウスオンイベント
this.prev.addEventListener('mouseenter', () => {
this.stopCarousel();
});
// 前へボタン・マウスアウトイベント
this.prev.addEventListener('mouseleave', () => {
// 再生ボタンオンなら再生、停止ボタンオンなら停止
if (this.runFlg === true) {
this.playCarousel();
} else {
this.stopCarousel();
}
});
// 前へボタン・キーボードフォーカスインイベント
this.prev.addEventListener('focus', () => {
this.stopCarousel();
});
// 前へボタン・キーボードフォーカスアウトイベント
this.prev.addEventListener('blur', () => {
// 再生ボタンオンなら再生、停止ボタンオンなら停止
if (this.runFlg === true) {
this.playCarousel();
} else {
this.stopCarousel();
}
});
// カルーセル画像 次へ(>)ボタン・クリックイベント
this.next.addEventListener('click', () => {
this.hideCarousel(this.contArray[this.current]);
this.removeCurrent();
this.current++; // currentを1つ足す
// currentが配列の数(最大数)と同じときの処理
if (this.current === this.contArray.length) this.current = 0; // currentを0にする(1番目に戻す)
this.addCurrent(); //
this.showCarousel(this.contArray[this.current]);
});
// 次へボタン・マウスオンイベント
this.next.addEventListener('mouseenter', () => {
this.stopCarousel();
});
// 次へボタン・マウスアウトイベント
this.next.addEventListener('mouseleave', () => {
// 再生ボタンオンなら再生、停止ボタンオンなら停止
if (this.runFlg === true) {
this.playCarousel();
} else {
this.stopCarousel();
}
});
// 次へボタン・キーボードフォーカスオンイベント
this.next.addEventListener('focus', () => {
this.stopCarousel();
});
// 次へボタン・キーボードフォーカスアウトイベント
this.next.addEventListener('blur', () => {
// 再生ボタンオンなら再生、停止ボタンオンなら停止
if (this.runFlg === true) {
this.playCarousel();
} else {
this.stopCarousel();
}
});
// 再生ボタン・クリックイベント
this.play.addEventListener('click', () => {
this.play.setAttribute('aria-hidden', 'true');
this.pause.setAttribute('aria-hidden', 'false');
this.pause.focus(); // 停止ボタンにフォーカスさせる
this.playCarousel();
this.runFlg = true; // 再生フラグオン
});
// 停止ボタン・クリックイベント
this.pause.addEventListener('click', () => {
this.pause.setAttribute('aria-hidden', 'true');
this.play.setAttribute('aria-hidden', 'false');
this.play.focus(); // 再生ボタンにフォーカスさせる
this.stopCarousel();
this.runFlg = false; // 再生フラグオフ
});
}
}
}
/* /js/main.js */
import { Carousel } from './modules/Carousel.js';
const carousel = new Carousel('.js-carousel-cont', '.carousel__img', '.js-carousel-thumb', '.js-carousel-prev', '.js-carousel-next', '.js-carousel-play', '.js-carousel-pause');
carousel.setter();
.carousel {
margin: auto;
}
@media print, screen and (max-width:64em) {
.carousel {
width: 90vw;
}
}
@media print, screen and (min-width:64.0625em) {
.carousel {
width: 100%;
max-width: 40rem;
}
}
.carousel__wrap {
position: relative;
}
/* フレーム */
.carousel__frame {
padding: 33.33%;
overflow: hidden;
}
/* 各パネルの中身 = コンテンツ (divかaを想定) */
.carousel__content {
position: absolute;
top: 0;
left: 0;
opacity: 0;
}
.carousel__content[aria-hidden="false"] {
z-index: 1;
opacity: 1;
transition: var(--carousel-switch-effect);
}
@media print, screen and (min-width:64.0625em) {
.carousel__content[aria-hidden="false"]:hover {
opacity: .92;
transition: var(--in-transition);
}
}
.carousel__content[aria-hidden="false"]:focus {
opacity: .92;
transition: var(--in-transition);
}
.carousel__content[aria-hidden="true"] {
transition: var(--carousel-fade);
}
/* コンテンツ画像 */
.carousel__img {
width: 100%;
height: 100%;
}
/* カルーセル アニメーション ※必要に応じてご利用ください */
/*
* コントローラー群 - 前へナビ、次へナビ、再生ボタン、停止ボタン
* 拡張性担保のため、classセレクタ名は一意にしている
*/
.carousel__control-pause,
.carousel__control-play,
.carousel__control-next,
.carousel__control-prev {
position: absolute;
padding: .1rem .5rem;
text-align: center;
}
.carousel__control-next,
.carousel__control-prev {
top: 50%;
width: 2.8125rem;
height: 2.8125rem;
transform: translateY(-50%);
transition: var(--out-transition);
}
@media print, screen and (min-width:64.0625em) {
.carousel__control-next:hover,
.carousel__control-prev:hover {
transition: var(--in-transition);
}
}
.carousel__control-next:before,
.carousel__control-prev:before {
content: "";
display: block;
position: absolute;
top: 50%;
border-style: solid;
backface-visibility: hidden;
}
@media print, screen and (max-width:64em) {
.carousel__control-next:before,
.carousel__control-prev:before {
width: 1.25rem;
height: 1.25rem;
border-color: var(--white);
border-width: 0 2px 2px 0;
}
}
@media print, screen and (min-width:64.0625em) {
.carousel__control-next:before,
.carousel__control-prev:before {
width: 1.5625rem;
height: 1.5625rem;
border-color: var(--border-color);
border-width: 0 3px 3px 0;
}
}
.carousel__control-next:focus,
.carousel__control-prev:focus {
transition: var(--in-transition);
}
.carousel__control-pause,
.carousel__control-play {
z-index: 2;
width: 3rem;
height: 2.5em;
border: 1px solid #bbb;
border-radius: 2px;
}
@media print, screen and (max-width:64em) {
.carousel__control-pause,
.carousel__control-play {
bottom: 3%;
left: 50%;
transform: translateX(-50%);
}
}
@media print, screen and (min-width:64.0625em) {
.carousel__control-pause,
.carousel__control-play {
right: 2%;
bottom: 3%;
}
.carousel__control-pause:hover,
.carousel__control-play:hover {
background-color: var(--contrast-limit-gray);
}
}
.carousel__control-pause[aria-hidden="true"],
.carousel__control-play[aria-hidden="true"] {
z-index: 0;
visibility: hidden;
}
.carousel__control-pause[aria-hidden="false"],
.carousel__control-play[aria-hidden="false"] {
visibility: visible;
}
.carousel__control-pause:focus,
.carousel__control-play:focus {
background-color: var(--contrast-limit-gray);
}
/* 前へナビ */
.carousel__control-prev {
transition: all .3s var(--ease-out-quad);
}
@media print, screen and (max-width:64em) {
.carousel__control-prev {
left: .2rem;
z-index: 1;
}
}
@media print, screen and (min-width:64.0625em) {
.carousel__control-prev {
left: -2.2rem;
}
.carousel__control-prev:hover {
transform: translate(-10%, -50%) rotate(0);
transition: all .25s var(--ease-in-quad);
}
}
.carousel__control-prev:before {
transform: translate(0, -50%) rotate(135deg);
}
/* 次へナビ */
.carousel__control-next {
transition: transform .3s var(--ease-out-quad);
}
@media print, screen and (max-width:64em) {
.carousel__control-next {
right: -.3rem;
z-index: 1;
}
}
@media print, screen and (min-width:64.0625em) {
.carousel__control-next {
right: -2.2rem;
}
.carousel__control-next:hover {
transform: translate(10%, -50%) rotate(0);
transition: transform .25s var(--ease-in-quad);
}
}
.carousel__control-next:before {
transform: translate(0, -50%) rotate(-45deg);
}
/* 再生ボタン */
@media print, screen and (max-width:64em) {
.carousel__control-play {
background: #999 url(../img/img_play.png) 53% center no-repeat;
}
}
@media print, screen and (min-width:64.0625em) {
.carousel__control-play {
background: #999 url(../img/img_play.png) 56% center no-repeat;
}
}
/* 停止ボタン */
.carousel__control-pause {
background: #999 url(../img/img_pause.png) 50% center no-repeat;
}
/* インジケーターもしくはサムネイルのコンテナー(リスト) */
.carousel__thumbnail-list {
display: grid;
justify-content: center;
width: 100%;
}
@media print, screen and (max-width:47.96875em) {
.carousel__thumbnail-list {
gap: .5rem;
grid-template-columns: repeat(auto-fit, minmax(15%, 1fr));
margin-top: .8rem;
}
}
@media print, screen and (min-width:48em) {
.carousel__thumbnail-list {
gap: 1rem;
grid-template-columns: repeat(auto-fit, 15%);
margin-top: 1rem;
}
}
/* インジケーター・サムネイル ボタン */
.carousel__thumbnail-btn {
width: 100%;
height: auto;
}
@media print, screen and (min-width:64.0625em) {
.carousel__thumbnail-btn:hover {
opacity: 1;
transition: opacity .25s var(--ease-in-quad);
outline: .125rem solid var(--focusring-color);
outline-offset: .0625rem;
}
}
.carousel__thumbnail-btn[aria-selected="false"] {
opacity: .8;
transition: opacity .3s var(--ease-out-quad);
}
.carousel__thumbnail-btn[aria-selected="true"] {
opacity: 1;
outline: .2rem solid #248aff;
outline-offset: 0;
}
.carousel__thumbnail-btn:focus {
opacity: 1;
transition: opacity .25s var(--ease-in-quad);
}
/* サムネイル画像(img) */
.carousel__thumbnail-img {
width: 100%;
}
No notes defined.