CSS-свойство `scroll-snap-type`
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и во многих версиях браузеров. Она доступна во всех браузерах с января 2020 года.
CSS-свойство scroll-snap-type задаётся для контейнера прокрутки, включая режим привязки прокрутки и определяя направление и строгость фиксации точек привязки в пределах области привязки.
Попробуйте
scroll-snap-type: none;
scroll-snap-type: x mandatory;
scroll-snap-type: x proximity;
<section class="default-example" id="default-example">
<div id="example-element">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
<div class="info">Scroll »</div>
</section>
.default-example {
flex-wrap: wrap;
}
.default-example .info {
width: 100%;
padding: 0.5em 0;
font-size: 90%;
}
#example-element {
text-align: left;
width: 250px;
height: 250px;
overflow-x: scroll;
display: flex;
box-sizing: border-box;
border: 1px solid black;
}
#example-element > div {
flex: 0 0 250px;
width: 250px;
background-color: rebeccapurple;
color: white;
font-size: 30px;
display: flex;
align-items: center;
justify-content: center;
scroll-snap-align: start;
}
#example-element > div:nth-child(even) {
background-color: white;
color: rebeccapurple;
}
Если содержимое области прокрутки изменяется — например, если содержимое добавляется, перемещается, удаляется или меняет размер, — контейнер прокрутки повторно привяжется к ранее привязанному содержимому, если оно всё ещё присутствует.
Если значение свойства, связанного с привязкой прокрутки, например scroll-snap-type или scroll-margin, изменяется, контейнер прокрутки повторно привяжется на основе текущего значения scroll-snap-type.
Это свойство не определяет конкретные анимации или физические параметры, используемые для фиксации этих точек привязки, а оставляет их выбор пользовательскому агенту.
Синтаксис
/* No snapping */ scroll-snap-type: none; /* Keyword values for snap axes */ scroll-snap-type: x; scroll-snap-type: y; scroll-snap-type: block; scroll-snap-type: inline; scroll-snap-type: both; /* Optional keyword values for snap strictness */ /* mandatory | proximity */ scroll-snap-type: x mandatory; scroll-snap-type: y proximity; scroll-snap-type: both mandatory; /* Global values */ scroll-snap-type: inherit; scroll-snap-type: initial; scroll-snap-type: revert; scroll-snap-type: revert-layer; scroll-snap-type: unset;
Значения
Для этого свойства задаётся одно или два из следующих ключевых слов:
-
none - При прокрутке визуальной области просмотра этого контейнера прокрутки точки привязки должны игнорироваться.
-
x - Контейнер прокрутки привязывается к позициям привязки только по горизонтальной оси.
-
y - Контейнер прокрутки привязывается к позициям привязки только по вертикальной оси.
-
block - Контейнер прокрутки привязывается к позициям привязки только по блочной оси.
-
inline - Контейнер прокрутки привязывается к позициям привязки только по строчной оси.
-
both - Контейнер прокрутки независимо привязывается к позициям привязки по обеим осям (при этом по каждой оси потенциально могут быть выбраны разные элементы).
-
mandatory - Визуальная область просмотра этого контейнера прокрутки должна привязаться к позиции привязки, если в данный момент прокрутка не выполняется.
-
proximity - Визуальная область просмотра этого контейнера прокрутки может привязаться к позиции привязки, если в данный момент прокрутка не выполняется. Пользовательский агент решает, выполнять ли привязку, исходя из параметров прокрутки. Это строгость привязки по умолчанию, если указана любая ось привязки.
Формальное определение
| Начальное значение | none |
|---|---|
| Применяется к | всем элементам |
| Наследуется | нет |
| Вычисленное значение | как задано |
| Тип анимации | дискретный |
Формальный синтаксис
scroll-snap-type =
none |
[ x | y | block | inline | both ] [ mandatory | proximity ]?
Примеры
Привязка по разным осям
HTML
<main>
<section class="x mandatory-scroll-snapping" dir="ltr">
<div>X Mand. LTR</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</section>
<section class="x proximity-scroll-snapping" dir="ltr">
<div>X Prox. LTR</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</section>
<section class="y mandatory-scroll-snapping" dir="ltr">
<div>Y Mand. LTR</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</section>
<section class="y proximity-scroll-snapping" dir="ltr">
<div>Y Prox. LTR</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</section>
<section class="x mandatory-scroll-snapping" dir="rtl">
<div>X Mand. RTL</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</section>
<section class="x proximity-scroll-snapping" dir="rtl">
<div>X Prox. RTL</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</section>
<section class="y mandatory-scroll-snapping" dir="rtl">
<div>Y Mand. RTL</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</section>
<section class="y proximity-scroll-snapping" dir="rtl">
<div>Y Prox. RTL</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</section>
</main>
CSS
main {
display: flex;
align-items: center;
justify-content: space-between;
flex-flow: column nowrap;
font-family: monospace;
}
section {
display: flex;
margin: 1em auto;
outline: 1px dashed lightgray;
flex: none;
overflow: auto;
}
.x {
width: 100%;
height: 128px;
flex-flow: row nowrap;
overflow-y: hidden;
}
.y {
width: 256px;
height: 256px;
flex-flow: column nowrap;
overflow-x: hidden;
}
/* scroll-snap */
.x.mandatory-scroll-snapping {
scroll-snap-type: x mandatory;
}
.x.proximity-scroll-snapping {
scroll-snap-type: x proximity;
}
.y.mandatory-scroll-snapping {
scroll-snap-type: y mandatory;
}
.y.proximity-scroll-snapping {
scroll-snap-type: y proximity;
}
div {
text-align: center;
scroll-snap-align: center;
flex: none;
}
.x div {
line-height: 128px;
font-size: 64px;
width: 100%;
height: 128px;
}
.y div {
line-height: 256px;
font-size: 128px;
width: 256px;
height: 100%;
}
/* appearance fixes */
.y div:first-child {
line-height: 1.3;
font-size: 64px;
}
/* coloration */
div:nth-child(even) {
background-color: #87ea87;
}
div:nth-child(odd) {
background-color: #87ccea;
}
Результаты
Спецификации
| Спецификация |
|---|
| Модуль CSS Scroll Snap уровня 1 # scroll-snap-type |
Совместимость с браузерами
| Настольные ПК | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome для Android | Firefox для Android | Opera для Android | Safari для iOS | Samsung Internet | WebView для Android | WebView для iOS | |
scroll-snap-type |
69 |
79
12–79Edge поддерживает более ранний черновой вариант CSS Scroll Snap без значений осей. |
99
68–99В macOS Monterey привязка прокрутки завершается ненадёжно. См. ошибку 1749352.39–68Более ранний черновой вариант CSS Scroll Snap без значений осей. |
56 |
11
9Старые версии Safari поддерживают более ранний черновой вариант CSS Scroll Snap без значений осей. |
69 |
68
39–68Более ранний черновой вариант CSS Scroll Snap без значений осей. |
48 |
11
9Старые версии Safari для iOS поддерживают более ранний черновой вариант CSS Scroll Snap без значений осей. |
10.0 |
69 |
11
9Старые версии WebView для iOS поддерживают более ранний черновой вариант CSS Scroll Snap без значений осей. |
block |
69 |
79 |
68 |
56 |
11 |
69 |
68 |
48 |
11 |
10.0 |
69 |
11 |
both |
69 |
79 |
68 |
56 |
11 |
69 |
68 |
48 |
11 |
10.0 |
69 |
11 |
inline |
69 |
79 |
68 |
56 |
11 |
69 |
68 |
48 |
11 |
10.0 |
69 |
11 |
none |
69 |
79 |
39 |
56 |
11 |
69 |
39 |
48 |
11 |
10.0 |
69 |
11 |
x |
69 |
79 |
68 |
56 |
11 |
69 |
68 |
48 |
11 |
10.0 |
69 |
11 |
y |
69 |
79 |
68 |
56 |
11 |
69 |
68 |
48 |
11 |
10.0 |
69 |
11 |
См. также
- Другие свойства области прокрутки:
scroll-margin,scroll-padding - Свойства дочерних элементов прокрутки:
scroll-snap-align,scroll-margin,scroll-snap-stop - Основные понятия привязки прокрутки CSS
- Использование событий привязки прокрутки
- Модуль CSS Scroll Snap
- Управляемая прокрутка с помощью CSS Scroll Snap на web.dev (2018)
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/scroll-snap-type