本文へスキップ
  1. Web BENTO JS
  2. カテゴリ一覧
  3. スライダー・ギャラリー
15 / SLIDER 12 パーツ

スライダー・ギャラリーJS実装 12選

コピペで動くスライダー・カルーセル・ギャラリー系パーツのサンプル集です。プレビューは実際に動いています(ドラッグやホバーで操作できるものは、ぜひ触ってみてください)。HTML / CSS / JS タブでコードを確認し、全部コピーを押せば1回の貼り付けで完成します。すべて依存ライブラリなしのバニラJSで、data-bnto-* 属性による自動初期化式です。デモのスライドは権利フリーのCSSグラデーションで描いているので、お手元の画像に差し替えるだけで使えます。

該当するパーツが見つかりませんでした。

1
2
3

ベーシックカルーセル

<!-- .slide を増やすとドットも自動で増えます(実画像なら中身を img に) -->
<div class="bnto-sldr" data-bnto-slider>
  <div class="view">
    <div class="track">
      <div class="slide s1">1</div>
      <div class="slide s2">2</div>
      <div class="slide s3">3</div>
    </div>
  </div>
  <button type="button" class="nav prev" aria-label="前のスライドへ">‹</button>
  <button type="button" class="nav next" aria-label="次のスライドへ">›</button>
  <div class="dots"></div>
</div>
使い方のコツ

スライドを増やすときは .slide のdivを足すだけで、ドットは枚数に合わせて自動生成されます。実際の画像を使う場合は、スライドの中に <img> を入れて width: 100%; height: 100%; object-fit: cover; を指定してください。切替の速さは .tracktransition で調整できます。

1
2
3
一時停止中

自動再生スライダー

<!-- data-interval:切替間隔(ミリ秒) -->
<div class="bnto-auto" data-bnto-autoslider data-interval="2500">
  <div class="view">
    <div class="track">
      <div class="slide s1">1</div>
      <div class="slide s2">2</div>
      <div class="slide s3">3</div>
    </div>
    <span class="pause">一時停止中</span>
  </div>
  <div class="dots" aria-hidden="true"><span class="dot is-on"></span><span class="dot"></span><span class="dot"></span></div>
</div>
使い方のコツ

切替間隔は data-interval(ミリ秒)で指定します。写真をゆっくり見せたいときは 4000〜5000 程度が目安です。ホバーで一時停止するので「読みたいのに流れてしまう」ストレスがありません。ドットの数はスライドの枚数に合わせて増減させてください。

1
2
3

左右にドラッグ / スワイプしてみてください

ドラッグ・スワイプスライダー

<div class="bnto-drag" data-bnto-dragslider>
  <div class="view">
    <div class="track">
      <div class="slide s1">1</div>
      <div class="slide s2">2</div>
      <div class="slide s3">3</div>
    </div>
  </div>
  <p class="hint">左右にドラッグ / スワイプしてみてください</p>
</div>
使い方のコツ

Pointer Events なのでマウス・タッチ・ペンを同じコードで扱えます。切替の判定は「幅の1/4以上動かしたら」です。w / 4 の数字を小さくすると軽いフリックでも切り替わります。縦スクロールを邪魔しないよう touch-action: pan-y を必ずセットで使ってください。

A
B
C
D

サムネイル連動ギャラリー

<!-- .shot と .thumb は同じ順番で並べます -->
<div class="bnto-thumb" data-bnto-thumbgallery>
  <div class="main">
    <div class="shot g1">A</div>
    <div class="shot g2">B</div>
    <div class="shot g3">C</div>
    <div class="shot g4">D</div>
  </div>
  <div class="thumbs">
    <button type="button" class="thumb g1" aria-label="画像Aを表示">A</button>
    <button type="button" class="thumb g2" aria-label="画像Bを表示">B</button>
    <button type="button" class="thumb g3" aria-label="画像Cを表示">C</button>
    <button type="button" class="thumb g4" aria-label="画像Dを表示">D</button>
  </div>
</div>
使い方のコツ

ECサイトの商品画像やカラーバリエーションの切替にそのまま使えます。.shot.thumb同じ順番で並べるのがルールです。実画像を使う場合は、.shot.thumb の中にそれぞれ <img> を入れて object-fit: cover を指定してください。

1
2
3

フェード切替スライダー

<!-- data-interval:切替間隔(ミリ秒)。ドットは自動生成 -->
<div class="bnto-fade" data-bnto-fadeslider data-interval="3000">
  <div class="view">
    <div class="slide s1">1</div>
    <div class="slide s2">2</div>
    <div class="slide s3">3</div>
  </div>
  <div class="dots"></div>
</div>
使い方のコツ

横に流れるスライドより落ち着いた印象になるので、ヒーローエリアのメインビジュアルに向いています。フェードの長さは transition: opacity .8s、表示時間は data-interval で調整します。ドットをクリックするとタイマーが引き直されるので、切替直後にまた変わってしまうことがありません。

After
Before

Before/After比較スライダー

<!-- range を透明にして全面に重ね、ドラッグ操作を受け取る -->
<div class="bnto-ba" data-bnto-beforeafter>
  <div class="frame">
    <div class="img after">After</div>
    <div class="img before">Before</div>
    <div class="bar" aria-hidden="true"><span class="knob">⇔</span></div>
    <input class="rng" type="range" min="0" max="100" value="50" aria-label="比較位置(左右に動かす)">
  </div>
</div>
使い方のコツ

リフォームの施工前後、写真のレタッチ前後、デザインのリニューアル前後などの見せ方にぴったりです。操作の実体が input[type=range] なので、マウスドラッグ・タッチはもちろんキーボードの左右キーでも動かせます。実画像を使うときは .img の背景を background-image にするか、中に <img> を絶対配置してください。2枚の画像は同じサイズで用意するのがきれいに見せるコツです。

1
2
3

無限ループカルーセル

<!-- クローンはJSが自動で作るので、書くのは本物のスライドだけ -->
<div class="bnto-loop" data-bnto-loopslider>
  <div class="view">
    <div class="track">
      <div class="slide s1">1</div>
      <div class="slide s2">2</div>
      <div class="slide s3">3</div>
    </div>
  </div>
  <button type="button" class="nav prev" aria-label="前のスライドへ">‹</button>
  <button type="button" class="nav next" aria-label="次のスライドへ">›</button>
</div>
使い方のコツ

最後のスライドの次に最初のスライドが「同じ方向から」流れてくる、ライブラリでおなじみの動きです。仕組みは、両端にクローンを1枚ずつ足しておき、クローンに着いた瞬間(transitionend)にアニメなしで本物の位置へ瞬間移動しているだけです。スライドを増やしてもクローン生成は自動なので、HTMLに書くのは本物だけで大丈夫です。

1
2
3

プログレスバー付きスライダー

<!-- data-interval:1枚あたりの表示時間(ミリ秒) -->
<div class="bnto-prog" data-bnto-progressslider data-interval="3200">
  <div class="view">
    <div class="track">
      <div class="slide s1">1</div>
      <div class="slide s2">2</div>
      <div class="slide s3">3</div>
    </div>
  </div>
  <div class="bar" aria-hidden="true"><i></i></div>
</div>
使い方のコツ

「あとどれくらいで次に切り替わるか」が見えるので、自動再生でもユーザーが安心して眺められます。表示時間は data-interval(ミリ秒)で調整してください。進捗の描画は requestAnimationFrame なので、非表示タブでは自動的に止まり無駄な処理が発生しません。バーをスライドの上に重ねたいときは .bar を絶対配置に変えるだけです。

PHOTO

画像の上でマウスを動かしてみてください

ホバールーペ(部分拡大)

<!-- data-zoom:拡大率。lens の中には同じ内容の複製を入れる -->
<div class="bnto-zoom" data-bnto-zoomlens data-zoom="2.5">
  <div class="pic">PHOTO</div>
  <div class="lens" aria-hidden="true"><div class="pic">PHOTO</div></div>
  <p class="hint">画像の上でマウスを動かしてみてください</p>
</div>
使い方のコツ

ECサイトの商品画像で「生地の質感を見せたい」ときの定番です。拡大率は data-zoom、レンズの大きさはCSSの width / height で調整します。実画像で使う場合は、.pic を2つとも background-image: url(同じ画像) にするか、中に同じ <img> を入れてください(レンズ内の複製はJSが自動で拡大位置を合わせます)。タッチ端末ではピンチ拡大が使えるため、ホバー前提のこのUIは補助として考えるのがおすすめです。

1
2
3

縦スライダー

<!-- 上下ボタンで縦方向に送るスライダー(実画像なら中身を img に) -->
<div class="bnto-vsldr" data-bnto-vslider>
  <div class="view">
    <div class="track">
      <div class="slide s1">1</div>
      <div class="slide s2">2</div>
      <div class="slide s3">3</div>
    </div>
  </div>
  <button type="button" class="nav up" aria-label="前のスライドへ">↑</button>
  <button type="button" class="nav down" aria-label="次のスライドへ">↓</button>
</div>
使い方のコツ

横スライダーとの違いは flex-direction: columntranslateY() だけです。.viewheight がスライド1枚の高さになるので、スライドの高さと必ずそろえてください。縦に送る動きは、キャッチコピーを1行ずつ見せたいヒーローや、実績数値のローテーション表示に向いています。

1
2
3
4

中央拡大カルーセル

<!-- 中央のスライドが大きく、両脇が小さく見えるカルーセル -->
<div class="bnto-center" data-bnto-centerslider>
  <div class="view">
    <div class="track">
      <div class="slide s1">1</div>
      <div class="slide s2">2</div>
      <div class="slide s3">3</div>
      <div class="slide s4">4</div>
    </div>
  </div>
  <button type="button" class="nav prev" aria-label="前のスライドへ">‹</button>
  <button type="button" class="nav next" aria-label="次のスライドへ">›</button>
</div>
使い方のコツ

中央のスライドが大きく、両脇がのぞく「coverflow風」の見せ方です。1枚の幅はCSSの flex: 0 0 62% で決まり、ずらす量はスライドの実寸から自動計算するので、枚数を増やしても調整不要です。脇のスライドをクリックするとその1枚が中央へ来ます。おすすめ商品や導入事例を、主役を強調しながら見せたいときに向いています。

1
2
3

ストーリー風スライダー

<!-- data-interval:1枚あたりの表示時間(ミリ秒)。.bars はJSが自動生成 -->
<div class="bnto-story" data-bnto-storyslider data-interval="3000">
  <div class="bars" aria-hidden="true"></div>
  <div class="view">
    <div class="slide s1 is-show">1</div>
    <div class="slide s2">2</div>
    <div class="slide s3">3</div>
  </div>
</div>
使い方のコツ

SNSのストーリーでおなじみの、上部に分割バーが並ぶUIです。1枚あたりの表示時間は data-interval(ミリ秒)で調整します。バーの伸びはCSSアニメーションに任せ、伸びきった瞬間(animationend)に次へ送っています。クリック(タップ)でも手動で先へ進められます。キャンペーンの手順紹介や、短いお知らせを順番に見せたいときに向いています。

スライダー・ギャラリーJSの基礎知識

スライダー(カルーセル)は、限られたスペースで複数の画像やコンテンツを見せられる定番のUIです。このページのサンプルはすべて依存ライブラリなしのバニラJavaScriptで、SwiperやSlick、jQueryプラグインは一切不要です。デモのスライドは権利フリーのCSSグラデーションで描いた見本なので、そのまま試してから、お手元の画像に差し替えて使えます。

使い方は、HTML / CSS / JSの3タブをそれぞれ貼り付けるか、「全部コピー」ボタンでひとまとめになったコードを1回貼り付けるだけです。切替間隔や拡大率は data-interval / data-zoom などの属性で指定します。初期化は data-bnto-* 属性の自動検出式なので、同じページに何個置いても、うっかりコードを2回貼っても壊れません。

ライブラリを使わず自作する利点

Swiperのような高機能ライブラリは便利な一方、読み込むファイルだけで数十〜数百KBあり、実際に使う機能はごく一部ということが少なくありません。数枚のスライドを送るだけなら、このページのような数十行のバニラJSで十分です。表示が軽くなるのはもちろん、ライブラリのバージョンアップや仕様変更に振り回されない、コードを読めば動きをすべて把握できる、という保守面の利点もあります。反対に、レスポンシブで表示枚数を細かく変えたい、数百枚を仮想化して表示したい、といった要件が出てきたらライブラリの採用を検討するとよいバランスです。

スライドは transform で動かすのが軽さのコツ

スライドの移動は leftmargin ではなく transform: translateX() で行うのが鉄則です。transform はレイアウトの再計算(リフロー)を起こさずGPUで合成されるため、画像サイズが大きくてもなめらかに動きます。このページではBefore/After比較の境界も clip-path、プログレスバーも scaleX() と、描画コストの低いプロパティだけでアニメーションさせています。

Pointer Events でマウスもタッチも1本化

スワイプ対応というと touchstartmousedown を並べて書く方法を思い浮かべるかもしれませんが、現在は pointerdown / pointermove / pointerupPointer Events に一本化するのがすっきりします。マウス・タッチ・ペンのすべてで同じイベントが発火し、setPointerCapture() を使えば枠の外までドラッグしても追跡が途切れません。あわせてCSSの touch-action: pan-y を指定しておくと、縦スクロールを邪魔せずに横スワイプだけを扱えます。

スライダーのアクセシビリティ

操作ボタンは必ず button 要素で作り、矢印やドットのような見た目だけのボタンには aria-label で「前のスライドへ」などの説明を付けます。こうしておくとTabキーで移動してEnterで操作でき、スクリーンリーダーにも意味が伝わります。自動再生は「読みたいのに流れてしまう」の原因になりやすいため、当サービスのサンプルはホバーで一時停止する作りにしています。Before/After比較は input[type=range] ベースなので、キーボードの左右キーでも動かせます。

「全部コピー」と「分けて貼る」の使い分け

「全部コピー」を使うと、HTML・CSS・JavaScriptがひとつの自己完結ブロックとしてコピーされるので、1回の貼り付けだけですぐ動きを確認できます。動作のお試しや、1ページ完結のLPに組み込むときはこの方法が手軽です。

一方、本番サイトへ本格的に組み込む場合は、CSSはスタイルシート(.cssファイル)へ、JavaScriptは</body>直前や共通の.jsファイルへ、HTMLは使いたい場所へと分けて貼るのが一般的です。スタイルとスクリプトを1か所に集約できるため、複数ページ・複数パーツで使い回すときの管理がしやすく、ブラウザのキャッシュも効きやすくなります。なお、同じパーツをページ内で何度も使う場合でも、CSSとJSを貼るのは1回だけで大丈夫です(初期化スクリプトが該当要素すべてに自動で効きます)。

よくある質問

Swiperなどのライブラリなしでも大丈夫ですか?
数枚のスライドを送る用途であれば、このページのようなバニラJavaScriptで十分です。ライブラリの読み込み(数十〜数百KB)が不要になるため表示が軽く、バージョンアップへの追従作業も発生しません。多数のブレークポイント設定や仮想スライドが必要な大規模用途では、ライブラリの採用も検討してください。
スマホのスワイプ操作に対応できますか?
対応できます。ドラッグ・スワイプスライダーは Pointer Events(pointerdown / pointermove / pointerup)で実装しているため、マウス・タッチ・ペンを同じコードで扱えます。タッチ専用の処理を別に書き分ける必要はありません。
デモの色付きスライドを画像に差し替えるには?
スライドのdiv(CSSグラデーション)の中に img タグを入れるか、divごと img に置き換えるだけです。CSSで width: 100%height: 100%object-fit: cover を指定すると、枠にぴったり収まります。
自動再生はアクセシビリティ的に問題ありませんか?
動き続けるコンテンツは読みにくさの原因になるため、当サービスのサンプルはマウスをのせている間は一時停止する作りにしています。切替間隔も data-interval 属性で調整でき、3〜5秒程度のゆったりした設定をおすすめします。
このページのパーツはAIコーディングツールでも使えますか?
はい。Claude CodeやCursorのようにWebページを読めるAIには、このページのURLとパーツ名(例:「自動再生スライダー」)を伝えるだけで実装を指示できます。AIがWebを読めない場合は、「全部コピー」で取得した自己完結ブロックをチャットに貼り付けて調整を頼むのが確実です。改変後のコードは、公開前に動作確認することをおすすめします。

関連カテゴリ

スライダー・ギャラリーと組み合わせて使いやすいパーツはこちらです。