Webサイトで企業ロゴやメディア掲載ロゴを表示したいとき、
「ロゴが途中で途切れる」「2段目は逆方向に流したい」「スマホやSafariで潰れる」などの悩みに直面することがあります。
今回の記事では、CSSだけで完結する2段ロゴスライダー の作り方を解説します。
実際に私が制作中につまづいた点も踏まえ、「なぜこうするか」を丁寧に説明します。
目次
1. 制作のポイントとつまづきポイント
ポイント
- 2段目は逆方向に流す
- 途切れずループする
- ロゴ縦横比を維持して潰れないようにする
- Safariやスマホ対応
実際にハマったこと
- 2段目だけロゴが途切れる
- 原因:アニメーションの translateX が逆方向の設定で、1セット分の幅しかなかった
- 対策:ロゴリストを 2セット並べてループ させ、アニメーション範囲を50%に設定
 
- ロゴの高さが揃わない / 潰れる
- 原因:画像の縦横比が異なるため、height と width の指定だけでは崩れる
- 対策:object-fit: contain; display: block; を指定し、縦揃えと潰れ防止
 
- Safariで潰れる
- 原因:flexboxの縮小やoverflowの扱い
- 対策:min-width: max-content; flex-shrink: 0; を使い、flexアイテムが勝手に縮まないように設定
 
原因:flexboxの縮小やoverflowの扱い
<div class="media">
  <h4 class="media_title">
    Example <span class="badge">Sample Logos</span>
  </h4>
  <div class="media_wrap">
    <!-- 1段目 左方向 -->
    <div class="media_list_wrap">
      <div class="media_slider">
        <ul class="media_list">
          <li><img src="images/logo1.png" alt="Logo 1"></li>
          <li><img src="images/logo2.png" alt="Logo 2"></li>
          <li><img src="images/logo3.png" alt="Logo 3"></li>
          <li><img src="images/logo4.png" alt="Logo 4"></li>
          <li><img src="images/logo5.png" alt="Logo 5"></li>
          <!-- ループ用にもう1セット -->
          <li><img src="images/logo1.png" alt="Logo 1"></li>
          <li><img src="images/logo2.png" alt="Logo 2"></li>
          <li><img src="images/logo3.png" alt="Logo 3"></li>
          <li><img src="images/logo4.png" alt="Logo 4"></li>
          <li><img src="images/logo5.png" alt="Logo 5"></li>
        </ul>
      </div>
    </div>
    <!-- 2段目 右方向 -->
    <div class="media_list_wrap reverse">
      <div class="media_slider">
        <ul class="media_list">
          <li><img src="images/logo6.png" alt="Logo 6"></li>
          <li><img src="images/logo7.png" alt="Logo 7"></li>
          <li><img src="images/logo8.png" alt="Logo 8"></li>
          <li><img src="images/logo9.png" alt="Logo 9"></li>
          <li><img src="images/logo10.png" alt="Logo 10"></li>
          <!-- ループ用にもう1セット -->
          <li><img src="images/logo6.png" alt="Logo 6"></li>
          <li><img src="images/logo7.png" alt="Logo 7"></li>
          <li><img src="images/logo8.png" alt="Logo 8"></li>
          <li><img src="images/logo9.png" alt="Logo 9"></li>
          <li><img src="images/logo10.png" alt="Logo 10"></li>
        </ul>
      </div>
    </div>
  </div>
</div>
CSS例(汎用版)
.media {
  background-color: #fff;
  padding: 1rem 0;
  text-align: center;
}
.media_title {
  font-size: 1.6rem;
  font-weight: bold;
  margin-bottom: 1rem;
  color: #333;
}
.media_title .badge {
  background: #007BFF;
  color: #fff;
  border-radius: 50px;
  padding: 0.2rem 0.8rem;
  margin-left: 0.4rem;
  font-size: 1.4rem;
}
.media_wrap {
  overflow: hidden;
}
.media_list_wrap {
  display: flex;
  white-space: nowrap;
  margin: 0.6rem 0;
  position: relative;
}
.media_list_wrap.reverse .media_slider .media_list {
  animation-name: scroll-right;
}
.media_slider {
  display: flex;
}
.media_list {
  display: flex;
  align-items: center;
  flex-shrink: 0;
  min-width: max-content;
  animation: scroll-left 15s linear infinite;
}
.media_list_wrap.reverse .media_list {
  animation: scroll-right 15s linear infinite;
}
.media_list li {
  flex: 0 0 auto;
  margin: 0 0.5rem;
}
.media_list li img {
  height: 50px;
  width: auto;
  object-fit: contain;
  display: block;
}
@keyframes scroll-left {
  0% { transform: translateX(0); }
  100% { transform: translateX(-50%); }
}
@keyframes scroll-right {
  0% { transform: translateX(-50%); }
  100% { transform: translateX(0); }
}
@media (max-width: 768px) {
  .media_list li img { height: 35px; }
  .media_list, .media_list_wrap.reverse .media_list {
    animation-duration: 25s;
  }
  .media_title { font-size: 1.4rem; }
  .media_title .badge {
    font-size: 1.2rem;
    padding: 0.2rem 0.6rem;
  }
}. まとめ
- 2段目逆方向でも途切れないように ロゴ2セットでループ
- ロゴの縦横比は object-fit:contain で維持
- Safariやスマホでも潰れない
- タイトルはテキストで装飾しSEOフレンドリー
- 誰でも使える汎用例として再現可能
💡 ポイント
- アニメーション距離はロゴリストの2セット分で調整
- flex-shrinkを0にして潰れ防止
- 逆方向スクロールは translateX(-50%) → 0 で自然に


 
    
コメント