Сделать iframe автоматически настраивать высоту в соответствии с содержимым без использования полосы прокрутки?
Например:
<iframe name="Stack" src="http://stackoverflow.com/" width="740"
frameborder="0" scrolling="no" id="iframe"> ...
</iframe>
Я хочу, чтобы он мог регулировать его высоту в соответствии с содержимым внутри него, не используя прокрутку.
Добавьте это в раздел <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 обсуждения.
Вы можете использовать эту библиотеку, которая изначально корректно изменяет размер вашего iframe, а также поддерживает его в нужном размере, определяя всякий раз, когда изменяется размер содержимого iframe (либо путем регулярной проверки в setInterval
, либо через MutationObserver
), и изменяя его размер..
https://github.com/davidjbradshaw/iframe-resizer
Это также версия React.
https://github.com/davidjbradshaw/iframe-resizer-react
Это работает как с перекрестными, так и с одинаковыми доменными фреймами.
Вот компактная версия:
<iframe src="hello.html"
onload="this.style.height=this.contentDocument.body.scrollHeight +'px';">
</iframe>
Предложение 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>
Ответ на 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.
Избегайте встроенного 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';
});
Метод jQuery .contents() позволяет нам искать непосредственные дочерние элементы элемента в дереве DOM.
JQuery
$('iframe').height( $('iframe').contents().outerHeight() );
Помните, что тело страницы внутри iframe должно иметь высоту
CSS
body {
height: auto;
overflow: auto
}
Это работает для меня (также с несколькими iframes на одной странице):
$('iframe').load(function(){$(this).height($(this).contents().outerHeight());});
Попробуйте это для IE11
<iframe name="Stack" src="http://stackoverflow.com/" style='height: 100%; width: 100%;' frameborder="0" scrolling="no" id="iframe">...</iframe>
Это работает для меня (в основном).
Поместите это внизу страницы.
<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 или другим подобным, но вы должны установить класс. Также может использоваться только при полной высоте.
Примечание: по какой-то причине, когда он пересчитывается после изменения размера окна, он становится неправильным.
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')"
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'>
В прошлом у меня были проблемы с вызовом iframe.onload для динамически созданных iframe, поэтому я пошел с этим подходом для установки размера iframe:
iFrame View
var height = $("body").outerHeight();
parent.SetIFrameHeight(height);
Основной вид
SetIFrameHeight = function(height) {
$("#iFrameWrapper").height(height);
}
(это будет работать только в том случае, если оба представления находятся в одном домене)
Я сделал это с 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';
};
Я хотел, чтобы 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);
Функции не требуют пояснений и содержат комментарии для дальнейшего объяснения их цели.
<script type="text/javascript">
function resizeIframe(obj) {
obj.style.height = 0;
obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
}
</script>
это не работает для хром. Но работает для firefox.
Этот параметр будет работать на 100%
<iframe id='iframe2' src="url.com" frameborder="0" style="overflow: hidden; height: 100%; width: 100%; position: absolute;" height="100%" width="100%"></iframe>
Посмотрите другие вопросы по меткам html height iframe scrollbar или Задайте вопрос