コンテンツへスキップ
反応する CSSのみ 定番

横スワイプでぴたりと止まる

scroll-snap

横に並べた写真を、1枚ずつ止めながら見せる。指を離した位置ではなく、決めた位置で止まる。

AIへの頼み方

写真を横に並べたカルーセルを、JavaScript なしで1枚ずつぴたりと止まるようにしてください。親に scroll-snap-type: x mandatory、子に scroll-snap-align を指定してください。次の1枚が少し見える幅にして、横に動くと分かるようにしてください。

動くデモ

この項目のデモは自動では動きません。操作して確かめてください。

全画面で見る ↗

最小コード

CSS
/* 親:横スクロールできる箱にして、止め方を決める */
.track {
  display: flex;
  gap: 10px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;   /* 横方向に、必ずどれかで止める */
}

/* 子:どこで止まるか */
.slide {
  flex: 0 0 78%;                   /* 次の1枚が少し見える幅にすると「横に動く」と伝わる */
  scroll-snap-align: center;       /* 中央で止める(start / end も選べる)*/
  scroll-snap-stop: always;        /* 勢いで飛ばさず1枚ずつ止める */
}

/* proximity にすると「近ければ止まる」ゆるい挙動になる。
   縦方向のページ送りなら scroll-snap-type: y mandatory。*/

対応状況

定番 2026年08月時点で確認

Baseline widely available(newly 2020-01-15 / widely 2022-07-15)。

実案件でそのまま使える。ライブラリを入れる前にまずこれを試す。

対応状況は自動更新していません。確認日より後の変化はこのページに反映されていない場合があります。

使いどころ/避けどころ

写真の並び、事例の紹介、料金プランの比較など、横に並べて1つずつ見せたいものに向く。カルーセル用のライブラリを入れなくても、CSS の2行でそれらしく動く。指で払ったときの慣性や、端末ごとの操作感はブラウザに任せられる。

コツは次の1枚を少しだけ見せること。1枚が画面いっぱいだと、横に動かせること自体に気づかれない。8割くらいの幅にして、右端に次が覗いている状態にする。

避けたいのは、縦に読ませたい内容を横に並べること。横スクロールは「見比べる」動きであって「読み進める」動きではない。文章は縦に置く。

矢印ボタンを省かないのも大事になる。指で払える端末ではいいが、マウスだけの環境では横に動かせることに気づきにくい。ボタンを添えるなら scrollBy を呼ぶだけで済む。

mandatory は必ずどこかで止まるので迷いがないが、要素の高さがばらばらだと引っかかった感じになる。ゆるくしたいときは proximity にする。

止まる位置を細かく決めたいときは、親の余白(scroll-padding)も合わせて調整する。左端に少し余白を残すと、止まったときの見た目が落ち着く。

関連項目

← 実装辞典の一覧へ