Trang chủ / Nền Tảng Phong Cách
Cách căn giữa phần tử trong CSS: Các kỹ thuật hiện đại thực sự hiệu quả
Căn giữa trông như một nhiệm vụ nhỏ, nhưng nó chạm đến cốt lõi của bố cục CSS: cách các hộp được kích thước, cách phần tử cha tạo không gian, và cách canh chỉnh hoạt động trong các ngữ cảnh định dạng khác nhau. Tin tốt là CSS hiện đại cung cấp một bộ công cụ ngắn gọn và đáng tin cậy. Khi bạn hiểu mỗi công cụ thuộc về đâu, bạn có thể căn giữa phần tử trong CSS mà không cần các hack dễ vỡ hay sửa lỗi thử-và-sai.
Bắt đầu từ phần tử cha, không phải phần tử con
Trước khi chọn một thuộc tính, hãy đặt một câu hỏi: ai kiểm soát không gian có sẵn? Trong hầu hết các trường hợp, phần tử cha là nơi đúng để bắt đầu. Một phần tử cha có thể trở thành flex container, grid container, hoặc điểm tham chiếu định vị, và những lựa chọn đó quyết định cách các phần tử con hoạt động.
Điều này quan trọng vì căn giữa không phải là một thao tác hình ảnh duy nhất. Căn giữa theo chiều ngang thường có nghĩa là đặt một hộp trong trục inline của phần tử cha. Căn giữa theo chiều dọc có nghĩa là đặt nó trong trục block. Hai trục có thể được xử lý cùng lúc khi phần tử cha có mô hình bố cục rõ ràng.
Một mặc định hữu ích là gán cho phần tử cha chiều cao được xác định hoặc chiều cao tối thiểu khi căn giữa theo chiều dọc cần hiển thị. Nếu phần tử cha co lại về chiều cao của nội dung, sẽ không có không gian thừa để căn giữa. Đó là lý do một hero căn giữa thường cần min-height: 100vh hoặc chiều cao container gắn với thiết kế.
Dùng flexbox cho căn giữa một chiều
Flexbox là câu trả lời trực tiếp nhất cho nhiều giao diện. Khi phần tử cha là flex container, bạn có thể canh chỉnh các phần tử con của nó dọc theo cả hai trục chỉ với vài thuộc tính.
Mẫu rất đơn giản: biến phần tử cha thành flex container, căn giữa trục chính, và căn giữa trục phụ. Với hàng, justify-content: center xử lý vị trí theo chiều ngang và align-items: center xử lý vị trí theo chiều dọc. Với cột, hai thuộc tính này hoán đổi vai trò.
Flexbox đặc biệt hữu ích khi phần tử cần căn giữa tham gia vào luồng bố cục bình thường. Nó hoạt động tốt cho nút, nhóm điều hướng, thẻ, thanh công cụ, và các phần của trang. Nó cũng vẫn dự đoán được khi nội dung thay đổi kích thước, vì flexbox phân phối không gian theo container và các phần tử.
Một chi tiết quan trọng là căn giữa flex hoạt động trên các phần tử con trực tiếp của flex container. Nếu phần tử bạn muốn căn giữa lồng sâu hơn, hãy áp dụng flexbox cho phần tử cha đúng hoặc dùng một wrapper thể hiện rõ mối quan hệ bố cục.
Dùng grid cho căn giữa đơn giản, chính xác
CSS Grid có thể căn giữa một phần tử với ít nghi thức hơn nữa. Một grid một ô có thể đặt phần tử con vào tâm của cả hai trục.
Cách tiếp cận này lý tưởng khi phần tử cha đã là grid hoặc khi bạn muốn các quy tắc canh chỉnh gần container. Grid cũng dễ căn giữa trong một cấu trúc phức tạp hơn. Bạn có thể định nghĩa cột và hàng, rồi dùng các thuộc tính canh chỉnh trên chính grid item.
Một quan niệm sai lầm phổ biến là grid chỉ dành cho bố cục trang lớn. Trong thực tế, nó tuyệt vời cho bố cục cục bộ: một media object, một modal shell, một empty state, hoặc một điều khiển phải nằm giữa một khu vực xác định. Grid cung cấp cho bạn một mô hình rõ ràng cho cả hai trục mà không yêu cầu phần tử con biết về các anh em của nó.
Căn giữa phần tử trong hộp của chính nó
Đôi khi phần tử không phải là một sibling trong bố cục. Nó là phần tử con phải xuất hiện giữa container của chính nó, chẳng hạn như nhãn bên trong một badge hoặc chữ bên trong một tile có kích thước cố định. Với trường hợp đó, hãy kết hợp căn giữa inline và block trên chính phần tử.
CSS hiện đại cung cấp margin: auto như một công cụ căn giữa thực tế trong ngữ cảnh flex và grid. Khi một flex hoặc grid item có auto margin, không gian trống còn lại được phân phối đều. Điều này có thể căn giữa một phần tử mà không thay đổi các thuộc tính canh chỉnh của container.
Một kỹ thuật hữu ích khác là coi phần tử con như một inline-level box trong ngữ cảnh text-align. Phần tử cha có thể dùng text-align: center, trong khi phần tử con nhận vị trí dọc thông qua line height, flexbox, hoặc grid tùy cấu trúc. Cách này hữu ích cho chữ ngắn và điều khiển đơn giản, nhưng kém phù hợp hơn với nội dung phức tạp.
Positioning vẫn có chỗ đứng
Absolute positioning vẫn hợp lệ khi một phần tử phải được đưa ra khỏi luồng bình thường và đặt tương đối với một hộp cụ thể. Đặt phần tử cha thành position: relative, định vị phần tử con tuyệt đối, và dùng các offset cùng transform để đặt tâm của nó vào điểm mong muốn.
Kỹ thuật này hữu ích cho overlay, marker, và các phần tử trang trí. Nó kém lý tưởng hơn cho nội dung nên tham gia vào luồng tài liệu, vì một phần tử absolute không còn ảnh hưởng đến kích thước của phần tử cha. Hãy dùng nó khi thiết kế thực sự cần một overlay thay vì lựa chọn đầu tiên cho bố cục thông thường.
Chọn kỹ thuật theo ngữ cảnh
Không có thuộc tính tốt nhất duy nhất cho mọi tình huống. Cách tiếp cận đáng tin cậy là ghép công cụ với vấn đề bố cục.
- Flexbox là mặc định mạnh cho các nhóm một chiều và nội dung nên phản hồi tự nhiên khi kích thước thay đổi.
- Grid tuyệt vời cho một khu vực xác định, đặc biệt khi phần tử cha đã có cấu trúc grid.
- Auto margins hữu ích để căn giữa một phần tử duy nhất trong flex hoặc grid mà không thay đổi các quy tắc canh chỉnh của container.
- Absolute positioning phù hợp cho overlay và các phần tử phải tách khỏi luồng bình thường.
Tránh những cái bẫy phổ biến
Căn giữa thất bại thường nhất khi container không có không gian đo lường được để phân phối. Hãy kiểm tra các chiều cao co lại, chiều cao tối thiểu bị thiếu, và các phần tử cha có kiểu display không hỗ trợ canh chỉnh như bạn mong đợi. Cũng kiểm tra xem một wrapper có đang tạo ra một cấp bố cục thừa làm thay đổi trục bạn đang nhắm đến hay không.
Một cái bẫy khác là nhầm lẫn giữa căn chỉnh nội dung và căn chỉnh hộp. Chữ có thể được căn giữa với text-align, nhưng điều đó không căn giữa một block theo chiều dọc. Tương tự, transform có thể di chuyển m��t phần tử về mặt hình ảnh, nhưng nó không thay đổi không gian bố cục xung quanh. Hiểu sự khác biệt giúp tránh các giải pháp có vẻ đúng ở một viewport nhưng hỏng ở viewport khác.
Cuối cùng, hãy ưu tiên các thuộc tính mô tả ý định. Flexbox và grid giải thích không gian nên được phân phối như thế nào, trong khi transform và offset mô tả một vị trí hình ảnh cụ thể. Cách tiếp cận đầu tiên dễ bảo trì hơn khi nội dung, breakpoint, hoặc cấu trúc component thay đổi.
Xây dựng thói quen căn giữa đáng tin cậy
Quy trình thực tế rất ngắn. Xác định phần tử cha sở hữu không gian, chọn flexbox hoặc grid cho bố cục bình thường, xác nhận phần tử cha có đủ chiều cao cho canh chỉnh dọc, và chỉ dùng positioning khi phần tử phải rời khỏi luồng. Kiểm tra kết quả với nội dung dài hơn và viewport hẹp hơn, vì căn giữa nên ổn định khi trang thay đổi.
Với mô hình này, căn giữa không còn là một tập hợp mẹo. Nó trở thành một phần nhỏ, dự đoán được của bố cục CSS: chọn ngữ cảnh định dạng, xác định không gian có sẵn, và để các thuộc tính canh chỉnh làm công việc.
