Menu

justify-content và align-items trong CSS: mọi giá trị

justify-content đặt các flex item dọc theo trục chính, còn align-items đặt chúng dọc theo trục phụ. Xem mọi giá trị đặt cạnh nhau, có số đo, cùng lưới căn chỉnh bấm được, align-self và lý do đôi khi justify-content không có tác dụng.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

justify-content và align-items, mỗi thứ một câu

Trong một flex container, justify-content dàn các item dọc theo trục chính (main axis, theo chiều của hàng) còn align-items xếp chúng thẳng hàng trên trục phụ (cross axis, lên xuống trong hàng). Cả hai đều đặt trên container:

Hộp được căn giữa theo cả hai chiều: cách đều mép đầu và mép cuối, cách đều cạnh trên và cạnh dưới. Bỏ height: 140px đi thì align-items: center không còn gì để làm, vì container co lại bằng đúng chiều cao của item.

Mọi giá trị của justify-content, có số đo

Mỗi hàng dưới đây là cùng ba item với một giá trị justify-content khác nhau. Các con số trong nhãn phía trên mỗi hàng là khoảng trống trình duyệt để lại: trước item đầu, giữa các item và sau item cuối.

Container rộng 420px và các item chiếm 180px, nên còn 240px không gian trống. Phần đó đi đâu:

Giá trịKhông gian trống nằm ởKhoảng trống trong demo
flex-start (và start)toàn bộ sau các item0 / 0 / 0 / 240
centernửa trước, nửa sau120 / 0 / 0 / 120
flex-end (và end)toàn bộ trước các item240 / 0 / 0 / 0
space-betweenchỉ giữa các item0 / 120 / 120 / 0
space-aroundbằng nhau ở hai bên mỗi item, nên hai mép nhận một nửa40 / 80 / 80 / 40
space-evenlymọi khoảng bằng nhau, kể cả hai mép60 / 60 / 60 / 60

flex-start đi theo hướng flex còn start đi theo hướng viết. Chúng chỉ khác nhau với row-reverse hoặc column-reverse, khi flex-start nằm ở đầu bị đảo ngược.

Mọi giá trị của align-items

align-items hoạt động theo chiều vuông góc với hàng. Các item dưới đây có chiều cao khác nhau để bạn thấy mỗi giá trị xử lý chúng ra sao:

Giá trịĐiều xảy ra trên trục phụ
stretch (mặc định)Item không đặt chiều cao sẽ giãn ra lấp đầy container
flex-start (và start)Item nằm ở trên cùng, giữ chiều cao riêng
centerItem được căn giữa, giữ chiều cao riêng
flex-end (và end)Item nằm ở dưới cùng
baselineItem dịch chuyển để dòng chữ đầu tiên của chúng chung một đường cơ sở

Trong hộp baseline, ba nhãn "Ag" nằm trên cùng một dòng dù nhãn đầu to hơn và nhãn thứ hai có padding phía trên. Đó là giá trị dành cho một hàng trộn tiêu đề lớn với chữ nhỏ, hoặc một nhãn với một ô nhập.

Bấm để căn chỉnh

Bấm vào bất kỳ ô nào của lưới 3 x 3. Hộp sẽ di chuyển đến đó, và CSS đưa nó đến đó được in ra bên dưới:

Các hàng của bộ chọn thay đổi align-items còn các cột thay đổi justify-content. Ô ở giữa chính là bài toán kinh điển "căn giữa một div".

Trong một cột, hai thuộc tính đổi vai

justify-content luôn đi theo trục chính. Với flex-direction: column, trục chính là chiều dọc, nên justify-content di chuyển item lên xuống còn align-items di chuyển chúng theo chiều ngang:

Nếu bạn nhầm hai thuộc tính, hãy đổi chỗ chúng thay vì viết lại bố cục.

align-self và margin auto: chỉ một item

align-self trên một item ghi đè align-items cho riêng item đó. Flexbox không có justify-self; để di chuyển một item dọc theo trục chính, hãy cho nó một margin auto, thứ chiếm toàn bộ không gian trống ở phía đó:

Item màu xanh lá tự xuống dưới cùng, còn item màu hổ phách bị đẩy về tận cuối hàng trong khi các item khác vẫn ở đầu.

Khi có nhiều dòng: align-content

align-items căn các item bên trong dòng của chúng. Khi container xuống thành nhiều dòng, align-content phân bố khoảng cách giữa chính các dòng, và nhận cùng các giá trị như justify-content. Nó không có tác dụng trong container nowrap, vì dòng duy nhất luôn lấp đầy chiều cao của container. Trang flex-wrap minh họa điều này.

Lỗi thường gặp

  • Nhầm lẫn hai trục. justify-content là hướng các item nối tiếp nhau, align-items là chiều vuông góc với nó. Trong một cột, căn giữa theo chiều dọc là justify-content: center.
  • Không có không gian trống. Một item có flex: 1 chiếm hết không gian, nên justify-content không còn gì để phân bố. Điều tương tự xảy ra khi container là inline-flex và rộng đúng bằng các item.
  • Không có chiều cao cho align-items. Một container cao bằng nội dung không còn chỗ để căn chỉnh. Đặt height hoặc min-height.
  • Tìm justify-self trong flexbox. Thuộc tính này bị bỏ qua ở đó. Dùng margin-inline-start: auto (hoặc margin-left: auto) trên item.
  • align-items: stretch mà không giãn. Item có height riêng sẽ giữ nguyên nó. Bỏ height đi (dùng min-height nếu cần chiều cao tối thiểu).
  • Đặt các thuộc tính trên item. Cả hai đều đặt trên flex container. Chỉ align-self mới đặt trên item.

Câu hỏi thường gặp

justify-content và align-items khác nhau thế nào?

justify-content phân bố các item dọc theo trục chính, tức hướng chúng nối tiếp nhau (ngang với flex-direction: row). align-items đặt vị trí của chúng dọc theo trục phụ (dọc khi là hàng). Trong một cột, hai trục đổi chỗ: justify-content chuyển sang theo chiều dọc.

space-between, space-around và space-evenly khác nhau thế nào?

space-between không để khoảng trống trước item đầu và sau item cuối, phần còn lại chia đều giữa các item. space-around cho mỗi item khoảng trống bằng nhau ở hai bên, nên hai mép chỉ nhận nửa khoảng. space-evenly làm mọi khoảng trống bằng nhau, kể cả hai mép.

Vì sao justify-content không hoạt động?

Thường là vì không còn không gian trống để phân bố: một item có flex-grow hoặc flex: 1, hoặc container chỉ rộng bằng các item (ví dụ display: inline-flex hoặc container được float). Kiểm tra thêm display: flex có nằm trên phần tử cha chứ không phải trên các item.

Vì sao align-items center không căn giữa theo chiều dọc?

Có lẽ container cao đúng bằng nội dung của nó, nên không còn chỗ nào để căn giữa. Hãy cho flex container một chiều cao hoặc min-height, các item sẽ di chuyển vào giữa.

align-self dùng để làm gì?

align-self ghi đè align-items của container cho một item. Ví dụ align-self: flex-end trên một phần tử con chỉ đưa phần tử đó về cuối trục phụ, còn các item khác vẫn ở chỗ align-items đã đặt.

Flexbox có justify-self không?

Không. Flexbox bỏ qua justify-self, vì trục chính được mọi item dùng chung. Để đẩy một item dọc theo trục chính, dùng margin auto, chẳng hạn margin-inline-start: auto. justify-self hoạt động trong grid.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu