iframe自动调整其高度以适应内容高度

时间:2016-03-01 03:31:47

标签: javascript jquery html iframe

我已经尝试了一些有关此iframe自动高度问题的答案。

基本上,我想要的是根据iframe内部的内容高度自动调整iframe的高度。

以下是我尝试过的具体内容。

Resizing an iframe based on content

How to auto-size an iFrame?

iframe Auto Adjust Height as content changes

id #iframe需要自动调整的iframe是内容的高度,因此我将以下代码分别插入到父文档和iframe的正文中。

<script>
  // Resize iframe to full height
  function resizeIframe(height)
  {
// "+60" is a general rule of thumb to allow for differences in
// IE & and FF height reporting, can be adjusted as required..
document.getElementById('iframe').height = parseInt(height)+60;
  }
</script>

和iframe

<body onload="iframeResizePipe()">
<iframe id="helpframe" src='' height='0' width='0' frameborder='0'> </iframe>

  <script type="text/javascript">
  function iframeResizePipe()
 {
            // What's the page height?
     var height = document.body.scrollHeight;

 // Going to 'pipe' the data to the parent through the helpframe..
 var pipe = document.getElementById('helpframe');

 // Cachebuster a precaution here to stop browser caching interfering
 pipe.src = 'http://www.foo.com/helper.html?height='+height+'&cacheb='+Math.random();

  }
</script>

这是我遇到问题的网站:http://xefrontier.com

(如果您点击&#39; WALL&#39;标签,iframe就在那里。)

任何人都可以帮我弄清楚,为什么这些代码不会起作用? 感谢。

2 个答案:

答案 0 :(得分:1)

Snippet当然不起作用,我只是把它放在那里以满足帖子的要求。请阅读此README.md并查看Plunker demo。所有细节都在README.md中,并在此处发布。

README.md

iFrame动态高度

此演示在同源策略下工作,简单地说,父子页面必须位于同一位置:

  1. 相同协议(http://)
  2. 相同的子域名(http://app。)
  3. 相同域名(http://app.domain.com
  4. 相同的端口(http://app.domain.com:80

    • 有3个不同高度的儿童页面。

      • iFrm1,HTML
      • iFrm2.html
      • iFrm3.html
    • 当我们要控制iframe时,准备布局和iframe属性非常重要。

      • 当我们通过满足同源政策的要求确定父页面和子页面的确切位置时,已经完成了第一步。
  5. CSS:

    /* Outer Container */
    
    #iSec {
      width: 100vw;  /* As wide as your screen */
      height: 100vh; /* As tall as your screen */
      display: table;/* Will behave like a table */
    }
    
    
    /* iFrame Wrappers */
    
    .jFrame {
       position: relative; /* As a non-static element, any descendants can be easily positioned. */
       max-height: 100%; /* Being flexible is important when dealing with dynamic content. */
       max-width: 100%; /* see above */
       overflow-y: auto; /* Scrollbars will appear when height exceeds the viewport (your screen)*/
       display: table-cell; /* Will behave like a table-cell
    }
    
    /* iFrames */
    
    iframe {
       position: absolute; /* Easily positioned within it's parent (`.jFrame`)*/
       width: 100%; /* Set the iFrames' attribute as well */
       height: 100%; /* Set the iFrames' attribute as well */
    
       top: 0;  /* Streches iframes' edges */
       left: 0;
       bottom: 0;
       right: 0;
     }
    

    的iFrame:

    <iframe id="iFrm1" src="iFrm1.html" width="100%" height="100%" scrolling="no" frameborder="0"></iframe>
    

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~

    我借用和修改的大部分代码来自 这site

    //将所有iframe收集到NodeList中,转换为数组,然后调用iFrmHt(),并传递每个iFrame的id。

    function loadiFrames() {
      var iFrmList = document.querySelectorAll('iframe');
      var iFrmArray = Array.prototype.map.call(iFrmList, function(obj) {
        var ID = obj.id;
        iFrmHt(ID);
      });
    }
    

    //引用目标iFrame的文档

    function iFrmHt(ID) {
      var iFrm = document.getElementById(ID);
      var iDoc = iFrm.contentDocument || iFrm.contentWindow.document;
      var iHt = function(iDoc) {
        if (!iDoc) {
          iDoc = document;
        }
        var iKid = iDoc.body;
        var iRoot = iDoc.documentElement;
    

    //使用几种不同的方法来确定iFrame的子页面 - 高度。

        var iHt = Math.max(iKid.scrollHeight, iKid.offsetHeight,
          iRoot.clientHeight, iRoot.scrollHeight, iRoot.offsetHeight);
        return iHt;
      }
    

    //更改iFrame的高度

      iFrm.style.height = iHt + 'px';
      console.log('iFrame: ' + iFrm.id);
      console.log('height: ' + iHt(iDoc));
    }
    

    //如果加载窗口加载,iFrames不应该超时。

    window.onload = loadiFrames;
    

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~

    <强>段

    &#13;
    &#13;
    <!doctype html>
    <html>
    
    <head>
      <meta charset="utf-8">
      <title>iFrame Dynamic Height</title>
      <style>
        #iSec {
          width: 100vw;
          height: 100vh;
          display: table;
        }
        .jFrame {
          position: relative;
          max-height: 100%;
          max-width: 100%;
          overflow-y: auto;
          display: table-cell;
        }
        iframe {
          position: absolute;
          width: 100%;
          height: 100%;
          top: 0;
          left: 0;
          bottom: 0;
          right: 0;
        }
      </style>
    </head>
    
    <body>
      <section id="iSec">
        <div id="i1" class="jFrame">
          <iframe id="iFrm1" src="iFrm1.html" width="100%" height="100%" scrolling="no" frameborder="0"></iframe>
        </div>
        <div id="i2" class="jFrame">
          <iframe id="iFrm2" src="iFrm2.html" width="100%" height="100%" scrolling="no" frameborder="0"></iframe>
        </div>
        <div id="i3" class="jFrame">
          <iframe id="iFrm3" src="iFrm3.html" width="100%" height="100%" scrolling="no" frameborder="0"></iframe>
        </div>
      </section>
    
      <script>
        function loadiFrames() {
          var iFrmList = document.querySelectorAll('iframe');
          var iFrmArray = Array.prototype.map.call(iFrmList, function(obj) {
            var ID = obj.id;
            iFrmHt(ID);
          });
        }
    
        function iFrmHt(ID) {
          var iFrm = document.getElementById(ID);
          var iDoc = iFrm.contentDocument || iFrm.contentWindow.document;
          var iHt = function(iDoc) {
            if (!iDoc) {
              iDoc = document;
            }
            var iKid = iDoc.body;
            var iRoot = iDoc.documentElement;
            var iHt = Math.max(iKid.scrollHeight, iKid.offsetHeight,
              iRoot.clientHeight, iRoot.scrollHeight, iRoot.offsetHeight);
            return iHt;
          }
          iFrm.style.height = iHt + 'px';
          console.log('iFrame: ' + iFrm.id);
          console.log('height: ' + iHt(iDoc));
        }
    
        window.onload = loadiFrames;
      </script>
    </body>
    
    </html>
    &#13;
    &#13;
    &#13;

答案 1 :(得分:0)

多年前,另一位用户在StackOverflow上发布了这个问题和解决方案。

Full-screen iframe with a height of 100%

此方法使用CSS而不是JS来设置IFRAME的维度。