Vấn đề
Flexbox làm cho việc định tâm rất dễ dàng.
Chỉ cần áp dụng align-items: center
và justify-content: center
vào hộp chứa flex, (các) mục flex của bạn sẽ được căn giữa theo chiều dọc và chiều ngang.
Tuy nhiên, có một vấn đề với phương pháp này khi vật phẩm flex lớn hơn vật chứa flex.
Như đã lưu ý trong câu hỏi, khi vật phẩm flex tràn vào thùng chứa, phần trên sẽ không thể truy cập được.
Đối với tràn ngang, phần bên trái trở nên không thể truy cập (hoặc phần bên phải, bằng ngôn ngữ RTL).
Đây là một ví dụ với một container LTR có justify-content: center
và ba mục flex:
Xem phần dưới của câu trả lời này để được giải thích về hành vi này.
Giải pháp số 1
Để khắc phục vấn đề này, hãy sử dụng lề tự động flexbox , thay vì justify-content
.
Với auto
lề, một mục flex tràn có thể được căn giữa theo chiều dọc và chiều ngang mà không mất quyền truy cập vào bất kỳ phần nào của nó.
Vì vậy, thay vì mã này trên container flex:
#flex-container {
align-items: center;
justify-content: center;
}
Sử dụng mã này trên mục flex:
.flex-item {
margin: auto;
}
Bản sửa đổi
Giải pháp số 2 (chưa được triển khai trong hầu hết các trình duyệt)
Thêm safe
giá trị cho quy tắc căn chỉnh từ khóa của bạn, như thế này:
justify-content: safe center
hoặc là
align-self: safe center
Từ đặc tả mô-đun sắp xếp hộp CSS :
4.4. Overflow Alignment: các safe
và unsafe
các từ khóa và giới hạn an toàn cuộn
Khi [mục flex] lớn hơn [thùng chứa flex], nó sẽ tràn. Một số chế độ căn chỉnh, nếu được tôn trọng trong tình huống này, có thể gây mất dữ liệu: ví dụ: nếu nội dung của thanh bên được căn giữa, khi tràn, chúng có thể gửi một phần hộp của chúng qua cạnh bắt đầu của khung nhìn, không thể cuộn đến .
Để kiểm soát tình huống này, chế độ căn chỉnh tràn có thể được chỉ định rõ ràng. Unsafe
căn chỉnh tôn vinh chế độ căn chỉnh được chỉ định trong các tình huống tràn, ngay cả khi nó gây mất dữ liệu, trong khi safe
căn chỉnh sẽ thay đổi chế độ căn chỉnh trong các tình huống tràn để cố gắng tránh mất dữ liệu.
Hành vi mặc định là chứa chủ thể căn chỉnh trong vùng có thể cuộn, mặc dù tại thời điểm viết tính năng an toàn này chưa được triển khai.
safe
Nếu kích thước của [mục flex] tràn vào [thùng chứa flex], thì [mục flex] được căn chỉnh thay vì chế độ căn chỉnh là [ flex-start
].
unsafe
Bất kể kích thước tương đối của [mục flex] và [thùng chứa flex], giá trị căn chỉnh đã cho đều được tôn trọng.
Lưu ý: Mô-đun căn chỉnh hộp được sử dụng trên nhiều mô hình bố trí hộp, không chỉ flex. Vì vậy, trong đoạn trích đặc tả ở trên, các thuật ngữ trong ngoặc thực sự nói "chủ đề căn chỉnh", "bộ chứa căn chỉnh" và " start
". Tôi đã sử dụng các thuật ngữ cụ thể flex để tập trung vào vấn đề cụ thể này.
Giải thích cho giới hạn cuộn từ MDN:
Xem xét mục Flex
Các thuộc tính căn chỉnh của Flexbox thực hiện định tâm "đúng", không giống như các phương pháp định tâm khác trong CSS. Điều này có nghĩa là các mục flex sẽ giữ ở giữa, ngay cả khi chúng tràn vào hộp chứa flex.
Điều này đôi khi có thể có vấn đề, tuy nhiên, nếu chúng tràn qua cạnh trên của trang hoặc cạnh trái [...], vì bạn không thể cuộn đến khu vực đó, ngay cả khi có nội dung ở đó!
Trong phiên bản tương lai, các thuộc tính căn chỉnh cũng sẽ được mở rộng để có tùy chọn "an toàn".
Hiện tại, nếu đây là một vấn đề đáng lo ngại, thay vào đó, bạn có thể sử dụng lề để đạt được định tâm, vì họ sẽ phản hồi theo cách "an toàn" và ngừng tập trung nếu chúng tràn.
Thay vì sử dụng các align-
thuộc tính, chỉ cần đặt auto
lề trên các mục flex bạn muốn đặt ở giữa.
Thay vì các justify-
thuộc tính, đặt lề tự động ở các cạnh bên ngoài của các mục flex đầu tiên và cuối cùng trong thùng chứa flex.
Các auto
lề sẽ "uốn cong" và giả định không gian còn lại, căn giữa các mục flex khi có không gian còn lại và chuyển sang căn chỉnh bình thường khi không.
Tuy nhiên, nếu bạn đang cố gắng thay thế justify-content
bằng định tâm dựa trên lề trong hộp linh hoạt nhiều dòng, có lẽ bạn không gặp may, vì bạn cần đặt lề trên mục flex đầu tiên và cuối cùng trên mỗi dòng. Trừ khi bạn có thể dự đoán trước các mặt hàng sẽ kết thúc trên dòng nào, bạn không thể sử dụng định tâm dựa trên lề trong trục chính để thay thế thuộc justify-content
tính.