LoginSignup
0
0

More than 1 year has passed since last update.

slick でフェードスライダーを作成する

Last updated at Posted at 2022-04-30

slick を使用した、フェードで切り替わるスライダーのコードを紹介します。
アニメーションは全て CSS で制御しているため、slick 以外のスライダーライブラリにも流用可能です。

完成形

See the Pen Untitled by Riku Ota (@RikuOta) on CodePen.

HTML

コード
<div class="slider js-slider">
  <!-- 1つ目のスライド -->
  <div class="slideItem">
    <div class="slideItem__inner">
      <p class="slideItem__image">
        <img src="https://picsum.photos/300/200" alt="サンプル画像">
      </p>
      <div>
        <p class="slideItem__title">
          <span>1つ目のスライドです</span>
        </p>
        <div class="slideItem__text1">
          <p>1つ目のスライドです。</p>
          <p>1つ目のスライドです。</p>
        </div>
        <div class="slideItem__text2">
          <p>1つ目のスライドです。</p>
          <p>1つ目のスライドです。</p>
        </div>
      </div>
    </div>
  </div>
  <!-- 1つ目のスライド -->

  <!-- 2つ目のスライド -->
  <div class="slideItem">
    <div class="slideItem__inner">
      <p class="slideItem__image">
        <img src="https://picsum.photos/300/210" alt="サンプル画像">
      </p>
      <div>
        <p class="slideItem__title">
          <span>2つ目のスライドです</span>
        </p>
        <div class="slideItem__text1">
          <p>2つ目のスライドです。</p>
          <p>2つ目のスライドです。</p>
        </div>
        <div class="slideItem__text2">
          <p>2つ目のスライドです。</p>
          <p>2つ目のスライドです。</p>
        </div>
      </div>
    </div>
  </div>
  <!-- 2つ目のスライド -->

  <!-- 3つ目のスライド -->
  <div class="slideItem">
    <div class="slideItem__inner">
      <p class="slideItem__image">
        <img src="https://picsum.photos/300/220" alt="サンプル画像">
      </p>
      <div>
        <p class="slideItem__title">
          <span>3つ目のスライドです</span>
        </p>
        <div class="slideItem__text1">
          <p>3つ目のスライドです。</p>
          <p>3つ目のスライドです。</p>
        </div>
        <div class="slideItem__text2">
          <p>3つ目のスライドです。</p>
          <p>3つ目のスライドです。</p>
        </div>
      </div>
    </div>
  </div>
  <!-- 3つ目のスライド -->
</div>

JavaScript

$(".js-slider").slick({
  fade: true,
  speed: 0,
  touchThreshold: 100
});

CSS (SCSS)

body {
  color: #444;
  font-family: -apple-system, BlinkMacSystemFont, 'Hiragino Kaku Gothic ProN', 'ヒラギノ角ゴ ProN W3', Arial, YuGothic, 'Yu Gothic', Osaka, Meiryo, メイリオ, sans-serif;
}

// slick の「←」と「→」ボタン
.slick-arrow {
  // 色
  &::before {
    color: #222;
  }
}

// slick は オプションで `fade: true` とした場合、
// CSS の opacity プロパティを切り替えることでスライドの表示・非表示を制御している
// しかし、今回はスライド内の各要素 (画像やタイトルなど) に異なるアニメーションをつけたいため、
// スライド自身は常に `opacity: 1` を指定して表示しておく
.slick-slide {
  opacity: 1 !important;
}

// レイアウト用
.slider {
  max-width: 600px;
  margin: 0 auto;
  padding-top: 40px;
}

.slideItem {
  // レイアウト用
  &__inner {
    display: flex;
    justify-content: center;
  }

  &__image {
    margin-bottom: 32px;
    margin-right: 40px;

    // アニメーション (非アクティブになったとき)
    opacity: 0;
    transition: 0.3s;

    // アニメーション (アクティブになったとき)
    @at-root .slick-active & {
      opacity: 1;
      transition: 0.5s 0.3s;
    }
  }

  &__title {
    padding: 4px;
    margin: -4px;
    font-size: 1.2em;
    font-weight: bold;
    margin-bottom: 24px;
    position: relative;

    &::before {
      background-color: currentColor;
      position: absolute;
      top: 0;
      left: 0;
      height: 100%;
      content: "";

      // アニメーション (アクティブになったとき)
      @at-root .slick-active & {
        animation: stretch-left-to-right 0.6s both;
        @keyframes stretch-left-to-right {
          0% {
            left: 0;
            width: 0;
          }
          50% {
            left: 0;
            width: 100%;
          }
          51% {
            left: auto;
            right: 0;
            width: 100%;
          }
          100% {
            left: auto;
            right: 0;
            width: 0;
          }
        }
      }
    }

    > span {
      // アニメーション (非アクティブになったとき)
      opacity: 0;
      transition: 0s 0.3s;

      // アニメーション (アクティブになったとき)
      @at-root .slick-active & {
        opacity: 1;
      }
    }
  }

  &__text1 {
    line-height: 1.5;

    // アニメーション (非アクティブになったとき)
    opacity: 0;
    transition: 0.3s;
    transform: translateY(1em);

    // アニメーション (アクティブになったとき)
    @at-root .slick-active & {
      opacity: 1;
      transition: 0.3s 0.3s;
      transform: translateY(0);
    }
  }

  &__text2 {
    font-size: 14px;
    margin: 16px 0;
    padding: 1em;
    line-height: 1.75;
    position: relative;
    background-color: #f4f4f4;

    // アニメーション (非アクティブになったとき)
    opacity: 0;
    transition: 0.3s;
    transform: translateY(1em);

    // アニメーション (アクティブになったとき)
    @at-root .slick-active & {
      opacity: 1;
      transition: 0.3s 0.37s;
      transform: translateY(0);
    }
  }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0