Làm cách nào để một phần tử html có thể lấp đầy 100% chiều cao màn hình còn lại, chỉ sử dụng css?


118

Tôi có một phần tử tiêu đề và một phần tử nội dung:

#header
#content

Tôi muốn tiêu đề có chiều cao cố định và nội dung lấp đầy tất cả chiều cao còn lại có sẵn trên màn hình, với overflow-y: scroll;.

Nó có thể mà không cần Javascript?

Câu trả lời:


83

Mẹo cho điều này là chỉ định 100% chiều cao trên các phần tử html và body. Một số trình duyệt tìm đến các phần tử mẹ (html, body) để tính chiều cao.

<html>
    <body>
        <div id="Header">
        </div>
        <div id="Content">
        </div>
    </body>
</html>

html, body
{
    height: 100%;
}
#Header
{
    width: 960px;
    height: 150px;
}
#Content
{
    height: 100%;
    width: 960px;
}

1
Tôi đã thử tất cả các giải pháp nhưng chỉ điều này giải quyết được vấn đề của tôi.
Alex

1
@Alex nếu điều này hoạt động cho tất cả các trình duyệt bạn đang nhắm mục tiêu, thì hãy tiếp tục và triển khai nó. Yêu cầu của mọi người là khác nhau.
BentOnCoding

321

quên tất cả các câu trả lời, dòng CSS này đã làm việc cho tôi trong 2 giây:

height:100vh;

1vh = 1% chiều cao màn hình trình duyệt

nguồn

Để chia tỷ lệ bố cục đáp ứng, bạn có thể muốn sử dụng:

min-height: 100vh

[cập nhật tháng 11 năm 2018] Như đã đề cập trong phần nhận xét, việc sử dụng chiều cao tối thiểu có thể tránh gặp vấn đề về thiết kế phản hồi tốt

[cập nhật tháng 4 năm 2018] Như đã đề cập trong phần nhận xét, vào năm 2011 khi câu hỏi được đặt ra, không phải tất cả các trình duyệt đều hỗ trợ đơn vị khung nhìn. Các câu trả lời khác là các giải pháp hồi đó - vmaxvẫn chưa được hỗ trợ trong IE, vì vậy đây có thể không phải là giải pháp tốt nhất cho tất cả.


9
Đây là câu trả lời đơn giản nhất, vì bạn không cần đặt chiều cao của tất cả các phần tử mẹ thành 100%. Đây là hỗ trợ hiện tại cho vh - caniuse.com/#feat=viewport-units - iOS dường như có thể cần một giải pháp thay thế, vì "vh trên iOS được báo cáo bao gồm chiều cao của thanh công cụ dưới cùng trong tính toán chiều cao".
Brian Burns

2
WOW, rất tốt! Nhìn tất cả những người này với câu trả lời quá phức tạp.
NoName

8
Khi câu hỏi được đặt ra vào năm 2011, không có trình duyệt chính nào hỗ trợ đơn vị khung nhìn. Những "câu trả lời quá phức tạp" là lựa chọn duy nhất hồi đó.
JJJ

6
Đề nghị nhỏ rằng a min-height: 100vhsẽ tốt hơn rất nhiều. Nó cũng sẽ mở rộng quy mô cho các thiết kế đáp ứng.
Wiggy A.

3
Điều này không trả lời câu hỏi được hỏi, điều này sẽ chiếm 100% khung nhìn. Anh ta không muốn điều này vì tiêu đề của anh ta sẽ chiếm x% khung nhìn, vì như vậy các câu trả lời khác đều đúng.
4cody

35

Trên thực tế, cách tiếp cận tốt nhất là:

html { 
    height:100%;
}
body { 
    min-height:100%;
}

Điều này giải quyết mọi thứ cho tôi và nó giúp tôi kiểm soát chân trang của mình và nó có thể có chân trang cố định bất kể trang đang được cuộn xuống.

Giải pháp kỹ thuật - ĐÃ CHỈNH SỬA

Trong lịch sử, 'chiều cao' là thứ khó tạo khuôn mẫu, so với 'chiều rộng', là thứ dễ nhất. Vì css tập trung vào <body>việc tạo kiểu để hoạt động. Đoạn mã trên - chúng tôi đã đưa ra <html><body>một chiều cao. Đây là lúc phép thuật xuất hiện - vì chúng ta có 'chiều cao tối thiểu' trên bàn chơi, chúng tôi đang nói với trình duyệt <body>vượt trội hơn <html><body>giữ chiều cao tối thiểu. Đến lượt nó, cho phép <body>ghi đè <html><html>đã có chiều cao trước đó. Nói cách khác, chúng tôi đang đánh lừa trình duyệt để "đụng" <html>khỏi bàn, vì vậy chúng tôi có thể tạo kiểu độc lập.


1
Ôi chúa ơi, đó là một phép màu!
Geoff

Giống như phép màu, nó hoạt động! Nhưng xin vui lòng: tại sao min-heightheight?
Joy

1
@ShaojiangCai - Trong lịch sử, 'chiều cao' là thứ khó tạo khuôn mẫu, so với 'chiều rộng', dễ nhất. Vì css tập trung vào <body>việc tạo kiểu để hoạt động. Mã này: chúng tôi đã cung cấp <html><body>chiều cao. Đây là lúc mà phép thuật xuất hiện - vì chúng ta có 'chiều cao tối thiểu' trên bàn chơi, nên chúng tôi đang nói với máy chủ <body>vượt trội hơn <html><body>giữ chiều cao tối thiểu. Đến lượt nó, cho phép <body>ghi đè <html><html>đã có chiều cao trước đó. Nói cách khác, chúng tôi đang lừa máy chủ "va chạm" <html>khỏi bàn, vì vậy chúng tôi có thể tạo kiểu độc lập.
Faron

2
@Faron Có vẻ như 'trình duyệt' sẽ là lựa chọn từ tốt hơn ở đây thay vì 'máy chủ'. ;)
LETs

@EunLeem ... Tôi đồng ý với bạn về cách tôi có thể chọn từ ngữ thích hợp để giải quyết vấn đề này. Cảm ơn vì mẹo "cùi chỏ". Đã cập nhật câu trả lời của tôi cho phù hợp.
Faron

14

Bạn có thể sử dụng vh trên thuộc tính chiều cao tối thiểu.

min-height: 100vh;

Bạn có thể làm như sau, tùy thuộc vào cách bạn đang sử dụng lề ...

min-height: calc(100vh - 10px) //Considering you're using some 10px margin top on an outside element

10

Giải pháp được chấp nhận sẽ không thực sự hoạt động. Bạn sẽ nhận thấy rằng nội dung divsẽ bằng chiều cao của cha mẹ của nó body,. Vì vậy, đặt bodychiều cao thành 100%sẽ đặt nó bằng chiều cao của cửa sổ trình duyệt. Giả sử cửa sổ trình duyệt có 768pxchiều cao, bằng cách đặt divchiều cao nội dung thành 100%, divchiều cao của lần lượt sẽ là 768px. Vì vậy, bạn sẽ kết thúc với div tiêu đề là 150pxvà div nội dung là 768px. Cuối cùng bạn sẽ có nội dung 150pxbên dưới cuối trang. Đối với một giải pháp khác, hãy xem liên kết này.


8

Với HTML5, bạn có thể làm điều này:

CSS:

body, html{ width:100%; height:100%; padding: 0; margin: 0;}
header{ width:100%; height: 70px; }
section{ width: 100%; height: calc(100% - 70px);}

HTML:

<header>blabablalba </header>
<section> Content </section>

Cẩn thận khi sử dụng calc trên phần trăm chiều cao. Firefox sẽ không hoạt động với điều này một cách chính xác trừ khi tất cả cha mẹ đều có chiều cao được đặt.
TomDK

4

Đối với tôi, điều tiếp theo hoạt động tốt:

Tôi đã bọc tiêu đề và nội dung trên một div

<div class="main-wrapper">
    <div class="header">

    </div>
    <div class="content">

    </div>
</div>

Tôi đã sử dụng tham chiếu này để lấp đầy chiều cao bằng flexbox. CSS như sau:

.main-wrapper {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}
.header {
    flex: 1;
}
.content {
    flex: 1;
}

Để biết thêm thông tin về kỹ thuật flexbox, hãy truy cập tài liệu tham khảo



1

Câu trả lời được chấp nhận không hoạt động. Và câu trả lời được bình chọn cao nhất không trả lời câu hỏi thực tế. Với tiêu đề chiều cao pixel cố định và một phần điền vào màn hình còn lại của trình duyệt, và cuộn cho owerflow. Đây là một giải pháp thực sự hoạt động, sử dụng định vị tuyệt đối. Tôi cũng giả định rằng chiều cao của tiêu đề được biết đến, bởi âm thanh của "tiêu đề cố định" trong câu hỏi. Tôi sử dụng 150px làm ví dụ ở đây:

HTML:

<html>
    <body>
        <div id="Header">
        </div>
        <div id="Content">      
        </div>
    </body>
</html>

CSS: (chỉ thêm màu nền cho hiệu ứng hình ảnh)

#Header
{
    height: 150px;
    width: 100%;
    background-color: #ddd;
}
#Content
{
   position: absolute;
   width: 100%;
   top: 150px;
   bottom: 0;
   background-color: #aaa;
   overflow-y: scroll;
}

Để có cái nhìn chi tiết hơn về cách hoạt động của điều này, với nội dung thực tế bên trong #Content, hãy xem jsfiddle này , sử dụng các hàng và cột bootstrap.


"tiêu đề chiều cao pixel cố định" -> điều này chính xác! Các bottombất động sản chắc chắn rằng #Contentở lại mắc kẹt ở phần cuối trang. Tôi đánh giá cao bạn đã dành thời gian để giải thích nó.
Armfoot

1
Và tôi rất vui vì nó đã giúp được ai đó;)
jumps4fun

1

Trong trường hợp này, tôi muốn div nội dung chính của mình có chiều cao lỏng để toàn bộ trang chiếm 100% chiều cao của trình duyệt.

height: 100vh;


1

Vui lòng để tôi thêm 5 xu của mình vào đây và đưa ra giải pháp cổ điển:

html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idHeader {position:absolute; left:0; right:0; border:solid 3px red;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
<div id="idOuter">
  <div id="idHeader" style="height:30px; top:0;">Header section</div>
  <div id="idContent" style="top:36px; bottom:0;">Content section</div>
</div>

Điều này sẽ hoạt động trên tất cả các trình duyệt, không cần tập lệnh, không cần linh hoạt. Đoạn mã mở ở chế độ toàn trang và trình duyệt thay đổi kích thước: tỷ lệ mong muốn được giữ nguyên ngay cả ở chế độ toàn màn hình.

Ghi chú:

  • Các phần tử có màu nền khác nhau thực sự có thể che phủ lẫn nhau. Ở đây tôi đã sử dụng đường viền đặc để đảm bảo rằng các phần tử được đặt chính xác.
  • idHeader.heightidContent.topđược điều chỉnh để bao gồm đường viền và phải có cùng giá trị nếu đường viền không được sử dụng. Nếu không, các phần tử sẽ kéo ra khỏi khung nhìn, vì chiều rộng được tính toán không bao gồm đường viền, lề và / hoặc phần đệm.
  • left:0; right:0;có thể được thay thế bởi width:100%cùng một lý do, nếu không có đường viền được sử dụng.
  • Thử nghiệm trong trang riêng biệt (không phải dưới dạng đoạn mã) không yêu cầu bất kỳ điều chỉnh html / body nào.
  • Trong IE6 và các phiên bản trước đó, chúng ta phải thêm padding-topvà / hoặc padding-bottomcác thuộc tính vào #idOuterphần tử.

Để hoàn thành câu trả lời của tôi, đây là bố cục chân trang:

html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
#idFooter {position:absolute; left:0; right:0; border:solid 3px blue;}
<div id="idOuter">
  <div id="idContent" style="bottom:36px; top:0;">Content section</div>
  <div id="idFooter" style="height:30px; bottom:0;">Footer section</div>
</div>

Và đây là bố cục có cả đầu trang và chân trang:

html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idHeader {position:absolute; left:0; right:0; border:solid 3px red;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
#idFooter {position:absolute; left:0; right:0; border:solid 3px blue;}
<div id="idOuter">
  <div id="idHeader" style="height:30px; top:0;">Header section</div>
  <div id="idContent" style="top:36px; bottom:36px;">Content section</div>
  <div id="idFooter" style="height:30px; bottom:0;">Footer section</div>
</div>


0

Trừ khi bạn cần hỗ trợ IE 9 trở xuống, tôi sẽ sử dụng flexbox

body { display: flex; flex-direction: column; }
.header { height: 70px; }
.content { flex: 1 1 0 }

Bạn cũng cần có được nội dung để lấp đầy toàn bộ trang

body, html{ width:100%; height:100%; padding: 0; margin: 0;}

0

CSS PLaY | bố cục đầu trang / chân trang / cột đơn được căn giữa trình duyệt chéo

Khung CSS, phiên bản 2: Ví dụ 2, chiều rộng được chỉ định | 456 phố Berea

Một điều quan trọng là mặc dù điều này nghe có vẻ dễ dàng, nhưng sẽ có khá nhiều đoạn mã xấu đi vào tệp CSS của bạn để có được hiệu ứng như thế này. Thật không may, nó thực sự là lựa chọn duy nhất.


Câu trả lời chỉ có liên kết không được khuyến khích. Hãy thử đưa mã vào câu trả lời của bạn.
người dùng mà không phải là một người sử dụng

0
#Header
{
width: 960px;
height: 150px;
}

#Content
{
min-height:100vh;
height: 100%;
width: 960px;
}

-1

Giải pháp tốt nhất mà tôi tìm thấy cho đến nay là đặt một phần tử chân trang ở cuối trang và sau đó đánh giá sự khác biệt của độ lệch của phần chân trang và phần tử chúng ta cần mở rộng. ví dụ

Tệp html

<div id="contents"></div>
<div id="footer"></div>

Tệp css

#footer {
    position: fixed;
    bottom: 0;
    width: 100%;
}

Tệp js (sử dụng jquery)

var contents = $('#contents'); 
var footer = $('#footer');
contents.css('height', (footer.offset().top - contents.offset().top) + 'px');

Bạn cũng có thể muốn cập nhật chiều cao của phần tử nội dung trên mỗi lần thay đổi kích thước cửa sổ, vì vậy ...

$(window).on('resize', function() {
  contents.css('height', (footer.offset().top -contents.offset().top) + 'px');
});


-3

Bạn đã thử một cái gì đó như thế này?

CSS:

.content {
    height: 100%;
    display: block;
}

HTML:

<div class=".content">
<!-- Content goes here -->
</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.