5 điểm bởi GN⁺ 2024-02-14 | 3 bình luận | Chia sẻ qua WhatsApp

Cách căn giữa phần tử

  • Việc đặt một phần tử vào chính giữa bên trong phần tử cha từ lâu đã là một vấn đề khá khó xử lý.
  • Khi CSS phát triển, nhiều giải pháp khác nhau đã xuất hiện, và hiện nay có rất nhiều lựa chọn.
  • Hướng dẫn này giúp hiểu các đánh đổi giữa nhiều cách tiếp cận khác nhau, đồng thời cung cấp chiến lược để xử lý việc căn giữa trong mọi tình huống.

Căn giữa bằng margin tự động

  • Khi muốn đặt phần tử vào giữa theo chiều ngang, có thể dùng margin với giá trị auto.
  • Cần giới hạn chiều rộng của phần tử, và fit-content sẽ điều chỉnh kích thước phần tử theo nội dung.
  • Dùng thuộc tính margin-inline sẽ cho phép đặt đồng thời margin-leftmargin-right thành auto.

Căn giữa bằng Flexbox

  • Flexbox cung cấp nhiều mức độ kiểm soát khi phân bổ một nhóm item dọc theo trục chính.
  • Có thể căn giữa một phần tử đơn lẻ theo cả chiều ngang lẫn chiều dọc, và việc căn giữa vẫn được giữ nguyên ngay cả khi phần tử con không vừa với container.
  • Có thể dùng thuộc tính flex-direction để điều khiển hướng xếp chồng của nhiều phần tử con.

Căn giữa trong viewport

  • Có những trường hợp cần đặt phần tử vào chính giữa viewport thay vì bên trong container cha.
  • Có thể dùng position: fixedinset: 0px để cố định phần tử vào viewport, sau đó dùng margin: auto để căn giữa theo cả chiều ngang và chiều dọc.

Căn giữa phần tử có kích thước chưa biết

  • Khi không biết rõ kích thước của phần tử, có thể dùng fit-content để thu nhỏ phần tử theo nội dung.

Căn giữa bằng CSS Grid

  • Cách ngắn gọn nhất để căn giữa phần tử theo cả chiều ngang và chiều dọc bằng CSS Grid là dùng thuộc tính place-content: center.

Điểm khác biệt với Flexbox

  • CSS Grid dùng một thuật toán layout khác, và đôi khi sự phức tạp bổ sung này có thể trở thành vấn đề.
  • Flexbox tính toán phần trăm dựa trên phần tử cha, trong khi CSS Grid tính theo ô lưới.

Căn giữa một chồng phần tử

  • Có thể dùng CSS Grid để gán nhiều phần tử vào cùng một ô, khiến chúng xếp chồng từ sau ra trước.

Căn giữa văn bản

  • Văn bản được CSS xử lý theo cách riêng, và có thể dùng thuộc tính text-align để đặt văn bản vào giữa.

Tương lai của việc căn giữa

  • Thuộc tính align-content cũng đang được triển khai cho Flow layout, giúp kiểm soát việc căn chỉnh nội dung theo hướng block.

Vượt ra ngoài các mẫu có sẵn

  • Nếu hiểu sâu về CSS, bạn có thể dùng trực giác để giải quyết vấn đề thay vì chỉ dựa vào việc ghi nhớ.

Quyết định nên dùng cách nào

  • Nếu muốn căn giữa một phần tử đơn lẻ theo chiều ngang, có thể dùng chiến lược margin tự động trong Flow layout.
  • Nếu muốn căn giữa UI nổi như modal hoặc banner, có thể dùng Positioned layout kết hợp với margin tự động.
  • Nếu muốn căn giữa một chồng phần tử, có thể dùng CSS Grid.
  • Nếu muốn căn giữa văn bản, có thể dùng text-align, và nó cũng có thể kết hợp với các cách khác.
  • Trong hầu hết các tình huống còn lại, có thể dùng Flexbox. Đây là cách linh hoạt nhất, cho phép căn giữa một hoặc nhiều phần tử con theo chiều ngang/dọc.

Ý kiến của GN⁺

  • Điều quan trọng nhất trong bài viết này là giúp người đọc hiểu rõ các cách căn giữa khác nhau trong CSS.
  • Nhờ sự phát triển của CSS, những tác vụ căn giữa từng phức tạp trước đây nay đã trở nên đơn giản hơn rất nhiều, điều này rất hữu ích với các nhà phát triển web.
  • Hiểu và tận dụng các công nghệ CSS hiện đại như Flexbox và CSS Grid đã trở thành kỹ năng thiết yếu trong thiết kế web và xây dựng layout.

3 bình luận

 
v08zbv8fvlkjasdflkj 2024-02-15

Nghĩ lại thì tự dưng mình cũng thấy khó chịu vì ngay cả bài viết trên GeekNews cũng không được căn giữa, hic haha

 
joyfui 2024-02-14

Tôi hay dùng place-items: center;, nhưng hóa ra còn nhiều cách khác nữa.

 
GN⁺ 2024-02-14
Ý kiến trên Hacker News
  • Tóm tắt bình luận thứ nhất:

    • Có nhiều ý kiến khác nhau về lý do tại sao việc căn giữa phần tử bằng CSS lại khó.
    • Khi đa số mọi người hỏi vì sao việc căn giữa lại khó, thực ra họ chỉ đang hỏi cách đặt một phần tử đúng vào chính giữa của một phần tử khác.
    • Trước đây trong HTML, có thể dễ dàng căn giữa bằng thẻ <table>, nhưng trong CSS điều này lại tạo cảm giác khó khăn hơn.
    • Dù CSS được cho là công cụ tốt hơn, việc ngay cả căn giữa cơ bản cũng không làm dễ dàng được khiến người ta thất vọng.
    • Vì lý do đó, đã dùng layout bằng bảng trong một thời gian dài.
    • Dù vậy, vẫn thích CSS.
  • Tóm tắt bình luận thứ hai:

    • Có nhiều người không hiểu được độ phức tạp của việc layout và định dạng trang tự động.
    • Không thể trừu tượng hóa sự phức tạp đó thành kiểu đơn giản "hãy làm đúng như tôi muốn".
    • Lấy trang web của Gwern Branwen làm ví dụ, điều quan trọng là phải giới hạn nội dung sao cho phù hợp với phong cách mong muốn.
    • Layout trang web là một quá trình phức tạp nhằm trình bày nội dung phù hợp với nhiều loại màn hình khác nhau.
    • CSS có thể trông phức tạp với những người quyết định làm web page ngay từ đầu, nhưng thực tế nó mang lại nhiều lựa chọn.
    • Để đạt được kết quả mong muốn, cần tìm đúng công cụ và đóng gói nội dung theo hình thức phù hợp.
  • Tóm tắt bình luận thứ ba:

    • Để hiểu positioning và căn giữa trong CSS, việc hiểu box model sẽ rất hữu ích.
    • Thuộc tính displayposition là nền tảng để học về positioning.
    • MDN có các bài viết hữu ích về chủ đề này.
  • Tóm tắt bình luận thứ tư:

    • Bài viết rất hay, đặc biệt phần tương tác gây ấn tượng mạnh.
    • Đã dùng một website cung cấp cách căn giữa dễ dàng trong CSS suốt thời gian dài.
  • Tóm tắt bình luận thứ năm:

    • "Căn giữa" trong CSS là một vấn đề kinh điển.
    • CSS thiếu sự rõ ràng vì nó là một tập hợp phức tạp được nhiều ủy ban thiết kế đồng thời.
    • CSS tồn tại dưới dạng các mô-đun riêng lẻ trong trạng thái thay đổi liên tục.
    • Đây không phải là cách phát triển phần mềm lý tưởng.
  • Tóm tắt bình luận thứ sáu:

    • Sau hàng chục năm, CSS vẫn chưa đưa ra được cách hiệu quả tương đương việc căn giữa bằng bảng.
    • Trong suốt thời gian đó, việc dùng bảng cho mục đích layout lại bị xem là điều đáng xấu hổ.
  • Tóm tắt bình luận thứ bảy:

    • Nhiều người có bất mãn với CSS.
    • Vấn đề chính là các chỉ thị style xung đột với nhau hoặc thất bại mà không tạo ra bất kỳ hiệu ứng nào.
  • Tóm tắt bình luận thứ tám:

    • Như bài viết đã nhắc đến, Flexbox giải quyết vấn đề căn giữa trong các trường hợp đơn giản.
    • Nếu Flexbox không giải quyết được, thì đó là vì bạn đang làm thứ gì đó phức tạp hơn việc căn giữa đơn thuần.
  • Tóm tắt bình luận thứ chín:

    • Cách chính mà họ dùng để căn giữa là position: absolute, left: 50%, transform: translateX(-50%).
  • Tóm tắt bình luận thứ mười:

    • Việc căn giữa div trong CSS quá khó là lý do họ đã từ bỏ phát triển web.