Tạo Iframe để vừa với 100% chiều cao còn lại của container


260

Tôi muốn thiết kế một trang web với một biểu ngữ và iframe. Tôi hy vọng iframe có thể lấp đầy tất cả chiều cao trang còn lại và được thay đổi kích thước tự động khi trình duyệt đang thay đổi kích thước. Có thể hoàn thành nó mà không cần viết mã Javascript, chỉ với CSS?

Tôi đã thử đặt height:100%trên iframe, kết quả khá gần nhưng iframe đã cố gắng lấp đầy toàn bộ chiều cao của trang, bao gồm cả 30pxchiều cao của phần tử div banner, vì vậy tôi nhận được thanh cuộn dọc không cần thiết. Nó không hoàn hảo.

Cập nhật Ghi chú : Xin lỗi vì tôi không mô tả tốt câu hỏi, tôi đã thử lề CSS, thuộc tính đệm trên DIV để chiếm toàn bộ chiều cao sửa chữa của một trang web thành công, nhưng thủ thuật không hoạt động trên iframe.

 <body>
    <div style="width:100%; height:30px; background-color:#cccccc;">Banner</div>
    <iframe src="http: //www.google.com.tw" style="width:100%; height:100%;"></iframe>
</body>

Bất kỳ ý tưởng được đánh giá cao.

Câu trả lời:


236

Cập nhật năm 2019

TL; DR: Hôm nay, tùy chọn tốt nhất là lựa chọn cuối cùng trong câu trả lời này - flexbox. Tất cả mọi thứ hỗ trợ nó độc đáo và có trong nhiều năm. Đi cho điều đó và không nhìn lại. Phần còn lại của câu trả lời này được để lại vì lý do lịch sử.


Bí quyết là để hiểu những gì 100% được thực hiện. Đọc thông số kỹ thuật CSS có thể giúp bạn ở đó.

Để làm cho một câu chuyện dài ngắn - có một thứ gọi là "khối chứa" - không cần thiết là phần tử cha. Nói một cách đơn giản, đây là yếu tố đầu tiên trong hệ thống phân cấp có vị trí: tương đối hoặc vị trí: tuyệt đối. Hoặc chính yếu tố cơ thể nếu không có gì khác. Vì vậy, khi bạn nói "width: 100%", nó sẽ kiểm tra độ rộng của "khối chứa" và đặt chiều rộng của phần tử của bạn thành cùng kích thước. Nếu có một cái gì đó khác ở đó, thì bạn có thể nhận được nội dung của một "khối chứa" lớn hơn chính nó (do đó "tràn ra").

Chiều cao hoạt động theo cùng một cách. Với một ngoại lệ. Bạn không thể lấy chiều cao tới 100% cửa sổ trình duyệt. Phần tử mức cao nhất, dựa vào đó 100% có thể được tính toán, là phần tử phần thân (hoặc html? Không chắc chắn) và phần đó chỉ đủ để chứa nội dung của nó. Chỉ định chiều cao: 100% trên đó sẽ không có hiệu lực, bởi vì nó không có "phần tử cha" để đo 100%. Cửa sổ tự nó không tính. ;)

Để làm cho một cái gì đó kéo dài chính xác 100% của cửa sổ, bạn có hai lựa chọn:

  1. Sử dụng JavaScript
  2. Đừng sử dụng DOCTYPE. Đây không phải là một cách thực hành tốt, nhưng nó đặt các trình duyệt ở chế độ "quirks", trong đó bạn có thể thực hiện height = "100%" trên các phần tử và nó sẽ kéo dài chúng đến kích thước cửa sổ. Xin lưu ý rằng phần còn lại của trang của bạn có thể sẽ phải được thay đổi để phù hợp với các thay đổi của DOCTYPE.

Cập nhật: Tôi không chắc là tôi đã sai khi tôi đăng bài này chưa, nhưng điều này chắc chắn đã lỗi thời. Hôm nay bạn có thể làm điều này trong biểu định kiểu của mình: html, body { height: 100% }và nó thực sự sẽ kéo dài đến toàn bộ khung nhìn của bạn. Ngay cả với một DOCTYPE. min-height: 100%cũng có thể hữu ích, tùy thuộc vào tình huống của bạn.

Và tôi sẽ không khuyên bất cứ ai làm một tài liệu chế độ kỳ quặc nữa, bởi vì nó gây ra nhiều vấn đề đau đầu hơn là giải quyết chúng. Mỗi trình duyệt có một chế độ kỳ quặc khác nhau, do đó, việc để trang của bạn trông ổn định trên các trình duyệt trở nên khó khăn hơn. Sử dụng một DOCTYPE. Luôn luôn. Tốt nhất là HTML5 - <!DOCTYPE html>. Thật dễ nhớ và hoạt động như một bùa mê trong tất cả các trình duyệt, ngay cả những trình duyệt 10 tuổi.

Ngoại lệ duy nhất là khi bạn phải hỗ trợ một cái gì đó như IE5 hoặc một cái gì đó. Nếu bạn ở đó, thì dù sao bạn cũng tự mình làm. Những trình duyệt cổ xưa đó không giống với các trình duyệt ngày nay, và những lời khuyên nhỏ được đưa ra ở đây sẽ giúp bạn với chúng. Về mặt sáng sủa, nếu bạn ở đó, có lẽ bạn chỉ cần hỗ trợ MỘT loại trình duyệt, loại bỏ các vấn đề tương thích.

Chúc may mắn!

Cập nhật 2: Này, đã lâu rồi! 6 năm sau, những lựa chọn mới đã xuất hiện. Tôi vừa có một cuộc thảo luận trong các ý kiến ​​dưới đây, đây là nhiều thủ thuật cho bạn làm việc trong các trình duyệt ngày nay.

Tùy chọn 1 - định vị tuyệt đối. Đẹp và sạch sẽ khi bạn biết chiều cao chính xác của phần đầu tiên.

body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.first-row {position: absolute;top: 0; left: 0; right: 0; height: 100px; background-color: lime;}
.second-row {position: absolute; top: 100px; left: 0; right: 0; bottom: 0; background-color: red }
.second-row iframe {display: block; width: 100%; height: 100%; border: none;}
<div class="first-row">
  <p>Some text</p>
  <p>And some more text</p>
</div>
<div class="second-row">
  <iframe src="https://jsfiddle.net/about"></iframe>
</div>

Một số lưu ý - bộ second-rowchứa là cần thiết bởi vì bottom: 0right: 0không hoạt động trên iframe vì một số lý do. Một cái gì đó để làm với việc là một yếu tố "thay thế". Nhưng width: 100%height: 100%hoạt động tốt. display: blocklà cần thiết bởi vì nó là mộtinline yếu tố theo mặc định và khoảng trắng bắt đầu tạo ra các luồng tràn lạ.

Tùy chọn 2 - bảng. Hoạt động khi bạn không biết chiều cao của phần đầu tiên. Bạn có thể sử dụng <table>các thẻ thực tế hoặc làm theo cách ưa thích với display: table. Tôi sẽ đi sau vì nó dường như là thời trang ngày nay.

body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.row-container {display: table; empty-cells: show; border-collapse: collapse; width: 100%; height: 100%;}
.first-row {display: table-row; overflow: auto; background-color: lime;}
.second-row {display: table-row; height: 100%; background-color: red; overflow: hidden }
.second-row iframe {width: 100%; height: 100%; border: none; margin: 0; padding: 0; display: block;}
<div class="row-container">
  <div class="first-row">
    <p>Some text</p>
    <p>And some more text</p>
  </div>
  <div class="second-row">
    <iframe src="https://jsfiddle.net/about"></iframe>
  </div>
</div>

Một số lưu ý - overflow: autođảm bảo rằng hàng luôn bao gồm tất cả các nội dung của nó. Nếu không các yếu tố nổi đôi khi có thể tràn. Cácheight: 100% thứ hai đảm bảo nó mở rộng hết mức có thể ép hàng thứ nhất nhỏ nhất có thể.

Tùy chọn 3 - hộp linh hoạt. Một trong số tất cả trong số đó, nhưng với sự hỗ trợ ít hơn so với trình duyệt. IE10 sẽ cần -ms-tiền tố cho các thuộc tính flexbox và mọi thứ ít hơn sẽ không hỗ trợ nó.

body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.row-container {display: flex; width: 100%; height: 100%; flex-direction: column; background-color: blue; overflow: hidden;}
.first-row {background-color: lime; }
.second-row { flex-grow: 1; border: none; margin: 0; padding: 0; }
<div class="row-container">
  <div class="first-row">
    <p>Some text</p>
    <p>And some more text</p>
  </div>
  <iframe src="https://jsfiddle.net/about" class="second-row"></iframe>
</div>

Một số lưu ý - đó overflow: hiddenlà vì iframe vẫn tạo ra một số loại tràn ngay cả display: blocktrong trường hợp này. Nó không hiển thị trong chế độ xem toàn màn hình hoặc trình chỉnh sửa đoạn trích, nhưng cửa sổ xem trước nhỏ sẽ có thêm một thanh cuộn. Không biết đó là gì, iframe là lạ.


@sproketboy Vâng, đó là một đề xuất của W3C. Và nó thậm chí không phải là tồi tệ nhất, không phải là một chặng đường dài.
Giăng

Vậy chúng ta có đặt nó trong biểu định kiểu của trang IFrame hay biểu định kiểu của trang mẹ có chứa IFrame không?
Mathias Lykkegaard Lorenzen

1
Thật tuyệt vời, cảm ơn bạn! Flexbox thực sự sạch nhất, nhưng các bảng cũng rất tuyệt để học và dường như hoạt động mà không bị tràn: jsfiddle.net/dmitri14/1uqh3zgx/2
Dmitri Zaitsev

1
Có thể đáng để di chuyển các bản cập nhật mới nhất lên đầu câu trả lời này. Tôi đã phải trải qua tất cả mọi thứ để có được câu trả lời tốt nhất, flexbox.
tha thứ cho

2
@forgivenson - Đúng vậy. Đã thêm một ghi chú khi bắt đầu câu trả lời này.
Vilx-

68

Chúng tôi sử dụng JavaScript để giải quyết vấn đề này; đây là nguồn


var buffer = 20; //scroll bar buffer
var iframe = document.getElementById('ifm');

function pageY(elem) {
    return elem.offsetParent ? (elem.offsetTop + pageY(elem.offsetParent)) : elem.offsetTop;
}

function resizeIframe() {
    var height = document.documentElement.clientHeight;
    height -= pageY(document.getElementById('ifm'))+ buffer ;
    height = (height < 0) ? 0 : height;
    document.getElementById('ifm').style.height = height + 'px';
}

// .onload doesn't work with IE8 and older.
if (iframe.attachEvent) {
    iframe.attachEvent("onload", resizeIframe);
} else {
    iframe.onload=resizeIframe;
}

window.onresize = resizeIframe;

Ghi chú: ifm là ID iframe

pageY() được tạo bởi John Resig (tác giả của jQuery)


49

Một cách khác để làm điều đó là sử dụng position: fixed;nút cha.
Nếu tôi không nhầm, position: fixed;liên kết phần tử với khung nhìn, do đó, một khi bạn cung cấp cho nút width: 100%;height: 100%;thuộc tính này, nó sẽ trải dài trên toàn bộ màn hình. Từ thời điểm này, bạn có thể đặt <iframe>thẻ bên trong nó và trải rộng nó trên không gian còn lại (cả về chiều rộng và chiều cao) với width: 100%; height: 100%;hướng dẫn CSS đơn giản .

Mã ví dụ


    body {
        margin: 0px;
        padding: 0px;
    }

    /* iframe's parent node */
    div#root {
        position: fixed;
        width: 100%;
        height: 100%;
    }

    /* iframe itself */
    div#root > iframe {
        display: block;
        width: 100%;
        height: 100%;
        border: none;
    }
   <html>
        <head>
            <title>iframe Test</title>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        </head>
        <body>
            <div id="root">
                <iframe src="http://stackoverflow.com/">
                    Your browser does not support inline frames.
                </iframe>
            </div>
        </body>
    </html>


1
Làm thế nào là lấy chiều cao "còn lại" ..?
EricG

3
Tôi đã nhận thấy bạn cũng cần thêm position: fixedvào iframe.
0xF

cảm ơn bạn, đã sửa lỗi báo cáo SSRS của tôi ra, tránh tự tử cho một ngày khác.
Mike D

1
không có thanh cuộn nào có thể nhìn thấy
andrej

hoàn hảo - bạn có thể giải thích css '>' ví dụ: div # root> iframe xa hơn Tôi không quen với nó và không thể tìm thấy tài liệu tham khảo
Datadimension

40

Dưới đây là một vài cách tiếp cận hiện đại:



  • Cách tiếp cận 2 - Cách tiếp cận Flexbox

    Ví dụ ở đây

    Đặt displayphần tử cha chung chung thành flex, cùng với flex-direction: column(giả sử bạn muốn các phần tử xếp chồng lên nhau). Sau đó đặt flex-grow: 1vào iframephần tử con để nó lấp đầy khoảng trống còn lại.

    body {
        margin: 0;
    }
    .parent {
        display: flex;
        flex-direction: column;
        min-height: 100vh;
    }
    .parent .banner {
        background: #f00;
        width: 100%;
        height: 30px;
    }
    .parent iframe {
        background: #000;
        border: none;
        flex-grow: 1;
    }
    <div class="parent">
        <div class="banner"></div>
        <iframe></iframe>
    </div>

    Vì cách tiếp cận này có ít hỗ trợ hơn 1 , tôi khuyên bạn nên đi theo cách tiếp cận đã nói ở trên.

1 Mặc dù có vẻ như nó hoạt động trong Chrome / FF, nhưng nó không hoạt động trong IE (phương pháp đầu tiên hoạt động trong tất cả các trình duyệt hiện tại).


3
Cả hai công việc và IMO hai tùy chọn được đề cập ở đây là cách tiếp cận tốt nhất. Tôi thích flexboxtùy chọn hơn vì với calcbạn cần biết số lượng không gian để khấu trừ từ vh. Với flexboxmột đơn giản flex-grow:1làm điều đó.
Kilmazed

39

Bạn có thể làm điều đó với DOCTYPE, nhưng bạn phải sử dụng table. Kiểm tra này:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<style>
*{margin:0;padding:0}
html, body {height:100%;width:100%;overflow:hidden}
table {height:100%;width:100%;table-layout:static;border-collapse:collapse}
iframe {height:100%;width:100%}

.header {border-bottom:1px solid #000}
.content {height:100%}
</style>
</head>
<body>
<table>
    <tr><td class="header"><div><h1>Header</h1></div></td></tr>
    <tr><td class="content">
        <iframe src="http://google.com/" frameborder="0"></iframe></td></tr>
</table>
</body>
</html>

1
ít nhất là nó không cần js !! Nhưng nó có an toàn trên web không?
Ali Shakiba

1
Nhược điểm của giải pháp này là html, body {overflow: hidden;} sẽ xóa các cuộn trang.
Ali Shakiba

Tôi đang cố gắng thêm chân trang trong mã trên nhưng chân trang không hiển thị. bạn có thể vui lòng giúp đỡ
Akshay Raut

18

Có lẽ điều này đã được trả lời (một vài câu trả lời ở trên là những cách "chính xác" để làm điều này), nhưng tôi nghĩ tôi cũng chỉ cần thêm giải pháp của mình.

IFrame của chúng tôi được tải trong một div, do đó tôi cần một cái gì đó khác sau window.height. Và thấy dự án của chúng tôi đã phụ thuộc rất nhiều vào jQuery, tôi thấy đây là giải pháp tao nhã nhất:

$("iframe").height($("#middle").height());

Tất nhiên "#middle" là id của div. Điều duy nhất bạn cần làm là nhớ lại thay đổi kích thước này bất cứ khi nào người dùng thay đổi kích thước cửa sổ.

$(window).resize(function() {
    $("iframe").height($("#middle").height());
});

7

Đây là những gì tôi đã làm. Tôi đã có cùng một vấn đề và cuối cùng đã tìm kiếm trên web các tài nguyên trong nhiều giờ.

<style type="text/css">
   html, body, div, iframe { margin:0; padding:0; height:100%; }
   iframe { position:fixed; display:block; width:100%; border:none; }
</style>

Tôi đã thêm phần này vào phần đầu.

Xin lưu ý rằng iframe của tôi nằm bên trong ô giữa của bảng có 3 hàng và 1 cột.


Mã của bạn sẽ chỉ hoạt động hoặc TD chứa IFRAME có chiều cao: 100%. Nó sẽ hoạt động nếu bảng được chứa trong một phần tử DIV, bởi vì bạn có một kiểu cho tất cả các div có chiều cao: 100%.
Nikola Petkanski

6

Mã MichAdel hoạt động với tôi nhưng tôi đã thực hiện một số sửa đổi nhỏ để làm cho nó hoạt động chính xác.

function pageY(elem) {
    return elem.offsetParent ? (elem.offsetTop + pageY(elem.offsetParent)) : elem.offsetTop;
}
var buffer = 10; //scroll bar buffer
function resizeIframe() {
    var height = window.innerHeight || document.body.clientHeight || document.documentElement.clientHeight;
    height -= pageY(document.getElementById('ifm'))+ buffer ;
    height = (height < 0) ? 0 : height;
    document.getElementById('ifm').style.height = height + 'px';
}
window.onresize = resizeIframe;
window.onload = resizeIframe;

4

Đúng vậy, bạn đang hiển thị iframe có độ cao 100% so với vật chứa của nó: thân máy.

Thử cái này:

<body>
  <div style="width:100%; height:30px; background-color:#cccccc;">Banner</div>
  <div style="width:100%; height:90%; background-color:transparent;">
    <iframe src="http: //www.google.com.tw" style="width:100%; height:100%;">
    </iframe> 
  </div>
</body>

Tất nhiên, thay đổi chiều cao của div thứ hai thành chiều cao bạn muốn.


8
30px + 90%! = 100%
stepancheg

1
có thể sử dụng calc (100% - 30px) thay vì 90%
Justin E

4

hãy thử như sau:

<iframe name="" src="" width="100%" style="height: 100em"/>

nó làm việc cho tôi


4
Không lấp đầy cha mẹ, chỉ đặt chiều cao lớn trên iframe.
Ben

3

Bạn có thể làm điều này với html / css như thế này:

<body>
    <div style="width:100%; height:30px; background-color:#cccccc;">Banner</div>
    <iframe src="http: //www.google.com.tw" style="position:fixed;top:30px;bottom:0px;width:100%;"></iframe>
</body>

2

Tính năng mới trong HTML5: Sử dụng calc (về chiều cao)

<html style="width:100%; height:100%; margin: 0px; padding: 0px;">
<body style="width:100%; height:100%; margin: 0px; padding: 0px;">
<div style="width:100%; height:30px; background-color:#cccccc;">Banner</div>
<iframe src="http://www.google.com.tw" style="width:100%; height: calc(100% - 30px);"></iframe>
</body>
</html>

2

Tôi đã sử dụng display: bảng để khắc phục một vấn đề tương tự. Nó gần như hoạt động cho việc này, để lại một thanh cuộn dọc nhỏ. Nếu bạn đang cố gắng tạo cột linh hoạt đó bằng một thứ khác ngoài iframe thì nó hoạt động tốt (không phải

Lấy HTML sau

<body>
  <div class="outer">
    <div class="banner">Banner</div>
    <div class="iframe-container">
      <iframe src="http: //www.google.com.tw" style="width:100%; height:100%;border:0;"></iframe>
    </div>
  </div>
</body>

Thay đổi div bên ngoài để sử dụng display: bảng và đảm bảo nó có chiều rộng và chiều cao được đặt.

.outer {
  display: table;
  height: 100%;
  width: 100%;
}

Đặt biểu ngữ thành một hàng của bảng và đặt chiều cao của nó thành bất kỳ sở thích nào của bạn là:

.banner {
  display: table-row;
  height: 30px;
  background: #eee;
}

Thêm một div bổ sung xung quanh iframe của bạn (hoặc bất kỳ nội dung nào bạn cần) và biến nó thành một hàng bảng với chiều cao được đặt thành 100% (đặt chiều cao của nó là rất quan trọng nếu bạn muốn nhúng iframe để lấp đầy chiều cao)

.iframe-container {
  display: table-row;
  height: 100%;
}

Dưới đây là một jsfiddle hiển thị nó tại nơi làm việc (không có iframe vì điều đó dường như không hoạt động trong fiddle)

https://jsfiddle.net/yufceynk/1/


1

Tôi nghĩ rằng bạn có một vấn đề khái niệm ở đây. Để nói "Tôi đã thử đặt chiều cao: 100% trên iframe, kết quả khá gần nhưng iframe đã cố gắng lấp đầy toàn bộ trang" , vâng, khi nào "100%" không bằng "toàn bộ"?

Bạn đã yêu cầu iframe lấp đầy toàn bộ chiều cao của thùng chứa (đó là phần thân) nhưng thật không may, nó có anh chị em ở cấp độ khối trong <div> ở trên mà bạn đã yêu cầu lớn 30px. Vì vậy, tổng số bộ chứa cha mẹ hiện đang được yêu cầu kích thước đến 100% + 30px> 100%! Do đó thanh cuộn.

Điều tôi nghĩ bạn muốn nói là bạn muốn iframe tiêu thụ những gì còn lại như khung và ô bảng có thể, tức là height = "*". IIRC này không tồn tại.

Thật không may theo hiểu biết tốt nhất của tôi, không có cách nào để trộn / tính toán / trừ một cách hiệu quả các đơn vị tuyệt đối và tương đối, vì vậy tôi nghĩ rằng bạn bị giảm xuống còn hai lựa chọn:

  1. Hoàn toàn định vị div của bạn, nó sẽ lấy nó ra khỏi container để một mình iframe sẽ tiêu thụ chiều cao của container. Điều này khiến bạn gặp phải tất cả các vấn đề khác, nhưng có lẽ đối với những gì bạn đang làm mờ hoặc căn chỉnh sẽ ổn.

  2. Ngoài ra, bạn cần chỉ định% height cho div và giảm chiều cao của iframe đó. Nếu chiều cao tuyệt đối thực sự quan trọng, bạn sẽ cần phải áp dụng điều đó cho một phần tử con của div.


1

Đã thử tuyến đường css một thời gian, cuối cùng tôi đã viết một thứ khá cơ bản trong jQuery đã thực hiện công việc cho tôi:

function iframeHeight() {
    var newHeight = $j(window).height();
    var buffer = 180;     // space required for any other elements on the page 
    var newIframeHeight = newHeight - buffer;
    $j('iframe').css('height',newIframeHeight);    //this will aply to all iframes on the page, so you may want to make your jquery selector more specific.
}

// When DOM ready
$(function() {
    window.onresize = iframeHeight;
}

Đã thử nghiệm trong IE8, Chrome, Firefox 3.6


1

Nó sẽ làm việc với mã được đề cập dưới đây

<iframe src="http: //www.google.com.tw"style="position: absolute; height: 100%; border: none"></iframe>

1

Câu trả lời tương tự của @MichAdel, nhưng tôi đang sử dụng JQuery và thanh lịch hơn.

<script type="text/javascript">
    $(document).ready(function() {
        var $iframe = $('#iframe_id')[0];

        // Calculate the total offset top of given jquery element
        function totalOffsetTop($elem) {
            return $elem.offsetTop + ($elem.offsetParent ? totalOffsetTop($elem.offsetParent) : 0);
        }

        function resizeIframe() {
            var height = window.innerHeight || document.body.clientHeight || document.documentElement.clientHeight;
            height -= totalOffsetTop($iframe);
            $iframe.height = Math.max(0, height) + 'px';
        }

        $iframe.onload = resizeIframe();
        window.onresize = resizeIframe;
    });
</script>

iframe_id là ID của thẻ iframe


0

Bạn có thể làm điều này bằng cách đo kích thước cơ thể khi tải / thay đổi kích thước các sự kiện và đặt chiều cao thành (chiều cao đầy đủ - chiều cao biểu ngữ).

Lưu ý rằng hiện tại trong IE8 Beta2, bạn không thể thực hiện điều này khi kích hoạt sự kiện đó hiện đang bị hỏng trong IE8 Beta2.


0

hoặc bạn có thể đi học cũ và sử dụng bộ khung có lẽ:

<frameset rows="30,*">
  <frame src="banner.swf"/>
  <frame src="inner.html" />
</frameset>

2
@vdbuilder: Không, nó chỉ hợp lệ trước html5. Tôi cá là nó vẫn hoạt động. ;-)
TJ Crowder

0

Mặc dù tôi đồng ý rằng JS có vẻ là một lựa chọn tốt hơn, tôi có một giải pháp chỉ hoạt động với CSS. Nhược điểm của nó là nếu bạn phải thường xuyên thêm nội dung vào tài liệu html iframe của mình, bạn sẽ phải điều chỉnh một phần trăm thời gian.

Giải pháp:

Cố gắng không chỉ định bất kỳ chiều cao nào cho CẢ HAI tài liệu html của bạn,

html, body, section, main-div {}

sau đó chỉ mã này:

#main-div {height:100%;}
#iframe {height:300%;}

lưu ý: div nên là phần chính của bạn.

Điều này nên tương đối làm việc. iframe tính toán chính xác 300% chiều cao cửa sổ hiển thị. Nếu nội dung html của bạn từ tài liệu thứ 2 (trong iframe) có chiều cao nhỏ hơn 3 lần chiều cao trình duyệt của bạn, thì nó hoạt động. Nếu bạn không cần thêm nội dung thường xuyên vào tài liệu đó thì đây là một giải pháp lâu dài và bạn chỉ có thể tìm thấy% cần thiết theo chiều cao nội dung của mình.

Điều này hoạt động vì nó ngăn tài liệu html thứ 2 (được nhúng) kế thừa chiều cao của nó từ tài liệu html gốc. Nó ngăn chặn điều đó bởi vì chúng tôi đã không chỉ định chiều cao cho cả hai. Khi chúng tôi đưa ra% cho đứa trẻ, nó sẽ tìm cha mẹ của nó, nếu không, nó sẽ lấy chiều cao nội dung của nó. Và chỉ khi các container khác không có chiều cao, từ những gì tôi đã thử.


0

" Liền mạch " thuộc tính là một tiêu chuẩn mới nhằm giải quyết vấn đề này:

http://www.w3schools.com/tags/att_iframe_siền.asp

Khi gán thuộc tính này, nó sẽ xóa các đường viền và thanh cuộn và kích thước iframe theo kích thước nội dung của nó. mặc dù nó chỉ được hỗ trợ trong Chrome và Safari mới nhất

thêm về điều này ở đây: Thuộc tính liền mạch HTML5 iFrame


Thuộc tính liền mạch đã bị xóa khỏi HTML 5 spec.
Eric Steinborn

0

Một giải pháp jQuery đơn giản

Sử dụng điều này trong một tập lệnh bên trong trang có khung

$(function(){

    if(window != top){
        var autoIframeHeight = function(){
            var url = location.href;
            $(top.jQuery.find('iframe[src="'+ url +'"]')).css('height', $('body').height()+4);
        }
        $(window).on('resize',autoIframeHeight);
        autoIframeHeight();
    }

}

0

bạn không thể đặt chiều cao iframe theo% vì chiều cao cơ thể cha mẹ của bạn không phải là 100%, vì vậy hãy tạo chiều cao cha mẹ là 100% và sau đó áp dụng chiều cao iframe 100%

For eg.
<html>
<head>
<style>
html,body{height:100%}
</style> 
</head>
<body>
<iframe src="http://www.quasarinfosystem.com" height="100%" width="100%" ></iframe>
</body>
</html>

0

Nếu bạn có quyền truy cập vào nội dung của iframe sẽ được tải, bạn có thể yêu cầu cha mẹ của nó thay đổi kích thước bất cứ khi nào nó thay đổi kích thước ..

    $(window).resize(function() {
        $(parent.document)
            .find("iframe")
            .css("height", $("body").css("height"));        
    }).trigger("resize");

Nếu bạn có nhiều iframe trên trang, bạn có thể cần sử dụng id hoặc các phương thức thông minh khác để nâng cao .find ("iframe") để bạn chọn đúng.


0

Tôi nghĩ rằng cách tốt nhất để đạt được kịch bản này bằng cách sử dụng vị trí css. đặt vị trí liên quan đến div cha và vị trí của bạn: tuyệt đối với iframe của bạn.

.container{
  width:100%;
  position:relative;
  height:500px;
}

iframe{
  position:absolute;
  width:100%;
  height:100%;
}
<div class="container">
  <iframe src="http://www.w3schools.com">
  <p>Your browser does not support iframes.</p>
 </iframe>
</div>

đối với vấn đề đệm và lề khác hiện nay, css3 calc () rất tiên tiến và cũng tương thích với tất cả các trình duyệt.

kiểm tra calc ()


0

Tại sao không làm điều này (với sự điều chỉnh nhỏ cho phần đệm / lề cơ thể)

<script>
  var oF = document.getElementById("iframe1");
  oF.style.height = document.body.clientHeight - oF.offsetTop - 0;
</script>

Bạn cần phải thay thế -0bằng +'px'ở cuối. Nó hoạt động trên điện thoại di động?
Dmitri Zaitsev
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.