İframe'in genişliğini ve yüksekliğini içindeki içeriğe uyacak şekilde ayarlayın


300

Ben bir çözüm gerek otomatik ayarlamawidth ve heightbir bir iframezorlukla içeriğini uyacak şekilde. Nokta genişlik ve yüksekliğin iframeyüklendikten sonra değiştirilebilmesidir . Sanırım iframe'de bulunan bedenin boyutlarındaki değişimle başa çıkmak için bir olay eylemine ihtiyacım var.


Açısal iFrame Otomatik Yüksekliği: gitlab.com/reduardo7/angular-iframe-auto-height
Eduardo Cuomo

Kabul edilen cevap çalışmıyor. Stackoverflow.com/a/31513163/482382
Steven Shaw

Yanıtlar:


268
<script type="application/javascript">

function resizeIFrameToFitContent( iFrame ) {

    iFrame.width  = iFrame.contentWindow.document.body.scrollWidth;
    iFrame.height = iFrame.contentWindow.document.body.scrollHeight;
}

window.addEventListener('DOMContentLoaded', function(e) {

    var iFrame = document.getElementById( 'iFrame1' );
    resizeIFrameToFitContent( iFrame );

    // or, to resize all iframes:
    var iframes = document.querySelectorAll("iframe");
    for( var i = 0; i < iframes.length; i++) {
        resizeIFrameToFitContent( iframes[i] );
    }
} );

</script>

<iframe src="usagelogs/default.aspx" id="iFrame1"></iframe>

8
@ StoneHeart: evet, çapraz tarayıcı. DOM spesifikasyonunda tanımlanmayan contentWindow özelliği nedeniyle kod standartlara uygun değil. DOM spesifikasyonunda contentDocument adlı özellik var, ancak Internet Explorer 6 (ve 7?) Bunu desteklemiyor. ContentWindow özelliği bunun yerine kullanılabilir ve tüm yaygın tarayıcılarda (Gecko, Opera, Webkit, IE) uygulanır.
Rafael

30
İf (document.getElementById) kullanımı ne işe yarar?
Ally

55
Ayrıca alanlar arası olmadığını unutmayın. Nedeni bir tür Hata alıyor: Etki alanı farklıysa izin 'belge' özelliğine erişim izni verilmedi . Bir çözüm burada
Pierre de LESPINAY

15
Şartlı sadece işe yaramaz değil, nadir durumlarda amaçlanan sorunlara neden olması garanti edilir. Neden bir yöntemin var olup olmadığını görmek için kontrol ve sonra kontrol dışında yöntemi kullanıyor ??
JS

6
Sanırım demek istediniz DOMContentLoaded, çünkü DOMContentReadybir şey gibi görünmüyor: developer.mozilla.org/en-US/…
Max Heiber

46

Çapraz tarayıcı jQuery eklentisi .

Çapraz bowser Alanları arası kütüphane kullanımları olduğunu mutationObserveriFrame içeriğe büyüklükte tutmak ve postMessageiFrame ve ana sayfası arasında iletişim kurmak için. JQuery ile veya jQuery olmadan çalışır.


3
İframe-resizer kütüphanesi en sağlam çözümdür.
1919'da

35

Şimdiye kadar verilen tüm çözümler yalnızca bir kerelik yeniden boyutlandırmayı oluşturmaktadır. İçerikler değiştirildikten sonra iFrame'i yeniden boyutlandırmak istediğinizi belirttiniz. Bunu yapmak için iFrame içinde bir işlev yürütmeniz gerekir (içerik değiştirildikten sonra, içeriğin değiştiğini söylemek için bir olay başlatmanız gerekir).

İFrame içindeki kod iFrame içindeki DOM ile sınırlı görünüyordu (ve iFrame'i düzenleyemedi) ve iFrame dışında yürütülen kod iFrame dışındaki DOM ile sıkışmış gibi (ve yapamadım) t iFrame'in içinden gelen bir etkinliği seçer).

Çözüm, (bir iş arkadaşından yardım alarak) jQuery'nin hangi DOM'un kullanacağı söylenebileceğini keşfetmekten geldi. Bu durumda, üst pencerenin DOM'u.

Bu nedenle, böyle bir kod ihtiyacınız olanı yapar (iFrame içinde çalıştırıldığında):

<script type="text/javascript">
    jQuery(document).ready(function () {
        jQuery("#IDofControlFiringResizeEvent").click(function () {
            var frame = $('#IDofiframeInMainWindow', window.parent.document);
            var height = jQuery("#IDofContainerInsideiFrame").height();
            frame.height(height + 15);
        });
    });
</script>

Bunun tam kodu ne olurdu? Senaryo iframe html içinde gider varsayalım?
Andrew Hundt

Bu tam koddur ve evet, iFrame'in HTML'sinde çalışır. "Window.parent.document" bölümü, jQuery seçicisinin içinde bulunduğunuz belgeyi (iFrame'in içinde değil) ana belgenin DOM'sini kullanması gerektiğini belirtir.
Garnaph

13
Bu , iframe'deki üst belge ve belgenin ikisi de aynı etki alanından geliyorsa güzel çalışır . Değilse (veya her ikisi de yerel dosyaysa kromda ise ), tarayıcıların "aynı kökeni" güvenlik politikaları devreye girer ve iframe içeriğinin üst dokümanı değiştirmesini önler.
user56reinstatemonica8

1
Bu tür bir etki alanı gibi bir şey yapmaya çalışan herkes için window.postMessage (IE8 +) 'a bakın ve hem ana bilgisayar (üst öğe) hem de kaynak (iframe içinde) belgeler üzerinde özel komut dosyalarına ihtiyacınız olacağını unutmayın. jQuery postmessage eklentisi yardımcı olabilir. Ana bilgisayarda ve kaynakta komut dosyalarına ihtiyacınız olacağından, ana bilgisayarın JSON-P kullanarak AJAX tarafından içeriği yüklemesi daha kolay olabilir.
user56reinstatemonica8

3
Olay yerine otomatik olarak nasıl tetiklenir jQuery("#IDofControlFiringResizeEvent").click(function ()?
Ben

34

Gömme için tek astarlı çözüm: minimum boyutla başlar ve içerik boyutuna artar. komut dosyası etiketlerine gerek yoktur.

<iframe src="http://URL_HERE.html" onload='javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+"px";}(this));' style="height:200px;width:100%;border:none;overflow:hidden;"></iframe>


Kod parçacığı çalıştırma Safari 9.1.1 ile çalışmıyor belki SO sorunu dahil?
Elensar

Alanlar arası değildir. Belki de sunucunun çerçeveli sayfaya bazı üstbilgiler eklemesi gerekir?
Finesse

Burada bahsi geçen tüm cevaplar, scrollHeight/scrollWidthvücut marjlarını dikkate almak için biraz ayarlanmalıdır. Tarayıcılar, belgelerin gövde öğesi için varsayılan sıfır olmayan kenar boşlukları uygular (ayrıca çerçevelere yüklenen içerik için de geçerlidir). Bulduğum çalışma çözüm bu eklemektir: parseInt(window.getComputedStyle(this.contentDocument.body).margin.
Stan

25

İframe içeriği aynı alan adından geliyorsa, bu harika çalışmalıdır. Gerçi jQuery gerektirir.

$('#iframe_id').load(function () {
    $(this).height($(this).contents().height());
    $(this).width($(this).contents().width());
});

Dinamik olarak yeniden boyutlandırmasını sağlamak için şunları yapabilirsiniz:

<script language="javaScript">
<!--
function autoResize(){
    $('#themeframe').height($('#themeframe').contents().height());
}
//-->
</script>
<iframe id="themeframe" onLoad="autoResize();" marginheight="0" frameborder="0" src="URL"></iframe>

Sonra iframe'in yüklediği sayfada şunu ekleyin:

<script language="javaScript">
function resize()
{
    window.parent.autoResize();
}

$(window).on('resize', resize);
</script>

kökeni farklı bir alandan olduğunda bunu yapmanın basit bir yolu var mı?
BruceJohnJennerLawso

16

JQuery kullanmak istemiyorsanız çapraz tarayıcı çözümü:

/**
 * Resizes the given iFrame width so it fits its content
 * @param e The iframe to resize
 */
function resizeIframeWidth(e){
    // Set width of iframe according to its content
    if (e.Document && e.Document.body.scrollWidth) //ie5+ syntax
        e.width = e.contentWindow.document.body.scrollWidth;
    else if (e.contentDocument && e.contentDocument.body.scrollWidth) //ns6+ & opera syntax
        e.width = e.contentDocument.body.scrollWidth + 35;
    else (e.contentDocument && e.contentDocument.body.offsetWidth) //standards compliant syntax – ie8
        e.width = e.contentDocument.body.offsetWidth + 35;
}

1
Bu garip. Benim için iframe'in çok garip genişliğini hesaplıyor. içerik genişliği 750'dir ve 300 olarak hesaplar. Neden fikirleriniz var?
Rob

Bu kodla oynadım (yükseklik seçenekleri ekleyerek). İFrame yüksekliğini% 100 olarak ayarlarsam, yaklaşık 200 piksel ile sınırlar. İFrame yüksekliğini 600 piksele ayarlarsam, bununla yapışır. @RobertJagoda buna bir çözüm buldunuz mu?
iaindownie

9

Dünyadaki her şeyi denedikten sonra, bu gerçekten benim için çalışıyor.

index.html

<style type="text/css">
html, body{
  width:100%;
  height:100%;
  overflow:hidden;
  margin:0px;   
}
</style>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
function autoResize(iframe) {
    $(iframe).height($(iframe).contents().find('html').height());
}
</script>

<iframe src="http://iframe.domain.com" width="100%" height="100%" marginheight="0" frameborder="0" border="0" scrolling="auto" onload="autoResize(this);"></iframe>

diyor: Yakalanmayan TypeError: HTMLIFrameElement.onload de ((endeks): 204): $ AutoResize (200 (indeks)) bir işlev değil
Michael Rogers

2
@Michael Rogers $ ile bir çakışma var veya jQuery.js dosyasını eklemeyi unutuyorsunuz. Stackoverflow.com/questions/6109847/… genel bir işlev kullanın veya $ yerine jQuery
Adrian P. yazın.

8

Bu kodu, sayfa yüklendiğinde tüm iframe'lerin (sınıf autoHeight ile) yüksekliğini otomatik olarak ayarlamak için kullanıyorum. Test edildi ve IE, FF, Chrome, Safari ve Opera'da çalışıyor.

function doIframe() {
    var $iframes = $("iframe.autoHeight"); 
    $iframes.each(function() {
        var iframe = this;
        $(iframe).load(function() {
            setHeight(iframe);
        });
    });
}

function setHeight(e) {
  e.height = e.contentWindow.document.body.scrollHeight + 35;
}

$(window).load(function() {
    doIframe();
});

2
Eklediğiniz bu sihir 35 nedir? Hangi tarayıcı ve işletim sistemi için ölçtünüz?
h2stein

Şimdi neden 35 piksel eklediğimi bilmiyorum. Ama kesinlikle size FF, IE (7, 8, 9) ve Chrome üzerinde test ettiğimi söyleyebilirim ve gayet iyi çalıştım.
petriq

3
Bence 35 sadece kaydırma çubuğu kalınlığı
Sadegh

Ben setHeight (iframe) denilen işe almak için bu biraz tweak gerekiyordu; doğrudan (çevresindeki $ (iframe) .load () sarmalayıcısını
kaldırdı

Eklenen sihirli 35 piksel, iframe dolgusunu hesaba katmalıdır. İframe'in iframe içeriğinin dolgusunu içermemesi gerektiğini de ekleyeceğim.
Filipe Melo

5

Bu sağlam bir çözümdür

function resizer(id)
{

var doc=document.getElementById(id).contentWindow.document;
var body_ = doc.body, html_ = doc.documentElement;

var height = Math.max( body_.scrollHeight, body_.offsetHeight, html_.clientHeight, html_.scrollHeight, html_.offsetHeight );
var width  = Math.max( body_.scrollWidth, body_.offsetWidth, html_.clientWidth, html_.scrollWidth, html_.offsetWidth );

document.getElementById(id).style.height=height;
document.getElementById(id).style.width=width;

}

html

<IFRAME SRC="blah.php" id="iframe1"  onLoad="resizer('iframe1');"></iframe>

3

Garnaph'ın yukarıdaki harika çözümünü biraz değiştirdim. Çözümü, olaydan hemen önceki boyuta göre iframe boyutunu değiştirmiş gibi görünüyordu. Durumum için (iframe üzerinden e-posta gönderimi) Gönderdikten hemen sonra iframe yüksekliğine ihtiyacım vardı. Örneğin, gönderimden sonra doğrulama hatalarını göster veya "teşekkür ederim" mesajı.

Ben sadece iç içe click () işlevini elimine ve benim iframe html koymak:

<script type="text/javascript">
    jQuery(document).ready(function () {
        var frame = $('#IDofiframeInMainWindow', window.parent.document);
        var height = jQuery("#IDofContainerInsideiFrame").height();
        frame.height(height + 15);
    });
</script>

Benim için çalıştı, ancak çapraz tarayıcı işlevselliğinden emin değilim.


3

Hem IFRAME içeriğini hem de üst pencereyi kontrol edebiliyorsanız iFrame Resizer'a ihtiyacınız vardır .

Bu kütüphane, aynı ve çapraz etki alanı iFrame'lerinin yüksekliğinin ve genişliğinin içerdikleri içeriğe uyacak şekilde otomatik olarak yeniden boyutlandırılmasını sağlar. İFrames kullanımıyla ilgili en yaygın sorunları ele almak için bir dizi özellik sunar, bunlar şunları içerir:

  • İFrame'in içerik boyutuna göre yüksekliği ve genişliği yeniden boyutlandırma.
  • Birden çok ve iç içe iFrame'lerle çalışır.
  • Web alanları arası iFrame'ler için alan adı kimlik doğrulaması.
  • Karmaşık CSS mizanpajlarını desteklemek için bir dizi sayfa boyutu hesaplama yöntemi sağlar.
  • DOM'da, MutationObserver kullanılarak sayfanın yeniden boyutlandırılmasına neden olabilecek değişiklikleri algılar.
  • Sayfanın yeniden boyutlandırılmasına neden olabilecek olayları algılar (Pencere Yeniden Boyutlandır, CSS Animasyonu ve Geçişi, Yön Değişikliği ve Fare olayları).
  • PostMessage ile iFrame ve ana sayfa arasında basitleştirilmiş mesajlaşma.
  • İFrame'deki sayfa bağlantılarındaki düzeltmeler ve iFrame ile üst sayfa arasındaki bağlantıları destekler.
  • Özel boyutlandırma ve kaydırma yöntemleri sunar.
  • Üst konumu ve görünüm alanı boyutunu iFrame'e gösterir.
  • PDF ve ODF belgelerini desteklemek için ViewerJS ile birlikte çalışır.
  • IE8'e geri dönüş desteği.

2

tüm yukarıdaki yöntemleri kullanarak çalışamaz.

javascript:

function resizer(id) {
        var doc = document.getElementById(id).contentWindow.document;
        var body_ = doc.body, html_ = doc.documentElement;

        var height = Math.max(body_.scrollHeight, body_.offsetHeight, html_.clientHeight, html_.scrollHeight, html_.offsetHeight);
        var width = Math.max(body_.scrollWidth, body_.offsetWidth, html_.clientWidth, html_.scrollWidth, html_.offsetWidth);

        document.getElementById(id).style.height = height;
        document.getElementById(id).style.width = width;

    }

html:

<div style="background-color:#b6ff00;min-height:768px;line-height:inherit;height:inherit;margin:0px;padding:0px;overflow:visible" id="mainDiv"  >
         <input id="txtHeight"/>height     <input id="txtWidth"/>width     
        <iframe src="head.html" name="topFrame" scrolling="No" noresize="noresize" id="topFrame" title="topFrame" style="width:100%; height: 47px" frameborder="0"  ></iframe>
        <iframe src="left.aspx" name="leftFrame" scrolling="yes"   id="Iframe1" title="leftFrame" onload="resizer('Iframe1');" style="top:0px;left:0px;right:0px;bottom:0px;width: 30%; border:none;border-spacing:0px; justify-content:space-around;" ></iframe>
        <iframe src="index.aspx" name="mainFrame" id="Iframe2" title="mainFrame" scrolling="yes" marginheight="0" frameborder="0" style="width: 65%; height:100%; overflow:visible;overflow-x:visible;overflow-y:visible; "  onload="resizer('Iframe2');" ></iframe>
</div>

Zarf: IE 10, Windows 7 x64


2

Biraz deney yaptıktan sonra başka bir çözüm buldum. Başlangıçta bu soruya 'en iyi cevap' olarak işaretlenmiş kodu denedim ve işe yaramadı. Tahminimce, o zamanlar programımdaki iframe dinamik olarak oluşturuldu. İşte kullandığım kod (benim için çalıştı):

Yüklenen iframe içindeki Javascript:

window.onload = function()
    {
        parent.document.getElementById('fileUploadIframe').style.height = document.body.clientHeight+5+'px';
        parent.document.getElementById('fileUploadIframe').style.width = document.body.clientWidth+18+'px';
    };

Kaydırma çubuklarını kaldırmak için yüksekliğe 4 veya daha fazla piksel eklemek gerekir (bazı garip hata / iframe efektleri). Genişlik daha da tuhaftır, vücudun genişliğine 18 piksel eklemek güvenlidir. Ayrıca, iframe gövdesi için css uyguladığınızdan emin olun (aşağıda).

html, body {
   margin:0;
   padding:0;
   display:table;
}

iframe {
   border:0;
   padding:0;
   margin:0;
}

İşte iframe için html:

<iframe id="fileUploadIframe" src="php/upload/singleUpload.html"></iframe>

İşte benim iframe içindeki tüm kod:

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <title>File Upload</title>
    <style type="text/css">
    html, body {
        margin:0;
        padding:0;
        display:table;
    }
    </style>
    <script type="text/javascript">
    window.onload = function()
    {
        parent.document.getElementById('fileUploadIframe').style.height = document.body.clientHeight+5+'px';
        parent.document.getElementById('fileUploadIframe').style.width = document.body.clientWidth+18+'px';
    };
    </script>
</head>
<body>
    This is a test.<br>
    testing
</body>
</html>

Ben krom ve biraz firefox (windows xp) test yaptık. Daha yapacak daha fazla testim var, bu yüzden lütfen bunun sizin için nasıl çalıştığını söyleyin.


teşekkür ederim, bu test ettiklerimden mobil tarayıcılarda harika çalışıyor ve iframe'lerin yeniden boyutlandırılmasında sorun yaşadığım yer burası!
Mircea Sandu

Beğendim sevindim :-) Çoğunlukla iframe'in çok daha verimli olması ve Ajax'tan daha iyi tarayıcı desteği sunması için buldum.
www139

1
TEŞEKKÜR EDERİM!!! Temel olarak, insanların bildiklerini varsaymadan kodu NEREDE koyacaklarını belirten tek kişi sizsiniz. Bu basit çözüm, Wordpress sitemdeki aynı alandaki dinamik içeriği çerçevelemek için benim için (Firefox, Chrome, Edge) mükemmel çalıştı. Çeşitli uzunluklarda dinamik içerik çıktı verecek bir form seçme var. İFrame güzel bir şekilde ayarlanır. .ClientHeight + 5 + 'px' ayarını yapmak zorunda kaldım; ve clientWidth + 18 + 'px'; daha fazla piksel olacak. Ve neden ekran: masa; CSS gerekli olduğunu, bu yüzden benim amaçlar için yorumladı. Tekrar teşekkürler.
Heres2u

1

Bunu nasıl yaparım (FF / Chrome'da test edildi):

<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
function autoResize(iframe) {
    $(iframe).height($(iframe).contents().find('html').height());
}
</script>

<iframe src="page.html" width="100%" height="100" marginheight="0" frameborder="0" onload="autoResize(this);"></iframe>

Microsoft bunu umursamıyorsa, kimin umurunda?
m3nda

1

İşte birkaç yöntem:

<body style="margin:0px;padding:0px;overflow:hidden">
    <iframe src="http://www.example.com" frameborder="0" style="overflow:hidden;height:100%;width:100%" height="100%" width="100%"></iframe>
</body>

VE BAŞKA BİR ALTERNATİF

<body style="margin:0px;padding:0px;overflow:hidden">
    <iframe src="http://www.example.com" frameborder="0" style="overflow:hidden;overflow-x:hidden;overflow-y:hidden;height:100%;width:100%;position:absolute;top:0px;left:0px;right:0px;bottom:0px" height="100%" width="100%"></iframe>
</body>

YUKARIYA GÖSTERİLEN 2 ALTERNATİF İLE KAYDIRMAYI Gizlemek

<body style="margin:0px;padding:0px;overflow:hidden">
    <iframe src="http://www.example.com" frameborder="0" style="overflow:hidden;height:150%;width:150%" height="150%" width="150%"></iframe>
</body>

İKİNCİ KODLA HACK

<body style="margin:0px;padding:0px;overflow:hidden">
    <iframe src="http://www.example.com" frameborder="0" style="overflow:hidden;overflow-x:hidden;overflow-y:hidden;height:150%;width:150%;position:absolute;top:0px;left:0px;right:0px;bottom:0px" height="150%" width="150%"></iframe>
</body>

İFrame'in kaydırma çubuklarını gizlemek için üst öğe kaydırma çubuklarını gizlemek için "taşma: gizli" yapılır ve iFrame, kaydırma çubuklarını sayfanın dışına zorlayan ve gövde yapmadığı için% 150 genişliğe ve yüksekliğe kadar yapılır. t İfadenin sayfanın sınırlarını aşmasını beklemeyeceğiniz kaydırma çubuklarına sahip olmak. Bu, iFrame'in kaydırma çubuklarını tam genişlikte gizler!

kaynak: iframe otomatik yüksekliğini ayarla


Verdiğiniz örneklerin, iframe'in yüksekliğini tüm dahili içeriğe uyacak şekilde otomatikleştirmek için değil, iframe'in tam içeriğini oluşturması gerekiyor. Sorulara cevap vermiyor.
nickornotto


1

Daha iyi çalışmak için bu yeniden boyutlandırıcı buldum:

function resizer(id)
{

    var doc = document.getElementById(id).contentWindow.document;
    var body_ = doc.body;
    var html_ = doc.documentElement;

    var height = Math.max( body_.scrollHeight, body_.offsetHeight, html_.clientHeight,     html_.scrollHeight, html_.offsetHeight );
    var width  = Math.max( body_.scrollWidth, body_.offsetWidth, html_.clientWidth, html_.scrollWidth, html_.offsetWidth );

    document.getElementById(id).height = height;
    document.getElementById(id).width = width;

}

Stil nesnesinin kaldırıldığını unutmayın.


Chrome / Win10'da benim için çalışmıyor - içerik kısmen alttan kesilmiş.
glenneroo

1

JQuery, bu gerçekten bana yardım, benim için en iyi seçenek !! Sana yardım etmesini bekliyorum!

iframe

<iframe src="" frameborder="0" id="iframe" width="100%"></iframe>

jQuery

<script>            
        var valueSize = $( "#iframe" ).offset();
        var totalsize = (valueSize.top * 2) + valueSize.left;

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

</script>

1

bağlam

Bunu bir web uzantısı bağlamında kendim yapmak zorunda kaldım. Bu web uzantısı, her sayfaya bir parça kullanıcı arayüzü enjekte eder ve bu kullanıcı arayüzü bir iframe. İçindeki içerik iframedinamiktir, bu yüzden kendi genişliğini ve yüksekliğini yeniden ayarlamak zorunda kaldım iframe.

Kullandığım Tepki ancak kavram her kütüphane için geçerlidir.

Çözümüm (bu, hem sayfayı hem de iframe'i kontrol ettiğinizi varsayar)

İçinde iframeDeğiştim bodystilleri gerçekten büyük boyutlara sahip olması. Bu, içerideki elemanların gerekli tüm alanı kullanarak yerleşmesine izin verecektir. Yapma widthve height% 100 benim için işe yaramadı (sanırım iframe'in bir varsayılanı var width = 300pxve height = 150px)

/* something like this */
body {
  width: 99999px;
  height: 99999px;
}

Sonra tüm iframe kullanıcı arayüzünü bir div içine enjekte ettim ve bazı stiller verdim

#ui-root {
  display: 'inline-block';     
}

Bu #ui-root( benim içinde bunu yapmak React içinde componentDidMount) benim app render sonra Bu div gibi boyutları hesaplamak ve kullanarak ana sayfaya onları senkronize window.postMessage:

let elRect = el.getBoundingClientRect()
window.parent.postMessage({
  type: 'resize-iframe',
  payload: {
    width: elRect.width,
    height: elRect.height
  }
}, '*')

Üst çerçevede böyle bir şey yapıyorum:

window.addEventListener('message', (ev) => {
  if(ev.data.type && ev.data.type === 'resize-iframe') {
    iframe.style.width = ev.data.payload.width + 'px'
    iframe.style.height = ev.data.payload.height + 'px'
  }
}, false)

Güzel çözüm! Teşekkürler!
redelschaap


0

Gönderinin eski olduğunu biliyorum, ama bunun başka bir yol olduğuna inanıyorum. Sadece kodumu uyguladım. Hem sayfa yüklemesinde hem de sayfa yeniden boyutlandırmasında mükemmel çalışır:

var videoHeight;
var videoWidth;
var iframeHeight;
var iframeWidth;

function resizeIframe(){
    videoHeight = $('.video-container').height();//iframe parent div's height
    videoWidth = $('.video-container').width();//iframe parent div's width

    iframeHeight = $('.youtubeFrames').height(videoHeight);//iframe's height
    iframeWidth = $('.youtubeFrames').width(videoWidth);//iframe's width
}
resizeIframe();


$(window).on('resize', function(){
    resizeIframe();
});

0

Başlığa yerleştirilecek Javascript:

function resizeIframe(obj) {
        obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
      }

İşte iframe html kodu:

<iframe class="spec_iframe" seamless="seamless" frameborder="0" scrolling="no" id="iframe" onload="javascript:resizeIframe(this);" src="somepage.php" style="height: 1726px;"></iframe>

Css stil sayfası

>

.spec_iframe {
        width: 100%;
        overflow: hidden;
    }

0

Angularjs yönergesi niteliği için:

G.directive ( 'previewIframe', function () {
return {
    restrict : 'A',
    replace : true,
    scope : true,
    link : function ( scope, elem, attrs ) {
        elem.on ( 'load', function ( e ) {
            var currentH = this.contentWindow.document.body.scrollHeight;
            this.style.height = eval( currentH ) + ( (25 / 100)* eval( currentH ) ) + 'px';
        } );
    }
};
} );

Yüzde dikkat edin, i iframe, metin, reklamlar vb.


0

Ben böyle yükledim ya da işler değişti.

parent.jQuery("#frame").height(document.body.scrollHeight+50);

0

Açıkçası birçok senaryo var, ancak belge ve iframe için aynı etki alanına sahiptim ve bunu iframe içeriğimin sonuna kadar yapıştırabildim:

var parentContainer = parent.document.querySelector("iframe[src*=\"" + window.location.pathname + "\"]");
parentContainer.style.height = document.body.scrollHeight + 50 + 'px';

Bu, üst kabı 'bulur' ve ardından kaydırma çubuğunu kaldırmak için 50 piksel geçme katsayısına eklenen uzunluğu ayarlar.

Doküman yüksekliği değişimini 'gözlemleyecek' hiçbir şey yok, bu benim kullanım durumum için gerekli değildi. Cevabımda, üst / iframe içeriğine pişmiş kimlikler kullanmadan ana kapsayıcıya başvurmanın bir yolunu getiriyorum.


0

Sabit bir en boy oranıyla yaşayabilir ve duyarlı bir iframe istiyorsanız , bu kod sizin için yararlı olacaktır. Sadece CSS kuralları.

.iframe-container {
  overflow: hidden;
  /* Calculated from the aspect ration of the content (in case of 16:9 it is 9/16= 
  0.5625) */
  padding-top: 56.25%;
  position: relative;
}
.iframe-container iframe {
  border: 0;
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
}

İframe'in div olarak kapsayıcısı olmalıdır.

<div class="iframe-container">
   <iframe src="http://example.org"></iframe>
</div>

Kaynak kodu bu siteye dayanıyor ve Ben Marshall'ın iyi bir açıklaması var.


-1

Basitlik :

var iframe = $("#myframe");
$(iframe.get(0).contentWindow).on("resize", function(){
    iframe.width(iframe.get(0).contentWindow.document.body.scrollWidth);
    iframe.height(iframe.get(0).contentWindow.document.body.scrollHeight);
});

-1

İçerik çok basit bir html ise, en basit yol iframe'i javascript ile kaldırmaktır

HTML Kodu:

<div class="iframe">
    <iframe src="./mypage.html" frameborder="0" onload="removeIframe(this);"></iframe>
</div>

Javascript kodu:

function removeIframe(obj) {
    var iframeDocument = obj.contentDocument || obj.contentWindow.document;
    var mycontent = iframeDocument.getElementsByTagName("body")[0].innerHTML;
    obj.remove();
    document.getElementsByClassName("iframe")[0].innerHTML = mycontent;
}

1
Bu, üst belge anahattını değiştirir. Figcaption ile şekil olarak başka bir belgeye sahip olmak istiyorsanız, bu belge özetini özlü tutmaz. Farklı kullanım durumları, ancak bir kod snippet'i ana hatları nedeniyle bir iframe'e taşımak istedim.
Henry's Cat

-2
<iframe src="hello.html" sandbox="allow-same-origin"
        onload="this.style.height=(this.contentWindow.document.body.scrollHeight+20)+'px';this.style.width=(this.contentWindow.document.body.scrollWidth+20)+'px';">
</iframe>

Bu CSS değil, JS.
clifgriffin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.