CSS scroll snap と ::scroll-button()
横スクロールSample
概要
- `::scroll-button()` `::scroll-marker` `::scroll-marker-group` `scroll-state()` は CSS の新しい機能
- 2026年05月27日現在、対応しているのはChrome 135以降とEdgeだけ
- 現在表示中のアイテムに対応するマーカーが赤く塗りつぶされ、マーカーをクリックすると該当位置までスナップスクロールするサンプル
- Container Scroll-State Queries により、左方向にスクロール可能なときだけ◀ボタン、右方向にスクロール可能なときだけ▶ボタンが表示されるサンプル
コード
HTML
<div class="container">
<div class="content">1</div>
<div class="content">2</div>
<div class="content">3</div>
<div class="content">4</div>
<div class="content">5</div>
<div class="content">6</div>
<div class="content">7</div>
</div>
CSS
.container {
overflow-x: scroll;
width: 480px;
height: 120px;
border: 1px solid black;
display: flex;
align-items: center;
gap: 16px;
padding: 16px;
box-sizing: border-box;
/* Scroll Snap Events(横方向) */
scroll-snap-type: x mandatory;
/* Container Scroll-State Queries */
container-type: scroll-state;
/* Scroll Marker Group */
scroll-marker-group: after;
&::scroll-marker-group {
display: flex;
gap: 8px;
margin-top: 8px;
justify-content: center;
position: absolute;
}
/* スクロールボタン本体(初期は非表示) */
&::scroll-button(left) {
content: "◀";
opacity: 0;
transition: opacity 0.2s;
}
&::scroll-button(right) {
content: "▶";
opacity: 0;
transition: opacity 0.2s;
}
/* 左方向にスクロール可能なときだけ左ボタンを表示 */
@container scroll-state(scrollable: left) {
&::scroll-button(left) {
opacity: 1;
}
}
/* 右方向にスクロール可能なときだけ右ボタンを表示 */
@container scroll-state(scrollable: right) {
&::scroll-button(right) {
opacity: 1;
}
}
/* スクロールボタン共通スタイル */
&::scroll-button(*) {
background-color: #000;
color: #fff;
border-radius: 100%;
display: inline-flex;
justify-content: center;
align-items: center;
width: 24px;
height: 24px;
margin: 4px;
}
}
.content {
width: 240px;
height: 80px;
min-width: 240px;
min-height: 80px;
border: 2px solid red;
display: inline-flex;
justify-content: center;
align-items: center;
font-weight: bold;
font-size: 20px;
background: #ffebee;
/* Scroll Snap */
scroll-snap-align: center;
/* Scroll Marker(各アイテムに対応する点) */
&::scroll-marker {
display: block;
content: "";
width: 16px;
height: 16px;
border: 1px solid red;
border-radius: 100%;
cursor: pointer;
}
/* 現在表示中のアイテムに対応するマーカーをハイライト */
&::scroll-marker:target-current {
border: 1px solid red;
background-color: red;
}
}