scroll-snap-type
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since апÑÐµÐ»Ñ 2022 г..
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: #fff;
font-size: 30px;
display: flex;
align-items: center;
justify-content: center;
scroll-snap-align: start;
}
#example-element > div:nth-child(even) {
background-color: #fff;
color: rebeccapurple;
}
ÐÑо ÑвойÑÑво не ÑÑоÑнÑÐµÑ ÐºÐ°ÐºÐ¸Ðµ именно анимаÑии иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ð¿ÑивÑзки пÑокÑÑÑки, ÑÑо оÑÑаÑÑÑÑ Ð·Ð° агенÑом полÑзоваÑелÑ.
/* ÐлÑÑевÑе Ñлова */
scroll-snap-type: none;
scroll-snap-type: x;
scroll-snap-type: y;
scroll-snap-type: block;
scroll-snap-type: inline;
scroll-snap-type: both;
/* ÐпÑионалÑно mandatory | proximity*/
scroll-snap-type: x mandatory;
scroll-snap-type: y proximity;
scroll-snap-type: both mandatory;
/* и Ñ.д. */
/* ÐлобалÑнÑе знаÑÐµÐ½Ð¸Ñ */
scroll-snap-type: inherit;
scroll-snap-type: initial;
scroll-snap-type: unset;
| ÐаÑалÑное знаÑение | none |
|---|---|
| ÐÑименÑеÑÑÑ Ðº | вÑе ÑлеменÑÑ |
| ÐаÑледÑеÑÑÑ | Ð½ÐµÑ |
| ÐбÑабоÑка знаÑÐµÐ½Ð¸Ñ | как Ñказано |
| Animation type | discrete |
СинÑакÑиÑ
>ÐнаÑениÑ
none-
Ðогда визÑалÑнÑй viewport ÑÑого конÑейнеÑа пÑокÑÑÑиваеÑÑÑ, ÑоÑки пÑокÑÑÑки игноÑиÑÑÑÑÑÑ.
x-
ÐÑокÑÑÑка конÑейнеÑа пÑивÑзÑваеÑÑÑ ÑолÑко по гоÑизонÑалÑной оÑи.
y-
ÐÑокÑÑÑка конÑейнеÑа пÑивÑзÑваеÑÑÑ ÑолÑко по веÑÑикалÑной оÑи.
block-
ÐÑокÑÑÑка конÑейнеÑа пÑивÑзÑваеÑÑÑ ÑолÑко по блоковой оÑи.
inline-
ÐÑокÑÑÑка конÑейнеÑа пÑивÑзÑваеÑÑÑ ÑолÑко по ÑÑÑоÑной оÑи.
both-
ÐÑокÑÑÑка конÑейнеÑа незавиÑимо пÑивÑзÑваеÑÑÑ ÑолÑко по обоим оÑÑм (поÑенÑиалÑно Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивÑзÑваÑÑÑÑ Ðº ÑазнÑм ÑлеменÑам на ÑазнÑÑ Ð¾ÑÑÑ ).
mandatory-
ÐизÑалÑнÑй viewport конÑейнеÑа оÑÑаÑÑÑÑ Ð½Ð° ÑоÑке пÑивÑзки, еÑли он в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ðµ пÑокÑÑÑиваеÑÑÑ. То еÑÑÑ Ð¾Ð½ пÑивÑзÑваеÑÑÑ Ðº ÑоÑке, когда пÑокÑÑÑивание завеÑÑилоÑÑ. ÐÑли конÑÐµÐ½Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½, пеÑемеÑÑн, ÑдалÑн или еÑли изменÑн его ÑазмеÑ, пÑокÑÑÑка бÑÐ´ÐµÑ Ð¾ÑÑегÑлиÑована Ñак, ÑÑÐ¾Ð±Ñ Ð¾ÑÑаваÑÑÑÑ Ð½Ð° ÑÑой же ÑоÑке.
proximity-
ÐизÑалÑнÑй viewport конÑейнеÑа Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑаваÑÑÑÑ Ð½Ð° ÑоÑке пÑивÑзки, еÑли он в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ðµ пÑокÑÑÑиваеÑÑÑ, в завиÑимоÑÑи Ð¾Ñ Ð¿Ð°ÑамеÑÑов полÑзоваÑелÑÑкого агенÑа. ÐÑли конÑÐµÐ½Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½, пеÑемеÑÑн, ÑдалÑн или еÑли изменÑн его ÑазмеÑ, пÑокÑÑÑка Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾ÑÑегÑлиÑована Ñак, ÑÑÐ¾Ð±Ñ Ð¾ÑÑаваÑÑÑÑ Ð½Ð° ÑÑой же ÑоÑке.
ФоÑмалÑнÑй ÑинÑакÑиÑ
scroll-snap-type =
none |
[ x | y | block | inline | both | pair ] [ mandatory | proximity ]?
ÐÑимеÑ
>HTML
<div class="holster">
<div class="container x mandatory-scroll-snapping" dir="ltr">
<div>X Mand. LTR</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</div>
<div class="container x proximity-scroll-snapping" dir="ltr">
<div>X Prox. LTR</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</div>
<div class="container y mandatory-scroll-snapping" dir="ltr">
<div>Y Mand. LTR</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</div>
<div class="container y proximity-scroll-snapping" dir="ltr">
<div>Y Prox. LTR</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</div>
<div class="container x mandatory-scroll-snapping" dir="rtl">
<div>X Mand. RTL</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</div>
<div class="container x proximity-scroll-snapping" dir="rtl">
<div>X Prox. RTL</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</div>
<div class="container y mandatory-scroll-snapping" dir="rtl">
<div>Y Mand. RTL</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</div>
<div class="container y proximity-scroll-snapping" dir="rtl">
<div>Y Prox. RTL</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</div>
</div>
CSS
/* setup */
html,
body,
.holster {
height: 100%;
}
.holster {
display: flex;
align-items: center;
justify-content: space-between;
flex-flow: column nowrap;
font-family: monospace;
}
.container {
display: flex;
overflow: auto;
outline: 1px dashed lightgray;
flex: none;
}
.container.x {
width: 100%;
height: 128px;
flex-flow: row nowrap;
}
.container.y {
width: 256px;
height: 256px;
flex-flow: column nowrap;
}
/* scroll-snap */
.x.mandatory-scroll-snapping {
scroll-snap-type: x mandatory;
}
.y.mandatory-scroll-snapping {
scroll-snap-type: y mandatory;
}
.x.proximity-scroll-snapping {
scroll-snap-type: x proximity;
}
.y.proximity-scroll-snapping {
scroll-snap-type: y proximity;
}
.container > div {
text-align: center;
scroll-snap-align: center;
flex: none;
}
.x.container > div {
line-height: 128px;
font-size: 64px;
width: 100%;
height: 128px;
}
.y.container > div {
line-height: 256px;
font-size: 128px;
width: 256px;
height: 100%;
}
/* appearance fixes */
.y.container > div:first-child {
line-height: 1.3;
font-size: 64px;
}
/* coloration */
.container > div:nth-child(even) {
background-color: #87ea87;
}
.container > div:nth-child(odd) {
background-color: #87ccea;
}
РезÑлÑÑаÑ
СпеÑиÑикаÑии
| Specification |
|---|
| CSS Scroll Snap Module Level 1 > # scroll-snap-type > |