我需要一个解决方案自动调节的width
和height
一个iframe
勉强适合其内容。关键是iframe
加载后可以更改宽度和高度。我想我需要一个事件操作来处理iframe中包含的主体尺寸的变化。
我需要一个解决方案自动调节的width
和height
一个iframe
勉强适合其内容。关键是iframe
加载后可以更改宽度和高度。我想我需要一个事件操作来处理iframe中包含的主体尺寸的变化。
Answers:
<script type="application/javascript">
function resizeIFrameToFitContent( iFrame ) {
iFrame.width = iFrame.contentWindow.document.body.scrollWidth;
iFrame.height = iFrame.contentWindow.document.body.scrollHeight;
}
window.addEventListener('DOMContentLoaded', function(e) {
var iFrame = document.getElementById( 'iFrame1' );
resizeIFrameToFitContent( iFrame );
// or, to resize all iframes:
var iframes = document.querySelectorAll("iframe");
for( var i = 0; i < iframes.length; i++) {
resizeIFrameToFitContent( iframes[i] );
}
} );
</script>
<iframe src="usagelogs/default.aspx" id="iFrame1"></iframe>
到目前为止,所有给出的解决方案都只能解决一次调整大小的问题。您提到要修改内容后能够调整iFrame的大小。为此,您需要在iFrame中执行一个函数(一旦更改了内容,则需要触发一个事件以说内容已更改)。
我被卡住了一段时间,因为iFrame内的代码似乎仅限于iFrame内的DOM(并且无法编辑iFrame),而在iFrame之外执行的代码与在iFrame之外的DOM卡在一起(并且不能t接收来自iFrame内部的事件)。
解决方案来自发现(通过同事的帮助)可以告诉jQuery使用什么DOM。在这种情况下,父窗口的DOM。
这样,这样的代码就可以满足您的需求(在iFrame中运行时):
<script type="text/javascript">
jQuery(document).ready(function () {
jQuery("#IDofControlFiringResizeEvent").click(function () {
var frame = $('#IDofiframeInMainWindow', window.parent.document);
var height = jQuery("#IDofContainerInsideiFrame").height();
frame.height(height + 15);
});
});
</script>
jQuery("#IDofControlFiringResizeEvent").click(function ()
?
嵌入的单线解决方案:从最小尺寸开始,然后增加到内容尺寸。不需要脚本标签。
<iframe src="http://URL_HERE.html" onload='javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+"px";}(this));' style="height:200px;width:100%;border:none;overflow:hidden;"></iframe>
scrollHeight/scrollWidth
都应进行一些调整,以考虑到车身边距。浏览器为文档的body元素应用默认的非零边距(也适用于加载到框架中的内容)。我发现的有效解决方案是添加以下内容:parseInt(window.getComputedStyle(this.contentDocument.body).margin
。
如果iframe内容来自同一域,则应该会很好用。它确实需要jQuery。
$('#iframe_id').load(function () {
$(this).height($(this).contents().height());
$(this).width($(this).contents().width());
});
要动态调整其大小,可以执行以下操作:
<script language="javaScript">
<!--
function autoResize(){
$('#themeframe').height($('#themeframe').contents().height());
}
//-->
</script>
<iframe id="themeframe" onLoad="autoResize();" marginheight="0" frameborder="0" src="URL"></iframe>
然后在iframe加载的页面上添加以下内容:
<script language="javaScript">
function resize()
{
window.parent.autoResize();
}
$(window).on('resize', resize);
</script>
如果您不想使用jQuery,这是一个跨浏览器的解决方案:
/**
* Resizes the given iFrame width so it fits its content
* @param e The iframe to resize
*/
function resizeIframeWidth(e){
// Set width of iframe according to its content
if (e.Document && e.Document.body.scrollWidth) //ie5+ syntax
e.width = e.contentWindow.document.body.scrollWidth;
else if (e.contentDocument && e.contentDocument.body.scrollWidth) //ns6+ & opera syntax
e.width = e.contentDocument.body.scrollWidth + 35;
else (e.contentDocument && e.contentDocument.body.offsetWidth) //standards compliant syntax – ie8
e.width = e.contentDocument.body.offsetWidth + 35;
}
在我尝试了地球上的所有内容之后,这确实对我有用。
index.html
<style type="text/css">
html, body{
width:100%;
height:100%;
overflow:hidden;
margin:0px;
}
</style>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
function autoResize(iframe) {
$(iframe).height($(iframe).contents().find('html').height());
}
</script>
<iframe src="http://iframe.domain.com" width="100%" height="100%" marginheight="0" frameborder="0" border="0" scrolling="auto" onload="autoResize(this);"></iframe>
我正在使用此代码在页面上加载时自动调整所有iframe(具有autoHeight类)的高度。经过测试,可以在IE,FF,Chrome,Safari和Opera中运行。
function doIframe() {
var $iframes = $("iframe.autoHeight");
$iframes.each(function() {
var iframe = this;
$(iframe).load(function() {
setHeight(iframe);
});
});
}
function setHeight(e) {
e.height = e.contentWindow.document.body.scrollHeight + 35;
}
$(window).load(function() {
doIframe();
});
这是一个可靠的解决方案
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
<IFRAME SRC="blah.php" id="iframe1" onLoad="resizer('iframe1');"></iframe>
我在上面稍微修改了Garnaph的出色解决方案。似乎他的解决方案根据事件发生前的大小修改了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>
为我工作,但不确定跨浏览器功能。
如果可以同时控制IFRAME内容和父窗口,则需要iFrame Resizer。
通过该库,可以自动调整相同和跨域iFrame的高度和宽度的大小,以适合其包含的内容。它提供了一系列功能来解决使用iFrame时最常见的问题,其中包括:
使用上述方法都无法使用。
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
经过一些试验,我想出了另一种解决方案。我最初尝试将代码标记为该问题的“最佳答案”,但此方法无效。我的猜测是因为当时我的程序中的iframe是动态生成的。这是我使用的代码(对我有用):
正在加载的iframe中的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';
};
有必要在高度上添加4个或更多像素以删除滚动条(iframe的某些怪异错误/效果)。宽度甚至更奇怪,您可以安全地将18px添加到主体的宽度。另外,请确保已为iframe主体应用了CSS(如下)。
html, body {
margin:0;
padding:0;
display:table;
}
iframe {
border:0;
padding:0;
margin:0;
}
这是iframe的html:
<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中)。我还有更多测试要做,所以请告诉我这是如何工作的。
这就是我的方法(在FF / Chrome中测试):
<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
function autoResize(iframe) {
$(iframe).height($(iframe).contents().find('html').height());
}
</script>
<iframe src="page.html" width="100%" height="100" marginheight="0" frameborder="0" onload="autoResize(this);"></iframe>
以下是几种方法:
<body style="margin:0px;padding:0px;overflow:hidden">
<iframe src="http://www.example.com" frameborder="0" style="overflow:hidden;height:100%;width:100%" height="100%" width="100%"></iframe>
</body>
和另一种
<body style="margin:0px;padding:0px;overflow:hidden">
<iframe src="http://www.example.com" frameborder="0" style="overflow:hidden;overflow-x:hidden;overflow-y:hidden;height:100%;width:100%;position:absolute;top:0px;left:0px;right:0px;bottom:0px" height="100%" width="100%"></iframe>
</body>
如上所示隐藏2种替代方案的滚动
<body style="margin:0px;padding:0px;overflow:hidden">
<iframe src="http://www.example.com" frameborder="0" style="overflow:hidden;height:150%;width:150%" height="150%" width="150%"></iframe>
</body>
带有第二个代码的哈希
<body style="margin:0px;padding:0px;overflow:hidden">
<iframe src="http://www.example.com" frameborder="0" style="overflow:hidden;overflow-x:hidden;overflow-y:hidden;height:150%;width:150%;position:absolute;top:0px;left:0px;right:0px;bottom:0px" height="150%" width="150%"></iframe>
</body>
为了隐藏iFrame的滚动条,父级被设置为“溢出:隐藏”以隐藏滚动条,并且iFrame的宽度和高度达到150%,这迫使滚动条超出页面,并且主体没有有滚动条的人可能不会想到iframe会超出页面的范围。这会隐藏全宽度的iFrame滚动条!
来源:设定iframe自动高度
万一有人到达这里:当我从iframe移除div时,我的解决方案有问题-iframe没有变短。
有一个Jquery插件可以完成这项工作:
http://www.jqueryscript.net/layout/jQuery-Plugin-For-Auto-Resizing-iFrame-iFrame-Resizer.html
我发现此调整大小更好地工作:
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;
}
请注意,样式对象已删除。
我必须在网络扩展的背景下自己做。此网络扩展程序将一些UI注入到每个页面中,并且该UI位于内iframe
。里面的内容iframe
是动态的,因此我不得不重新调整iframe
。
我用React但是这个概念适用于每个库。
在内部,iframe
我更改了body
样式以具有很大的尺寸。这将允许使用所有必要的空间来布置内部元素。制作width
和height
100%都不适合我(我猜因为iframe具有默认值width = 300px
和height = 150px
)
/* something like this */
body {
width: 99999px;
height: 99999px;
}
然后,我将所有iframe UI注入了div并提供了一些样式
#ui-root {
display: 'inline-block';
}
在此应用程序中渲染我的应用程序后#ui-root
(在React中,我在内部执行此操作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)
可以制作一个“幽灵般”的IFrame,就像它不存在那样。
参见http://codecopy.wordpress.com/2013/02/22/ghost-iframe-crossdomain-iframe-resize/
基本上,您使用的事件系统parent.postMessage(..)
在
https://developer.mozilla.org/zh-CN/docs/DOM/window.postMessage中
这适用于所有现代浏览器!
我知道这个职位很旧,但是我相信这是另一种方式。我只是在我的代码上实现。在页面加载和页面调整大小上均可完美运行:
var videoHeight;
var videoWidth;
var iframeHeight;
var iframeWidth;
function resizeIframe(){
videoHeight = $('.video-container').height();//iframe parent div's height
videoWidth = $('.video-container').width();//iframe parent div's width
iframeHeight = $('.youtubeFrames').height(videoHeight);//iframe's height
iframeWidth = $('.youtubeFrames').width(videoWidth);//iframe's width
}
resizeIframe();
$(window).on('resize', function(){
resizeIframe();
});
放置在标头中的Javascript:
function resizeIframe(obj) {
obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
}
iframe html代码如下:
<iframe class="spec_iframe" seamless="seamless" frameborder="0" scrolling="no" id="iframe" onload="javascript:resizeIframe(this);" src="somepage.php" style="height: 1726px;"></iframe>
CSS样式表
>
.spec_iframe {
width: 100%;
overflow: hidden;
}
对于angularjs指令属性:
G.directive ( 'previewIframe', function () {
return {
restrict : 'A',
replace : true,
scope : true,
link : function ( scope, elem, attrs ) {
elem.on ( 'load', function ( e ) {
var currentH = this.contentWindow.document.body.scrollHeight;
this.style.height = eval( currentH ) + ( (25 / 100)* eval( currentH ) ) + 'px';
} );
}
};
} );
请注意,我插入了该百分比,以便您可以对通常针对iframe,文本,广告等所做的缩放进行计数,如果未实现任何缩放,则只需输入0
显然有很多情况,但是,我对文档和iframe具有相同的域,因此能够将其附加到iframe内容的末尾:
var parentContainer = parent.document.querySelector("iframe[src*=\"" + window.location.pathname + "\"]");
parentContainer.style.height = document.body.scrollHeight + 50 + 'px';
这将“查找”父容器,然后设置长度(加上50个像素的软键)以删除滚动条。
没有什么可以“观察”文档高度的变化,这对于我的用例来说是不需要的。在我的回答中,我确实提供了一种引用父容器的方法,而无需使用烘焙到父/ iframe内容中的ID。
如果您可以使用固定的宽高比,并且希望使用响应式iframe,那么此代码将对您有用。这只是CSS规则。
.iframe-container {
overflow: hidden;
/* Calculated from the aspect ration of the content (in case of 16:9 it is 9/16=
0.5625) */
padding-top: 56.25%;
position: relative;
}
.iframe-container iframe {
border: 0;
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
iframe必须将div作为容器。
<div class="iframe-container">
<iframe src="http://example.org"></iframe>
</div>
源代码基于此站点,并且Ben Marshall拥有很好的解释。
如果内容只是一个非常简单的html,最简单的方法是使用javascript删除iframe
HTML代码:
<div class="iframe">
<iframe src="./mypage.html" frameborder="0" onload="removeIframe(this);"></iframe>
</div>
JavaScript代码:
function removeIframe(obj) {
var iframeDocument = obj.contentDocument || obj.contentWindow.document;
var mycontent = iframeDocument.getElementsByTagName("body")[0].innerHTML;
obj.remove();
document.getElementsByClassName("iframe")[0].innerHTML = mycontent;
}
<iframe src="hello.html" sandbox="allow-same-origin"
onload="this.style.height=(this.contentWindow.document.body.scrollHeight+20)+'px';this.style.width=(this.contentWindow.document.body.scrollWidth+20)+'px';">
</iframe>