Spec-Zone.ru › CSS

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API