Làm cách nào tôi có thể tạo cho trẻ em Flexbox 100% chiều cao của bố mẹ?


459

Tôi đang cố gắng lấp đầy không gian dọc của vật phẩm flex bên trong Flexbox.

.container {
  height: 200px;
  width: 500px;
  display: flex;
  flex-direction: row;
}
.flex-1 {
  width: 100px;
  background-color: blue;
}
.flex-2 {
  position: relative;
  flex: 1;
  background-color: red;
}
.flex-2-child {
  height: 100%;
  width: 100%;
  background-color: green;
}
<div class="container">
  <div class="flex-1"></div>
  <div class="flex-2">
    <div class="flex-2-child"></div>
  </div>
</div>

Và đây là JSFiddle

flex-2-child không lấp đầy chiều cao yêu cầu ngoại trừ trong hai trường hợp:

  1. flex-2 có chiều cao 100% (điều này thật kỳ lạ vì một mục flex có 100% theo mặc định + đó là lỗi trong Chrome)
  2. flex-2-child có một vị trí tuyệt đối mà cũng bất tiện

Điều này hiện không hoạt động trong Chrome hoặc Firefox.


vấn đề với việc sử dụng chiều cao là gì: 100%; cho .flex-2?
rmagnum2002

Nó bất chấp mục đích của mục flex là tự điền nội dung và nó mang lại cho tôi lỗi kỳ lạ nhất trong chrome khi chiều cao trở về 0 mỗi khi tôi thay đổi kích thước cửa sổ
Raz

3
Trên thực tế, phiên bản mới nhất của Firefox là phiên bản duy nhất hoạt động bình thường
Raz

1
Hiện tại, có sự khác biệt đáng kể về hành vi giữa các trình duyệt khi nói đến việc hiển thị chiều cao phần trăm trong flexbox: stackoverflow.com/a/35537510/3597276
Michael Benjamin

2
Đúng, Chrome có một số vấn đề, đặc biệt là với các flexbox lồng nhau. Ví dụ: tôi đã có một hộp flex lồng nhau có trẻ em height:100%nhưng chúng được hiển thị với chiều cao tự nhiên thay thế. Và điều kỳ lạ là nếu tôi thay đổi chiều cao của chúng thành auto, thì chúng sẽ hiển thị height:100%giống như tôi đang cố gắng làm. Nó chắc chắn không trực quan nếu đó là cách nó nên hoạt động.
trusktr

Câu trả lời:


237

Sử dụng align-items: stretch

Tương tự như câu trả lời của David Store, cách giải quyết của tôi là:

.flex-2 {
    display: flex;
    align-items: stretch;
}

Ngoài ra align-items, bạn có thể sử dụng align-selfchỉ trên .flex-2-childmục bạn muốn kéo dài.


7
stretch: đây nên là câu trả lời được chọn
Dave Everitt

1
Chắc chắn đây là câu trả lời tốt nhất cho câu hỏi. Hoạt động hoàn hảo.
marcias

Vâng, đây thực sự là câu trả lời tốt nhất cho câu hỏi này.
yvind Bråthen

20
đừng quên xóa height: 100%khỏi thành phần trẻ em mà bạn muốn có cùng chiều cao với cha mẹ
Ilham Wahabi GX

Vui lòng thêm xóa height: 100%vào câu trả lời - Tôi gần như đã bỏ cuộc và chỉ nhìn thấy điều này vào giây phút cuối cùng trước khi quay trở lại absolute- đi kèm với tất cả các loại vấn đề.
Peter

274

Tôi đã trả lời một câu hỏi tương tự ở đây .

Tôi biết bạn đã nói position: absolute;là bất tiện nhưng nó hoạt động. Xem bên dưới để biết thêm thông tin về khắc phục vấn đề thay đổi kích thước.

Cũng xem jsFiddle này để xem bản demo, mặc dù tôi mới chỉ thêm tiền tố webkit để mở trong Chrome.

Về cơ bản bạn có 2 vấn đề mà tôi sẽ giải quyết riêng.

  1. Bắt con của một vật phẩm flex để lấp đầy chiều cao 100%
    • Đặt position: relative;trên cha mẹ của đứa trẻ.
    • Đặt position: absolute;lên con.
    • Sau đó, bạn có thể đặt chiều rộng / chiều cao theo yêu cầu (100% trong mẫu của tôi).
  2. Sửa lỗi thay đổi kích thước cuộn "quirk" trong Chrome
    • Đặt overflow-y: auto;trên div có thể cuộn.
    • Div có thể cuộn phải có chiều cao rõ ràng được chỉ định. Mẫu của tôi đã có chiều cao 100% nhưng nếu không có mẫu nào được áp dụng, bạn có thể chỉ địnhheight: 0;

Xem câu trả lời này để biết thêm thông tin về vấn đề cuộn.


10
Điểm 1) hoạt động hoàn hảo trong Chrome, Firefox không cần vị trí tuyệt đối.
yuri

223

Nếu tôi hiểu chính xác, bạn muốn flex-2-con lấp đầy chiều cao và chiều rộng của bố mẹ nó, để vùng màu đỏ được bao phủ hoàn toàn bởi màu xanh lá cây?

Nếu vậy, bạn chỉ cần đặt flex-2 để sử dụng flexbox:

.flex-2 {
    display: flex;  
}

Sau đó bảo flex-2-child trở nên linh hoạt:

.flex-2-child {    
    flex: 1;
}

Xem http://jsfiddle.net/2ZDuE/10/

Lý do là flex-2-child không phải là một mục flexbox, mà là cha mẹ của nó.


Làm thế nào tôi có thể làm như vậy, chỉ với chiều cao 100% và mỗi đứa trẻ là 50/50?
Ricky Levi

7
Xin lưu ý rằng nếu bạn sử dụng "align-items: centre", bạn sẽ không thể sử dụng bản sửa lỗi này vì các mục của bạn giờ sẽ có chiều cao bằng nhau.
Neil Monroe

10
@NeilMonroe Bạn vẫn có thể sử dụng align-items: centernếu bạn chỉ sử dụng align-self: stretchcho một đứa trẻ.
BT

1
Xin chào @David, tôi đã thử giải pháp của bạn, nó hoạt động tốt cho flex-direction: layout layout, có vẻ như không hoạt động với flex-direction: layout layout, hoặc tôi có bất kỳ chỗ nào sai trong mã. Bạn có thể giúp kiểm tra tại sao trong fiddle jsfiddle.net/78o54Lmv này , hộp bên trong sẽ không chiếm toàn bộ chiều cao của cha mẹ không?
huan feng

Tôi phải thêm min-height: 100vh;vào .flex-2phần tử để làm cho nó hoạt động. Cảm ơn đã giúp đỡ!
Tenacityd93

24

Tôi cho rằng hành vi của Chrome phù hợp hơn với thông số CSS (mặc dù nó ít trực quan hơn). Theo thông số kỹ thuật của Flexbox, stretchgiá trị mặc định của thuộc align-selftính chỉ thay đổi giá trị được sử dụng của "thuộc tính kích thước chéo" của phần tử ( heighttrong trường hợp này). Và, như tôi hiểu thông số CSS2.1 , chiều cao phần trăm được tính từ giá trị được chỉ định của cha mẹ height, không phải giá trị được sử dụng. Giá trị được chỉ định của cha mẹ heightkhông bị ảnh hưởng bởi bất kỳ thuộc tính flex nào và vẫnauto .

Cài đặt rõ ràng height: 100%giúp chính thức có thể tính chiều cao phần trăm của trẻ, giống như cài đặt height: 100%để htmlcó thể tính chiều cao phần trăm của bodyCSS2.1.


2
Chính xác! Để đưa điều này vào thực tế, chỉ cần thêm height:100%vào .flex-2. Đây là jsfiddle .
CourtDemone

7
Hành vi của Chrome phù hợp hơn với cách diễn giải thông số CSS của Nhóm Chrome . Mặc dù có thể được giải thích theo cách đó, có nhiều cách tốt hơn để diễn giải nó, bất kỳ cách nào trong số đó sẽ không khiến chúng ta bị mắc kẹt trong thị trường này, hành vi gây phiền nhiễu và khó chịu. Họ nên nghĩ về nó nhiều hơn
WraithKenny

1
@RickDoesburg, điều này đã hơn một năm trước, nhưng tôi tin rằng tôi đã phải dùng đến các yếu tố chiều cao cố định. Tôi ước những trình duyệt này sẽ có được hành động của họ với nhau. Tôi thực sự bắt đầu không thích không gian di động.
Jordan

1
Đặt một đứa trẻ của hộp chứa flexbox dọc height: 100%sẽ mang lại kết quả rất kỳ lạ cho tôi trong Chrome. Dường như điều này làm cho "chiều cao được chỉ định" được đặt thành tổng chiều cao của vùng chứa , thay vì chiều cao của chính phần tử, do đó gây ra cuộn không mong muốn khi các phần tử khác có kích thước được tính tương đối với nó.
Jules

13

Tôi tự tìm giải pháp, giả sử bạn có CSS ​​bên dưới:

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

.child {
  height: 100%; <- didn't work
}

Trong trường hợp này, cài đặt chiều cao 100% sẽ không hoạt động, vì vậy, những gì tôi làm là đặt margin-bottomquy tắc thành auto, như:

.child {
  margin-bottom: auto;
}

và đứa trẻ sẽ được sắp xếp theo chiều cao nhất của cha mẹ, bạn cũng có thể sử dụng align-selfquy tắc này nếu bạn thích.

.child {
  align-self: flex-start;
}

Một bản hack hay, nhưng vấn đề là: nếu con là thanh bên và nó có màu nền thì không gian lề vẫn là màu trắng.
Boris Burkov

Điều tuyệt vời về giải pháp này là chiều cao của cha mẹ có thể năng động! Các giải pháp trước đó yêu cầu cha mẹ phải có chiều cao được thiết lập. Cám ơn vì cái này.
Bribbons

4

Một ý tưởng sẽ là display:flex;với flex-direction: row;được lấp đầy containerdiv với .flex-1.flex-2, nhưng điều đó không có nghĩa là .flex-2có một mặc định height:100%;ngay cả khi nó được mở rộng với chiều cao đầy đủ và có một phần tử con ( .flex-2-child) với height:100%;bạn sẽ cần phải thiết lập các phụ huynh đến height:100%;hoặc sử dụng display:flex;với flex-direction: row;trên.flex-2 div cũng vậy.

Từ những gì tôi biết display:flex sẽ không mở rộng tất cả các yếu tố con của bạn lên 100%.

Một bản demo nhỏ, đã loại bỏ chiều cao từ .flex-2-childvà được sử dụng display:flex;trên .flex-2: http://jsfiddle.net/2ZDuE/3/


3

html

<div class="container">
    <div class="flex-1"></div>
    <div class="flex-2">
        <div class="flex-2-child"></div>
    </div>
</div>

css

.container {
    height: 200px;
    width: 500px;
    display: -moz-box;
    display: -webkit-flexbox;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: -moz-flex;
    display: flex;
    -webkit-flex-direction: row;
    -moz-flex-direction: row;
    -ms-flex-direction: row;
    flex-direction: row;
}
.flex-1 {
   flex:1 0 100px;
    background-color: blue;
}
.flex-2 {
    -moz-box-flex: 1;
    -webkit-flex: 1;
    -moz-flex: 1;
    -ms-flex: 1;
    flex: 1 0 100%;
    background-color: red;
}
.flex-2-child {
    flex: 1 0 100%;
    height:100%;
    background-color: green;
}

http://jsfiddle.net/2ZDuE/750/


0

Điều này cũng có thể được giải quyết với align-self: stretch;yếu tố chúng ta muốn được kéo dài.

Đôi khi, chỉ nên kéo dài một mục trong thiết lập flexbox.

.container {
  height: 200px;
  width: 500px;
  display: flex;
  flex-direction: row;
}
.flex-1 {
  width: 100px;
  background-color: blue;
}
.flex-2 {
  position: relative;
  flex: 1;
  align-self: stretch;
  background-color: red;
}
.flex-2-child {
  background-color: green;
}
<div class="container">
  <div class="flex-1"></div>
  <div class="flex-2">
    <div class="flex-2-child"></div>
  </div>
</div>


-7

.thùng đựng hàng { . . . . align-item: kéo dài; . . . . }


5
Chào mừng đến với stackoverflow. Bạn cần giải thích đầy đủ câu trả lời của bạn và những gì nó đóng góp khác với câu trả lời hiện có. Xem stackoverflow.com/help/how-to-answer
Simon.SA

1
Câu trả lời của bạn có vẻ giống như của BT (được viết sớm hơn ba năm) nhưng được thể hiện kém hơn nhiều.
Quentin

-12

Đây là giải pháp của tôi bằng cách sử dụng css +

Trước hết, nếu con đầu tiên (flex-1) không nên là 100px. Trong css + trên thực tế, bạn có thể đặt các phần tử linh hoạt và / hoặc tĩnh (cột hoặc hàng) và ví dụ của bạn trở nên dễ dàng như sau:

<div class="container">
  <div class="EXTENDER">
    <div class="COLS">
      <div class="CELL _100px" style="background-color:blue">100px</div>
      <div class="CELL _FLEX" style="background-color:red">flex</div>
    </div>
  </div>
</div>

container css:

.container {
    height: 200px;
    width: 500px;
    position:relative;
}

và rõ ràng bao gồm css + 0,2 lõi

nghe câu đố

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.