CSS - scroll-snap-type Property
CSS scroll-snap-type property specifies how the scroll container snaps to snap positions.
To use the scroll-snap-type property, you need to set it on the scroll container. You also need to set the scroll-snap-align property on the elements that you want to snap into place.
Possible Values
-
none − The scroll container will not snap to any positions.
-
x − This value is used for horizontal scrolling.
-
y − This value is used for vertical scrolling.
-
block − This makes the scroll container stop at the nearest snap point on the block axis.
-
inline − This makes the scroll container stop at the nearest snap point on the inline axis.
-
both − It specify that scrolling should snap both horizontally and vertically within a scroll container.
-
mandatory − The scroll container should snap to the nearest snap point, making it mandatory for the user to scroll to a specific position.
-
proximity − The scroll container should snap to the nearest snap point based on proximity.
Applies to
All the HTML elements.
DOM Syntax
object.style.scrollSnapType = "none|x|y|block|inline|both|mandatory|proximity";
CSS Scroll Snap Type - None Value
The following example demostrate the use of scroll-snap-type: none property −
<html>
<head>
<style>
.scroll-container {
display: flex;
width: 350px;
height: 200px;
overflow-x: scroll;
overflow-y: hidden;
white-space: nowrap;
scroll-snap-type: none;
}
.scrolling-section1,
.scrolling-section2,
.scrolling-section3 {
flex: 0 0 auto;
width: 320px;
height: 200px;
scroll-snap-align: center;
}
.scrolling-section1 {
background-color: rgb(220, 235, 153);
}
.scrolling-section2 {
background-color: rgb(230, 173, 218);
}
.scrolling-section3 {
background-color: rgb(176, 229, 238);
}
</style>
</head>
<body>
<div class="scroll-container">
<div class="scrolling-section1">scroll-snap-type: none</div>
<div class="scrolling-section2">scroll-snap-type: none</div>
<div class="scrolling-section3">scroll-snap-type: none</div>
<div class="scrolling-section1">scroll-snap-type: none</div>
</div>
</body>
</html>
CSS Scroll Snap Type - X and Y mandatory Value
The following example demonstrates how to use the scroll-snap-type: x mandatory and scroll-snap-type: y mandatory will make the scroll container stop at the nearest snap point on both the X-axis and the Y-axis, even if you scroll quickly −
<html>
<head>
<style>
.scroll-container1 {
display: flex;
width: 350px;
height: 200px;
overflow-x: scroll;
overflow-y: hidden;
white-space: nowrap;
scroll-snap-type: x mandatory;
margin-bottom: 20px;
}
.scroll-container2 {
width: 350px;
height: 200px;
overflow-y: scroll;
overflow-x: hidden;
white-space: nowrap;
scroll-snap-type: y mandatory;
}
.scrolling-section1,
.scrolling-section2,
.scrolling-section3 {
flex: 0 0 auto;
width: 320px;
height: 200px;
scroll-snap-align: center;
}
.scrolling-section1 {
background-color: rgb(220, 235, 153);
}
.scrolling-section2 {
background-color: rgb(230, 173, 218);
}
.scrolling-section3 {
background-color: rgb(176, 229, 238);
}
</style>
</head>
<body>
<div class="scroll-container1">
<div class="scrolling-section1">scroll-snap-type: x mandatory</div>
<div class="scrolling-section2">scroll-snap-type: x mandatory</div>
<div class="scrolling-section3">scroll-snap-type: x mandatory</div>
<div class="scrolling-section1">scroll-snap-type: x mandatory</div>
</div>
<div class="scroll-container2">
<div class="scrolling-section1">scroll-snap-type: y mandatory</div>
<div class="scrolling-section2">scroll-snap-type: y mandatory</div>
<div class="scrolling-section3">scroll-snap-type: y mandatory</div>
<div class="scrolling-section1">scroll-snap-type: y mandatory</div>
</div>
</body>
</html>
CSS Scroll Snap Type - X and Y proximity Value
The following example demostrates how to use the scroll-snap-type: x proximity and scroll-snap-type: y proximity properties to create scrolling containers where the sections snap into place as you scroll horizontally and vertically −
<html>
<head>
<style>
.scroll-container1 {
display: flex;
width: 350px;
height: 200px;
overflow-x: scroll;
overflow-y: hidden;
white-space: nowrap;
scroll-snap-type: x proximity;
margin-bottom: 20px;
}
.scroll-container2 {
width: 350px;
height: 200px;
overflow-y: scroll;
overflow-x: hidden;
white-space: nowrap;
scroll-snap-type: y proximity;
}
.scrolling-section1,
.scrolling-section2,
.scrolling-section3 {
flex: 0 0 auto;
width: 300px;
height: 200px;
scroll-snap-align: center;
}
.scrolling-section1 {
background-color: rgb(220, 235, 153);
}
.scrolling-section2 {
background-color: rgb(230, 173, 218);
}
.scrolling-section3 {
background-color: rgb(176, 229, 238);
}
</style>
</head>
<body>
<div class="scroll-container1">
<div class="scrolling-section1">scroll-snap-type: x proximity</div>
<div class="scrolling-section2">scroll-snap-type: x proximity</div>
<div class="scrolling-section3">scroll-snap-type: x proximity</div>
<div class="scrolling-section1">scroll-snap-type: x proximity</div>
</div>
<div class="scroll-container2">
<div class="scrolling-section1">scroll-snap-type: y proximity</div>
<div class="scrolling-section2">scroll-snap-type: y proximity</div>
<div class="scrolling-section3">scroll-snap-type: y proximity</div>
<div class="scrolling-section1">scroll-snap-type: y proximity</div>
</div>
</body>
</html>
CSS Scroll Snap Type - Both Value
The following example demonstrates the scroll-snap-type: both property will stop the scroll container at the nearest snap point on both horizontally and vertically −
<html>
<head>
<style>
.scroll-container {
display: flex;
width: 350px;
height: 200px;
overflow-x: scroll;
overflow-y: scroll;
white-space: nowrap;
scroll-snap-type: both;
}
.scrolling-section1,
.scrolling-section2,
.scrolling-section3 {
flex: 0 0 auto;
width: 320px;
height: 200px;
scroll-snap-align: center;
}
.scrolling-section1 {
background-color: rgb(220, 235, 153);
}
.scrolling-section2 {
background-color: rgb(230, 173, 218);
}
.scrolling-section3 {
background-color: rgb(176, 229, 238);
}
</style>
</head>
<body>
<div class="scroll-container">
<div class="scrolling-section1">scroll-snap-type: both</div>
<div class="scrolling-section2">scroll-snap-type: both</div>
<div class="scrolling-section3">scroll-snap-type: both</div>
<div class="scrolling-section1">scroll-snap-type: both</div>
</div>
</body>
</html>
CSS Scroll Snap Type - RTL AND LTR Directions
The following example demostrates how to use the scroll-snap-type property to create scrolling containers with snap points in both directions right-to-left (RTL) and left-to-right (LTR) −
<html>
<head>
<style>
.scroll-container1 {
display: flex;
width: 350px;
height: 150px;
overflow-x: scroll;
overflow-y: hidden;
white-space: nowrap;
scroll-snap-type: x mandatory;
margin-bottom: 20px;
}
.scroll-container2 {
width: 350px;
height: 150px;
overflow-y: scroll;
overflow-x: hidden;
white-space: nowrap;
scroll-snap-type: y mandatory;
margin-bottom: 20px;
}
.scroll-container3 {
display: flex;
width: 350px;
height: 150px;
overflow-x: scroll;
overflow-y: hidden;
white-space: nowrap;
scroll-snap-type: x proximity;
margin-bottom: 20px;
}
.scroll-container4 {
width: 350px;
height: 150px;
overflow-y: scroll;
overflow-x: hidden;
white-space: nowrap;
scroll-snap-type: y proximity;
margin-bottom: 20px;
}
.scrolling-section1,
.scrolling-section2,
.scrolling-section3 {
flex: 0 0 auto;
width: 320px;
height: 150px;
scroll-snap-align: center;
}
.scrolling-section1 {
background-color: rgb(220, 235, 153);
}
.scrolling-section2 {
background-color: rgb(230, 173, 218);
}
.scrolling-section3 {
background-color: rgb(176, 229, 238);
}
</style>
</head>
<body>
<div class="scroll-container1" dir="ltr">
<div class="scrolling-section1">scroll-snap-type: x mandatory with ltr</div>
<div class="scrolling-section2">scroll-snap-type: x mandatory with ltr</div>
<div class="scrolling-section3">scroll-snap-type: x mandatory with ltr</div>
<div class="scrolling-section1">scroll-snap-type: x mandatory with ltr</div>
</div>
<div class="scroll-container2" dir="ltr">
<div class="scrolling-section1">scroll-snap-type: y mandatory with ltr</div>
<div class="scrolling-section2">scroll-snap-type: y mandatory with ltr</div>
<div class="scrolling-section3">scroll-snap-type: y mandatory with ltr</div>
<div class="scrolling-section1">scroll-snap-type: y mandatory with ltr</div>
</div>
<div class="scroll-container3" dir="ltr">
<div class="scrolling-section1">scroll-snap-type: x proximity with ltr</div>
<div class="scrolling-section2">scroll-snap-type: x proximity with ltr</div>
<div class="scrolling-section3">scroll-snap-type: x proximity with ltr</div>
<div class="scrolling-section1">scroll-snap-type: x proximity with ltr</div>
</div>
<div class="scroll-container4" dir="ltr">
<div class="scrolling-section1">scroll-snap-type: y proximity with ltr</div>
<div class="scrolling-section2">scroll-snap-type: y proximity with ltr</div>
<div class="scrolling-section3">scroll-snap-type: y proximity with ltr</div>
<div class="scrolling-section1">scroll-snap-type: y proximity with ltr</div>
</div>
<div class="scroll-container1" dir="rtl">
<div class="scrolling-section1">scroll-snap-type: x mandatory with rtl</div>
<div class="scrolling-section2">scroll-snap-type: x mandatory with rtl</div>
<div class="scrolling-section3">scroll-snap-type: x mandatory with rtl</div>
<div class="scrolling-section1">scroll-snap-type: x mandatory with rtl</div>
</div>
<div class="scroll-container2" dir="rtl">
<div class="scrolling-section1">scroll-snap-type: y mandatory with rtl</div>
<div class="scrolling-section2">scroll-snap-type: y mandatory with rtl</div>
<div class="scrolling-section3">scroll-snap-type: y mandatory with rtl</div>
<div class="scrolling-section1">scroll-snap-type: y mandatory with rtl</div>
</div>
<div class="scroll-container3" dir="rtl">
<div class="scrolling-section1">scroll-snap-type: x proximity with rtl</div>
<div class="scrolling-section2">scroll-snap-type: x proximity with rtl</div>
<div class="scrolling-section3">scroll-snap-type: x proximity with rtl</div>
<div class="scrolling-section1">scroll-snap-type: x proximity with rtl</div>
</div>
<div class="scroll-container4" dir="rtl">
<div class="scrolling-section1">scroll-snap-type: y proximity with rtl</div>
<div class="scrolling-section2">scroll-snap-type: y proximity with rtl</div>
<div class="scrolling-section3">scroll-snap-type: y proximity with rtl</div>
<div class="scrolling-section1">scroll-snap-type: y proximity with rtl</div>
</div>
</body>
</html>