Giới thiệu về scroll-snap
Bài đăng này đã không được cập nhật trong 3 năm
Tại sao phải dùng scroll snap
Câu trả lời cũng tương tự như câu hỏi 'Tại sao phải responsive ?', với nhu cầu sử dụng smartphone, tablet ngày càng nhiều thì mong muốn đáp ứng được điều này cũng là lẽ đương nhiên, kèm theo đó là UX - trải nghiệm người dùng cần được nâng lên. Ví dụ như, mọt galary hình ảnh, nếu hiển thị chiều dọc trên điện thoại thì người dùng phải scroll rất nhiều, điều đó khiến UX rất tệ và user sẽ không muốn xem phần bên dưới của trang web nữa, do vậy chúng ta phải tối ưu cho UX thật tốt.
Scroll căn bản
Để tạo một scrolling container
, thì chúng ta cần:
- Sử dụng
overflow-x: auto
- Sắp xếp các phần tử thành 1 hàng
<div class="section">
<div class="section__item">Item 1</div>
<div class="section__item">Item 2</div>
<div class="section__item">Item 3</div>
<div class="section__item">Item 4</div>
<div class="section__item">Item 5</div>
</div>
.section {
white-space: nowrap;
overflow-x: auto;
}
Đã từ lâu,chúng ta sử dụng white-space: nowrap;
để sắp xếp các element
thẳng hàng,tuy nhiên bây giờ chúng ta đã có một thứ hiện đại hơn, đó là flexbox
;
.section {
display: flex;
overflow-x: auto;
}
Vấn đề scroll với overflow
Có một vấn đề chính là scroll
với overflow
có UX chưa tốt trên di động, để có một trải nghiệm mượt mà chúng ta cần một giải pháp tốt hơn, chi tiết tại sau overflow
chưa tốt bạn có thể xem thêm video dưới:
Về scroll snap
Để sử dụng scroll snap
thì các phần tử bên trong container
phải là inline
- thẳng trên 1 hàng. Tái sự dụng phần code phía trên, chúng ta cần bổ sung:
- Thêm thuộc tính
scroll-snap-type
vàocss
củacontainer
- Thêm thuộc tính
scroll-snap-align
vàocss
của cácelement
bên trongcontainer
.section {
display: flex;
overflow-x: auto;
scroll-snap-type: x mandatory;
}
.section__item {
scroll-snap-align: start;
}
Lúc này, việc scroll của bạn sẽ rất mượt mà, giống như là đang sử dụng slick.js
vậy
Chi tiết
scroll-snap-type
scroll-snap-type
xác định kiểu snap
cho container
sẽ có kiểu scroll như thế nào và hướng ra sao:
Như đây là xác định hướng scroll
của container
/* Chiều ngang */
.section {
display: flex;
overflow-x: auto;
scroll-snap-type: x;
}
/* Chiều dọc */
.section {
height: 250px;
overflow-y: auto;
scroll-snap-type: y;
}
Còn đây là khi chúng ta cần chọn kiểu scroll
, giá trị default
sẽ là proximity
tuy nhiên sẽ không đẹp cho lắm, mình ưu tiên sử dụng mandatory
hơn
- proximity: là giá trị
default
, trình duyệt sẽsnap
theo các điểm mặc định mà trình duyệt đã tính toán. - mandatory: trình duyệt sẽ
snap
theo từng điểmscroll
, giả sửscroll-snap-align
làstart
thì trình duyệt sẽscroll
theo hướng bắt đầu củacontainer
scroll snapping alignment
Hơi khó giải thích đối với thuộc tính này, có thể hiểu rằng chúng ta sẽ canh ví trị các element
bên trong container
khi scroll
scroll-snap-stop
Thuộc tính này giúp tối ưu UX hơn khi chúng ta scroll container
quá nhanh
- normal: giá trị
default
cho phépuser
lướt nhanh quacontainer
- always: khi lướt nhanh qua
container
,container
sẽ dừng ở từngelement
scroll-padding
Tương tự như padding
, được dùng để set padding
giữa element
bên trong và container
Lưu ý:
Không nên sử dụng scoll snap
bừa bãi, chỉ nên sử dụng với layout
với dạng list
, scroll ngang
scroll-margin
dùng để set margin
giữa các element
trong container
Một vài ví dụ khác
Images List
Avatars List
Full Height Sections
Tham khảo:
All rights reserved