如何缩放iframe的内容?


237

如何在网站页面中缩放iframe的内容(在我的示例中是HTML页面,而不是弹出窗口)?

例如,我想以80%的原始大小显示iframe中显示的内容。


14
问题抓取-良好做法?我不这么认为。
康拉德·鲁道夫

9
典型用例:在线在线所见即所得编辑器中预览页面/站点
frenchone 18'July

Answers:


224

如果将CSS更改为:Kip的解决方案应可在Opera和Safari上运行:

<style>
    #wrap { width: 600px; height: 390px; padding: 0; overflow: hidden; }
    #frame { width: 800px; height: 520px; border: 1px solid black; }
    #frame {
        -ms-zoom: 0.75;
        -moz-transform: scale(0.75);
        -moz-transform-origin: 0 0;
        -o-transform: scale(0.75);
        -o-transform-origin: 0 0;
        -webkit-transform: scale(0.75);
        -webkit-transform-origin: 0 0;
    }
</style>

您可能还需要指定溢出:在#frame上隐藏以防止滚动条。


@JonathanM-cfmeta.stackexchange.com/questions/ 75043/…,我在这里做错了吗?
lxs 2012年

@lxs,一点也不。我喜欢它,并给它+1。做得好。
乔纳森·M

7
我注意到,在chrome上,我同时应用了zoom和webkit转换,这导致将缩放比例应用两次。
dennisjtaylor

1
正如@dennisjtaylor所说,chrome似乎两次应用了比例尺-如此处所示jsfiddle.net/zjTBq/embedded/result
Horse

3
由于所有现代浏览器已经支持转换已有相当长的一段时间了,因此我将考虑使用无前缀版本(至少作为替代)。
wortwart

55

我找到了一个可以在IE和Firefox中使用的解决方案(至少在当前版本上)。在Safari / Chrome上,iframe的大小已调整为其原始大小的75%,但iframe中的内容根本没有缩放。在Opera中,这似乎不起作用。这感觉有些深奥,因此,如果有更好的方法,我欢迎提出建议。

<style>
#wrap { width: 600px; height: 390px; padding: 0; overflow: hidden; }
#frame { width: 800px; height: 520px; border: 1px solid black; }
#frame { zoom: 0.75; -moz-transform: scale(0.75); -moz-transform-origin: 0 0; }
</style>

...

<p>Some text before the frame</p>
<div id="wrap">
<iframe id="frame" src="test2.html"></iframe>
</div>
<p>Some text after the frame</p>
</body>

注意:我必须将wrap元素用于Firefox。出于某种原因,在Firefox中,当将对象缩小75%时,出于布局原因,它仍然使用图像的原始大小。(尝试从上面的示例代码中删除div,您将明白我的意思。)

我从这个问题中发现了一些。


31

经过数小时的努力后,尝试使其在IE8、9和10中工作,这对我来说很有效。

截至2014年1月7日,此精简CSS可在FF 26,Chrome 32,Opera 18和IE9 -11中运行:

.wrap
{
    width: 320px;
    height: 192px;
    padding: 0;
    overflow: hidden;
}

.frame
{
    width: 1280px;
    height: 786px;
    border: 0;

    -ms-transform: scale(0.25);
    -moz-transform: scale(0.25);
    -o-transform: scale(0.25);
    -webkit-transform: scale(0.25);
    transform: scale(0.25);

    -ms-transform-origin: 0 0;
    -moz-transform-origin: 0 0;
    -o-transform-origin: 0 0;
    -webkit-transform-origin: 0 0;
    transform-origin: 0 0;
}

对于IE8,设置宽度/高度以匹配iframe,然后将-ms-zoom添加到.wrap容器div中:

.wrap
{
    width: 1280px; /* same size as frame */
    height: 768px;
    -ms-zoom: 0.25; /* for IE 8 ONLY */
}

只需使用您喜欢的方法进行浏览器嗅探就可以有条件地包含适当的CSS,请参阅是否可以在* .css文件中进行特定于浏览器的条件CSS?一些想法。

IE7是一个丢失的原因,因为直到IE8才存在-ms-zoom。

这是我测试过的实际HTML:

<div class="wrap">
   <iframe class="frame" src="http://time.is"></iframe>
</div>
<div class="wrap">
    <iframe class="frame" src="http://apple.com"></iframe>
</div>

http://jsfiddle.net/esassaman/PnWFY/


17

我刚刚进行了测试,对我来说,其他解决方案均无效。我只是尝试了一下,就象我期望的那样,它在Firefox和Chrome上完美运行:

<div class='wrap'>
    <iframe ...></iframe>
</div>

和CSS:

.wrap {
    width: 640px;
    height: 480px;
    overflow: hidden;
}

iframe {
    width: 76.92% !important;
    height: 76.92% !important;
    -webkit-transform: scale(1.3);
    transform: scale(1.3);
    -webkit-transform-origin: 0 0;
    transform-origin: 0 0;
}

这会将所有内容缩放30%。当然,宽度/高度百分比需要相应地调整(1 / scale_factor)。


2
您还想添加overflow: hidden;.wrap元素。使用iframe { width: 200%; height: 200%; transform: scale(0.5); }iframe时开始溢出。
ozgrozer

这是最先进的方法。谢谢!
富吉

10

lxs的回答的后续工作:我注意到一个问题,即同时具有zoom--webkit-transform标签似乎通过执行双重缩放效果而使Chrome(版本15.0.874.15)感到困惑。通过替换zoom-ms-zoom(仅针对IE),我得以解决该问题,让Chrome仅使用该--webkit-transform标记,从而清除了所有问题。


9

您无需使用其他代码包装iframe。只需确保将iframe的宽度和高度增加与缩小iframe的数量相同即可。

例如将iframe内容缩放到80%:

#frame { /* Example size! */
    height: 400px; /* original height */
    width: 100%; /* original width */
}
#frame {
    height: 500px; /* new height (400 * (1/0.8) ) */
    width: 125%; /* new width (100 * (1/0.8) )*/

    transform: scale(0.8); 
    transform-origin: 0 0;
}

基本上,要获得相同大小的iframe,您需要缩放尺寸。


7

html {zoom:0.4;}?-)


3
80%的值为0.8,但这是专有的Microsoftism,所以可能不合适。如果加载到框架中的文档可以被编辑,这也是可行的,这是不可能的。
昆汀

7

以为我会分享我的想法,并使用上面给出的很多内容。据我所知,我尚未检查Chrome,但它可以在IE,Firefox和Safari中运行。

在此示例中,特定的偏移量和缩放系数可用于在iframe中将Facebook标签的宽度(810像素)缩小和居中。

使用的两个站点是wordpress站点和ning网络。我对html不太满意,所以这样做可能做得更好,但是结果似乎不错。

<style>
    #wrap { width: 1620px; height: 3500px; padding: 0; position:relative; left:-100px; top:0px; overflow: hidden; }
    #frame { width: 1620px; height: 3500px; position:relative; left:-65px; top:0px; }
    #frame { -ms-zoom: 0.7; -moz-transform: scale(0.7); -moz-transform-origin: 0px 0; -o-transform: scale(0.7); -o-transform-origin: 0 0; -webkit-transform: scale(0.7); -webkit-transform-origin: 0 0; }
</style>
<div id="wrap">
    <iframe id="frame" src="http://www.example.com"></iframe>
</div>

5

如果您希望在调整窗口大小时缩放iframe及其内容,则可以对窗口的resize事件以及iframe onload事件设置以下内容。

function()
{
    var _wrapWidth=$('#wrap').width();
    var _frameWidth=$($('#frame')[0].contentDocument).width();

    if(!this.contentLoaded)
      this.initialWidth=_frameWidth;
    this.contentLoaded=true;
    var frame=$('#frame')[0];

    var percent=_wrapWidth/this.initialWidth;

    frame.style.width=100.0/percent+"%";
    frame.style.height=100.0/percent+"%";

    frame.style.zoom=percent;
    frame.style.webkitTransform='scale('+percent+')';
    frame.style.webkitTransformOrigin='top left';
    frame.style.MozTransform='scale('+percent+')';
    frame.style.MozTransformOrigin='top left';
    frame.style.oTransform='scale('+percent+')';
    frame.style.oTransformOrigin='top left';
  };

这将使iframe及其内容缩放到自动换行div的100%宽度(或所需的百分比)。另外,您不必将框架的css设置为硬编码值,因为它们都是动态设置的,您只需要担心想如何显示wrap div。

我已经测试过了,它可以在chrome,IE11和firefox上使用。


4

我认为您可以通过以下方法来实现此目的:通过使用javascript计算高度和宽度(通过document.body.clientWidth等),然后将iframe注入HTML中,如下所示:

var element = document.getElementById(“ myid”);
element.innerHTML + =“ <iframe src ='http://www.google.com'height ='200'width ='” + document.body.clientWidth * 0.8 +“'/>”;

我没有在IE6中测试此功能,但似乎可以与优秀的功能一起使用:)


请原谅我的无知,但是这会使iframe占源页面的80%,而不是缩小源页面本身吗?
Phill Healey 2014年

3

对于那些在IE中无法正常使用的人,-ms-zoom按照以下建议使用并在#wrapdiv 上使用缩放功能(而不是iframeid)会很有帮助。以我的经验,该zoom函数尝试缩放iframe的#frame,它将缩放iframe的大小,而不是其中的内容(这就是您要的)。

看起来像这样。适用于IE8,Chrome和FF。

#wrap {
  overflow: hidden;
  position: relative;
  width:800px;
  height:850px;
  -ms-zoom: 0.75;
}

使用zoom在IE8标准模式,使用-ms-zoom怪癖模式。
乔纳森·希尔

3

这是我在宽度为890px的页面上的解决方案

#frame { 
overflow: hidden;
position: relative;
width:1044px;
height:1600px;
-ms-zoom: 0.85;
-moz-transform: scale(0.85);
-moz-transform-origin: 0px 0;
-o-transform: scale(0.85);
-o-transform-origin: 0 0;
-webkit-transform: scale(0.85);
-webkit-transform-origin: 0 0; 

}


2

所以可能不是最好的解决方案,但似乎可以。

<IFRAME ID=myframe SRC=.... ></IFRAME>

<SCRIPT>
    window.onload = function(){document.getElementById('myframe').contentWindow.document.body.style = 'zoom:50%;';};
</SCRIPT>

显然,不尝试修复父对象,只是使用一些JavaScript将“ zoom:50%”样式添加到孩子的身体上。

也许可以设置“ HTML”元素的样式,但是没有尝试过。


1
不要这样 来自developer.mozilla.org/zh-CN/docs/Web/CSS/zoom:“此功能是非标准的,不在标准轨道上。请不要在面向Web的生产站点上使用该功能:该功能不适用于每个用户。实现之间也可能存在很大的不兼容性,并且将来的行为可能会改变。”
hackel

+1(修改iframe的内容,而不是iframe本身)似乎是一个更好的主意。我需要一种缩小页面的方式,并将其显示为该页面的预览,并且这种方法可以解决问题。
akinuri

@akinuri是的,这正是我使用的目的。我经历了许多解决方案,但这似乎是最简单的。我只是遍历iframe,并将它们全部缩小以得到一页缩略图。无需更改子页面。
格雷厄姆

1

如果您的html使用CSS设置样式,则可以链接不同尺寸的不同样式表。


0

我不认为HTML具有这种功能。我唯一能想到的就是完成一些服务器端处理。也许您可以获得要提供的网页的图像快照,将其在服务器上缩放并提供给客户端。但是,这将是一个非交互式页面。(也许图像映射可能具有链接,但仍然存在。)

另一个想法是拥有一个可以更改HTML的服务器端组件。像firefox 2.0缩放功能一样。这当然不是完美的缩放,但总比没有好。

除此之外,我没有主意。


0

如前所述,我怀疑您能做到。
也许您可以通过设置样式至少缩放文本本身font-size: 80%;
未经测试,不确定它是否有效,并且不会调整框或图像的大小。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.