Làm cách nào để bố trí flexbox chiếm 100% không gian dọc?


102

Làm cách nào để biết một hàng bố cục flexbox sử dụng không gian dọc còn lại trong cửa sổ trình duyệt?

Tôi có bố cục flexbox 3 hàng. Hai hàng đầu tiên có chiều cao cố định, nhưng hàng thứ 3 là động và tôi muốn nó phát triển đến chiều cao đầy đủ của trình duyệt.

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

Tôi có một flexbox khác ở hàng-3 tạo ra một tập hợp các cột. Để điều chỉnh chính xác các phần tử trong các cột này, tôi cần chúng hiểu toàn bộ chiều cao của trình duyệt - đối với những thứ như màu nền và căn chỉnh mục ở cơ sở. Bố cục chính cuối cùng sẽ giống như sau:

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

.vwrapper {
    display: flex;
    flex-direction: column;
    flex-wrap: nowrap;
    justify-content: flex-start;
    align-items: stretch;
    align-content: stretch;
    //height: 1000px;
}
.vwrapper #row1 {
    background-color: red;
}
.vwrapper #row2 {
    background-color: blue;
}
.vwrapper #row3 {
    background-color: green;
    flex 1 1 auto;
    display: flex;
}
.vwrapper #row3 #col1 {
    background-color: yellow;
    flex 0 0 240px;
}
.vwrapper #row3 #col2 {
    background-color: orange;
    flex 1 1;
}
.vwrapper #row3 #col3 {
    background-color: purple;
    flex 0 0 240px;
}
<body>
    <div class="vwrapper">
        <div id="row1">
            this is the header
        </div>
        <div id="row2">
            this is the second line
        </div>
        <div id="row3">
            <div id="col1">
                col1
            </div>
            <div id="col2">
                col2
            </div>
            <div id="col3">
                col3
            </div>
        </div>
    </div>
</body>

Tôi đã thử thêm một heightthuộc tính, thuộc tính này hoạt động khi tôi đặt nó thành số cứng nhưng không hoạt động khi tôi đặt nó thành 100%. Tôi hiểu height: 100%là không hoạt động, vì nội dung không lấp đầy cửa sổ trình duyệt, nhưng tôi có thể tái tạo ý tưởng bằng cách sử dụng bố cục flexbox không?


2
Ủng hộ cho hình ảnh, bạn đã tạo ra chúng như thế nào?
Jonathan

2
OmniGraffle và Pixelmator để sửa lỗi.
Evil Closet Monkey

Câu trả lời:


115

Bạn nên thiết lập heightcủa html, body, .wrapperđể 100%(để chiều cao đầy đủ kế thừa) và sau đó chỉ cần thiết lập một flexlớn hơn giá trị hơn 1để .row3và không phải trên những người khác.

.wrapper, html, body {
    height: 100%;
    margin: 0;
}
.wrapper {
    display: flex;
    flex-direction: column;
}
#row1 {
    background-color: red;
}
#row2 {
    background-color: blue;
}
#row3 {
    background-color: green;
    flex:2;
    display: flex;
}
#col1 {
    background-color: yellow;
    flex: 0 0 240px;
    min-height: 100%;/* chrome needed it a question time , not anymore */
}
#col2 {
    background-color: orange;
    flex: 1 1;
    min-height: 100%;/* chrome needed it a question time , not anymore */
}
#col3 {
    background-color: purple;
    flex: 0 0 240px;
    min-height: 100%;/* chrome needed it a question time , not anymore */
}
<div class="wrapper">
    <div id="row1">this is the header</div>
    <div id="row2">this is the second line</div>
    <div id="row3">
        <div id="col1">col1</div>
        <div id="col2">col2</div>
        <div id="col3">col3</div>
    </div>
</div>

BẢN GIỚI THIỆU


Bất kỳ cách nào để làm điều này trong khi cũng có các div nội dung mở rộng để lấp đầy nội dung của chúng? Đã yêu cầu ví dụ của bạn ở đây .
iameli

@iameli, sử dụng chiều cao tối thiểu cho chrome thay vì chiều cao fiddle.jshell.net/Lhhh3wde/1
G-Cyrillus

2
JSFiddle được môi giới
Joel Peltonen

Đây là bản demo codepen đang hoạt động: codepen.io/mprinc/pen/JjGQvae và giải thích cho câu hỏi tương tự: stackoverflow.com/a/63174085/257561
mPrinC

fiddle được thay thế bằng một codepen không được biến mất, đó là một bản sao của đoạn mã. Lưu ý rằng chiều cao tối thiểu không còn cần thiết trong phiên bản chrome ngày nay.
G-Cyrillus

18

đặt trình bao bọc thành chiều cao 100%

.vwrapper {
  display: flex;
  flex-direction: column;

  flex-wrap: nowrap;
  justify-content: flex-start;
  align-items: stretch;
  align-content: stretch;

  height: 100%;
}

và đặt hàng thứ 3 để phát triển linh hoạt

#row3 {
   background-color: green;
   flex: 1 1 auto;
   display: flex;
}

bản giới thiệu


3
Trong trường hợp của tôi, html, body, .wrapper {height: 100%; } đang làm việc. không chỉ wrapper hoạt động.
gnganpath

1

Hãy để tôi chỉ cho bạn một cách khác hiệu quả 100%. Tôi cũng sẽ thêm một số phần đệm cho ví dụ.

<div class = "container">
  <div class = "flex-pad-x">
    <div class = "flex-pad-y">
      <div class = "flex-pad-y">
        <div class = "flex-grow-y">
         Content Centered
        </div>
      </div>
    </div>
  </div>
</div>

.container {
  position: fixed;
  top: 0px;
  left: 0px;
  bottom: 0px;
  right: 0px;
  width: 100%;
  height: 100%;
}

  .flex-pad-x {
    padding: 0px 20px;
    height: 100%;
    display: flex;
  }

  .flex-pad-y {
    padding: 20px 0px;
    width: 100%;
    display: flex;
    flex-direction: column;
  }

  .flex-grow-y {
    flex-grow: 1;
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
   }

Như bạn có thể thấy, chúng ta có thể đạt được điều này với một số trình bao bọc để kiểm soát trong khi sử dụng thuộc tính flex-grow & flex-direction.

1: Khi "flex-direction" gốc là một "row", con của nó là "flex-grow" hoạt động theo chiều ngang. 2: Khi "flex-direction" chính là "cột", con của nó là "flex-grow" hoạt động theo chiều dọc.

Hi vọng điêu nay co ich

Daniel


1
divquá mức cần thiết.
John

Bạn có thể xóa một trong những của mình flex-pad-y:)
Eoin

1
Đẹp..! Đây là ví dụ duy nhất quản lý để làm cho "nội dung" <div> của tôi (ở giữa đầu trang và chân trang của tôi) lấp đầy toàn bộ chiều cao màn hình. Tất cả các ví dụ khác dường như bỏ qua thuộc tính "height: 100%".
Mike Gledhill

Đó là một giải pháp mát mẻ. Tôi biết John nói ở trên DIV quá mức cần thiết, nhưng tôi không đồng ý. Bạn cần bốn div để sử dụng flex phát triển theo cả chiều ngang và chiều dọc (Theo chiều dọc là cái quan trọng!). Rất vui vì tôi có thể giúp ! Có bốn DIV mang lại cho bạn rất nhiều sự linh hoạt. Khi bạn bắt đầu cố gắng loại bỏ DIV, tính linh hoạt đó bắt đầu khô héo!
GaddMaster
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.