Отрегулируйте ширину и высоту iframe, чтобы соответствовать содержанию в нем - PullRequest
267 голосов
/ 04 мая 2009

Мне нужно решение для автоматической настройки width и height для iframe, чтобы едва соответствовать его содержанию. Дело в том, что ширина и высота могут быть изменены после загрузки iframe. Я предполагаю, что мне нужно действие события, чтобы справиться с изменением размеров тела, содержащегося в iframe.

Ответы [ 28 ]

3 голосов
/ 11 июля 2012

Я слегка модифицировал отличное решение Гарнафа выше. Казалось, что его решение изменило размер iframe, основанный на размере прямо перед событием. Для моей ситуации (отправка электронной почты через iframe) мне нужно было изменить высоту iframe сразу после отправки. Например, показать ошибки проверки или сообщение «спасибо» после отправки.

Я просто удалил вложенную функцию click () и поместил ее в свой 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>

Работал для меня, но не уверен насчет кросс-браузерной функциональности.

2 голосов
/ 19 декабря 2013

все не может работать, используя вышеуказанные методы.

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>

Конверт: IE 10, Windows 7 x64

2 голосов
/ 13 января 2018

Если вы можете управлять как содержимым IFRAME, так и родительским окном, вам потребуется iFrame Resizer .

Эта библиотека позволяет автоматически изменять размеры высоты и ширины как одинаковых, так и междоменных iFrames, чтобы соответствовать их содержанию. Он предоставляет ряд функций для решения наиболее распространенных проблем с использованием iFrames, в том числе:

  • Изменение размера iFrame по высоте и ширине до размера содержимого.
  • Работает с несколькими и вложенными фреймами.
  • Аутентификация домена для междоменных фреймов.
  • Предоставляет ряд методов расчета размера страницы для поддержки сложных макетов CSS.
  • Обнаруживает изменения в DOM, которые могут привести к изменению размера страницы с помощью MutationObserver.
  • Обнаруживает события, которые могут вызвать изменение размера страницы (изменение размера окна, анимация и переход CSS, изменение ориентации и события мыши).
  • Упрощенный обмен сообщениями между iFrame и страницей хоста через postMessage.
  • Исправляет ссылки на страницы в iFrame и поддерживает ссылки между iFrame и родительской страницей.
  • Предоставляет пользовательские методы определения размера и прокрутки.
  • Предоставляет родительскую позицию и размер области просмотра для iFrame.
  • Работает с ViewerJS для поддержки документов PDF и ODF.
  • Откат поддержки до IE8.
1 голос
/ 17 декабря 2014

В случае, если кто-то добирается сюда: У меня была проблема с решениями, когда я удалил div из iframe - iframe не стал короче.

Существует плагин Jquery, который выполняет эту работу:

http://www.jqueryscript.net/layout/jQuery-Plugin-For-Auto-Resizing-iFrame-iFrame-Resizer.html

1 голос
/ 13 августа 2014

Мне показалось, что этот ресайзер работает лучше:

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;

}

Обратите внимание, что объект стиля удален.

1 голос
/ 17 июня 2015

Я нашел другое решение после некоторых экспериментов. Сначала я попробовал код, помеченный как «лучший ответ» на этот вопрос, и он не сработал. Я думаю, потому что мой iframe в моей программе в то время создавался динамически. Вот код, который я использовал (он работал для меня):

Javascript внутри загружаемого 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';
    };

Необходимо добавить 4 или более пикселей к высоте, чтобы убрать полосы прокрутки (какая-то странная ошибка / эффект iframes). Ширина еще более странная, вы можете добавить 18px к ширине тела. Также убедитесь, что у вас есть CSS для тела iframe (ниже).

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

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

Вот HTML-код для iframe:

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

Вот весь код в моем 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>

Я провел тестирование в Chrome и немного в Firefox (в Windows XP). У меня еще есть тесты, поэтому, пожалуйста, расскажите, как это работает для вас.

1 голос
/ 08 февраля 2017

В jQuery это лучший вариант для меня, который действительно помогает мне !! Я жду, что вам поможет!

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>
0 голосов
/ 10 апреля 2019

Ясно, что существует множество сценариев, однако у меня был один домен для документа и iframe, и я смог добавить это в конец содержимого iframe:

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

Это 'находит' родительский контейнер и затем устанавливает длину, добавляя коэффициент выдумки 50 пикселей, чтобы удалить полосу прокрутки.

Там нет ничего, чтобы «наблюдать» за изменением высоты документа, это мне не понадобилось для моего варианта использования. В своем ответе я привел средство ссылки на родительский контейнер без использования идентификаторов, запеченных в содержимом parent / iframe.

0 голосов
/ 06 сентября 2018

Контекст

Я должен был сделать это сам в контексте веб-расширения. Это веб-расширение внедряет какой-то кусок пользовательского интерфейса в каждую страницу, и этот пользовательский интерфейс находится внутри iframe. Содержимое внутри iframe является динамическим, поэтому мне пришлось перенастроить ширину и высоту самого iframe.

Я использую Реагирует , но концепция применима к каждой библиотеке.

Мое решение (предполагается, что вы контролируете как страницу, так и фрейм)

Внутри iframe я изменил стили body, чтобы иметь действительно большие размеры. Это позволит расположить элементы внутри, используя все необходимое пространство. Создание width и height 100% у меня не сработало (наверное, потому что у iframe по умолчанию width = 300px и height = 150px)

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

Затем я вставил весь интерфейс iframe в div и дал ему несколько стилей

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

После рендеринга моего приложения внутри этого #ui-rootРеагирование Я делаю это внутри componentDidMount) Я вычисляю размеры этого div как и синхронизирую их с родительской страницей, используя window.postMessage:

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

В родительском кадре я делаю что-то вроде этого:

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)
0 голосов
/ 22 июля 2018

Вот как я это делал при загрузке или когда все меняется.

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