<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">※メインパネルと「前へ(&lt;)」「次へ(&gt;)」ナビゲーションにマウスオン/フォーカスしていると自動再生は停止します</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">※メインパネルと「前へ(&lt;)」「次へ(&gt;)」ナビゲーションにマウスオン/フォーカスしていると自動再生は停止します</p>
  </div>
</main>
/* No context defined. */
  • Content:
    /* /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();
  • URL: /components/raw/carousel/index.js
  • Filesystem Path: src/components/2-dynamic-ui/carousel/index.js
  • Size: 9.2 KB
  • Content:
    .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%;
    }
  • URL: /components/raw/carousel/style.css
  • Filesystem Path: src/components/2-dynamic-ui/carousel/style.css
  • Size: 6.3 KB

No notes defined.