CSS - Mở rộng chiều cao DIV con nổi lên chiều cao của cha mẹ


450

Tôi có cấu trúc trang như:

<div class="parent">
    <div class="child-left floatLeft">
    </div>

    <div class="child-right floatLeft">
    </div>
</div>

Bây giờ, child-leftDIV sẽ có nhiều nội dung hơn, vì vậy parentchiều cao của DIV sẽ tăng theo DIV trẻ em.

Nhưng vấn đề là child-rightchiều cao không tăng. Làm thế nào tôi có thể làm cho chiều cao của nó bằng với cha mẹ của nó?


Câu trả lời:


459

Đối với parentphần tử, thêm các thuộc tính sau:

.parent {
    overflow: hidden;
    position: relative;
    width: 100%;
}

sau đó cho .child-rightnhững điều này:

.child-right {
    background:green;
    height: 100%;
    width: 50%;
    position: absolute;
    right: 0;
    top: 0;
}

Tìm kết quả chi tiết hơn với các ví dụ CSS tại đây và thêm thông tin về các cột có chiều cao bằng nhau tại đây .


14
Kết quả CSS của bạn trong hành vi không xác định - chiều cao của cha mẹ phụ thuộc vào chiều cao của trẻ em, nhưng trẻ em có chiều cao phần trăm được xác định theo nghĩa của cha mẹ: điều này không hợp lệ và có thể sẽ không hoạt động theo cách đa trình duyệt.
Eamon Nerbonne

1
Tôi thấy bạn không nổi mọi thứ - vì vậy, điều đó được xác định với chi phí không mở rộng nếu cột bên phải phát triển dài hơn bên trái (điều này thực sự không phải là câu hỏi của OP).
Eamon Nerbonne

4
Có, bạn cần thêm cái này: padding-bottom: 32768px; lề dưới: -32768px; cho trẻ em.
Michael

3
Điều này hoạt động miễn là cột bên phải được đảm bảo có ít nội dung hơn thì bên trái sẽ bị cắt bớt. Ngoài ra tôi đã chỉnh sửa câu trả lời để bỏ qua các tuyên bố vô dụng.
Christoph

3
@MatthewBlackford: đó là một "hack" trong đó nó ngăn chặn sự sụp đổ lề. Bạn có thể ngăn sập lề theo những cách khác, chẳng hạn như sử dụng viền trong suốt 1px, nhưng thực chất, nhưng điều quan trọng ở đây là bạn tránh sập lề. Tôi sẽ không sử dụng giải pháp này trừ trường hợp cuối cùng vì nó gây ra lỗi bố cục kỳ lạ và cắt xén bất ngờ (hoặc nội dung chồng chất) khi các giả định của bạn bị lỗi. Nói tóm lại: bạn không muốn làm điều này trừ khi bạn thực sự cần.
Eamon Nerbonne

205

Một giải pháp phổ biến cho vấn đề này sử dụng định vị tuyệt đối hoặc phao cắt xén, nhưng những điều này rất khó ở chỗ chúng yêu cầu điều chỉnh rộng nếu các cột của bạn thay đổi về số lượng + kích thước và bạn cần đảm bảo cột "chính" của bạn luôn dài nhất. Thay vào đó, tôi khuyên bạn nên sử dụng một trong ba giải pháp mạnh mẽ hơn:

  1. display: flex: cho đến nay là giải pháp đơn giản & tốt nhất và rất linh hoạt - nhưng không được IE9 hỗ trợ trở lên.
  2. tablehoặc display: table: rất đơn giản, rất tương thích (khá nhiều trình duyệt từng có), khá linh hoạt.
  3. display: inline-block; width:50% với hack lề âm: khá đơn giản, nhưng viền dưới cùng cột hơi khó.

1. display:flex

Điều này thực sự đơn giản và dễ dàng thích ứng với các bố cục phức tạp hơn hoặc chi tiết hơn - nhưng flexbox chỉ được hỗ trợ bởi IE10 trở lên (ngoài các trình duyệt hiện đại khác).

Ví dụ: http://output.jsbin.com/hetunujuma/1

Html có liên quan:

<div class="parent"><div>column 1</div><div>column 2</div></div>

Css có liên quan:

.parent { display: -ms-flex; display: -webkit-flex; display: flex; }
.parent>div { flex:1; }

Flexbox có hỗ trợ cho nhiều tùy chọn hơn, nhưng chỉ cần có bất kỳ số lượng cột nào là đủ!

2. <table>hoặcdisplay: table

Một cách đơn giản và cực kỳ tương thích để làm điều này là sử dụng một table- Tôi khuyên bạn nên thử trước nếu bạn cần hỗ trợ IE cũ . Bạn đang xử lý các cột; divs + float đơn giản không phải là cách tốt nhất để làm điều đó (chưa kể đến thực tế là nhiều cấp độ div lồng nhau chỉ để hack xung quanh các giới hạn css hầu như không "ngữ nghĩa" hơn là chỉ sử dụng một bảng đơn giản). Nếu bạn không muốn sử dụng tablephần tử này, hãy xem xét cssdisplay: table (không được IE7 hỗ trợ trở lên).

Ví dụ: http://jsfiddle.net/emn13/7FFp3/

Html có liên quan: (nhưng xem xét sử dụng đơn giản<table>thay thế)

<div class="parent"><div>column 1</div><div>column 2</div></div>

Css có liên quan:

.parent { display: table; }
.parent > div {display: table-cell; width:50%; }
/*omit width:50% for auto-scaled column widths*/

Cách tiếp cận này mạnh mẽ hơn nhiều so với sử dụng overflow:hiddenvới phao. Bạn có thể thêm khá nhiều số cột; bạn có thể có quy mô tự động nếu bạn muốn; và bạn giữ được khả năng tương thích với các trình duyệt cổ xưa. Không giống như giải pháp float yêu cầu, bạn cũng không cần biết trước cột nào dài nhất; các thang đo chiều cao tốt.

KISS: không sử dụng hack nổi trừ khi bạn đặc biệt cần. Nếu IE7 là một vấn đề, tôi vẫn chọn một bảng đơn giản với các cột ngữ nghĩa trong một giải pháp lừa-CSS khó bảo trì, kém linh hoạt bất cứ ngày nào.

Nhân tiện, nếu bạn cần bố cục của mình phản hồi (ví dụ: không có cột nào trên điện thoại di động nhỏ), bạn có thể sử dụng @mediatruy vấn để quay lại bố cục khối đơn giản cho độ rộng màn hình nhỏ - điều này hoạt động cho dù bạn sử dụng <table>hay bất kỳ display: tableyếu tố nào khác .

3. display:inline blockvới một hack lề âm.

Một cách khác là sử dụng display:inline block.

Ví dụ: http://jsbin.com/ovuqes/2/edit

Html có liên quan: (sự vắng mặt của khoảng trắng giữa cácdivthẻ là rất quan trọng!)

<div class="parent"><div><div>column 1</div></div><div><div>column 2</div></div></div>

Css có liên quan:

.parent { 
    position: relative; width: 100%; white-space: nowrap; overflow: hidden; 
}

.parent>div { 
    display:inline-block; width:50%; white-space:normal; vertical-align:top; 
}

.parent>div>div {
    padding-bottom: 32768px; margin-bottom: -32768px; 
}

Điều này hơi khó khăn và lề âm có nghĩa là đáy "thực" của các cột bị che khuất. Đến lượt điều này có nghĩa là bạn không thể định vị bất cứ thứ gì liên quan đến đáy của các cột đó vì điều đó bị cắt đứt overflow: hidden. Lưu ý rằng ngoài các khối nội tuyến, bạn có thể đạt được hiệu ứng tương tự với các số float.


TL; DR : sử dụng flexbox nếu bạn có thể bỏ qua IE9 trở lên; nếu không hãy thử một bảng (css). Nếu cả hai tùy chọn này đều không phù hợp với bạn, có các hack lề âm, nhưng chúng có thể gây ra các vấn đề hiển thị kỳ lạ dễ bỏ sót trong quá trình phát triển và có những hạn chế về bố cục mà bạn cần phải biết.


1
Tốt, nhưng đáng lưu ý rằng bạn không thể sử dụng lề giữa các ô này (và phần đệm sẽ không giúp ích nếu bạn muốn chúng được tạo kiểu).
Wordpressor

3
border-spacing:10px;trên phần tử bảng sẽ giới thiệu khoảng cách giống như lề. Ngoài ra, bạn có thể thêm các cột (trống) nơi bạn muốn có thêm không gian. Và bạn cũng có thể thêm phần đệm bên trong các ô của bảng; phần đệm đó sẽ được bao gồm trong nền, tuy nhiên, đó có thể không phải là điều bạn muốn. Nhưng bạn nói đúng rằng nó không hoàn toàn linh hoạt như lề bình thường. Và bạn không thể định vị bất cứ thứ gì liên quan đến các cột, đây có thể là một vấn đề.
Eamon Nerbonne

1
Vì vậy, nó tốt hơn một cách bố trí không có bảng hay không?
năng động

3
Tôi phải nói rằng: Tôi đồng ý với bạn rằng trong trường hợp này, một bảng đơn giản là quá đủ. Vấn đề là có một quan điểm chung để bỏ qua mọi bố cục với bảng
động

3
Vấn đề với bảng là khi màn hình được thay đổi kích thước thành chiều rộng nhỏ hơn (thiết kế đáp ứng), các ô của bảng sẽ bị cắt xén thay vì xếp chồng lên nhau trên đỉnh của màn hình tiếp theo. Phương thức thứ hai với padding-bottom: 32768px; lề dưới: -32768px; là khá tuyệt vời và thực hiện gần như chính xác những gì tôi cần ... cảm ơn vì điều đó ... đáy biên giới là một vấn đề ...
Serj Sagan

23

Dành cho phụ huynh:

display: flex;

Cho trẻ em:

align-items: stretch;

Bạn nên thêm một số tiền tố, kiểm tra caniuse.


2
Sẽ không đề nghị. IE9 vẫn là một điều.

Cảm ơn bạn vì câu trả lời; nó hoạt động tốt "Bạn nên thêm một số tiền tố, kiểm tra caniuse." ý của bạn là gì? Bạn có thể thêm ít thông tin cho người mới bắt đầu?
Md Sifatul Hồi giáo

@MdSifatulIslam Truy cập vào đây: caniuse.com/#feat=flexbox Bạn có thể xem nếu một số trình duyệt bạn cần hỗ trợ cần tiền tố tính năng.
Aiphee

18

Tôi đã tìm thấy rất nhiều câu trả lời, nhưng có lẽ giải pháp tốt nhất cho tôi là

.parent { 
  overflow: hidden; 
}
.parent .floatLeft {
  # your other styles
  float: left;
  margin-bottom: -99999px;
  padding-bottom: 99999px;
}

Bạn có thể kiểm tra các giải pháp khác tại đây http://css-tricks.com/fluid- thong-equal-height-columns/


Tôi không biết tại sao công việc này, nhưng nó giải quyết vấn đề của tôi như một cơ duyên. Cảm ơn bạn
Kết hợp

Làm việc cho tôi quá. Mặc dù đó không phải là cách sạch sẽ. Cảm ơn!
Mark Anthony Uy

17
hacky như địa ngục. Tôi không khuyến nghị điều này cho một ứng dụng sản xuất
FedericoCapaldo

điều này thật tuyệt vời haha. Tôi không nghĩ rằng nó sẽ thực sự hoạt động
Tom McDonough

11

Vui lòng đặt div cha thành overflow: hidden
sau đó trong div con, bạn có thể đặt số lượng lớn cho phần dưới cùng. ví dụ
padding-bottom: 5000px
sau đó margin-bottom: -5000px
và tất cả các div con sẽ là chiều cao của cha mẹ.
Tất nhiên điều này sẽ không hoạt động nếu bạn đang cố gắng đưa nội dung vào div cha (bên ngoài các div khác)

.parent{
    border: 1px solid black;
    overflow: hidden;
    height: auto;
}
.child{
    float: left;
    padding-bottom: 1500px;
    margin-bottom: -1500px;
}
.child1{
    background: red;
    padding-right: 10px;    
}
.child2{
    background: green;
    padding-left: 10px;
}
<div class="parent">
    <div class="child1 child">
        One line text in child1
    </div>
    <div class="child2 child">
        Three line text in child2<br />
        Three line text in child2<br />
        Three line text in child2
    </div>
</div>

Ví dụ: http://jsfiddle.net/Tareqdhk/DAFEC/


có vẻ hơi bẩn, nhưng làm việc cho tôi - giải pháp duy nhất cho câu hỏi này. Tôi đã thử điều này bằng cách sử dụng twitter bootstrap.
cukabeka

8

Cha mẹ có chiều cao không? Nếu bạn thiết lập chiều cao của cha mẹ như vậy.

div.parent { height: 300px };

Sau đó, bạn có thể làm cho trẻ kéo dài đến chiều cao đầy đủ như thế này.

div.child-right { height: 100% };

BIÊN TẬP

Đây là cách bạn sẽ làm điều đó bằng cách sử dụng JavaScript.


cha mẹ không có chiều cao cố định. Nó đang mở rộng theo chiều cao trái trẻ em.
Veera

Ah, tôi đã nghĩ rất nhiều, sau đó bạn sẽ cần một số JavaScript, tôi sẽ nối nó lại trong một giây.
Olical

Liên kết @Olical JSFiddle bị hỏng. Hoặc loại bỏ nó hoặc cập nhật câu trả lời. Cảm ơn!
itmysterybox

1
Liên kết đến js hiện cung cấp 404
Chanoch

5

Hiển thị bảng CSS là lý tưởng cho việc này:

.parent {
  display: table;
  width: 100%;
}
.parent > div {
  display: table-cell;
}
.child-left {
  background: powderblue;
}
.child-right {
  background: papayawhip;
}
<div class="parent">
  <div class="child-left">Short</div>
  <div class="child-right">Tall<br>Tall</div>
</div>

Câu trả lời gốc (giả sử bất kỳ cột nào có thể cao hơn):

Bạn đang cố gắng làm cho chiều cao của cha mẹ phụ thuộc vào chiều cao của trẻ em và chiều cao của trẻ em phụ thuộc vào chiều cao của cha mẹ. Sẽ không tính toán. Cột CSS Faux là giải pháp tốt nhất. Có nhiều hơn một cách để làm điều đó. Tôi không muốn sử dụng JavaScript.


Điểm tốt. Sẽ thế nào nếu chiều cao của trẻ em phụ thuộc vào chiều cao của anh chị em cao nhất (liệu điều đó được xác định bởi chiều cao của cha mẹ hay không), và không phải là cha mẹ? Tôi đoán điều đó không thể được thực hiện trong CSS.
mikato

Không, anh chị em không thể ảnh hưởng đến chiều cao của nhau. Tuy nhiên, bố cục display: table+ display: table-cellsẽ tạo ra kết quả mong muốn.
Salman A

Cập nhật tuyệt vời! Tuy nhiên, cuối cùng tôi đã thử điều này và tôi muốn phân tách khoảng trắng giữa các div / ô và cuối cùng phải tạo các div bên trong các div của ô bảng để thực hiện điều đó và dĩ nhiên mất khả năng khiến chúng sử dụng toàn bộ chiều cao bởi vì các div bên trong không phải là div tế bào bảng - chính xác là cùng một vấn đề. Bất cứ ý tưởng cho điều đó? Loại khoảng cách di động bị thiếu bây giờ.
mikato 3/03/2015

Ah, có khoảng cách viền trong CSS! stackoverflow.com/questions/339923/ Mạnh Tôi đã có thể khiến các div giống như bảng của tôi hoạt động tốt với phân tách khoảng trắng bằng cách sử dụng khoảng cách viền. Bây giờ tôi có khả năng tạo các ô bảng (khối nền màu) có sử dụng toàn bộ chiều cao của cha mẹ hay không bằng cách sử dụng khéo léo các div ô của bảng.
mikato

Chỉ là một hình ảnh xác thực mà tôi gặp phải: bạn không thể sử dụng cái này với float: stackoverflow.com/questions/20110217/iêu
Joshua Pinter

4

Gần đây tôi đã thực hiện điều này trên trang web của mình bằng jQuery. Mã này tính toán chiều cao của div cao nhất và đặt các div khác có cùng chiều cao. Đây là kỹ thuật:

http://www.broken-links.com/2009/01/20/very-quick-equal-height-columns-in-jquery/

Tôi không tin height:100%sẽ hoạt động, vì vậy nếu bạn không biết rõ về độ cao div tôi không nghĩ có một giải pháp CSS thuần túy.


1
Bạn nên kích hoạt điều này ít nhất là sẵn sàng, thay đổi kích thước, thay đổi hướng, thay đổi kích thước phông chữ.
netAction

4

Tôi đã sử dụng điều này cho một phần bình luận:

.parent {
    display: flex;
    float: left;
    border-top:2px solid black;
    width:635px;
    margin:10px 0px 0px 0px;
    padding:0px 20px 0px 20px;
    background-color: rgba(255,255,255,0.5);
}
    
.child-left {
	align-items: stretch;
	float: left;
	width:135px;
	padding:10px 10px 10px 0px;
	height:inherit;
	border-right:2px solid black;
}

.child-right {
	align-items: stretch;
	float: left;
	width:468px;
	padding:10px;
}
<div class="parent">
  <div class="child-left">Short</div>
  <div class="child-right">Tall<br>Tall</div>
</div>

Bạn có thể thả quyền con sang phải, nhưng trong trường hợp này tôi đã tính chính xác độ rộng của mỗi div.


1
Điều đầu tiên tôi nghĩ đến là chiều cao: kế thừa không chắc tại sao không ai thăng hoa
Andreas

3

Nếu bạn biết về bootstrap, bạn có thể thực hiện điều đó một cách dễ dàng bằng cách sử dụng thuộc tính 'flex'. Tất cả những gì bạn cần làm là chuyển các thuộc tính css bên dưới div div

.homepageSection {
  overflow: hidden;
  height: auto;
  display: flex;
  flex-flow: row;
}

nơi .homepageSectionlà div cha mẹ tôi. Bây giờ thêm div con trong html của bạn dưới dạng

<div class="abc col-md-6">
<div class="abc col-md-6">

abc là div con của tôi. Bạn có thể kiểm tra sự bằng nhau về chiều cao ở cả div con không phân biệt đường viền chỉ bằng cách đưa đường viền cho div con


0
<div class="parent" style="height:500px;">
<div class="child-left floatLeft" style="height:100%">
</div>

<div class="child-right floatLeft" style="height:100%">
</div>
</div>

Tôi đã sử dụng phong cách nội tuyến chỉ để đưa ra ý tưởng.


-2

Tôi đã học được thủ thuật gọn gàng này trong một cuộc phỏng vấn thực tập. Câu hỏi ban đầu là làm thế nào để bạn đảm bảo chiều cao của mỗi thành phần hàng đầu trong ba cột có cùng chiều cao hiển thị tất cả nội dung có sẵn. Về cơ bản tạo ra một thành phần con vô hình mà làm cho chiều cao tối đa có thể.

<div class="parent">
    <div class="assert-height invisible">
        <!-- content -->
    </div>
    <div class="shown">
        <!-- content -->
    </div>
</div>
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.