Dostosuj szerokość i wysokość elementu iframe, aby dopasować go do zawartości


300

Potrzebuję rozwiązanie dla automatycznej regulacjiwidth i heightod iframeledwo dopasować jego zawartość. Chodzi o to, że szerokość i wysokość można zmienić po iframezaładowaniu. Chyba potrzebuję akcji zdarzenia, aby poradzić sobie ze zmianą wymiarów ciała zawartego w ramce iframe.



Akceptowana odpowiedź nie działa. Spróbuj stackoverflow.com/a/31513163/482382
Steven Shaw

Odpowiedzi:


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: tak, to przeglądarka. Kod jest niestandardowy, ponieważ ma właściwość contentWindow, która nie jest zdefiniowana w specyfikacji DOM. W specyfikacji DOM istnieje właściwość o nazwie contentDocument, ale program Internet Explorer 6 (i 7?) Jej nie obsługuje. Zamiast tego można użyć właściwości contentWindow i jest ona implementowana we wszystkich popularnych przeglądarkach (Gecko, Opera, Webkit, IE).
Rafael

30
Jaki jest pożytek z if (document.getElementById)?
Ally

55
Nie zapominaj też, że to nie jest domena międzydomenowa. Powód, dla którego pojawia się rodzaj błędu: odmowa dostępu do „dokumentu” właściwości, jeśli domena jest inna. Rozwiązanie można znaleźć tutaj
Pierre de LESPINAY,

15
Warunek jest nie tylko bezużyteczny, ale w rzadkich okolicznościach, dla których jest przeznaczony, może powodować problemy. Dlaczego sprawdzasz, czy metoda istnieje, a następnie używasz metody poza sprawdzeniem?
JS

6
Myślę, że miałeś na myśli DOMContentLoaded, ponieważ DOMContentReadywydaje się , że to nie jest coś: developer.mozilla.org/en-US/…
Max Heiber


35

Wszystkie dotychczasowe rozwiązania uwzględniają tylko jednorazową zmianę rozmiaru. Wspominasz, że chcesz zmienić rozmiar ramki iFrame po zmodyfikowaniu zawartości. Aby to zrobić, musisz wykonać funkcję w ramce iFrame (po zmianie zawartości musisz uruchomić zdarzenie, aby powiedzieć, że zawartość się zmieniła).

Utknąłem z tym przez chwilę, ponieważ kod wewnątrz iFrame wydawał się ograniczony do DOM wewnątrz iFrame (i nie mógł edytować iFrame), a kod wykonywany poza iFrame utknął z DOM poza iFrame (i nie mógł odebrać wydarzenie pochodzące z wnętrza iFrame).

Rozwiązanie pochodzi z odkrycia (dzięki pomocy kolegi), że jQuery można powiedzieć, z którego DOM korzystać. W takim przypadku DOM okna nadrzędnego.

Jako taki, kod taki jak ten robi to, czego potrzebujesz (po uruchomieniu w ramce 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>

Jaki byłby na to pełny kod? Zakładam, że skrypt wchodzi w HTML iframe?
Andrew Hundt,

To jest pełny kod i tak, działa w kodzie HTML iFrame. Część „window.parent.document” określa, że ​​selektor jQuery powinien używać DOM dokumentu nadrzędnego, a nie dokumentu, w którym się znajdujesz (który znajduje się w ramce iFrame).
Garnaph

13
Działa to pięknie, jeśli dokument nadrzędny i dokument w ramce iframe pochodzą z tej samej domeny . Jeśli nie są (lub w wersji chromowanej, jeśli oba są plikami lokalnymi ), uruchamiane są zasady bezpieczeństwa „tego samego pochodzenia” przeglądarki, co uniemożliwia modyfikowanie dokumentu nadrzędnego przez zawartość elementu iframe.
user56reinstatemonica8

1
Dla każdego, kto próbuje zrobić coś takiego, działając w wielu domenach, zajrzyj do window.postMessage (IE8 +) i pamiętaj, że będziesz potrzebował niestandardowych skryptów zarówno na dokumencie hosta (nadrzędnym), jak i źródłowym (w ramach iframe). Pomocna może być wtyczka jQuery postmessage . Ponieważ będziesz potrzebować skryptów na hoście i źródle, może być łatwiej po prostu załadować zawartość przez AJAX za pomocą JSON-P.
user56reinstatemonica8

3
Jak automatycznie uruchomić wydarzenie zamiast jQuery("#IDofControlFiringResizeEvent").click(function ()?
Ben

33

jedno-liniowe rozwiązanie do osadzania: zaczyna się od rozmiaru minimalnego i zwiększa się do rozmiaru zawartości. nie potrzeba tagów skryptu.

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


Fragment kodu uruchamiania nie działa w przeglądarce Safari 9.1.1. Może zawierać problem SO?
Elensar

To nie jest między domenami. Może serwer musi dodać nagłówki do strony w ramce?
Finesse

Wszystkie odpowiedzi tutaj, które wymieniają, scrollHeight/scrollWidthpowinny zostać nieco dostosowane, aby uwzględnić marginesy ciała. Przeglądarki stosują domyślne niezerowe marginesy dla elementu treści dokumentów (dotyczy to również treści ładowanych do ramek). Roztwór roboczy znalazłem jest dodanie tego: parseInt(window.getComputedStyle(this.contentDocument.body).margin.
Stan

24

Jeśli zawartość elementu iframe pochodzi z tej samej domeny, powinno to działać świetnie. Wymaga to jednak jQuery.

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

Aby zmienić rozmiar dynamicznie, możesz to zrobić:

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

Następnie na stronie ładowanej przez iframe dodaj:

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

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

czy są jakieś proste sposoby, aby to zrobić, gdy pochodzenie pochodzi z innej domeny?
BruceJohnJennerLawso

15

Oto rozwiązanie dla różnych przeglądarek, jeśli nie chcesz używać 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
To jest dziwne. Dla mnie oblicza bardzo dziwną szerokość iframe. szerokość zawartości wynosi 750 i oblicza ją jako 300. Czy masz pomysły, dlaczego?
Rob

Bawiłem się tym kodem (dodając opcje wysokości). Jeśli ustawię wysokość ramki iFrame na 100%, ograniczy to do około 200 pikseli. Jeśli ustawię wysokość ramki iFrame na 600 pikseli, to się z tym zgadza. @RobertJagoda, czy masz na to rozwiązanie?
iaindownie

9

Po wypróbowaniu wszystkiego na ziemi, to naprawdę działa dla mnie.

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>

mówi: Uncaught TypeError: $ nie jest funkcją w autoResize ((indeks): 200) w HTMLIFrameElement.onload ((indeks): 204)
Michael Rogers

2
@Michael Rogers Wystąpił konflikt z $ lub zapomniałeś dołączyć plik jQuery.js. Użyj funkcji ogólnej stackoverflow.com/questions/6109847/… lub zamień $ na jQuery
Adrian P.

8

Korzystam z tego kodu, aby automatycznie dostosować wysokość wszystkich ramek iframe (z klasą autoHeight), gdy ładują się na stronie. Przetestowane i działa w IE, FF, Chrome, Safari i 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
Czym jest ta magia 35, którą dodajesz? Dla której przeglądarki i systemu operacyjnego to zmierzyłeś?
h2stein,

Teraz naprawdę nie wiem, dlaczego dodałem 35 pikseli. Ale mogę z pewnością powiedzieć, że przetestowałem to na FF, IE (7, 8, 9) i Chrome i działałem dobrze.
petriq

3
Myślę, że 35 to tylko grubość paska przewijania
Sadegh

Musiałem to nieco ulepszyć, aby działało - o nazwie setHeight (iframe); bezpośrednio (usunęliśmy wokół niego opakowanie $ (iframe) .load ().
shacker

Dodane magiczne 35 pikseli mają uwzględniać dopełnienie elementu iframe. Dodałbym, że iframe nie powinien zawierać dopełnienia, a zawartość iframe powinna to załatwić.
Filipe Melo

5

To solidne rozwiązanie

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

Lekko zmodyfikowałem świetne rozwiązanie Garnaph powyżej. Wyglądało na to, że jego rozwiązanie zmodyfikowało rozmiar elementu iframe w oparciu o rozmiar tuż przed zdarzeniem. W mojej sytuacji (przesyłanie wiadomości e-mail za pośrednictwem elementu iframe) potrzebowałem zmienić wysokość elementu iframe bezpośrednio po przesłaniu. Na przykład pokaż błędy weryfikacji lub komunikat „dziękuję” po przesłaniu.

Właśnie wyeliminowałem zagnieżdżoną funkcję click () i umieściłem ją w html iframe:

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

Pracowałem dla mnie, ale nie jestem pewien co do funkcjonalności w różnych przeglądarkach.


3

Jeśli możesz kontrolować zarówno zawartość IFRAME, jak i okno nadrzędne, potrzebujesz iFrame Resizer .

Ta biblioteka umożliwia automatyczne zmienianie wysokości i szerokości zarówno tych samych, jak i między domenowych ramek iFrame w celu dopasowania ich zawartej zawartości. Zapewnia szereg funkcji rozwiązujących najczęstsze problemy z używaniem ramek iFrames, do których należą:

  • Wysokość i szerokość zmienia rozmiar ramki iFrame na rozmiar zawartości.
  • Działa z wieloma i zagnieżdżonymi ramkami iFrame.
  • Uwierzytelnianie domeny dla i-ramek między domenami.
  • Udostępnia szereg metod obliczania rozmiaru strony w celu obsługi złożonych układów CSS.
  • Wykrywa zmiany w DOM, które mogą powodować zmianę rozmiaru strony za pomocą MutationObserver.
  • Wykrywa zdarzenia, które mogą spowodować zmianę rozmiaru strony (zmiana rozmiaru okna, animacja i przejście CSS, zmiana orientacji i zdarzenia myszy).
  • Uproszczone przesyłanie wiadomości między ramką iFrame a stroną hosta za pośrednictwem postMessage.
  • Naprawiono łącza do stron w iFrame i obsługuje łącza między iFrame a stroną nadrzędną.
  • Zapewnia niestandardowe metody zmiany rozmiaru i przewijania.
  • Wystawia pozycję nadrzędną i rozmiar rzutni w ramce iFrame.
  • Współpracuje z ViewerJS w celu obsługi dokumentów PDF i ODF.
  • Wsparcie awaryjne do IE8.

2

wszystko nie może działać przy użyciu powyższych metod.

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>

Środowisko: IE 10, Windows 7 x64


2

Po eksperymentach wymyśliłem inne rozwiązanie. Początkowo próbowałem kodu oznaczonego jako „najlepsza odpowiedź” na to pytanie i nie zadziałało. Domyślam się, że mój iframe w moim programie w tym czasie był generowany dynamicznie. Oto kod, którego użyłem (zadziałało dla mnie):

JavaScript wewnątrz ładowanego elementu iframe:

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

Konieczne jest dodanie 4 lub więcej pikseli do wysokości, aby usunąć paski przewijania (dziwny błąd / efekt ramek iframe). Szerokość jest jeszcze dziwniejsza, możesz bezpiecznie dodać 18px do szerokości ciała. Upewnij się także, że masz css dla ciała iframe zastosowanego (poniżej).

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

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

Oto HTML dla iframe:

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

Oto cały kod w mojej ramce 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>

Zrobiłem testy w Chrome i trochę w Firefoksie (w Windows XP). Mam jeszcze więcej testów, więc powiedz mi, jak to działa.


dziękuję, działa to niesamowicie w przeglądarkach mobilnych z tego, co przetestowałem i właśnie tam miałem problemy ze zmianą rozmiaru iframe!
Mircea Sandu,

Cieszę się, że ci się podoba :-) Odkryłem, że iframe jest w większości bardziej wydajny i oferuje lepszą obsługę przeglądarek niż Ajax.
www139

1
DZIĘKUJĘ CI!!! Głównie dlatego, że jesteś jedynym, który określił GDZIE, aby umieścić kod bez zakładania, że ​​ludzie wiedzą. To proste rozwiązanie działało idealnie dla mnie (Firefox, Chrome, Edge) do kadrowania dynamicznych treści w tej samej domenie na mojej stronie Wordpress. Mam form-select, który wyświetli dynamiczną zawartość o różnych długościach. IFrame dostosowuje się pięknie. Musiałem dostosować .clientHeight + 5 + 'px'; i clientWidth + 18 + „px”; być więcej pikseli. I nie jestem pewien, dlaczego wyświetlacz: tabela; w CSS było potrzebne, więc skomentowałem to dla moich celów. Dzięki jeszcze raz.
Heres2u

1

Tak bym to zrobił (testowany w 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>

Jeśli Microsoft nie przejmuje się tym, kogo to obchodzi?
m3nda

1

Oto kilka metod:

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

I KOLEJNA ALTERNATYWA

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

ABY UKRYĆ PRZEWIJANIE Z 2 ALTERNATYWAMI WYMIENIONYMI POWYŻEJ

<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 Z DRUGIM KODEM

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

Aby ukryć paski przewijania w ramce iFrame, element nadrzędny zostaje „przepełniony: ukryty” w celu ukrycia pasków przewijania, a ramka iFrame jest przesuwana w górę do 150% szerokości i wysokości, co powoduje, że paski przewijania są przesuwane poza stronę, a ponieważ ciało nie „ Aby mieć paski przewijania, nie można oczekiwać, że ramka iframe będzie przekraczać granice strony. Ukrywa paski przewijania ramki iFrame na całej szerokości!

źródło: ustaw automatyczną wysokość iframe


Podane przez ciebie przykłady mają na celu pełną treść iframe, a nie automatyczną zmianę wysokości iframe w celu dopasowania do całej zawartości wewnętrznej. Nie odpowiada na pytania.
nickornotto


1

Uważam, że ten resizer działa lepiej:

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;

}

Uwaga: obiekt stylu został usunięty.


Nie działa dla mnie na Chrome / Win10 - treść jest częściowo odcięta na dole.
glenneroo

1

W jQuery jest to dla mnie najlepsza opcja, która naprawdę mi pomaga !! Czekam, żeby ci pomóc!

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

Kontekst

Musiałem to zrobić sam w kontekście rozszerzenia internetowego. To rozszerzenie internetowe wstrzykuje część interfejsu użytkownika na każdą stronę, a ten interfejs użytkownika znajduje się wewnątrz iframe. Zawartość wewnątrz iframejest dynamiczna, więc musiałem dostosować szerokość i wysokośćiframe samego siebie.

Używam React ale ta koncepcja dotyczy każdej biblioteki.

Moje rozwiązanie (zakłada się, że kontrolujesz zarówno stronę, jak i ramkę iframe)

Wewnątrz iframezmieniłem bodystyle, aby mieć naprawdę duże wymiary. Umożliwi to rozmieszczenie elementów w środku z wykorzystaniem niezbędnej przestrzeni. Tworzenie widthi height100% nie działało dla mnie (chyba dlatego, że iframe ma wartość domyślną width = 300pxi height = 150px)

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

Potem wstrzyknąłem interfejs użytkownika iframe do diva i nadałem mu trochę stylów

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

Po renderowaniu mojej aplikacji w tym #ui-root(w React robię to w środku componentDidMount) obliczam wymiary tego div, jak i synchronizuję je ze stroną nadrzędną, używając window.postMessage:

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

W ramce nadrzędnej robię coś takiego:

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)

Fajne rozwiązanie! Dzięki!
redelschaap,


0

Wiem, że post jest stary, ale wierzę, że jest to kolejny sposób na zrobienie tego. Właśnie zaimplementowałem mój kod. Działa idealnie zarówno przy ładowaniu strony, jak i przy zmianie rozmiaru strony:

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 do umieszczenia w nagłówku:

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

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

Arkusz stylów CSS

>

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

0

W przypadku atrybutu dyrektywy 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';
        } );
    }
};
} );

Zwróć uwagę na procent, wstawiłem go, abyś mógł przeciwdziałać skalowaniu wykonywanemu zwykle dla iframe, tekstu, reklam itp., Po prostu ustaw 0, jeśli skalowanie nie jest implementacją


0

Tak to zrobiłem onload lub kiedy rzeczy się zmieniają.

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

0

Oczywiście jest wiele scenariuszy, ale miałem tę samą domenę dla dokumentu i iframe i udało mi się rozwiązać to na końcu mojej zawartości iframe:

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

To „znajdzie” kontener nadrzędny, a następnie ustawia długość dodając współczynnik krycia 50 pikseli, aby usunąć pasek przewijania.

Nie ma nic, co „obserwowałoby” zmianę wysokości dokumentu, nie potrzebowałem tego w moim przypadku użycia. W mojej odpowiedzi przytaczam sposób odwoływania się do kontenera nadrzędnego bez użycia identyfikatorów upieczonych w treści nadrzędnej / iframe.


0

Jeśli możesz żyć ze stałym współczynnikiem kształtu i potrzebujesz responsywnego elementu iframe , ten kod będzie ci przydatny. To tylko zasady 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%;
}

Element iframe musi mieć div jako kontener.

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

Kod źródłowy jest oparty na tej stronie, a Ben Marshall ma dobre wyjaśnienie.


-1

Prostota:

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

Jeśli treść jest po prostu bardzo prostym plikiem HTML, najprostszym sposobem jest usunięcie elementu iframe za pomocą javascript

Kod HTML:

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

Kod 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
To zmienia kontur dokumentu nadrzędnego. Jeśli chcesz mieć inny dokument jako rysunek z rysunkiem, to nie zachowuje on zwięzłego obrysu dokumentu. Różne przypadki użycia, ale chciałem przenieść fragment kodu do elementu iframe z przyczyn ogólnych.
Kot Henry'ego

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

To nie jest CSS, to JS.
clifgriffin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.