【CSS】CSSのみで作るループスライダー 縦方向に動かす方法も紹介

css

はじめに

この記事の概要

こんにちは!
今回は、JavaScriptを使用せずにCSSのみで作成できるループスライダーの作り方を紹介します。
CSSのみでコードもシンプルなため、コーディング初心者の方にもおすすめです。
また、TOP画面で画像をギャラリー表示させたいときやアクセントを加えたいときにも簡単に使えます。

横に動くものだけでなく、縦に動くスライダーのセクション作成方法も紹介します。

対象読者

  • CSS初学者の方
  • 画面に動きを簡単につけたい方

ループスライダーとは?

そもそもループスライダーとはどういうアニメーションかと言うと、スライドが最後まで行っても途切れず、最初のスライドに戻りループするアニメーションです。
具体的には下記の動画のような動きを示します。

このようなスライダーはJavaScriptを使用する作成方法もありますが、CSSのみで作成することで以下のようなメリットがあります。

  • ファイルが軽量になる
  • コードのメンテナンスが容易
  • アニメーションのカスタマイズが柔軟

上記の理由から初心者の方にもおすすめです。

ループスライダーの実装方法

では早速、具体的な実装方法を紹介します。
今回使用する技術は、@keyframesを使ったアニメーションと、transformを利用したスライドの移動です。

<div class="slider">
  <div class="slides">
    <div class="slide">Slide 1</div>
    <div class="slide">Slide 2</div>
    <div class="slide">Slide 3</div>
  </div>
</div>
.slider {
  width: 100%;
  overflow: hidden;
}

.slides {
  display: flex;
  animation: slide 10s linear infinite;
}

.slide {
  min-width: 100%;
  box-sizing: border-box;
}

@keyframes slide {
  0% { transform: translateX(0); }
  100% { transform: translateX(-300%); }
}

CSS@keyframesを使用し、スライドが横に動くアニメーションを設定しています。transform: translateXでスライドの位置を移動し、infiniteでループを実現します。

基本のコードは以上です。
HTMLslide1,2,3の箇所に画像を設置することで、画像がループするスライダーを作成可能です。

応用

CSSのみでループスライダーを作る基本がわかったところで、さらにカスタマイズする方法を紹介します。
ループスライダーをホバー時にアニメーションを停止させる方法です。

.slides:hover {
  animation-play-state: paused;
}

この行を追加することで、スライダーをホバー時に停止させることができます。

次は縦方向に動くスライダーです。
今回はTOP画面を意識して、以下のようなセクションを作成しましょう。

<div class="c-top-concept">
 <div class="c-top-concept__gallery-area">
  <div class="c-gallery-slider">
   <div class="c-gallery-slider__wrap">
    <ul class="c-gallery-slider__list">
     <li class="c-gallery-slider__item"><img src="yukata.jpg"></li>
     <li class="c-gallery-slider__item"><img src="yukata.jpg"></li>
     <li class="c-gallery-slider__item"><img src="yukata.jpg"></li>
    </ul>
       <ul class="c-gallery-slider__list-2">
     <li class="c-gallery-slider__item"><img src="yukata.jpg"></li>
     <li class="c-gallery-slider__item"><img src="yukata.jpg"></li>
     <li class="c-gallery-slider__item"><img src="yukata.jpg"></li>
    </ul>
     </div>
    </div>
    <div class="c-top-concept__container">
      <div class="c-top-heading">
        <p class="c-top-heading__sub-text">コンセプト</p>
        <p class="c-top-heading__text">Concept</p>
      </div>
      <div class="c-top-concept__text-area">
        <p class="c-top-concept__heading">CSSのみでループスライダー</p>
        <p class="c-top-concept__text">
          テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。
      テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。
      テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。
        </p>
      </div>
    </div>
  </div>
</div>

.c-top-concept {
  width: 100%;
  position: relative;
  .c-top-concept__gallery-area {
    display: flex;
    justify-content: space-between;
    position: absolute;
    inset: 0;
    height: 100%;
    overflow: hidden;
  }
  .c-top-concept__container {
    position: relative;
    width: 100%;
    padding: 40px 0;
    .c-top-concept__text-area {
      max-width: 520px;
      width: 100%;
      margin: 40px auto;
      display: flex;
      flex-direction: column;
      gap: 20px;
      .c-top-concept__heading {
        font-size: 20px;
        text-align: center;
      }
      .c-top-concept__text {
        font-size: 16px;
        line-height: 1.6;
      }
    }
  }
}
.c-gallery-slider {
  margin-bottom: 40px;
}
.c-gallery-slider__wrap {
  display: flex;
  overflow: hidden;
  gap: 20px;
  &.--vertical {
    flex-direction: column;
  }
}
.c-gallery-slider__list {
  display: flex;
  list-style: none;
  padding: 0;
  gap: 20px;
  &.--vertical {
    flex-direction: column;
  }
}
.c-gallery-slider__list {
  animation: slide 60s infinite linear 0.2s both;
}
.c-gallery-slider__list-2 {
  animation: slide-reverse 60s infinite linear 0.2s both;
}

.c-gallery-slider__item {
  width: calc(100vw / 4);
  &.--small {
    width: calc(100vw / 5);
  }
}
.c-gallery-slider__item > img {
  width: 100%;
  border-radius: 16px;
}


@keyframes slide {
  0% { transform: translateY(0); }
  100% { transform: translateX(-100%); }
}

@keyframes slide-reverse {
  0% { transform: translateY(-100%); }
  100% { transform: translateX(0); }
}

今回のポイントは左右でそれぞれスライダーを設置することです。
使用するアニメーションが異なるため、必ず独自の命名をしましょう。

スライダーを縦方向に動かす際はtranslateYを使用します。これだけなので非常に簡単です。
左右逆方向にスライダーを動かすには@keyframes の0%時と100%時の位置を入れ替えるだけです。
また、display: flexおよびjusify-content:space-betweenposition: absolute にてスライダーの場所を固定します。

あとはテキストエリアを中央に配置することで、セクションの完成です。

おわりに

今回はCSSのみでループスライダーを作成しました。
CSSのみでもパフォーマンスの良いスライダーを実現可能です。
今回紹介した例はどれもシンプルな構成なので、ぜひ作成中のページ等に使用してみてください。