使iframe响应

时间:2013-07-24 15:34:14

标签: css iframe responsive-design

我正在阅读this stackoverflow post标题为“#34;你能让iFrame响应吗?"”,其中一条评论/回答让我this jfiddle.

但是当我尝试实现HTML和CSS以满足我的需求时,我没有取得相同的结果/成功。我创建了my own JS fiddle,所以我可以告诉你它对我来说是如何运作的。我确定它与我使用的iFrame类型有关(例如,产品图片可能也需要响应或其他什么?)

我主要担心的是,当我的博客读者在iPhone上访问我的博客时,我不希望所有内容都是x宽度(我的所有内容都是100%),然后iFrame行为不端,是唯一的元素更广泛(因此超出所有其他内容 - 如果这是有道理的?)

无论如何,有谁知道它为什么不起作用?谢谢。

这是HTML&我的JSFIDDLE的CSS(如果你不想点击链接):

<div class="wrapper">
  <div class="h_iframe">
    <!-- a transparent image is preferable -->
    <img class="ratio" src="http://www.brightontheday.com/wp-content/uploads/2013/07/placeholder300.png" />
    <iframe frameborder='0' height='465px' width='470px' scrolling='no' src='http://currentlyobsessed.me/api/v1/get_widget?wid=30&blog=Brighton+The+Day&widgetid=38585'
      frameborder="0" allowfullscreen></iframe>
  </div>
</div>

以下是随附的CSS:

.wrapper {
  width: 100%;
  height: 100%;
  margin: 0 auto;
  background: #ffffff;
}

.h_iframe {
  position: relative;
}

.h_iframe .ratio {
  display: block;
  width: 100%;
  height: auto;
}

.h_iframe iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

26 个答案:

答案 0 :(得分:85)

我向你呈现令人难以置信的歌唱解决方案=)

.wrapper {
    position: relative;
    padding-bottom: 56.25%; /* 16:9 */
    padding-top: 25px;
    height: 0;
}
.wrapper iframe {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}

jsFiddle:http://jsfiddle.net/omarjuvera/8zkunqxy/2/
当您移动窗口栏时,您将看到iframe响应调整大小


或者,您也可以使用 内在比率技术 - 这只是上述相同解决方案的另一种选择(番茄,番茄)

.iframe-container {
  overflow: hidden;
  padding-top: 56.25%;
  position: relative;
} 

.iframe-container iframe {
  position: absolute;
  top: 0;
  left: 0;
  border: 0;
  width: 100%;
  height: 100%;
}

答案 1 :(得分:68)

尝试使用此代码使其响应

iframe, object, embed {
    max-width: 100%;
}

答案 2 :(得分:43)

我找到了来自Dave Rupert / Chris Coyier的解决方案。但是,我想让卷轴可用,所以我提出了这个:

// HTML

<div class="myIframe"> 
   <iframe> </iframe> 
</div>

// CSS

.myIframe {
     position: relative;
     padding-bottom: 65.25%;
     padding-top: 30px;
     height: 0;
     overflow: auto; 
     -webkit-overflow-scrolling:touch; //<<--- THIS IS THE KEY 
     border: solid black 1px;
} 
.myIframe iframe {
     position: absolute;
     top: 0;
     left: 0;
     width: 100%;
     height: 100%;
}

答案 3 :(得分:16)

您可以使用此网站http://css-tricks.com/NetMag/FluidWidthVideo/Article-FluidWidthVideo.php上提到的此技巧。

它非常有用且易于理解。您需要创建的所有内容

<div class="videoWrapper">
    <!-- Copy & Pasted from YouTube -->
    <iframe width="560" height="349" src="http://www.youtube.com/embed/n_dZNLr2cME?rel=0&hd=1" frameborder="0" allowfullscreen></iframe>
</div>

.videoWrapper {
    position: relative;
    padding-bottom: 56.25%; /* 16:9 */
    padding-top: 25px;
    height: 0;
}
.videoWrapper iframe {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}

以下是您编辑的js fiddle用于演示。

答案 4 :(得分:10)

iframe{
  max-width: 100% !important;
}

答案 5 :(得分:9)

查看此解决方案...适用于我&gt;&gt; https://jsfiddle.net/y49jpdns/

<html lang="en" class="no-js">
   <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width,initial-scale=1.0">
      <style>
      html body {width: 100%;height: 100%;padding: 0px;margin: 0px;overflow: hidden;font-family: arial;font-size: 10px;color: #6e6e6e;background-color: #000;} #preview-frame {width: 100%;background-color: #fff;}</style>
      <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
      <script>
         var calcHeight = function() {
           $('#preview-frame').height($(window).height());
         }

         $(document).ready(function() {
           calcHeight();
         }); 

         $(window).resize(function() {
           calcHeight();
         }).load(function() {
           calcHeight();
         });
      </script>
   </head>
   <body>
      <iframe id="preview-frame" src="http://leowebguy.com/" name="preview-frame" frameborder="0" noresize="noresize">
      </iframe>
   </body>
</html>

答案 6 :(得分:6)

DA是对的。在你自己的小提琴中,iframe确实很敏感。您可以通过检查iframe框大小来验证firebug中的内容。但iframe中的一些元素没有响应,因此当窗口大小很小时它们会“伸出”。例如,div#products-post-wrapper的宽度为8800px。

答案 7 :(得分:3)

iFrames可以完全响应,同时使用一种名为Intrinsic Ratio Technique的CSS技术保持其宽高比。我写了一篇专门针对这个问题的博客文章:https://benmarshall.me/responsive-iframes/

这个要点是:

.intrinsic-container {
  position: relative;
  height: 0;
  overflow: hidden;
}

/* 16x9 Aspect Ratio */
.intrinsic-container-16x9 {
  padding-bottom: 56.25%;
}

/* 4x3 Aspect Ratio */
.intrinsic-container-4x3 {
  padding-bottom: 75%;
}

.intrinsic-container iframe {
  position: absolute;
  top:0;
  left: 0;
  width: 100%;
  height: 100%;
}

<div class="intrinsic-container intrinsic-container-16x9">
  <iframe src="//www.youtube.com/embed/KMYrIi_Mt8A" allowfullscreen></iframe>
</div>

BOOM,完全响应!

答案 8 :(得分:2)

我注意到leowebdev的帖子确实似乎在我的结尾,但是,它确实击败了我想要制作的网站的两个元素:滚动和页脚。

滚动我通过添加一个回来了         scrolling="yes" 到iframe嵌入代码。

我不确定页脚会因为响应性而自动被淘汰,但希望其他人知道答案。

答案 9 :(得分:2)

删除以像素为单位指定的iframe高度和宽度,并使用百分比

iframe{  max-width: 100%;}

答案 10 :(得分:2)

简单,使用CSS:

iframe{
width: 100%;
max-width: 800px /*this can be anyting you wish, to show, as default size*/
}

请注意:但它不会使其中的内容响应!

答案 11 :(得分:1)

通过调整来自@Connor Cushion Mulhall的代码来解决我的问题

iframe, object, embed {
  width: 100%;
  display: block !important;
}

答案 12 :(得分:1)

this.parent.method_that_updates(); //you can check if method exists before invoking, just to be safe; or wrap this in a try catch block

答案 13 :(得分:0)

iframe无法响应。您可以使iframe容器响应,但不能显示它显示的内容,因为它是一个具有自己的设置高度和宽度的网页。

示例小提琴链接有效,因为它显示的是未声明大小的嵌入式YouTube视频链接。

答案 14 :(得分:0)

使“iframe”响应并适合所有设备屏幕的最佳解决方案,只需应用此代码(与游戏网站配合使用):

iframe::-webkit-scrollbar{display:none}
.iframe{background:#fff;overflow:hidden}
.iframe iframe{width:100%;height:540px;border:0;display:block}
.iframe-content{position:absolute;width:100%;height:540px;overflow:auto;top:0;bottom:0;-webkit-overflow-scrolling:touch}

@media screen and (max-width:992px){.iframe iframe{height:720px}}
@media screen and (max-width:768px){.iframe iframe{height:720px}}
@media screen and (max-width:720px){.iframe iframe{height:720px}}
@media screen and (max-width:479px){.iframe iframe{height:480px}}
@media screen and (max-height:400px){.iframe iframe{height:360px}}

如果您正在寻找适合所有设备的响应式游戏容器,请使用此代码,该代码使用高级CSS @media查询。

答案 15 :(得分:0)

     入门

由于浏览器安全限制,您必须在“父”页面以及通过iframe(“子”)嵌入的页面中包含Javascript文件。

在当前版本中,父页面必须包含最新版本的jQuery。子页面功能不依赖于jQuery。在将来的版本中,我们也希望删除对父级的jQuery依赖。

注意:makeResponsive()函数调用中的“xdomain”参数是可选的。

代码示例 <!-- Activate responsiveness in the "child" page --> <script src="/js/jquery.responsiveiframe.js"></script> <script> var ri = responsiveIframe(); ri.allowResponsiveEmbedding(); </script> <!-- Corresponding code in the "parent" page --> <script src="/js/jquery.js"></script> <script src="/js/jquery.responsiveiframe.js"></script> <script> ;(function($){ $(function(){ $('#myIframeID').responsiveIframe({ xdomain: '*'}); }); })(jQuery); </script>     

答案 16 :(得分:0)

完全响应iFrame,适用于宽高比未知且iFrame中的内容完全响应的情况。

上述解决方案均无法满足我的需求,即创建一个完全响应的iFrame,其内部具有完全响应的动态内容。保持任何类型的宽高比都不是一种选择。

  1. 获取导航栏的高度以及任何超出或低于iFrame的内容。在我的情况下,我只需要减去顶部导航栏,我希望iFrame一直填充到屏幕的底部。
  2. 代码:

    function getWindowHeight() {
            console.log('Get Window Height Called')
            var currentWindowHeight = $(window).height()
    
            var iFrame = document.getElementById("myframe")
            var frameHeight = currentWindowHeight - 95
    
            iFrame.height = frameHeight; 
    
        }
    //Timeout to prevent function from repeatedly firing
        var doit;
        window.onresize = function(){
          clearTimeout(doit);
          doit = setTimeout(resizedw, 100);
        };
    

    我还创建了一个超时,因此在调整大小时,该函数不会被调用一百万次。

答案 17 :(得分:0)

For Example :

<div class="intrinsic-container">
  <iframe src="//www.youtube.com/embed/KMYrIi_Mt8A" allowfullscreen></iframe>
</div>

CSS 

.intrinsic-container {
  position: relative;
  height: 0;
  overflow: hidden;
}

/* 16x9 Aspect Ratio */
.intrinsic-container-16x9 {
  padding-bottom: 56.25%;
}

/* 4x3 Aspect Ratio */
.intrinsic-container-4x3 {
  padding-bottom: 75%;
}

.intrinsic-container iframe {
  position: absolute;
  top:0;
  left: 0;
  width: 100%;
  height: 100%;
}

答案 18 :(得分:0)

我正在更多地搜索这个主题,最后得到一个很好的答案。 您可以尝试this

.wrapper {
width: 50%;
}
.container {
height: 0;
width: 100%;
padding-bottom: 50%;
overflow: hidden;
position: relative;
}
.container iframe {
top: 0;
left: 0;
width: 100%;
height: 100%;
position: absolute;
}
<div class="wrapper">
  <div class="container">
    <iframe src="there is path of your iframe"></iframe>
   </div>
</div>

答案 19 :(得分:0)

使用以下标记:

<div class="video"><iframe src="https://www.youtube.com/embed/StTqXEQ2l-Y"></iframe></div>

以下CSS使视频成为全宽和16:9:

.video {
  position: relative;
  padding-bottom: 56.25%; /* 16:9 */
}

.video > .video__iframe {
    position: absolute;
    width: 100%;
    height: 100%;
    border: none;
  }
}

答案 20 :(得分:0)

查看此完整代码。你可以使用百分比的容器,如下面的代码:

<html>
<head>
<title>How to make Iframe Responsive</title>
<style>
html,body        {height:100%;}
.wrapper         {width:80%;height:100%;margin:0 auto;background:#CCC}
.h_iframe        {position:relative;}
.h_iframe .ratio {display:block;width:100%;height:auto;}
.h_iframe iframe {position:absolute;top:0;left:0;width:100%; height:100%;}
</style>
</head>
<body>
<div class="wrapper">
<div class="h_iframe">
<img class="ratio" src=""/>
<iframe src="http://www.sanwebcorner.com" frameborder="0" allowfullscreen></iframe>
</div>
<p>Please scale the "result" window to notice the effect.</p>
</div>
</body>
</html>

查看此demo Page.

答案 21 :(得分:0)

此解决方案对我有用。而且我发现它更容易。 https://jameshfisher.com/2017/08/30/how-do-i-make-a-full-width-iframe/

答案 22 :(得分:0)

以下代码将使iframe中无响应的网站的固定宽度内容调整为视口宽度,但前提是其宽度大于视口宽度。出于演示目的,网站为800像素宽的单个图像。您可以通过调整浏览器窗口的大小或在手机中加载页面来进行测试:

<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
iframe {width: 100%; transform-origin: left top;}
.imgbox{text-align:center;display:block;}
</style>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.1.js"></script>   
<script>
jQuery(document).ready(function($){
    nsZoomZoom(); 
    $(window).resize(function(){ 
        nsZoomZoom();
    });
    function nsZoomZoom(){
        htmlWidth = $('html').innerWidth();
        iframeWidth = 800;
        if (htmlWidth > iframeWidth)
            scale = 1;
        else {
            scale = htmlWidth / (iframeWidth); 
        }
        $("iframe").css('transform', 'scale(' + scale + ')');
        $("iframe").css('width', '800');
    } 
}); 
</script>
</head>
<body>
<div class=imgbox>
    <iframe src="http://placekitten.com/g/800/600" scrolling=no width=800 height=600 frameborder=no></iframe>
</div>
</body>

答案 23 :(得分:0)

如果碰巧正在使用Bootstrap CSS库,则可以使用它提供的响应式嵌入类:

<div class="embed-responsive embed-responsive-16by9">
  <iframe class="embed-responsive-item" src="https://www.youtube.com/embed/zpOULjyy-n8?rel=0" allowfullscreen></iframe>
</div>

支持多种不同的宽高比see the documentation

答案 24 :(得分:0)

如果您使用的是 bootstrap 4,那么只需使用实用程序类进行嵌入

https://getbootstrap.com/docs/4.5/utilities/embed/

示例:

iris %>% 
    select(-any_of("X")) %>%
    select(-matches(c("Width", "Spec"))) # use c for multiple matches

答案 25 :(得分:0)

我必须以正方形显示 iframe,所以这就是我使用的

.video-wrapper {
  position: relative;
  padding-bottom: 100%;
}
.video-wrapper iframe {
  position: absolute;
  width: 100%;
  height: 100%;
  border: none;
}