Сделать iframe автоматически настраивать высоту в соответствии с содержимым без использования полосы прокрутки?

Например:

<iframe name="Stack" src="http://stackoverflow.com/" width="740"
        frameborder="0" scrolling="no" id="iframe"> ...
</iframe>

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

+465
02 апр. '12 в 11:45
источник поделиться
17 ответов

Добавьте это в раздел <head>:

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

И измените ваш iframe на это:

<iframe src="..." frameborder="0" scrolling="no" onload="resizeIframe(this)" />

Как найти на Sitepoint обсуждения.

+614
02 апр. '12 в 12:20
источник

Вы можете использовать эту библиотеку, которая изначально правильно упорядочивает ваш iframe, а также сохраняет ее в нужном размере, определяя, когда изменяется размер содержимого iframe (либо путем регулярной проверки в setInterval, либо через MutationObserver). и изменить его размер.

https://github.com/davidjbradshaw/iframe-resizer

Это работает как с перекрестными, так и с одинаковыми доменными iframe.

+86
02 февр. '14 в 20:52
источник
другие ответы

Связанные вопросы


Похожие вопросы

Вот компактная версия:

<iframe src="hello.html"
        onload="this.style.height=this.contentDocument.body.scrollHeight +'px';">
</iframe>
+45
23 авг. '15 в 2:01
источник

Предложение hjpotter92 не работает в сафари! Я сделал небольшую настройку для script, поэтому теперь он работает и в Safari.

Только сделанное изменение сбрасывает высоту до 0 при каждой загрузке, чтобы позволить некоторым браузерам уменьшать высоту.

Добавьте это в тег <head>:

<script type="text/javascript">
  function resizeIframe(obj){
     obj.style.height = 0;
     obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
  }
</script>

И добавьте следующий атрибут onload в ваш iframe, например:

<iframe onload='resizeIframe(this)'></iframe>
+38
21 дек. '13 в 18:30
источник

Ответ на hjpotter92 работает достаточно хорошо в некоторых случаях, но я обнаружил, что контент iframe часто получает снизу в Firefox и IE, но отлично работает в Chrome.

Следующее хорошо работает для меня и устраняет проблему отсечения. Код был найден в http://www.dyn-web.com/tutorials/iframes/height/. Я сделал небольшую модификацию, чтобы извлечь атрибут onload из HTML. Поместите следующий код после <iframe> HTML и перед закрывающим тегом </body>:

<script type="text/javascript">
function getDocHeight(doc) {
    doc = doc || document;
    // stackoverflow.com/questions/1145850/
    var body = doc.body, html = doc.documentElement;
    var height = Math.max( body.scrollHeight, body.offsetHeight, 
        html.clientHeight, html.scrollHeight, html.offsetHeight );
    return height;
}

function setIframeHeight(id) {
    var ifrm = document.getElementById(id);
    var doc = ifrm.contentDocument? ifrm.contentDocument: 
        ifrm.contentWindow.document;
    ifrm.style.visibility = 'hidden';
    ifrm.style.height = "10px"; // reset to minimal height ...
    // IE opt. for bing/msn needs a bit added or scrollbar appears
    ifrm.style.height = getDocHeight( doc ) + 4 + "px";
    ifrm.style.visibility = 'visible';
}

document.getElementById('ifrm').onload = function() { // Adjust the Id accordingly
    setIframeHeight(this.id);
}
</script>

Ваш HTML-код iframe:

<iframe id="ifrm" src="some-iframe-content.html"></iframe>

Обратите внимание, что если вы предпочитаете включать Javascript в <head> документа, то вы можете вернуться к использованию встроенного атрибута onload в iframe HTML, как на веб-странице dyn-web.

+13
04 июл. '15 в 11:01
источник

Избегайте встроенного JavaScript; вы можете использовать класс:

<iframe src="..." frameborder="0" scrolling="auto" class="iframe-full-height"></iframe>

И ссылайтесь на него с помощью jQuery:

$('.iframe-full-height').on('load', function(){
    this.style.height=this.contentDocument.body.scrollHeight +'px';
});
+12
29 нояб. '15 в 17:35
источник

Метод jQuery .contents() позволяет нам искать непосредственные дочерние элементы элемента в дереве DOM.

JQuery

$('iframe').height( $('iframe').contents().outerHeight() );

Помните, что тело страницы внутри iframe должно иметь высоту

CSS

body {
  height: auto;
  overflow: auto
}
+4
20 янв. '15 в 15:54
источник

Это работает для меня (также с несколькими iframes на одной странице):

$('iframe').load(function(){$(this).height($(this).contents().outerHeight());});
+2
17 мая '15 в 6:57
источник

Попробуйте это для IE11

<iframe name="Stack" src="http://stackoverflow.com/" style='height: 100%; width: 100%;' frameborder="0" scrolling="no" id="iframe">...</iframe>
+2
09 дек. '15 в 22:09
источник

Это работает для меня (в основном).

Поместите это внизу страницы.

<script type="application/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">
</script>

<script type="application/javascript" src="/script/jquery.browser.js">
</script>

<script type="application/javascript" src="/script/jquery-iframe-auto-height.js">
</script>

<script type="application/javascript"> 
  jQuery('iframe').iframeAutoHeight();
  $(window).load(
      function() {
          jQuery('iframe').iframeAutoHeight();  
      }
  );

  // for when content is not html e.g. a PDF
  function setIframeHeight() {
      $('.iframe_fullHeight').each(
          function (i, item) {
              item.height = $(document).height();
          }
      );
  };

  $(document).ready( function () {
      setIframeHeight();
  });
  $(window).resize( function () {
      setIframeHeight();
  });
</script> 

Первая половина от??? и работает, когда в iframe есть html. Вторая половина устанавливает iframe на высоту страницы (не высоту содержимого), когда класс iframes - iframe_fullHeight. Вы можете использовать это, если контент является PDF или другим подобным, но вы должны установить класс. Также может использоваться только при полной высоте.

Примечание: по какой-то причине, когда он пересчитывается после изменения размера окна, он становится неправильным.

+2
03 янв. '15 в 16:51
источник
function autoResize(id){
    var newheight;
    var newwidth;

    if(document.getElementById){
        newheight=document.getElementById(id).contentWindow.document.body.scrollHeight;
        newwidth=document.getElementById(id).contentWindow.document.body.scrollWidth;
    }

    document.getElementById(id).height=(newheight) + "px";
    document.getElementById(id).width=(newwidth) + "px"; 
}

добавьте это в свой iframe: OnLoad = "AUTORESIZE ( 'youriframeid')"

+1
15 янв. '14 в 19:49
источник
jq2('#stocks_iframe').load(function(){
var iframe_width = jq2('#stocks_iframe').contents().outerHeight() ; 
jq2('#stocks_iframe').css('height',iframe_width); });

<iframe id='stocks_iframe' style='width:100%;height:0px;' frameborder='0'>
+1
04 мая '15 в 8:52
источник

В прошлом у меня были проблемы с вызовом iframe.onload для динамически созданных iframe, поэтому я пошел с этим подходом для установки размера iframe:

iFrame View

var height = $("body").outerHeight();
parent.SetIFrameHeight(height);

Основной вид

SetIFrameHeight = function(height) {
    $("#iFrameWrapper").height(height);
}

(это будет работать только в том случае, если оба представления находятся в одном домене)

0
25 февр. '14 в 14:29
источник

Я сделал это с AngularJS. Angular не имеет ng-нагрузки, но был создан сторонний модуль; установите с беседкой ниже или найдите его здесь: https://github.com/andrefarzat/ng-load

Получить директиву ngLoad: bower install ng-load --save

Установите ваш iframe:

<iframe id="CreditReportFrame" src="about:blank" frameborder="0" scrolling="no" ng-load="resizeIframe($event)" seamless></iframe>

Функция resizeIframe контроллера:

$scope.resizeIframe = function (event) {
    console.log("iframe loaded!");
    var iframe = event.target;
    iframe.style.height = iframe.contentWindow.document.body.scrollHeight + 'px';
};
0
04 нояб. '14 в 20:55
источник

Я хотел, чтобы iframe вел себя как обычная страница (мне нужно было создать полноэкранный баннер внутри элемента iframe), так что вот мой script:

    (function (window, undefined) {

    var frame,
        lastKnownFrameHeight = 0,
        maxFrameLoadedTries = 5,
        maxResizeCheckTries = 20;

    //Resize iframe on window resize
    addEvent(window, 'resize', resizeFrame);

    var iframeCheckInterval = window.setInterval(function () {
        maxFrameLoadedTries--;
        var frames = document.getElementsByTagName('iframe');
        if (maxFrameLoadedTries == 0 || frames.length) {
            clearInterval(iframeCheckInterval);
            frame = frames[0];
            addEvent(frame, 'load', resizeFrame);
            var resizeCheckInterval = setInterval(function () {
                resizeFrame();
                maxResizeCheckTries--;
                if (maxResizeCheckTries == 0) {
                    clearInterval(resizeCheckInterval);
                }
            }, 1000);
            resizeFrame();
        }
    }, 500);

    function resizeFrame() {
        if (frame) {
            var frameHeight = frame.contentWindow.document.body.scrollHeight;
            if (frameHeight !== lastKnownFrameHeight) {
                lastKnownFrameHeight = frameHeight;

                var viewportWidth = document.documentElement.clientWidth;
                if (document.compatMode && document.compatMode === 'BackCompat') {
                    viewportWidth = document.body.clientWidth;
                }

                frame.setAttribute('width', viewportWidth);
                frame.setAttribute('height', lastKnownFrameHeight);

                frame.style.width = viewportWidth + 'px';
                frame.style.height = frameHeight + 'px';
            }
        }
    }

    //--------------------------------------------------------------
    //  Cross-browser helpers
    //--------------------------------------------------------------

    function addEvent(elem, event, fn) {
        if (elem.addEventListener) {
            elem.addEventListener(event, fn, false);
        } else {
            elem.attachEvent("on" + event, function () {
                return (fn.call(elem, window.event));
            });
        }
    }

})(window);

Функции не требуют пояснений и содержат комментарии для дальнейшего объяснения их цели.

-1
25 сент. '15 в 13:54
источник
<script type="text/javascript">
  function resizeIframe(obj) {
    obj.style.height = 0;
    obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
  }
</script>

это не работает для хром. Но работает для firefox.

-2
05 окт. '14 в 14:59
источник

Этот параметр будет работать на 100%

<iframe id='iframe2' src="url.com" frameborder="0" style="overflow: hidden; height: 100%; width: 100%; position: absolute;" height="100%" width="100%"></iframe>
-6
15 мая '15 в 10:14
источник

Посмотрите другие вопросы по меткам или Задайте вопрос