Flexbox: trung tâm theo chiều ngang và chiều dọc


669

Cách căn giữa div theo chiều ngang và chiều dọc trong thùng chứa bằng flexbox. Trong ví dụ dưới đây, tôi muốn mỗi số nằm dưới nhau (theo hàng), được căn giữa theo chiều ngang.

.flex-container {
  padding: 0;
  margin: 0;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: center;
}
row {
  width: 100%;
}
.flex-item {
  background: tomato;
  padding: 5px;
  width: 200px;
  height: 150px;
  margin: 10px;
  line-height: 150px;
  color: white;
  font-weight: bold;
  font-size: 3em;
  text-align: center;
}
<div class="flex-container">
  <div class="row">
    <span class="flex-item">1</span>
  </div>
  <div class="row">
    <span class="flex-item">2</span>
  </div>
  <div class="row">
    <span class="flex-item">3</span>
  </div>
  <div class="row">
    <span class="flex-item">4</span>
  </div>
</div>

http://codepen.io/anon/pen/zLxBo



Trong CSS của bạn, bạn row{không có hiệu lực trên các hàng. Nếu bạn thay đổi nó thành .row{kết quả sẽ hoàn toàn khác nhau.
Hamid Mayeli

Câu trả lời:


750

Tôi nghĩ rằng bạn muốn một cái gì đó như sau.

html, body {
    height: 100%;
}
body {
    margin: 0;
}
.flex-container {
    height: 100%;
    padding: 0;
    margin: 0;
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    align-items: center;
    justify-content: center;
}
.row {
    width: auto;
    border: 1px solid blue;
}
.flex-item {
    background-color: tomato;
    padding: 5px;
    width: 20px;
    height: 20px;
    margin: 10px;
    line-height: 20px;
    color: white;
    font-weight: bold;
    font-size: 2em;
    text-align: center;
}
<div class="flex-container">
    <div class="row"> 
        <div class="flex-item">1</div>
        <div class="flex-item">2</div>
        <div class="flex-item">3</div>
        <div class="flex-item">4</div>
    </div>
</div>

Xem bản demo tại: http://jsfiddle.net/audetwebdesign/tFscL/

Các .flex-itemyếu tố của bạn phải là cấp độ khối ( divthay vì span) nếu bạn muốn phần đệm chiều cao và đỉnh / đáy hoạt động chính xác.

Ngoài ra, trên .row, đặt chiều rộng thành autothay vì 100%.

.flex-containerTài sản của bạn là tốt.

Nếu bạn muốn .rowđặt chính giữa theo chiều dọc trong cổng xem, chỉ định 100% chiều cao cho htmlbody, cũng như không có bodylề.

Lưu ý rằng .flex-containercần có chiều cao để xem hiệu ứng căn chỉnh dọc, nếu không, vùng chứa sẽ tính chiều cao tối thiểu cần thiết để bao quanh nội dung, nhỏ hơn chiều cao cổng xem trong ví dụ này.

Chú thích:
Các flex-flow, flex-direction, flex-wrapthuộc tính có thể đã thực hiện thiết kế này dễ thực hiện hơn. Tôi nghĩ rằng .rowcontainer không cần thiết trừ khi bạn muốn thêm một số kiểu dáng xung quanh các thành phần (hình nền, đường viền, v.v.).

Một tài nguyên hữu ích là: http://demo.agektmr.com/flexbox/


5
Các mục linh hoạt không cần phải ở cấp độ khối trừ khi nội dung chúng chứa yêu cầu. Ngoài ra, bạn đã thêm tiền tố vào tất cả các thuộc tính hiển thị, nhưng không có tiền tố bất kỳ thuộc tính Flexbox nào khác (có các tên khác nhau trong các bản nháp khác).
cimmanon

1
@cimmanon Tôi đồng ý với bạn về cấp độ khối và tôi đã chỉnh sửa bài đăng của mình cho phù hợp. Cấp độ khối không bắt buộc để căn chỉnh nhưng có thể cần thiết nếu người dùng muốn chỉ định chiều cao, v.v. Tôi đã tự do về các tiền tố trình duyệt, tôi chỉ giả sử một trình duyệt hoàn hảo cho mục đích đến một bản demo hoạt động. Cảm ơn bạn một lần nữa cho ý kiến ​​của bạn, đánh giá cao thông tin phản hồi.
Marc Audet

1
Nếu nó tràn ra, nó cắt ngọn. i.imgur.com/3dgFfQK.png Có cách nào để tránh điều này không?
Brian Gates

1
@BrianGates Nếu chiều cao của cửa sổ quá ngắn, bạn muốn 4 phần tử được hiển thị như thế nào, 2x2, 1x4?
Marc Audet

2
Giải pháp có tại đây: stackoverflow.com/questions/24538100/ Kẻ
Brian Gates

252

Cách trung tâm các phần tử theo chiều dọc và chiều ngang trong Flexbox

Dưới đây là hai giải pháp định tâm chung.

Một cho các mục flex được căn chỉnh theo chiều dọc ( flex-direction: column) và một cho các mục flex được căn chỉnh theo chiều ngang ( flex-direction: row).

Trong cả hai trường hợp, chiều cao của div trung tâm có thể thay đổi, không xác định, không xác định, bất cứ điều gì. Chiều cao của div trung tâm không quan trọng.

Đây là HTML cho cả hai:

<div id="container"><!-- flex container -->

    <div class="box" id="bluebox"><!-- flex item -->
        <p>DIV #1</p>
    </div>

    <div class="box" id="redbox"><!-- flex item -->
        <p>DIV #2</p>
    </div>

</div>

CSS (không bao gồm các kiểu trang trí)

Khi các mục flex được xếp theo chiều dọc:

#container {
    display: flex;           /* establish flex container */
    flex-direction: column;  /* make main axis vertical */
    justify-content: center; /* center items vertically, in this case */
    align-items: center;     /* center items horizontally, in this case */
    height: 300px;
}

.box {
    width: 300px;
    margin: 5px;
    text-align: center;     /* will center text in <p>, which is not a flex item */
}

nhập mô tả hình ảnh ở đây

BẢN GIỚI THIỆU


Khi các mục flex được xếp theo chiều ngang:

Điều chỉnh flex-directionquy tắc từ mã trên.

#container {
    display: flex;
    flex-direction: row;     /* make main axis horizontal (default setting) */
    justify-content: center; /* center items horizontally, in this case */
    align-items: center;     /* center items vertically, in this case */
    height: 300px;
}

nhập mô tả hình ảnh ở đây

BẢN GIỚI THIỆU


Căn giữa nội dung của các mục flex

Phạm vi của bối cảnh định dạng flex được giới hạn trong mối quan hệ cha-con. Hậu duệ của một container flex ngoài trẻ em không tham gia vào bố trí flex và sẽ bỏ qua các thuộc tính flex. Về cơ bản, tính chất flex không được thừa kế ngoài trẻ em.

Do đó, bạn sẽ luôn cần phải áp dụng display: flexhoặc display: inline-flexcho một phần tử cha để áp dụng các thuộc tính flex cho trẻ.

Để văn bản trung tâm theo chiều dọc và / hoặc chiều ngang hoặc nội dung khác có trong một mục flex, hãy đặt mục đó thành một thùng chứa flex (lồng nhau) và lặp lại các quy tắc định tâm.

.box {
    display: flex;
    justify-content: center;
    align-items: center;        /* for single line flex container */
    align-content: center;      /* for multi-line flex container */
}

Thêm chi tiết tại đây: Làm cách nào để căn chỉnh văn bản theo chiều dọc trong một flexbox?

Ngoài ra, bạn có thể áp dụng margin: autocho thành phần nội dung của mục flex.

p { margin: auto; }

Tìm hiểu về autolề flex tại đây: Phương pháp căn chỉnh các mục Flex (xem hộp số 56).


Định tâm nhiều dòng vật phẩm flex

Khi một thùng chứa flex có nhiều dòng (do bao bọc), thuộc align-contenttính sẽ cần thiết cho việc căn chỉnh trục chéo.

Từ thông số kỹ thuật:

8.4. Đóng gói Flex Lines: align-content tài sản

Các align-contentbất động sản Canh lề đường một container flex trong container flex khi có thêm không gian trong cross-trục, tương tự như cách justify-contentCanh lề mục riêng lẻ trong chính trục. Lưu ý, thuộc tính này không có hiệu lực đối với thùng chứa flex dòng đơn.

Thêm chi tiết tại đây: Làm thế nào để flex-quấn hoạt động với align-self, align-item và align-content?


Hỗ trợ trình duyệt

Flexbox được hỗ trợ bởi tất cả các trình duyệt chính, ngoại trừ IE <10 . Một số phiên bản trình duyệt gần đây, như Safari 8 và IE10, yêu cầu tiền tố của nhà cung cấp . Để biết cách nhanh chóng để thêm tiền tố, hãy sử dụng Autoprefixer . Thêm chi tiết trong câu trả lời này .


Giải pháp định tâm cho các trình duyệt cũ hơn

Đối với một giải pháp định tâm thay thế bằng cách sử dụng bảng CSS và các thuộc tính định vị, hãy xem câu trả lời này: https://stackoverflow.com/a/31977476/3597276


chúng ta có thể làm nó theo chiều ngang phải, trái và dọc trung tâm không?
kapil

2
@kapil, điều chỉnh thuộc tính nội dung biện minh thành không gian giữa hoặc không gian xung quanh ... jsfiddle.net/8o29y7pd/105
Michael Benjamin

3
Câu trả lời này nên được đưa lên hàng đầu. Sử dụng Flex nên là cách ưa thích để thực hiện việc này, vì nó có tỷ lệ độc đáo trên các thiết bị và màn hình. Nó dễ dàng hơn nhiều so với việc sử dụng phao và quản lý nhiều div tuân thủ điều đó.
SeaWar Warrior404

Tức là 11 không hoạt động trung tâm ngang và dọc đúng cách
giveJob

1
Câu trả lời hoàn hảo, có lẽ là tốt nhất trên Google!
JAN

43

Thêm vào

.container {
    display: flex;
    justify-content: center;
    align-items: center;
}

đến phần tử container của bất cứ thứ gì bạn muốn làm trung tâm. Tài liệu: justify-contentalign-items .


3
Cảm ơn câu trả lời ngắn gọn. Mặc dù tất cả các thông báo ở trên đều ổn, nhưng 3 dòng này chính xác là những gì tôi đến đây để tìm kiếm (tốt, display: inline-flextrong trường hợp của tôi, nhưng đó là một chỉnh sửa dễ dàng.)
Jeff Ward

27

Đừng quên sử dụng các thuộc tính cụ thể của trình duyệt quan trọng:

align-item: trung tâm; ->

-webkit-box-align: center;
-moz-box-align: center;
-ms-flex-align: center;
-webkit-align-items: center;
align-items: center;

justify-content: trung tâm; ->

-webkit-box-pack: center;
-moz-box-pack: center;
-ms-flex-pack: center;
-webkit-justify-content: center;
justify-content: center;

Bạn có thể đọc hai liên kết này để hiểu rõ hơn về flex: http://css-tricks.com/almanac/properIES/j/justify-content/http://ptb2.me/flexbox/

Chúc may mắn.


1
đây là một điểm tốt, hôm nay (chỉ hỗ trợ các trình duyệt mới nhất) bạn chỉ cần hai dòng cuối cùng -webkit .. cho safari và cuối cùng cho tất cả các trình duyệt khác
Pete Kozak

1
+1 vì các bản nháp hoạt động năm 2009 và tháng 3 năm 2012 vẫn có tỷ lệ người dùng đáng kể (kết hợp khoảng 8% theo caniuse.com ).
benebun

Flext không hoạt động ở safari, làm thế nào bạn có thể giải quyết vấn đề đó?
dùng3378649

Tôi đã kiểm tra phiên bản safari cuối cùng trên windows nhiều ngày trước và tôi không nhớ rõ lắm, nhưng tôi sẽ kiểm tra và sẽ nói với bạn. Chỉ xin vui lòng cho tôi biết phiên bản của safari bạn có nghĩa là gì? và trên hệ điều hành nào?
QMaster

@ user3378649 Phiên bản safari mới nhất có thể hỗ trợ Flex-box, Vui lòng xem liên kết này: caniuse.com/#search=flexbox
QMaster

15

1 - Đặt CSS trên div cha thành display: flex;

2 - Đặt CSS trên div cha thành flex-direction: column;
Lưu ý rằng điều này sẽ làm cho tất cả nội dung trong dòng div đó từ trên xuống dưới. Điều này sẽ hoạt động tốt nhất nếu div cha chỉ chứa con và không có gì khác.

3 - Đặt CSS trên div cha thành justify-content: center;

Dưới đây là một ví dụ về giao diện của CSS:

.parentDivClass {
  display: flex;
  flex-direction: column;
  justify-content: center;
}



8

diplay: flex;cho nó container và margin:auto;cho nó hoạt động hoàn hảo.

LƯU Ý: Bạn phải thiết lập widthheightđể xem hiệu ứng.

#container{
  width: 100%; /*width needs to be setup*/
  height: 150px; /*height needs to be setup*/
  display: flex;
}

.item{
  margin: auto; /*These will make the item in center*/
  background-color: #CCC;
}
<div id="container">
   <div class="item">CENTER</div>
</div>


3

Nếu bạn cần căn giữa một văn bản trong một liên kết, điều này sẽ thực hiện thủ thuật:

div {
  display: flex;

  width: 200px;
  height: 80px;
  background-color: yellow;
}

a {
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center; /* only important for multiple lines */

  padding: 0 20px;
  background-color: silver;
  border: 2px solid blue;
}
<div>
  <a href="#">text</a>
  <a href="#">text with two lines</a>
</div>


1
Ngọt! Đôi khi tôi cảm thấy rằng tôi quá đổ cho Flexbox.) Giả sử tôi cần thực hành nhiều hơn, một số logic của nó vẫn chưa rõ ràng. Cảm ơn, Leo!
Zoltán

3

margin: autohoạt động hoàn hảo với flexbox. Nó tập trung theo chiều dọc và chiều ngang.

html, body {
  height: 100%;
  max-height: 100%;
}

.flex-container {
  display: flex;
    
  height: 100%;
  background-color: green;
}

.container {
  display: flex;
  margin: auto;
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS</title>
</head>
<body>
  <div class="flex-container">
    <div class="container">
      <div class="row">
        <span class="flex-item">1</span>
      </div>
      <div class="row">
        <span class="flex-item">2</span>
      </div>
      <div class="row">
        <span class="flex-item">3</span>
      </div>
     <div class="row">
        <span class="flex-item">4</span>
    </div>
  </div>  
</div>
</body>
</html>


1

KẾT QUẢ: Mã

HTML:

<div class="flex-container">
  <div class="rows">

    <div class="row">
      <span class="flex-item">1</span>
    </div>
    <div class="row">
      <span class="flex-item">2</span>
    </div>
    <div class="row">
      <span class="flex-item">3</span>
    </div>
    <div class="row">
      <span class="flex-item">4</span>
    </div>

  </div>  
</div>

CSS:

html, body {
  height: 100%;  
}

.flex-container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100%;
}

.rows {
  display: flex;
  flex-direction: column;
}

trong đó flex-containerdiv được sử dụng để căn giữa theo chiều dọc và chiều ngang của rowsdiv của bạn và rowsdiv được sử dụng để nhóm các "mục" của bạn và sắp xếp chúng theo một cột dựa trên cột.


0
    .flex-container {
  padding: 0;
  margin: 0;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: center;
}
row {
  width: 100%;
}
.flex-item {
  background: tomato;
  padding: 5px;
  width: 200px;
  height: 150px;
  margin: 10px;
  line-height: 150px;
  color: white;
  font-weight: bold;
  font-size: 3em;
  text-align: center;
}

Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Piotr Labunski

-7

Sử dụng CSS +

<div class="EXTENDER">
  <div class="PADDER-CENTER">
    <div contentEditable="true">Edit this text...</div>
  </div>
</div>

hãy xem TẠI ĐÂY


1
vì điều này dễ dàng và được hỗ trợ rộng rãi bởi các trình duyệt hiện đại với flexbox thuần túy, giải pháp thư viện của bạn chắc chắn là không cần thiết. Đặc biệt là khi anh hỏi làm thế nào để làm điều đó bằng cách sử dụng hộp flex chứ không phải thư viện css.
bungleofsketches
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.