Regola la larghezza e l'altezza dell'iframe per adattarlo al contenuto


300

Ho bisogno di una soluzione per l'auto-regolazione del widthe heightdi una iframeper adattarsi a malapena il suo contenuto. Il punto è che la larghezza e l'altezza possono essere modificate dopo che iframeè stato caricato. Immagino di aver bisogno di un'azione per un evento per affrontare il cambiamento nelle dimensioni del corpo contenuto nell'iframe.



La risposta accettata non funziona. Prova stackoverflow.com/a/31513163/482382
Steven Shaw il

Risposte:


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: sì, è cross browser. Il codice non è conforme allo standard a causa della proprietà contentWindow, che non è definita nelle specifiche DOM. Nelle specifiche DOM esiste una proprietà chiamata contentDocument, ma Internet Explorer 6 (e 7?) Non lo supporta. La proprietà contentWindow può invece essere utilizzata ed è implementata in tutti i browser comuni (Gecko, Opera, Webkit, IE).
Rafael,

30
A che serve if (document.getElementById)?
Alleato il

55
Inoltre, non dimenticare che non è interdominio. Motivo per cui viene visualizzato un tipo di errore: autorizzazione negata per accedere al "documento" della proprietà se il dominio è diverso. Una soluzione può essere trovata qui
Pierre de LESPINAY,

15
Il condizionale non è solo inutile, ma nelle rare circostanze in cui è previsto è garantito che causi problemi. Perché stai verificando se esiste un metodo e quindi utilizzi il metodo al di fuori del controllo ??
JS,

6
Penso che volevi dire DOMContentLoaded, dal momento DOMContentReadyche non sembra essere una cosa: developer.mozilla.org/en-US/…
Max Heiber

46

Plug-in jQuery tra browser .

Libreria cross-bowser e cross-domain che utilizza mutationObserverper mantenere le dimensioni di iFrame in base al contenuto e postMessageper comunicare tra iFrame e la pagina host. Funziona con o senza jQuery.


3
La libreria iframe-resizer è la soluzione più affidabile.
ucciderà

35

Tutte le soluzioni fornite finora rappresentano solo un ridimensionamento una tantum. Dici che vuoi essere in grado di ridimensionare l'iFrame dopo che i contenuti sono stati modificati. Per fare ciò, devi eseguire una funzione all'interno di iFrame (una volta che il contenuto è cambiato, devi lanciare un evento per dire che il contenuto è cambiato).

Sono rimasto bloccato per un po 'di tempo, poiché il codice all'interno dell'iFrame sembrava limitato al DOM all'interno dell'iFrame (e non poteva modificare l'iFrame), e il codice eseguito all'esterno dell'iFrame era bloccato con il DOM all'esterno dell'iFrame (e non poteva t raccogliere un evento proveniente dall'iFrame).

La soluzione è venuta dalla scoperta (tramite l'assistenza di un collega) che a jQuery è possibile sapere quale DOM usare. In questo caso, il DOM della finestra principale.

Pertanto, codice come questo fa ciò di cui hai bisogno (quando eseguito all'interno di iFrame):

<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>

Quale sarebbe il codice completo per questo? Presumo che lo script vada nell'html iframe?
Andrew Hundt,

Questo è il codice completo e sì, viene eseguito all'interno dell'HTML di iFrame. La parte "window.parent.document" specifica che il selettore jQuery deve utilizzare il DOM del documento principale e non il documento in cui ci si trova (che si trova all'interno dell'iFrame).
Garnaph,

13
Funziona magnificamente se il documento principale e il documento nell'iframe provengono entrambi dallo stesso dominio . Se non lo sono (o, in Chrome, se sono entrambi file locali ), le politiche di sicurezza "stessa origine" dei browser entrano in funzione e impedisce ai contenuti iframe di modificare il documento principale.
user56reinstatemonica8

1
Per chiunque cerchi di fare qualcosa di simile a questo cross-domain, guarda window.postMessage (IE8 +) e tieni presente che avrai bisogno di script personalizzati su entrambi i documenti host (padre) e sorgente (all'interno di iframe). Il plug-in postmessage di jQuery potrebbe essere d'aiuto. Dato che avrai bisogno di script sull'host e sul sorgente, potrebbe essere più semplice fare in modo che l'host carichi il contenuto da AJAX usando JSON-P.
user56reinstatemonica8

3
Come attivare l'evento automaticamente anziché jQuery("#IDofControlFiringResizeEvent").click(function ()?
Ben

33

soluzione one-liner per incorporamenti: inizia con una dimensione minima e aumenta alla dimensione del contenuto. non sono necessari tag di script.

<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>


Eseguire lo snippet di codice non funziona con Safari 9.1.1, forse includere un problema SO?
Elensar,

Non è interdominio. Forse il server deve aggiungere alcune intestazioni alla pagina incorniciata?
Finesse,

Tutte le risposte qui citate scrollHeight/scrollWidthdovrebbero essere leggermente adattate per tenere conto dei margini del corpo. I browser applicano margini diversi da zero per l'elemento del corpo dei documenti (ed è anche applicabile al contenuto caricato nei frame). La soluzione di lavoro che ho trovato è quello di aggiungere questo: parseInt(window.getComputedStyle(this.contentDocument.body).margin.
Stan,

24

Se il contenuto dell'iframe proviene dallo stesso dominio, dovrebbe funzionare alla grande. Tuttavia richiede jQuery.

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

Per ridimensionarlo dinamicamente puoi farlo:

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

Quindi nella pagina caricata dall'iframe aggiungi questo:

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

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

ci sono modi semplici per farlo quando l'origine proviene da un dominio diverso?
BruceJohnJennerLawso

15

Ecco una soluzione cross-browser se non vuoi usare jQuery:

/**
 * 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
È strano. Per me calcola una larghezza molto strana di iframe. la larghezza del contenuto è 750 e la calcola come 300. Hai idee perché?
Rob

Ho giocato con questo codice (aggiungendo opzioni in altezza). Se imposto l'altezza dell'iFrame al 100%, la limita a circa 200 px. Se imposto l'altezza di iFrame a 600 px, si attacca con quello. @RobertJagoda hai avuto una soluzione a questo?
Iiaindownie,

9

Dopo aver provato tutto sulla terra, questo funziona davvero per me.

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>

dice: Uncaught TypeError: $ non è una funzione in autoResize ((indice): 200) in HTMLIFrameElement.onload ((indice): 204)
Michael Rogers,

2
@Michael Rogers Si è verificato un conflitto con $ o hai dimenticato di includere il file jQuery.js. Utilizzare una funzione generica stackoverflow.com/questions/6109847/… o sostituire $ con jQuery
Adrian P.

8

Sto usando questo codice per regolare automaticamente l'altezza di tutti gli iframe (con classe autoHeight) quando vengono caricati sulla pagina. Testato e funziona in IE, FF, Chrome, Safari e Opera.

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
Cos'è questa magia 35 che stai aggiungendo? Per quale browser e sistema operativo l'hai misurato?
h2stein,

Ora non so davvero perché ho aggiunto 35 pixel. Ma posso sicuramente dirti che l'ho testato su FF, IE (7, 8, 9) e Chrome e ho funzionato bene.
petriq,

3
Penso che 35 sia solo lo spessore della barra di scorrimento
Sadegh,

Ho dovuto modificarlo un po 'per farlo funzionare - chiamato setHeight (iframe); direttamente (rimosso il wrapper $ (iframe) .load () attorno ad esso.
shacker

I 35 pixel magici aggiunti devono tenere conto dell'imbottitura dell'iframe. Aggiungerei che l'iframe non dovrebbe contenere alcun riempimento il contenuto dell'iframe dovrebbe occuparsene.
Filipe Melo,

5

Questa è una soluzione solida prova

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;

}

l'html

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

3

Ho leggermente modificato la grande soluzione di Garnaph sopra. Sembrava che la sua soluzione avesse modificato le dimensioni dell'iframe in base alle dimensioni subito prima dell'evento. Per la mia situazione (invio e-mail tramite un iframe) avevo bisogno che l'altezza dell'iframe cambiasse subito dopo l'invio. Ad esempio, mostra gli errori di convalida o il messaggio di ringraziamento dopo l'invio.

Ho appena eliminato la funzione click () nidificata e l'ho inserita nel mio iframe html:

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

Ha funzionato per me, ma non sono sicuro della funzionalità cross browser.


3

Se riesci a controllare sia il contenuto IFRAME che la finestra principale, allora hai bisogno di iFrame Resizer .

Questa libreria consente il ridimensionamento automatico dell'altezza e della larghezza di entrambi gli iFrame dello stesso dominio e interdominio per adattarli al contenuto contenuto. Fornisce una gamma di funzionalità per affrontare i problemi più comuni con l'utilizzo di iFrames, tra cui:

  • Ridimensionamento di altezza e larghezza dell'iFrame in base alle dimensioni del contenuto.
  • Funziona con iFrame multipli e nidificati.
  • Autenticazione del dominio per iFrame tra domini.
  • Fornisce una gamma di metodi di calcolo delle dimensioni della pagina per supportare layout CSS complessi.
  • Rileva le modifiche al DOM che possono causare il ridimensionamento della pagina utilizzando MutationObserver.
  • Rileva eventi che possono causare il ridimensionamento della pagina (ridimensionamento finestra, animazione e transizione CSS, modifica orientamento e mouse).
  • Messaggi semplificati tra iFrame e la pagina host tramite postMessage.
  • Risolve i collegamenti alle pagine in iFrame e supporta i collegamenti tra iFrame e la pagina padre.
  • Fornisce metodi di dimensionamento e scorrimento personalizzati.
  • Espone la posizione principale e la dimensione della finestra sull'iFrame.
  • Funziona con ViewerJS per supportare documenti PDF e ODF.
  • Supporto di fallback fino a IE8.

2

tutto non può funzionare usando i metodi sopra.

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>

Env: IE 10, Windows 7 x64


2

Ho trovato un'altra soluzione dopo alcuni esperimenti. Inizialmente ho provato il codice contrassegnato come "migliore risposta" a questa domanda e non ha funzionato. La mia ipotesi è perché il mio iframe nel mio programma all'epoca era generato dinamicamente. Ecco il codice che ho usato (ha funzionato per me):

Javascript all'interno dell'iframe che viene caricato:

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';
    };

È necessario aggiungere 4 o più pixel all'altezza per rimuovere le barre di scorrimento (alcuni strani bug / effetti di iframe). La larghezza è ancora più strana, puoi tranquillamente aggiungere 18 px alla larghezza del corpo. Assicurati anche di aver applicato i CSS per il corpo iframe (di seguito).

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

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

Ecco l'html per l'iframe:

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

Ecco tutto il codice all'interno del mio iframe:

<!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>

Ho fatto i test in Chrome e un po 'in Firefox (in Windows XP). Ho ancora altri test da fare, quindi per favore dimmi come funziona per te.


grazie, questo funziona alla grande nei browser mobili da quello che ho testato ed è lì che ho avuto problemi con il ridimensionamento degli iframe!
Mircea Sandu,

Sono contento che ti piaccia :-) Ho trovato iframe per la maggior parte molto più efficiente e offre un supporto browser migliore di Ajax.
www139,

1
GRAZIE!!! Principalmente, perché sei l'unico che ha specificato DOVE inserire il codice senza supporre che le persone lo sappiano. Questa semplice soluzione ha funzionato perfettamente per me (Firefox, Chrome, Edge), per inquadrare contenuti dinamici sullo stesso dominio nel mio sito Wordpress. Ho un form-select che produrrà contenuti dinamici di varie lunghezze. L'iFrame si adatta perfettamente. Ho dovuto modificare il .clientHeight + 5 + 'px'; e clientWidth + 18 + 'px'; essere più pixel. E non sono sicuro del motivo per cui il display: tabella; nel CSS era necessario, quindi l'ho commentato per i miei scopi. Grazie ancora.
Heres2u,

1

Ecco come lo farei (testato in FF / Chrome):

<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>

Se a Microsoft non interessa, a chi dovrebbe interessare?
m3nda,

1

Ecco alcuni metodi:

<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>

E UN ALTRO ALTERNATIVO

<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>

PER NASCONDERE LO SCORRIMENTO CON 2 ALTERNATIVE COME INDICATO SOPRA

<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>

HACK CON SECONDO CODICE

<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>

Per nascondere le barre di scorrimento dell'iFrame, il genitore viene reso "overflow: nascosto" per nascondere le barre di scorrimento e l'iFrame viene fatto salire fino al 150% in larghezza e altezza che forza le barre di scorrimento all'esterno della pagina e poiché il corpo non lo fa ' Non ci sono barre di scorrimento, non ci si può aspettare che l'iframe superi i limiti della pagina. Questo nasconde le barre di scorrimento dell'iFrame a tutta larghezza!

fonte: imposta l'altezza automatica iframe


Gli esempi che hai fornito dovrebbero rendere il contenuto completo dell'iframe, non ridimensionare automaticamente l'altezza dell'iframe per adattarlo a tutto il contenuto interno. Non risponde alle domande.
Nickornotto


1

Ho trovato questo resizer per funzionare meglio:

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;

}

Si noti che l'oggetto stile è stato rimosso.


Non funziona per me su Chrome / Win10 - il contenuto è parzialmente tagliato in basso.
glenneroo

1

In jQuery, questa è l'opzione migliore per me, che mi aiuta davvero !! Aspetto che ti aiuti!

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

Contesto

Ho dovuto farlo da solo in un contesto di estensione web. Questa estensione web inietta una parte dell'interfaccia utente in ogni pagina e questa interfaccia utente vive all'interno di un iframe. Il contenuto all'interno di iframeè dinamico, quindi ho dovuto regolare nuovamente la larghezza e l'altezza di iframese stesso.

Uso React ma il concetto si applica a tutte le librerie.

La mia soluzione (questo presuppone che tu controlli sia la pagina che l'iframe)

All'interno iframeho cambiato bodystile per avere dimensioni davvero grandi. Ciò consentirà agli elementi interni di disporre utilizzando tutto lo spazio necessario. Fare widthe il height100% non ha funzionato per me (suppongo perché l'iframe ha un valore predefinito width = 300pxe height = 150px)

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

Quindi ho iniettato tutta l'interfaccia utente iframe all'interno di un div e gli ho dato alcuni stili

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

Dopo aver eseguito il rendering della mia app all'interno di questo #ui-root(in React lo faccio all'interno componentDidMount) computo le dimensioni di questo div come e le sincronizzo con la pagina padre usando window.postMessage:

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

Nel frame genitore faccio qualcosa del genere:

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)

Bella soluzione! Grazie!
redelschaap,


0

So che il post è vecchio, ma credo che questo sia un altro modo per farlo. Ho appena implementato il mio codice. Funziona perfettamente sia al caricamento della pagina che al ridimensionamento della pagina:

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

Javascript da inserire nell'intestazione:

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

Ecco qui il codice HTML iframe:

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

Foglio di stile CSS

>

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

0

Per l'attributo della direttiva angularjs:

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';
        } );
    }
};
} );

Nota la percentuale, l'ho inserita in modo da poter contrastare il ridimensionamento di solito fatto per iframe, testo, annunci ecc., Metti semplicemente 0 se nessun ridimensionamento è implementazione


0

È così che l'ho fatto quando ho caricato o quando le cose cambiano.

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

0

Chiaramente ci sono molti scenari, tuttavia, avevo lo stesso dominio per documenti e iframe e sono stato in grado di affrontarlo fino alla fine del mio contenuto iframe:

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

Questo "trova" il contenitore principale e quindi imposta la lunghezza aggiungendo un fattore di sfumatura di 50 pixel per rimuovere la barra di scorrimento.

Non c'è nulla lì per 'osservare' il cambiamento dell'altezza del documento, questo non mi serviva per il mio caso d'uso. Nella mia risposta, porto un modo per fare riferimento al contenitore padre senza usare gli id ​​inseriti nel contenuto padre / iframe.


0

Se riesci a vivere con proporzioni fisse e vorresti un iframe reattivo , questo codice ti sarà utile. Sono solo regole CSS.

.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%;
}

L'iframe deve avere un div come contenitore.

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

Il codice sorgente si basa su questo sito e Ben Marshall ha una buona spiegazione.


-1

Semplicità:

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

Se il contenuto è solo un HTML molto semplice, il modo più semplice è rimuovere l'iframe con javascript

Codice HTML:

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

Codice Javascript:

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
Ciò modifica la struttura del documento principale. Se si desidera avere un altro documento come figura con una didascalia, questo non mantiene la struttura del documento come succinta. Casi d'uso diversi, ma volevo spostare uno snippet di codice su un iframe per motivi di contorno.
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>

Questo non è CSS, è JS.
clifgriffin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.