Tiếng Việt

Làm chủ CSS scroll-behavior để điều hướng mượt mà và dễ tiếp cận. Tìm hiểu các kỹ thuật triển khai, khả năng tương thích của trình duyệt và các tùy chọn tùy chỉnh nâng cao.

CSS Scroll Behavior: Hướng Dẫn Toàn Diện Về Cuộn Mượt

Trong bối cảnh phát triển web ngày nay, trải nghiệm người dùng (UX) chiếm vị trí tối cao. Một chi tiết có vẻ nhỏ nhưng có thể tác động đáng kể đến UX là độ mượt mà của cuộn trang. Không còn những cú nhảy giật cục giữa các phần! Thuộc tính scroll-behavior của CSS cung cấp một cách đơn giản nhưng mạnh mẽ để triển khai cuộn mượt, nâng cao khả năng truy cập trang web và sự hài lòng chung của người dùng. Hướng dẫn này cung cấp một khám phá toàn diện về scroll-behavior, bao gồm mọi thứ từ triển khai cơ bản đến tùy chỉnh nâng cao và các cân nhắc về khả năng tương thích của trình duyệt cho khán giả toàn cầu.

CSS Scroll Behavior là gì?

Thuộc tính scroll-behavior trong CSS cho phép bạn chỉ định hành vi cuộn cho một hộp cuộn. Theo mặc định, cuộn trang là tức thời, dẫn đến các cú nhảy đột ngột khi điều hướng giữa các phần khác nhau của trang. scroll-behavior: smooth; thay đổi điều này, cung cấp một chuyển đổi động mượt mà khi cuộn được kích hoạt, cho dù bằng cách nhấp vào liên kết neo, sử dụng các phím mũi tên hoặc khởi tạo cuộn theo chương trình.

Triển Khai Cơ Bản scroll-behavior: smooth;

Cách đơn giản nhất để bật cuộn mượt là áp dụng thuộc tính scroll-behavior: smooth; cho phần tử html hoặc body. Điều này làm cho tất cả các thao tác cuộn trong khung nhìn trở nên mượt mà.

Áp Dụng cho Phần Tử html:

Đây thường là phương pháp được ưu tiên vì nó ảnh hưởng đến hành vi cuộn của toàn bộ trang.

html {
  scroll-behavior: smooth;
}

Áp Dụng cho Phần Tử body:

Phương pháp này cũng hoạt động nhưng ít phổ biến hơn vì nó chỉ ảnh hưởng đến nội dung bên trong body.

body {
  scroll-behavior: smooth;
}

Ví dụ: Hãy tưởng tượng một trang web đơn giản với một số phần được xác định bằng tiêu đề. Khi người dùng nhấp vào một liên kết điều hướng trỏ đến một trong các phần này, thay vì ngay lập tức chuyển đến phần đó, trang sẽ cuộn mượt đến phần đó.

Cuộn Mượt với Liên Kết Neo

Liên kết neo (còn được gọi là định danh đoạn) là một cách phổ biến để điều hướng trong một trang web. Chúng thường được sử dụng trong mục lục hoặc các trang web một trang. Với scroll-behavior: smooth;, việc nhấp vào một liên kết neo sẽ kích hoạt hoạt ảnh cuộn mượt.

Cấu Trúc HTML cho Liên Kết Neo:



Section 1

Content of section 1...

Section 2

Content of section 2...

Section 3

Content of section 3...

Với quy tắc CSS html { scroll-behavior: smooth; }, việc nhấp vào bất kỳ liên kết nào trong điều hướng sẽ dẫn đến hoạt ảnh cuộn mượt đến phần tương ứng.

Nhắm Mục Tiêu Các Phần Tử Có Thể Cuộn Cụ Thể

Bạn cũng có thể áp dụng scroll-behavior: smooth; cho các phần tử có thể cuộn cụ thể, chẳng hạn như div có overflow: auto; hoặc overflow: scroll;. Điều này cho phép bạn bật cuộn mượt trong một vùng chứa cụ thể mà không ảnh hưởng đến phần còn lại của trang.

Ví dụ: Cuộn Mượt trong một Div:

Lots of content here...

More content...

Even more content...

.scrollable-container {
  width: 300px;
  height: 200px;
  overflow: scroll;
  scroll-behavior: smooth;
}

Trong ví dụ này, chỉ nội dung bên trong .scrollable-container sẽ cuộn mượt mà.

Cuộn Mượt Theo Chương Trình với JavaScript

Mặc dù scroll-behavior: smooth; xử lý cuộn được kích hoạt bởi tương tác của người dùng (như nhấp vào liên kết neo), nhưng bạn có thể cần bắt đầu cuộn theo chương trình bằng JavaScript. Các phương thức scrollTo()scrollBy(), khi được kết hợp với tùy chọn behavior: 'smooth', cung cấp một cách để đạt được điều này.

Sử Dụng scrollTo():

Phương thức scrollTo() cuộn cửa sổ đến một tọa độ cụ thể.

window.scrollTo({
  top: 500,
  left: 0,
  behavior: 'smooth'
});

Mã này sẽ cuộn mượt cửa sổ đến một độ lệch dọc là 500 pixel từ trên cùng.

Sử Dụng scrollBy():

Phương thức scrollBy() cuộn cửa sổ theo một số lượng được chỉ định.

window.scrollBy({
  top: 100,
  left: 0,
  behavior: 'smooth'
});

Mã này sẽ cuộn mượt cửa sổ xuống 100 pixel.

Ví dụ: Cuộn Mượt Đến Một Phần Tử Khi Nhấp Vào Nút:



Section 3

Content of section 3...

const scrollButton = document.getElementById('scrollButton');
const section3 = document.getElementById('section3');

scrollButton.addEventListener('click', () => {
  section3.scrollIntoView({
    behavior: 'smooth'
  });
});

Khi nút được nhấp, trang sẽ cuộn mượt đến phần tử "Section 3" bằng cách sử dụng scrollIntoView(). Phương pháp này thường được ưu tiên vì nó tính toán vị trí chính xác của phần tử đích, bất kể các thay đổi nội dung động.

Tùy Chỉnh Tốc Độ Cuộn và Easing

Mặc dù scroll-behavior: smooth; cung cấp hoạt ảnh cuộn mượt mặc định, nhưng bạn không thể trực tiếp kiểm soát tốc độ hoặc easing (tốc độ thay đổi của hoạt ảnh theo thời gian) chỉ bằng CSS. Tùy chỉnh yêu cầu JavaScript.

Lưu ý quan trọng: Hoạt ảnh quá dài hoặc phức tạp có thể gây bất lợi cho UX, có khả năng gây ra chứng say tàu xe hoặc cản trở tương tác của người dùng. Cố gắng tạo các hoạt ảnh tinh tế và hiệu quả.

Tùy Chỉnh Dựa Trên JavaScript:

Để tùy chỉnh tốc độ cuộn và easing, bạn cần sử dụng JavaScript để tạo hoạt ảnh tùy chỉnh. Điều này thường liên quan đến việc sử dụng các thư viện như GSAP (GreenSock Animation Platform) hoặc triển khai logic hoạt ảnh của riêng bạn bằng cách sử dụng requestAnimationFrame.

Ví dụ sử dụng requestAnimationFrame:

function smoothScroll(target, duration) {
  const start = window.pageYOffset;
  const targetPosition = target.getBoundingClientRect().top;
  const startTime = performance.now();

  function animation(currentTime) {
    const timeElapsed = currentTime - startTime;
    const run = ease(timeElapsed, start, targetPosition, duration);
    window.scrollTo(0, run);
    if (timeElapsed < duration) {
      requestAnimationFrame(animation);
    }
  }

  // Easing function (e.g., easeInOutQuad)
  function ease(t, b, c, d) {
    t /= d/2;
    if (t < 1) return c/2*t*t + b;
    t--;
    return -c/2 * (t*(t-2) - 1) + b;
  }

  requestAnimationFrame(animation);
}

// Example usage:
const targetElement = document.getElementById('section3');
const scrollDuration = 1000; // milliseconds
smoothScroll(targetElement, scrollDuration);

Mã này định nghĩa một hàm smoothScroll lấy một phần tử đích và thời lượng làm đầu vào. Nó sử dụng requestAnimationFrame để tạo hoạt ảnh mượt mà và bao gồm một hàm easing (easeInOutQuad trong ví dụ này) để kiểm soát tốc độ của hoạt ảnh. Bạn có thể tìm thấy nhiều hàm easing khác nhau trực tuyến để đạt được các hiệu ứng hoạt ảnh khác nhau.

Cân Nhắc Khả Năng Tiếp Cận

Mặc dù cuộn mượt có thể nâng cao UX, nhưng điều quan trọng là phải xem xét khả năng tiếp cận. Một số người dùng có thể thấy cuộn mượt gây xao nhãng hoặc thậm chí gây mất phương hướng. Việc cung cấp một cách để tắt cuộn mượt là điều cần thiết cho tính toàn diện.

Triển Khai Tùy Chọn Ưu Tiên Của Người Dùng:

Cách tiếp cận tốt nhất là tôn trọng tùy chọn của hệ điều hành người dùng để giảm chuyển động. Các truy vấn phương tiện như prefers-reduced-motion cho phép bạn phát hiện xem người dùng có yêu cầu giảm chuyển động trong cài đặt hệ thống của họ hay không.

Sử Dụng prefers-reduced-motion:

@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto !important; /* Override smooth scrolling */
  }
}

Mã này tắt cuộn mượt nếu người dùng đã bật cài đặt "giảm chuyển động" trong hệ điều hành của họ. Cờ !important được sử dụng để đảm bảo rằng quy tắc này ghi đè bất kỳ khai báo scroll-behavior nào khác.

Cung Cấp Chuyển Đổi Thủ Công:

Bạn cũng có thể cung cấp một chuyển đổi thủ công (ví dụ: hộp kiểm) cho phép người dùng bật hoặc tắt cuộn mượt. Điều này cho phép người dùng kiểm soát trực tiếp hơn trải nghiệm của họ.


const smoothScrollToggle = document.getElementById('smoothScrollToggle');

smoothScrollToggle.addEventListener('change', () => {
  if (smoothScrollToggle.checked) {
    document.documentElement.style.scrollBehavior = 'smooth';
  } else {
    document.documentElement.style.scrollBehavior = 'auto';
  }
});

Mã này thêm một hộp kiểm cho phép người dùng bật hoặc tắt cuộn mượt. Hãy nhớ duy trì tùy chọn ưu tiên của người dùng này (ví dụ: sử dụng bộ nhớ cục bộ) để nó được ghi nhớ giữa các phiên.

Khả Năng Tương Thích Trình Duyệt

scroll-behavior có khả năng hỗ trợ trình duyệt tốt, nhưng điều quan trọng là phải nhận biết các trình duyệt cũ hơn có thể không hỗ trợ nó. Dưới đây là tóm tắt về khả năng tương thích của trình duyệt:

Cung Cấp Dự Phòng cho Các Trình Duyệt Cũ Hơn:

Đối với các trình duyệt không hỗ trợ scroll-behavior, bạn có thể sử dụng polyfill JavaScript. Polyfill là một đoạn mã cung cấp chức năng của một tính năng mới hơn trong các trình duyệt cũ hơn.

Ví dụ: Sử Dụng Polyfill:

Có một số thư viện JavaScript có sẵn cung cấp polyfill cuộn mượt. Một tùy chọn là sử dụng một thư viện như "smoothscroll-polyfill".



Mã này bao gồm thư viện "smoothscroll-polyfill" và khởi tạo nó. Điều này sẽ cung cấp chức năng cuộn mượt trong các trình duyệt cũ hơn không hỗ trợ tự nhiên scroll-behavior.

Tải Có Điều Kiện: Hãy cân nhắc tải polyfill có điều kiện bằng trình tải tập lệnh hoặc phát hiện tính năng để tránh chi phí không cần thiết trong các trình duyệt hiện đại.

Các Phương Pháp Hay Nhất để Cuộn Mượt

Dưới đây là một số phương pháp hay nhất cần ghi nhớ khi triển khai cuộn mượt:

Các Vấn Đề Phổ Biến và Giải Pháp

Dưới đây là một số vấn đề phổ biến bạn có thể gặp phải khi triển khai cuộn mượt và các giải pháp của chúng:

Các Kỹ Thuật và Cân Nhắc Nâng Cao

Ngoài những điều cơ bản, có một số kỹ thuật và cân nhắc nâng cao để nâng cao việc triển khai cuộn mượt của bạn.

Sử Dụng scroll-marginscroll-padding:

Các thuộc tính CSS này cung cấp khả năng kiểm soát chi tiết hơn đối với hành vi chụp cuộn và giúp tránh nội dung bị che khuất bởi các tiêu đề hoặc chân trang cố định.

Ví dụ:

section {
  scroll-margin-top: 20px; /* Adds a 20px margin above each section when scrolling */
}

html {
  scroll-padding-top: 60px; /* Adds 60px padding at the top of the viewport when scrolling */
}

Kết Hợp với Intersection Observer API:

Intersection Observer API cho phép bạn phát hiện khi một phần tử đi vào hoặc thoát khỏi khung nhìn. Bạn có thể sử dụng API này để kích hoạt hoạt ảnh cuộn mượt dựa trên khả năng hiển thị của các phần tử.

Ví dụ:

const sections = document.querySelectorAll('section');

const observer = new IntersectionObserver(entries => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      // Do something when the section is in view
      console.log('Section ' + entry.target.id + ' is in view');
    } else {
      // Do something when the section is out of view
      console.log('Section ' + entry.target.id + ' is out of view');
    }
  });
}, {
  threshold: 0.5 // Trigger when 50% of the element is visible
});

sections.forEach(section => {
  observer.observe(section);
});

Mã này sử dụng Intersection Observer API để phát hiện khi mỗi phần đi vào hoặc thoát khỏi khung nhìn. Sau đó, bạn có thể sử dụng thông tin này để kích hoạt hoạt ảnh cuộn mượt tùy chỉnh hoặc các hiệu ứng hình ảnh khác.

Góc Nhìn Toàn Cầu về Hành Vi Cuộn

Mặc dù việc triển khai kỹ thuật cuộn mượt vẫn nhất quán trên toàn cầu, nhưng các cân nhắc về văn hóa và bối cảnh có thể ảnh hưởng đến khả năng sử dụng được nhận thức của nó.

Kết luận

scroll-behavior: smooth; là một thuộc tính CSS có giá trị có thể cải thiện đáng kể trải nghiệm người dùng trên trang web của bạn. Bằng cách hiểu triển khai cơ bản, các tùy chọn tùy chỉnh, các cân nhắc về khả năng tiếp cận và khả năng tương thích của trình duyệt, bạn có thể tạo ra trải nghiệm duyệt web liền mạch và thú vị cho người dùng trên toàn thế giới. Hãy nhớ ưu tiên khả năng tiếp cận, tối ưu hóa hiệu suất và kiểm tra kỹ lưỡng để đảm bảo rằng việc triển khai cuộn mượt của bạn đáp ứng nhu cầu của tất cả người dùng. Bằng cách tuân theo các hướng dẫn và phương pháp hay nhất được trình bày trong hướng dẫn này, bạn có thể làm chủ cuộn mượt và tạo ra một trang web vừa hấp dẫn về mặt hình ảnh vừa thân thiện với người dùng cho đối tượng toàn cầu.