Css ngăn xếp văn bản theo chiều dọc
Ghi chú của biên tập viên. Bài đăng này được cập nhật lần cuối vào ngày 8 tháng 9 năm 2022 để cải thiện mã và cập nhật mọi thông tin lỗi thời Show
Quay trở lại những ngày xưa tốt đẹp, các giới hạn của CSS thậm chí còn khiến những thứ “đơn giản” như căn giữa theo chiều dọc trở thành một thách thức, với một số nhà phát triển thậm chí còn dựa vào các giải pháp JavaScript. Nó mỏng manh, rất hạn chế và luôn có một ngoại lệ khiến nó thất bại Cho dù chúng tôi đang cố gắng căn chỉnh một biểu tượng hoặc hình ảnh bên cạnh văn bản, tạo một trong những biểu ngữ anh hùng phổ biến đó hoặc tạo lớp phủ phương thức, việc căn giữa mọi thứ trên trục dọc luôn là một cuộc đấu tranh Nhưng CSS đã đi một chặng đường dài kể từ đó, cung cấp rất nhiều phương pháp giúp việc căn giữa theo chiều dọc trở nên dễ dàng hơn mọi lúc. Dưới đây là tóm tắt về một số trong số chúng, cùng với các trường hợp sử dụng và giới hạn của chúng Để nhảy về phía trước trong bài viết này
Ghi chú bên lề. Trừ khi được nêu rõ ràng, mỗi chiến lược được đánh dấu bên dưới cũng sẽ hoạt động với các phần tử nội tuyến, điều này hợp lý khi chúng tôi sẽ trực tiếp chuyển đổi vị trí hoặc thuộc tính hiển thị của chúng 1. Định vị tuyệt đối và .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); } 7Một phần tử không có kích thước nội tại có thể được căn giữa bằng cách sử dụng các giá trị bằng nhau từ trên xuống dưới. Khi một phần tử có kích thước nội tại, chúng ta có thể sử dụng .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }30 cho trên cùng và dưới cùng, sau đó áp dụng .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }7. Điều này tự động căn giữa phần tử .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }5 Chúng tôi đã thêm các kiểu bổ sung trong CodePen để làm cho bản trình diễn dễ nhìn hơn. 2. .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); } 8 cổ điển, .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); } 9Đây là một trong những thủ thuật đầu tiên và vẫn là thủ thuật của nhiều nhà phát triển. Bằng cách dựa vào định vị tuyệt đối, phần tử bên trong ở 50 phần trăm tính từ đỉnh phần tử gốc của chúng, sau đó chúng ta có thể dịch phần tử đó lên tới 50 phần trăm chiều cao của phần tử đó .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); } Một cách tiếp cận khá chắc chắn, với hạn chế lớn duy nhất là việc sử dụng bản dịch có thể cản trở các phép biến đổi khác, chẳng hạn như khi áp dụng hiệu ứng chuyển tiếp hoặc hoạt ảnh 3. Định tâm bằng bảngMột cách tiếp cận thực sự đơn giản và là một trong những cách tiếp cận đầu tiên (trước đây, mọi thứ đều tập trung quanh các bảng), là sử dụng hành vi của các ô trong bảng và .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }34 để căn giữa một phần tử trên một vùng chứa Điều này có thể được thực hiện với các bảng thực tế hoặc sử dụng HTML ngữ nghĩa, chuyển cách hiển thị của phần tử thành .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }35 .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; } Điều này hoạt động ngay cả khi cả hai yếu tố có chiều cao không xác định. Tất nhiên, hạn chế chính là nếu bạn cần có một anh chị em không phải là trung tâm, thì có thể gặp khó khăn với các giới hạn nền. Ngoài ra, hãy nhớ rằng điều này hoàn toàn không thành công trên trình đọc màn hình (ngay cả khi đánh dấu của bạn dựa trên div, việc đặt hiển thị CSS thành .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }36 và .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }35 khiến trình đọc màn hình hiểu nó là một bảng thực tế). Vì vậy, nó không phải là tốt nhất khi nói đến khả năng tiếp cận 4. Phương pháp phần tử maMột cách cũ khác không theo kịp vì bất kỳ lý do gì là sử dụng .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }38 với phần tử ma (giả) có 100% chiều cao của phần tử gốc, sau đó đặt .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }39 cho cả phần tử giả và phần tử mà chúng tôi muốn căn giữa .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }3 Nó thực sự hoạt động khá tốt, với điểm nổi bật đáng chú ý nhất là nó di chuyển trung tâm nằm ngang sang bên phải một chút do hành vi luôn co rúm của khoảng trắng giữa các phần tử .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }38 Điều này có thể được giải quyết bằng cách điều chỉnh lề trên phần tử giả. Trong trường hợp của chúng tôi, chúng tôi đã chỉ định .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }81. Chúng ta cũng có thể căn giữa hoàn hảo bằng cách đặt kích thước phông chữ thành .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }30 trên vùng chứa và sau đó đặt lại thành .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }83 hoặc .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }84 trên phần tử .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }8 5. Sử dụng .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); } 7 trên một mục .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; } 1Cuối cùng, khi bước vào lãnh thổ CSS hiện đại, Flexbox đã giới thiệu một hành vi khá tuyệt vời cho lợi nhuận .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }87. Bây giờ, nó không chỉ căn giữa một phần tử theo chiều ngang như đã làm trong bố cục khối, mà còn căn giữa nó trên trục dọc .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }6 Chiến thuật này là một trong những mục yêu thích của tôi vì tính đơn giản của nó. Hạn chế lớn duy nhất là nó sẽ chỉ hoạt động với một phần tử duy nhất 6. Phần tử giả trên vùng chứa .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; } 1Không phải là cách tiếp cận thực tế nhất trên thế giới, nhưng chúng ta cũng có thể sử dụng các phần tử giả, rỗng, linh hoạt để đẩy một phần tử vào trung tâm .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }8 Điều này có thể hữu ích khi chúng ta muốn giữ khoảng cách linh hoạt trên bộ chứa flex hướng cột có nhiều mục Hơn 200 nghìn nhà phát triển sử dụng LogRocket để tạo ra trải nghiệm kỹ thuật số tốt hơnTìm hiểu thêm →7 và 8. Căn chỉnh trên hộp đựng .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; } 1 hoặc vật phẩm .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; } 1Flexbox cũng đã giới thiệu các thuộc tính căn chỉnh thực sự tuyệt vời (hiện được chia thành mô-đun căn chỉnh hộp của riêng chúng) Điều này cho phép chúng tôi kiểm soát cách đặt các mục và cách phân bổ không gian trống theo cách yêu cầu số ma thuật trong CSS cho một số phần tử cụ thể hoặc JavaScript thông minh cho số lượng động Tùy thuộc vào .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }61, chúng tôi có thể sử dụng .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }62 hoặc .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }63 để điều chỉnh khi cần thiết trên thùng chứa .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; }4 Trên một mục linh hoạt cụ thể. .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; }5 Điều này không có nhiều nhược điểm, trừ khi bạn cần hỗ trợ các trình duyệt cũ hơn. IE 11 sẽ hoạt động, nhưng việc triển khai Flexbox của nó khá nhiều lỗi, vì vậy nó phải luôn được xử lý cẩn thận IE 10 yêu cầu công việc bổ sung có cú pháp khác và yêu cầu tiền tố nhà cung cấp .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }64 9. Sử dụng .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); } 34 cho các phần tử nội tuyếnBạn cũng có thể sử dụng thuộc tính vertical-align để căn giữa các phần tử ô nội tuyến, khối nội tuyến hoặc bảng theo chiều dọc. Một trong nhiều ứng dụng của phương pháp này là căn chỉnh theo chiều dọc của hình ảnh với văn bản hoặc căn chỉnh theo chiều dọc nội dung của một ô trong bảng .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; }8
Phương pháp này không hoạt động với phần tử khối có thể là một công cụ giảm giá. Ngoài ra, nó hoạt động khá tốt và cũng được hỗ trợ bởi các trình duyệt cũ hơn Các bài viết hay khác từ LogRocket
10 và 11. Căn chỉnh trên hộp chứa .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; } 5 hoặc vật phẩm .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; } 5Lưới CSS bao gồm khá nhiều tùy chọn căn chỉnh giống như Flexbox, vì vậy chúng ta có thể sử dụng nó trên bộ chứa .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; }5 .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }0 Hoặc chúng ta có thể sử dụng nó chỉ trên một mục cụ thể .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; }5 .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }1 Thiếu hỗ trợ trình duyệt cũ là hạn chế duy nhất của kỹ thuật này 12. Các phần tử giả trên lướiTương tự như giải pháp thay thế Flexbox, chúng ta có thể sử dụng lưới ba hàng với các phần tử giả .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }2 Hãy nhớ rằng .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }80 thực sự có nghĩa là .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }81, vì vậy các hàng trống sẽ không nhất thiết chiếm một phần ba chiều cao của vùng chứa. Chúng sẽ sụp đổ khi cần thiết xuống giá trị tối thiểu là ________ 287, không có nội dung, có nghĩa là ________ 130 Điều này có vẻ giống như một cách tiếp cận ngớ ngẩn, nhưng nó cho phép chúng ta dễ dàng thực hiện một trong những thủ thuật CSS Grid yêu thích của tôi. kết hợp các hàng .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }84 với các hàng .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }85, làm cho các hàng .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }84 trống bị thu gọn trước, tiếp theo là các hàng .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }87 Vì vậy, để các hàng giả lấy các hàng có thể thu gọn hoàn toàn cho phép thuật toán sắp xếp tự động phát huy tác dụng kỳ diệu của nó trên các phần tử thực tế của chúng ta, trừ khi chúng ta cần hỗ trợ IE vốn thiếu tính năng sắp xếp tự động. Điều này dẫn chúng ta đến phương pháp tiếp theo… 13. Vị trí hàng lưới rõ ràngLưới CSS cho phép các mục được đặt rõ ràng trên một hàng cụ thể, do đó, khai báo lưới tương tự như trên và mục được đặt trên hàng thứ hai là đủ .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }3 Điều này có thể hoạt động xuống IE10. Dù bạn có tin hay không, IE là một trong những người hỗ trợ đầu tiên và mạnh mẽ hơn cho lưới CSS, đã đưa nó trở lại vào năm 2011 với IE10. Nó có một cú pháp hoàn toàn khác, nhưng chúng ta có thể làm cho nó hoạt động .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }4 14. .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); } 7 trên một mục .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; } 5Tương tự với Flexbox, áp dụng .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; }40 .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }87 trên mục .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; }5 sẽ căn giữa mục đó trên cả hai trục .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }5 15. .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; } 5 + .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; } 44Những gì tốt nhất được để dành đến sau cùng; .container{ position: relative; } .element{ position: absolute; top: 50%; transform: translateY(-50%); }6
Tuy nhiên, thuộc tính .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; }48 vẫn còn tương đối mới và hỗ trợ trình duyệt có thể là một vấn đề do nó không tương thích với các trình duyệt cũ hơn như IE11 và Chrome 4-58 Một số triển khai (có thể xảy ra) trong tương laiTheo thông số kỹ thuật của Mô-đun căn chỉnh hộp CSS Cấp 3, .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; }49 sẽ hoạt động trên trục khối của vùng chứa .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; }50 và vùng chứa .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; }51, vì vậy (nếu trình duyệt triển khai nó), chúng tôi sẽ có thể căn giữa nội dung của các vùng chứa đó giống như chúng tôi làm trong .container{ display: table; height: 100%; } .element{ display: table-cell; text-align: center; vertical-align: middle; }1 hoặc Phần kết luậnVà đó là nó. Những gì đã từng cực kỳ khó khăn giờ đây có thể đạt được bằng hàng chục cách khác nhau và tôi có thể còn thiếu một vài cách nữa. Nếu bạn biết các kỹ thuật khác, vui lòng chia sẻ chúng trong phần bình luận |