Web Performance

Cách Khắc Phục Lỗi Cumulative Layout Shift (CLS) Do Footer Gây Ra

By Ginbok6 min read

Các vấn đề về Cumulative Layout Shift (CLS - Thay đổi bố cục tích lũy) thường được đổ lỗi cho font chữ hoặc hình ảnh, nhưng footer (chân trang) cũng có thể là một "thủ phạm" chính. Trong bài phân tích kỹ thuật này, tôi sẽ chia sẻ cách tôi đã khắc phục điểm CLS cao do footer gây ra, giảm từ mức báo động xuống gần như bằng không—mà không làm ảnh hưởng đến trải nghiệm người dùng hay thiết kế. Hiểu cách trình duyệt tính toán không gian cho các thành phần ở cuối trang là chìa khóa để đạt điểm Lighthouse tuyệt đối.

Tác Động Của CLS Đến Kinh Doanh

Trước khi đi sâu vào kỹ thuật, cần hiểu tại sao CLS lại quan trọng. Core Web Vitals của Google là một yếu tố xếp hạng trực tiếp. Điểm CLS cao cho thấy một website "nhảy nhót", dẫn đến các cú nhấp chuột nhầm và gây ức chế cho người dùng. Đối với các nền tảng thương mại điện tử hoặc trang tin tức, sự ổn định của bố cục chuyển hóa trực tiếp thành tỷ lệ chuyển đổi cao hơn và xếp hạng SEO tốt hơn. Khi footer làm thay đổi bố cục, nó thường ảnh hưởng đến toàn bộ luồng tài liệu, tạo ra tác động lớn hơn nhiều so với kích thước hiển thị của nó.

Tình Huống Ban Đầu: CLS Gần 0.65, Xác Định Footer Là Nguyên Nhân Chính

Báo cáo Lighthouse cho thấy phần tử .site-footer đóng góp hơn 0.6 điểm vào chỉ số CLS. Các phần tử khác như .page-subtitle và một vài div nhỏ có tác động không đáng kể, và web font cũng không còn là vấn đề sau khi chúng tôi áp dụng font-display: swap. Tuy nhiên, footer vẫn là vấn đề lớn nhất.

Hành vi quan sát được là chiều cao của footer thay đổi sau khi trang tải lần đầu, khiến toàn bộ nội dung phía trên nó bị đẩy xuống hoặc vị trí cuộn bị nhảy. Điều này tạo ra một trải nghiệm khó chịu, đặc biệt là trên các thiết bị di động nơi độ trễ mạng thường làm chậm quá trình render các cấu trúc footer phức tạp.

Nguyên Nhân Gốc Rễ Của CLS Liên Quan Đến Footer

Từ phân tích chuyên sâu bằng Chrome DevTools (tab Performance), có ba lý do phổ biến gây ra CLS liên quan đến footer:

Giải Pháp: Dành Sẵn Chiều Cao Footer Và Ổn Định Bố Cục

Chiến lược để loại bỏ CLS do footer gây ra bao gồm "đặt chỗ không gian" và "ổn định render". Bằng cách thông báo cho trình duyệt chính xác footer sẽ chiếm bao nhiêu không gian trước khi nó render, chúng ta ngăn chặn sự thay đổi đột ngột.

1. Dành Sẵn Chiều Cao Cho Footer Bằng CSS

Cách khắc phục quan trọng nhất là áp dụng min-height hợp lý cho .site-footer. Điều này cho phép trình duyệt phân bổ đủ không gian trong lần vẽ đầu tiên (first paint). Nếu chiều cao footer thay đổi nhẹ giữa các trang, hãy chọn một giá trị tối thiểu an toàn đại diện cho bố cục phổ biến nhất.

.site-footer {
  /* Đặt trước chiều cao footer để ngăn thay đổi bố cục */
  min-height: 180px; 
  display: block;
}

@media (min-width: 768px) {
  .site-footer {
    min-height: 250px; /* Điều chỉnh cho bản desktop nếu lớn hơn */
  }
}

Điều chỉnh giá trị chiều cao dựa trên kích thước render thực tế cuối cùng của footer. Bạn có thể tìm thấy giá trị này bằng cách kiểm tra (inspect) phần tử trong DevTools sau khi trang đã tải hoàn toàn.

2. Ổn Định Bố Cục Văn Bản Trong Footer

Việc tải font có thể gây ra những thay đổi nhỏ. Nếu footer của bạn sử dụng web font tùy chỉnh lớn hơn font mặc định, chiều cao sẽ "nhích" lên khi font tải xong. Hãy thiết lập line-height cố định cho văn bản và tiêu đề bên trong footer.

.site-footer {
  line-height: 1.5;
  font-family: 'YourCustomFont', sans-serif;
}

.site-footer h3 {
  line-height: 1.3;
  margin-bottom: 1rem;
}

3. Cố Định Kích Thước Icon Và Hình Ảnh

Đảm bảo các icon và hình ảnh bên trong footer có chiều rộng và chiều cao cố định hoặc sử dụng aspect-ratio. Đây là một thiếu sót phổ biến trong responsive design khi lập trình viên chỉ dùng width: 100% mà quên thuộc tính height.

.site-footer img,
.site-footer svg {
  width: 24px;
  height: 24px;
  aspect-ratio: 1 / 1;
  object-fit: contain;
}

4. Tránh Chèn Nội Dung Footer Bằng JavaScript (Nếu Có Thể)

Nếu nội dung footer được chèn hoặc thay đổi động bằng JavaScript sau khi render lần đầu:

Thông Tin Chiến Lược: Xử Lý Các Phần Tử Khác

Trong quá trình sửa footer, tôi nhận thấy những đóng góp CLS nhỏ từ .page-subtitle. Nguyên nhân là do thiếu chiều cao xác định cho các trạng thái trống hoặc các chuỗi ngôn ngữ tải chậm. Cách khắc phục cũng tương tự: áp dụng line-height và chiều cao dành sẵn.

.p.page-subtitle {
  line-height: 1.4;
  min-height: 1.4em; /* Dành không gian cho một dòng văn bản */
  margin-bottom: 0.5rem;
}

Kết Quả Và Phân Tích Cuối Cùng

Việc triển khai các bản sửa lỗi CSS đơn giản này đã giảm CLS của chúng tôi từ mức 0.65 xuống dưới 0.02. Điều này đưa website vào phạm vi "Tốt" của Core Web Vitals. Lighthouse không còn gắn cờ footer là nguồn gây CLS đáng kể, và trải nghiệm người dùng cảm thấy "chắc chắn" và chuyên nghiệp hơn nhiều.

Lời Kết

CLS không chỉ liên quan đến font hay ảnh ở đầu trang; footer, mặc dù nằm ở dưới cùng, vẫn có thể gây ra sự dịch chuyển nếu trình duyệt chưa tính toán đúng toàn bộ chiều dài tài liệu. Dành sẵn chiều cao và ổn định bố cục footer là những bước thiết yếu, tốn ít công sức nhưng mang lại tác động lớn để cải thiện hiệu suất và SEO cho website của bạn.

#performance#seo#frontend
← Back to Articles
Cách Khắc Phục Lỗi Cumulative Layout Shift (CLS) Do Footer Gây Ra - Ginbok