Làm cho div (chiều cao) chiếm chiều cao còn lại của phụ huynh


107

http://jsfiddle.net/S8g4E/

Tôi có một container divvới hai đứa trẻ. Đứa trẻ đầu tiên có chiều cao cho trước. Làm thế nào tôi có thể làm cho đứa trẻ thứ hai để chiếm "không gian trống" của container divmà không đưa ra chiều cao cụ thể?

Trong ví dụ, màu hồng divcũng nên chiếm không gian màu trắng.


Tương tự với câu hỏi này: Làm thế nào để div chiếm chiều cao còn lại?

Nhưng tôi không muốn cho vị trí tuyệt đối .


Tôi cố gắng als cho chiều cao đứa con thứ hai 100% nhưng không hoạt động: jsfiddle.net/S8g4E/1
Alvaro

Câu trả lời:


156

Việc mở rộng #downcon để lấp đầy không gian còn lại của #containercó thể được thực hiện theo nhiều cách khác nhau tùy thuộc vào sự hỗ trợ của trình duyệt mà bạn muốn đạt được và có hay không #upcó chiều cao xác định.

Mẫu

Lưới

gridBố cục của CSS cung cấp một tùy chọn khác, mặc dù nó có thể không đơn giản như mô hình Flexbox. Tuy nhiên, nó chỉ yêu cầu tạo kiểu cho phần tử vùng chứa:

.container { display: grid; grid-template-rows: 100px }

Hàng grid-template-rowsxác định hàng đầu tiên có chiều cao cố định 100px và các hàng còn lại sẽ tự động kéo dài để lấp đầy không gian còn lại.

Tôi khá chắc chắn rằng IE11 yêu cầu -ms-tiền tố, vì vậy hãy đảm bảo xác thực chức năng trong các trình duyệt bạn muốn hỗ trợ.

Flexbox

Mô-đun Bố cục Hộp linh hoạt ( flexbox) của CSS3 hiện đã được hỗ trợ tốt và có thể rất dễ triển khai. Bởi vì nó linh hoạt, nó thậm chí hoạt động khi #upkhông có chiều cao xác định.

#container { display: flex; flex-direction: column; }
#down { flex-grow: 1; }

Điều quan trọng cần lưu ý là hỗ trợ IE10 & IE11 cho một số thuộc tính flexbox có thể bị lỗi và IE9 trở xuống không có hỗ trợ nào cả.

Chiều cao tính toán

Một giải pháp dễ dàng khác là sử dụng đơn vị chức năng CSS3calc , như Alvaro đã chỉ ra trong câu trả lời của mình , nhưng nó yêu cầu chiều cao của con đầu tiên phải là một giá trị đã biết:

#up { height: 100px; }
#down { height: calc( 100% - 100px ); }

Nó được hỗ trợ khá rộng rãi, với các ngoại lệ đáng chú ý duy nhất là <= IE8 hoặc Safari 5 (không hỗ trợ) và IE9 (hỗ trợ một phần). Một số vấn đề khác bao gồm việc sử dụng calc kết hợp với biến đổi hoặc box-shadow , vì vậy hãy đảm bảo kiểm tra trong nhiều trình duyệt nếu bạn lo lắng.

Các lựa chọn thay thế khác

Nếu cần hỗ trợ cũ hơn, bạn có thể thêm height:100%;vào để #downlàm cho div màu hồng có chiều cao đầy đủ, với một lưu ý. Nó sẽ gây tràn cho thùng chứa, vì #upđang đẩy nó xuống.

Do đó, bạn có thể thêm overflow: hidden;vào vùng chứa để khắc phục điều đó.

Ngoài ra, nếu chiều cao của #upđược cố định, bạn có thể định vị nó hoàn toàn trong vùng chứa và thêm phần đệm vào #down.

Và, một tùy chọn khác sẽ là sử dụng màn hình bảng:

#container { width: 300px; height: 300px; border: 1px solid red; display: table;}
#up { background: green; display: table-row; height: 0; }
#down { background: pink; display: table-row;}​

4
Tôi muốn #down có #container height - #up height. Vì vậy, tràn ẩn không phải là thứ tôi đang tìm kiếm. Và cũng không muốn sử dụng vị trí tuyệt đối. Cảm ơn!
Alvaro

@Alvaro, tôi đã thêm một tùy chọn khác, sử dụng màn hình bảng. Bất lợi ở đây là khả năng tương thích. PS Một phần tử được đặt hoàn toàn bên trong một vùng chứa với position: relative;vị trí của nó so với vùng chứa, không phải cửa sổ. Vì vậy, đó phải là một lựa chọn khả thi.
người dùng

2
Table-row hẳn có tác dụng với bạn, hãy xem jsFiddle này để làm bằng chứng. Phương thức vị trí tuyệt đối, sẽ không thể mang lại kết quả giống như phương pháp fiddle này, vì vậy chúng ta có thể loại bỏ nó khỏi danh sách (#down và #container sẽ có cùng chiều cao trong trường hợp đó).
người dùng

3
Bạn đang hỏi rất nhiều, @Alvaro. CSS không phải là một ngôn ngữ kịch bản; nó không thể tính toán các thứ. Bạn bị mắc kẹt với ảo tưởng hoặc js.
Jezen Thomas

1
@Quantastical, cảm ơn sự giúp đỡ của bạn, nhưng trong lần chỉnh sửa mới nhất, bạn vừa sao chép câu trả lời mà tôi đã đăng. Một số đề cập về nó ít nhất sẽ là tốt.
Alvaro

24

Đã gần hai năm kể từ khi tôi hỏi câu hỏi này. Tôi vừa nghĩ ra css calc () để giải quyết vấn đề này mà tôi đã gặp phải và nghĩ rằng sẽ rất tuyệt nếu thêm nó trong trường hợp ai đó gặp vấn đề tương tự. (Bằng cách này, tôi đã sử dụng vị trí tuyệt đối).

http://jsfiddle.net/S8g4E/955/

Đây là css

#up { height:80px;}
#down {
    height: calc(100% - 80px);//The upper div needs to have a fixed height, 80px in this case.
}

Và thêm thông tin về nó tại đây: http://css-tricks.com/a-couple-of-use-case-for-calc/

Hỗ trợ trình duyệt: http://caniuse.com/#feat=calc


1
Tôi cũng đang sử dụng CSS3, calcnơi hỗ trợ trình duyệt rộng không quan trọng (IE8 trở xuống và Safari 5 không hỗ trợ).
người dùng

3
Bất kỳ cách nào để làm tương tự với một #upchiều cao động ?
Adam Waite

@AdamWaite, với độ cao #up động, bạn sẽ muốn sử dụng giải pháp tràn được mô tả trong câu trả lời khác.
người dùng

5

Câu trả lời của tôi chỉ sử dụng CSS và nó không sử dụng tràn: ẩn hoặc hiển thị: table-row. Nó yêu cầu đứa trẻ đầu tiên thực sự có chiều cao nhất định, nhưng trong câu hỏi của bạn, bạn nói rằng chỉ đứa trẻ thứ hai cần có chiều cao không được chỉ định, vì vậy tôi tin rằng bạn nên thấy điều này có thể chấp nhận được.

html

<div id="container">
    <div id="up">Text<br />Text<br />Text<br /></div>
    <div id="down">Text<br />Text<br />Text<br /></div>
</div>

css

#container { width: 300px; height: 300px; border:1px solid red;}
#up { background: green; height: 63px; float:left; width: 100% }
#down { background:pink; padding-top: 63px; height: 100%; box-sizing: border-box; }

http://jsfiddle.net/S8g4E/288/


2

kiểm tra bản demo - http://jsfiddle.net/S8g4E/6/

sử dụng css -

#container { width: 300px; height: 300px; border:1px solid red; display: table;}
#up { background: green; display: table-row; }
#down { background:pink; display: table-row;}

Bạn nên thêm height: 1pxvào #upđể đảm bảo nó chiếm số lượng chiều cao tối thiểu. Đây là hỗ trợ của trình duyệt cho display: table: caniuse.com/css-table
30

Bạn có thể vui lòng chỉ cho tôi cách giải pháp này có thể đạt được trong việc này "phức tạp hơn" Chẳng hạn, xin vui lòng: jsfiddle.net/fyNX4 Thank you very much
Alvaro

2

Trừ khi tôi hiểu lầm, bạn có thể chỉ cần thêm height: 100%;overflow:hidden;vào #down.

#down { 
    background:pink; 
    height:100%; 
    overflow:hidden;
}​

Bản thử trực tiếp

Chỉnh sửa: Vì bạn không muốn sử dụng overflow:hidden;, bạn có thể sử dụng display: table;cho trường hợp này; tuy nhiên, nó không được hỗ trợ trước IE 8. ( display: table;hỗ trợ )

#container { 
    width: 300px; 
    height: 300px; 
    border:1px solid red;
    display:table;
}

#up { 
    background: green;
    display:table-row;
    height:0; 
}

#down { 
    background:pink;
    display:table-row;
}​

Bản thử trực tiếp

Lưu ý: Bạn đã nói rằng bạn muốn #downchiều cao là #containerchiều cao trừ #upchiều cao. Các display:table;giải pháp thực hiện chính xác đó và jsfiddle này sẽ miêu tả rằng khá rõ ràng.


1
Tôi không muốn #down vượt quá chiều cao #container
Alvaro

Tôi chỉ nhận thấy rằng. Bạn có thể thêm overflow:hiddenvào để ẩn nội dung thừa.
Josh Mein

1
Tôi sẽ sao chép / dán những gì tôi đã nói với MrSlayer: Tôi muốn #down có #container height - #up height. Vì vậy, tràn ẩn không phải là thứ tôi đang tìm kiếm. Và cũng không muốn sử dụng vị trí tuyệt đối. Cảm ơn!
Alvaro

Vấn đề với điều này là nếu bạn hoàn nguyên hai div trong ví dụ của mình thì div màu xanh lá cây nằm ngoài.
Ced

Điều này không trả lời câu hỏi nào cả. Nó nói "Để chiếm tất cả chiều cao còn lại", sự kiện mặc dù điều này chiếm tất cả chiều cao còn lại, sẽ có tràn.
Giridhar Karnik

1

Bạn có thể sử dụng phao để đẩy nội dung xuống:

http://jsfiddle.net/S8g4E/5/

Bạn có một vùng chứa kích thước cố định:

#container {
    width: 300px; height: 300px;
}

Nội dung được phép chảy bên cạnh phao. Trừ khi chúng tôi đặt float thành full width:

#up {
    float: left;
    width: 100%;
}

Trong khi #up#downchia sẻ vị trí hàng đầu, #downnội dung của chỉ có thể bắt đầu sau phần cuối của phần nổi #up:

#down {
    height:100%;
}​

Lưu ý rằng #upthực sự bao gồm phần trên cùng của #down: jsfiddle.net/thirtydot/S8g4E/9
ba mươi

Vâng, đó là cách nó hoạt động. Nhưng nếu OP không cần viền tròn hoặc một thứ gì đó cầu kỳ khác #up, thì có lẽ nó có thể chấp nhận được.
biziclop

Giải pháp này đã hoàn tất, nhưng tôi muốn # xuống để có chiều cao #container - #up height. (Trong giải pháp của bạn #down height = #container height). Cảm ơn '
Alvaro

1
@Alvaro: Tại sao nó cần phải như vậy? Giải pháp này có vẻ đúng trong hầu hết các trường hợp, ngay cả khi nó chỉ là ảo giác.
30

Chà, câu hỏi này là một ví dụ đơn giản hóa từ ví dụ "phức tạp" hơn này: jsfiddle.net/fyNX4 Sẽ không hoạt động phải không?
Alvaro

1

trừu tượng

Tôi đã không tìm thấy một câu trả lời thỏa mãn hoàn toàn vì vậy tôi phải tự tìm hiểu nó.

Yêu cầu của tôi:

  • nguyên tố này nên chính xác không gian còn lại hoặc là khi nó kích thước nội dungnhỏ hơn hoặc lớn hơn so với kích thước không gian còn lại (trong trường hợp thứ hai cuộn nên được hiển thị );
  • giải pháp sẽ hoạt động khi chiều cao gốc được tính toán , và không được chỉ định ;
  • calc()không nên được sử dụng vì phần tử còn lại sẽ không biết gì về kích thước phần tử khác;
  • nên sử dụng kỹ thuật bố cục hiện đạiquen thuộc như flexbox .

Giải pháp

  • Chuyển thành các hộp flexbox tất cả cha mẹ trực tiếp với chiều cao được tính toán (nếu có)cha mẹ tiếp theo có chiều cao được chỉ định ;
  • Chỉ định flex-grow: 1cho tất cả cha mẹ trực tiếp có chiều cao được tính toán (nếu có)phần tử để chúng chiếm tất cả không gian còn lại khi kích thước nội dung phần tử nhỏ hơn;
  • Chỉ định flex-shrink: 0cho tất cả các mục linh hoạt có chiều cao cố định để chúng không trở nên nhỏ hơn khi kích thước nội dung phần tử lớn hơn kích thước không gian còn lại;
  • Chỉ định overflow: hiddencho tất cả cha mẹ trực tiếp với chiều cao được tính toán (nếu có) để tắt tính năng cuộn và cấm hiển thị nội dung tràn;
  • Chỉ định overflow: autocho phần tử để cho phép cuộn bên trong nó.

JSFiddle (phần tử có cha mẹ trực tiếp với chiều cao được tính toán)

JSFiddle (trường hợp đơn giản: không có cha mẹ trực tiếp với chiều cao được tính toán)


-3

Tôi không chắc nó có thể được thực hiện hoàn toàn bằng CSS, trừ khi bạn cảm thấy thoải mái khi giả mạo nó bằng ảo ảnh. Có thể sử dụng câu trả lời của Josh Mein và đặt #containerthành overflow:hidden.

Đối với những gì nó đáng giá, đây là một giải pháp jQuery:

var contH = $('#container').height(),
upH = $('#up').height();
$('#down').css('height' , contH - upH);

Cảm ơn Tôi đã tìm kiếm một giải pháp Css tinh khiết.
Alvaro
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.