Làm thế nào để tạo một div nổi 100% chiều cao của cha mẹ?


256

Đây là HTML:

<div id="outer">
    <div id="inner"></div>
    Test
</div>

Và đây là CSS:

#inner {
  float: left;
  height: 100%;
}

Khi kiểm tra với các công cụ dành cho nhà phát triển Chrome, div bên trong sẽ có chiều cao 0px.

Làm thế nào tôi có thể buộc nó là 100% chiều cao của div cha?


1
Vì vậy, bạn muốn văn bản trong div bên ngoài (không phải trong div bên trong), nhưng div bên trong nổi là chiều cao của div bên ngoài?
edl

Kết quả cuối cùng bạn đang cố gắng để đạt được là gì? Tôi đoán sự nhầm lẫn của tôi nằm ở chỗ nếu div bên trong cao bằng bên ngoài và bên ngoài cao như văn bản, thì có giống như có văn bản trong div bên trong không?
edl

2
@edl: Vâng, đúng vậy :) Lý do tôi muốn nó theo cách này là div bên trong có hình ảnh làm nền. Các văn bản cần phải được bên cạnh nó. Cả hai cần phải ở bên trong div bên ngoài vì nó cũng có một hình nền.
Nathan Osman


2
Nhìn thấy và cố gắng trả lời cho câu hỏi này chỉ là chán nản.
EternalHour

Câu trả lời:


125

Để #outerchiều cao được dựa trên nội dung của nó, và có#inner dựa trên chiều cao của nó, làm cho cả hai yếu tố được định vị tuyệt đối.

Thông tin chi tiết có thể được tìm thấy trong thông số kỹ thuật cho thuộc tính chiều cao css , nhưng về cơ bản, #innerphải bỏ qua #outerchiều cao nếu #outerchiều cao là auto, trừ khi #outer được định vị tuyệt đối. Sau đó, #innerchiều cao sẽ là 0, trừ khi #inner chính nó được định vị tuyệt đối.

<style>
    #outer {
        position:absolute; 
        height:auto; width:200px; 
        border: 1px solid red; 
    }
    #inner {
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
    }
</style>

<div id='outer'>
    <div id='inner'>
    </div>
    text
</div>

Tuy nhiên ... Bằng cách định vị #innerhoàn toàn, một floatcài đặt sẽ bị bỏ qua, do đó bạn sẽ cần chọn chiều rộng cho #innerrõ ràng và thêm phần đệm vào #outerđể giả mạo gói văn bản mà tôi nghi ngờ bạn muốn. Ví dụ, bên dưới, phần đệm #outerlà chiều rộng #inner+3. Thuận tiện (vì toàn bộ vấn đề là tăng #innerchiều cao lên 100%) không cần phải bọc văn bản bên dưới #inner, vì vậy điều này sẽ trông giống như #innerđược thả nổi.

<style>
    #outer2{
        padding-left: 23px;
        position:absolute; 
        height:auto; 
        width:200px; 
        border: 1px solid red; 
    }
    #inner2{
        left:0;
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
   }
</style>

<div id='outer2'>
    <div id='inner2'>
    </div>
    text
</div>

Tôi đã xóa câu trả lời trước đó của mình, vì nó dựa trên quá nhiều giả định sai về mục tiêu của bạn.


118
Hmm .. câu hỏi là về Floated div. Bạn đã trả lời về vị trí div hoàn toàn
Mihkel L.

57
Tôi không bao giờ ngừng ngạc nhiên về việc làm thế nào phức tạp để đạt được những điều cực kỳ đơn giản trong HTML/CSS:)
Yuriy Nakonechnyy

15
Bất kỳ cách nào để làm điều này mà không cần độ rộng mã hóa? Không tuyệt vời cho container đáp ứng.
Jake Wilson

23
Tôi không biết tại sao điều này được chấp nhận và nâng cao rất nhiều. Câu hỏi là về các div nổi, đó là những gì đã đưa tôi đến đây từ tìm kiếm của tôi, và thay vào đó câu trả lời này hoàn toàn định vị các div.
Matt K

2
Làm thế nào để làm cho một container nổi theo chiều dọc phù hợp với container của nó? Bằng cách không làm cho nó nổi nữa! Haha. Thực sự tốt, và đủ gần để được coi là hữu ích, thực sự.
Rolf

124

Dành cho phụ huynh:

display: flex;

Bạn nên thêm một số tiền tố http://css-tricks.com/USE-flexbox/

Chỉnh sửa: Chỉ có nhược điểm là IE như bình thường, IE9 không hỗ trợ flex. http://caniuse.com/flexbox

Chỉnh sửa 2: Như @toddsby đã lưu ý, các mục căn chỉnh là dành cho cha mẹ và giá trị mặc định của nó thực sự là kéo dài . Nếu bạn muốn một giá trị khác nhau cho trẻ em, có tài sản tự sắp xếp.

Chỉnh sửa 3: jsFiddle: https://jsfiddle.net/bv71tms5/2/


3
Bạn nên chỉ ra rằng điều này chỉ hoạt động trong các trình duyệt hiện đại và thậm chí sau đó yêu cầu tiền tố của nhà cung cấp.
kontur

12
Tôi ngạc nhiên khi giải pháp này không nhận được nhiều sự chú ý hơn, vì câu hỏi ban đầu đòi hỏi div con phải được thả nổi và tất cả các vị trí: giải pháp tuyệt đối thực sự ném cờ lê vào công việc trong hầu hết các tình huống mà bạn sẽ sử dụng float. Giải pháp này cung cấp một giải pháp tuyệt vời trong đó các tác dụng phụ của vị trí: tuyệt đối không phải là vấn đề và nếu bạn sẵn sàng đào sâu thêm một chút, có thể có được khả năng tương thích trình duyệt chéo khá tốt.
Lu-ca

Đây là câu trả lời ngay tại đây. IE9 sẽ sớm ra mắt, cũng có thể giúp đỡ nó bằng cách cho nó một cú đá tốt, vững chắc. Giải pháp này rất hay, đơn giản và dễ dàng ... Tôi đã thực hiện hack cùng các giải pháp thay thế. ;)
jrista

2
Theo thông số kỹ thuật gần đây nhất cho Flexbox: xem w3.org/TR/css-flexbox-1/#align-items-property . align-items: stretch;không bắt buộc vì nó là giá trị mặc định. Ngoài ra nó nên được xác định trên cha mẹ không phải là đứa trẻ.
chập chững

1
Đã thêm câu đố trong câu trả lời. @Tigran
Aiphee

77

Trên thực tế, miễn là phần tử cha được định vị, bạn có thể đặt chiều cao của trẻ thành 100%. Cụ thể, trong trường hợp bạn không muốn cha mẹ được định vị tuyệt đối. Hãy để tôi giải thích thêm:

<style>
    #outer2 {
        padding-left: 23px;
        position: relative; 
        height:auto; 
        width:200px; 
        border: 1px solid red; 
    }
    #inner2 {
        left:0;
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
    }
</style>

<div id='outer2'>
    <div id='inner2'>
    </div>
</div>

14
Thật tuyệt, điều này ít hạn chế hơn yêu cầu của Chadwick position:absolute(có thể can thiệp vào phong cách của một trang web)
henry

3
Chỉ có thể là tôi, nhưng tôi gặp vấn đề nếu thanh bên lớn hơn nội dung. Một màu nền sẽ dừng lại ở vùng chứa cha nhưng nội dung thanh bên sẽ tràn ra bên ngoài cha mẹ.
Howdy_McGee

Đây là một giải pháp linh hoạt hơn nhiều và ngay cả khi bạn có một số phần tử con nổi, có vẻ như một nhược điểm chấp nhận được đối với kiểu bù của chúng được định vị tuyệt đối. +1
kontur

Cảm ơn bạn rất nhiều. Tôi đã đăng giải pháp cụ thể của mình dưới dạng câu trả lời cho một câu hỏi khác trên SO: stackoverflow.com/a/31749164/84661 .
Brian Haak

24

Miễn là bạn không cần hỗ trợ các phiên bản Internet Explorer sớm hơn IE8, bạn có thể sử dụng display: table-cellđể thực hiện việc này:

HTML:

<div class="outer">
    <div class="inner">
        <p>Menu or Whatever</p>
    </div>
    <div class="inner">
        <p>Page contents...</p>
    </div>
</div>

CSS:

.inner {
    display: table-cell;
}

Điều này sẽ buộc mỗi phần tử với .innerlớp chiếm toàn bộ chiều cao của phần tử cha của nó.


Mặc dù điều này sẽ hoạt động, nhưng nó sẽ không hiển thị lề, ngay cả khi bạn chỉ định một mức. Vì vậy, giải pháp này sẽ thất bại nếu bạn muốn gán lề. Bạn có thể chỉ định phần đệm như một cách giải quyết, nhưng bạn sẽ giải quyết vấn đề này như thế nào nếu bạn cần một phần lề (& không phải phần đệm)?
Devner

13
Am i thiếu cái gì ở đây? Câu hỏi của bạn yêu cầu một yếu tố nổi để có chiều cao 100%. Khi nổi, một display: table-cell;phần tử không lấp đầy chiều cao của thùng chứa nữa? Tôi phải thiếu thứ gì đó, vì đó là câu hỏi của riêng bạn ...?
user56reinstatemonica8

16

Tôi đã làm một ví dụ giải quyết vấn đề của bạn.

Bạn phải tạo một trình bao bọc, làm nổi nó, sau đó định vị tuyệt đối div của bạn và cho nó 100% chiều cao.

HTML

<div class="container">
    <div class="left">"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." </div>
  <div class="right-wrapper">
    <div class="right">"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." </div>
  </div>
  <div class="clear">&nbsp;</div>
</div>

CSS:

.container {
    width: 100%;
    position:relative;
}
.left {
    width: 50%;
    background-color: rgba(0, 0, 255, 0.6);
    float: left;
}
.right-wrapper {
    width: 48%;
    float: left;
}
.right {
    height: 100%;
    position: absolute;
}

Giải trình: Div .right được định vị tuyệt đối. Điều đó có nghĩa là chiều rộng và chiều cao của nó, và các vị trí trên cùng và bên trái sẽ được tính toán dựa trên div cha đầu tiên hoàn toàn hoặc vị trí tương đối CHỈ nếu các thuộc tính chiều rộng hoặc chiều cao được khai báo rõ ràng trong CSS; nếu chúng không được khai báo rõ ràng, các thuộc tính đó sẽ được tính dựa trên vùng chứa chính (.right-Wrapper).

Vì vậy, chiều cao 100% của DIV sẽ được tính dựa trên chiều cao cuối cùng của .container và vị trí cuối cùng của vị trí .right sẽ được tính dựa trên vùng chứa chính.


1
Đây là một giải pháp vững chắc cho các tình huống mà bạn có thể đảm bảo rằng .rightnội dung của cột ngắn hơn .leftnội dung của cột. Ví dụ: nếu bạn đang sử dụng phần này trên một thành phần trong đó .leftcột có một số nội dung có kích thước thay đổi và cột bên phải chỉ hiển thị một mũi tên đến một trang chi tiết thì giải pháp này hoạt động tốt. +1 cho điều đó
Zachary Kniebel

15

Đây là một cách đơn giản hơn để đạt được điều đó:

  1. Đặt hiển thị vùng chứa ba phần tử (#outer): bảng
  2. Và tự đặt các phần tử (#inner) hiển thị: ô bảng
  3. Bỏ nổi.
  4. Sự thành công.
#outer{
    display: table;
}
#inner {
    display: table-cell;
    float: none;
}

Cảm ơn @Itay trong Divated div, chiều cao 100%


8

Nếu bạn chuẩn bị sử dụng một ít jQuery, câu trả lời rất đơn giản!

$(function() {
    $('.parent').find('.child').css('height', $('.parent').innerHeight());
});

Điều này hoạt động tốt khi thả một phần tử sang một bên với 100% chiều cao của phần tử mẹ trong khi các phần tử nổi khác thường quấn quanh được giữ ở một bên.

Hy vọng điều này sẽ giúp người hâm mộ jQuery.


18
Có vẻ như quá mức để ném javascript vào vấn đề bố trí này.
kontur

1
Là một người đang phải phát triển trong IE: CẢM ƠN BẠN!
Rook

1
Một chút quá mức có thể, nhưng đây là một câu trả lời đẹp, cảm ơn!
Martin

1
Tôi đồng ý rằng tất cả các vấn đề định vị nên được giải quyết mà không cần JS.
michaeluskov 18/03/2015

1
Việc sử dụng JS jQuery là quá mức cần thiết
ViliusL

3

Đây là một mẫu mã cho hệ thống lưới có chiều cao bằng nhau.

#outer{
width: 100%;
margin-top: 1rem;
display: flex;
height:auto;
}

Trên đây là CSS cho div ngoài

#inner{
width: 20%;
float: left;
border: 1px solid;
}

Trên đây là div bên trong

Hy vọng điều này sẽ giúp bạn


1

Điều này đã giúp tôi.

#outer {
    position:relative;
}
#inner {
    position:absolute;
    top:0;
    left:0px;
    right:0px;
    height:100%;
}

Thay đổi bên phải: và bên trái: để đặt chiều rộng #inner thích hợp hơn.


1

Một trường hợp tương tự khi bạn cần một số phần tử con có cùng chiều cao có thể được giải quyết bằng flexbox:

https://css-tricks.com/USE-flexbox/

Đặt display: flex;cho flex: 1;các phần tử cha và con, tất cả chúng sẽ có cùng chiều cao.


-1

thử

#outer{overflow: auto;}

hiển thị nhiều tùy chọn hơn trong: Làm thế nào để bạn giữ cho cha mẹ của các yếu tố nổi không bị sụp đổ?


tùy chọn "tràn: ẩn" dường như hoạt động tốt hơn vì không có cơ hội lăn ...
Rodrigo Barreiro

Nếu bạn đưa ra một giải pháp tốt hơn, bạn có thể chỉnh sửa câu trả lời của mình. Ngoài ra, sẽ tốt hơn nếu bạn thêm thông tin vào câu trả lời của mình, ví dụ như thông tin được cung cấp trong liên kết.
Vịt Donald
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.