Как я могу масштабировать содержимое iframe (в моем примере это HTML-страница и не является всплывающим) на странице моего веб-сайта?
Например, я хочу отображать содержимое, отображаемое в iframe, на 80% от исходного размера.
Как я могу масштабировать содержимое iframe (в моем примере это HTML-страница и не является всплывающим) на странице моего веб-сайта?
Например, я хочу отображать содержимое, отображаемое в iframe, на 80% от исходного размера.
Решение Kip должно работать в Opera и Safari, если вы измените CSS на:
<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 для предотвращения прокрутки.
Я нашел решение, которое работает в 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 из примера кода выше, и вы увидите, что я имею в виду.)
Я нашел кое-что из этого вопроса.
После долгих усилий, пытаясь заставить его работать в IE8, 9 и 10 здесь, что сработало для меня.
Этот урезанный CSS работает в FF 26, Chrome 32, Opera 18 и IE9 -11 по состоянию на 1/7/2014:
.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 в div.wrap:
.wrap
{
width: 1280px; /* same size as frame */
height: 768px;
-ms-zoom: 0.25; /* for IE 8 ONLY */
}
Просто используйте свой любимый метод для обхода браузером, чтобы условно включить соответствующий CSS, см. Есть ли способ сделать особый условный CSS-браузер в файле *.css? для некоторых идей.
IE7 был потерянной причиной, поскольку -ms-zoom не существовал до IE8.
Здесь фактический 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>
Followup to lxs answer: я заметил, что проблема с тем, что теги zoom
и --webkit-transform
в то же время, кажется, смешивают Chrome (версия 15.0. 874.15), сделав эффект двойного зума. Я смог обойти проблему, заменив zoom
на -ms-zoom
(только для IE), оставив Chrome использовать только тег --webkit-transform
, и это очистило вещи.
Вам не нужно обертывать 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 вам нужно масштабировать размеры.
Думал, что поделился бы тем, что я придумал, используя большую часть того, что было дано выше. Я не проверял 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>
Я только что проверил и для меня ни одно из других решений не сработало. Я просто попробовал это, и он отлично работал на 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).
html {zoom: 0.4;}? -)
Если вы хотите, чтобы iframe и его содержимое масштабировались при изменении размера окна, вы можете установить следующее в событие изменения размера окна, а также событие onload iframes.
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 и его контент равным 100% ширины div div (или любого процента, который вы хотите). В качестве дополнительного бонуса вам не нужно устанавливать CSS-фрейм в жестко закодированные значения, так как все они будут установлены динамически, вам просто нужно будет беспокоиться о том, как вы хотите отображать обертку.
Я тестировал это, и он работает на chrome, IE11 и firefox.
Я думаю, вы можете сделать это, вычислив высоту и ширину, которые вы хотите, с помощью 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, но, похоже, работает с хорошими:)
Для тех из вас, кто не может заставить это работать в IE, полезно использовать -ms-zoom
, как предложено ниже, и использовать функцию масштабирования в div #wrap
, а не iframe
. По моему опыту, с помощью функции zoom
, которая пытается масштабировать iframe div из #frame
, она будет масштабировать размер iframe, а не контент внутри него (для чего вы и собираетесь).
Похоже на это. Работает для меня в IE8, Chrome и FF.
#wrap {
overflow: hidden;
position: relative;
width:800px;
height:850px;
-ms-zoom: 0.75;
}
Это было мое решение на странице с шириной 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;
}
Решение #wrap #frame работает нормально, если числа в #wrap равны #frame раз масштабному коэффициенту. Он показывает только ту часть уменьшенного кадра. Вы можете увидеть это здесь, уменьшая количество веб-сайтов и помещая их в форму pinterest (с плагином woodmark jQuery):
Скорее всего, это не лучшее решение, но, похоже, работает нормально.
<IFRAME ID=myframe SRC=.... ></IFRAME>
<SCRIPT>
window.onload = function(){document.getElementById('myframe').contentWindow.document.body.style = 'zoom:50%;';};
</SCRIPT>
Очевидно, что вы не пытаетесь исправить родителя, просто добавив стиль "zoom: 50%" к телу дочернего элемента с небольшим количеством javascript.
Может быть, можно задать стиль элемента "HTML", но не попробовать.
Если ваш html оформлен css, вы можете связать разные таблицы стилей для разных размеров.
Я не думаю, что у HTML есть такая функциональность. Единственное, что я могу себе представить, - это сделать некоторую обработку на стороне сервера. Возможно, вы можете получить снимок изображения веб-страницы, которую вы хотите обслуживать, масштабировать ее на сервере и обслуживать ее для клиента. Однако это будет неинтерактивная страница. (возможно, у imagemap может быть ссылка, но все же.)
Еще одна идея - иметь компонент на стороне сервера, который изменит HTML. SOrt, как функция масштабирования firefox 2.0. это, конечно, не идеальное масштабирование, но лучше, чем ничего.
Кроме этого, у меня нет идей.
Как я уже сказал, я сомневаюсь, что вы это сделаете.
Возможно, вы можете масштабировать по крайней мере сам текст, установив стиль font-size: 80%;
.
Untested, не уверен, что он работает, и не будет изменять размер полей или изображений.
Я замечаю, что масштабирование происходит автоматически, когда я определяю ширину контейнера (родительский DIV) на целевой странице не в пикселях, а только в процентах. Это происходит автоматически.
1. В моем случае я определяю для exmpl. 480px ширина для div, где будет установлен iframe. 2.I устанавливает 100% ширину для iframe. 3. Я установил ширину 250% для родительского div на целевой странице (5 изображений x 50% ширины экрана).
Мое намерение состоит в том, чтобы показать 2 изображения (по ширине) в кадре и именно это происходит в каждом случае ширины кадра.
Почему он работает только в процентах?