Как я могу масштабировать содержимое iframe?

Как я могу масштабировать содержимое iframe (в моем примере это HTML-страница, а не всплывающее окно) на странице моего веб-сайта?

Например, я хочу отображать содержимое, отображаемое в iframe, на 80% от исходного размера.

Очистка вопросов - хорошая практика? Я так не думаю.

Konrad Rudolph 03.10.2008 14:03

Типичный вариант использования: предварительный просмотр страницы / сайта в онлайн-редакторе wysiwyg

frenchone 16.07.2018 12:23
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
255
2
396 552
17

Ответы 17

Я не думаю, что HTML обладает такой функциональностью. Единственное, что я могу себе представить, - это выполнить некоторую обработку на стороне сервера. Возможно, вы могли бы получить снимок веб-страницы, которую хотите обслуживать, масштабировать на сервере и передать клиенту. Однако это будет неинтерактивная страница. (возможно, карта изображения может иметь ссылку, но все же.)

Другая идея - иметь серверный компонент, который изменял бы HTML. SOrt как функция масштабирования Firefox 2.0. это, конечно, не идеальное масштабирование, но лучше, чем ничего.

Кроме этого, у меня нет идей.

Как уже было сказано, я сомневаюсь, что вы сможете это сделать. Может можно масштабировать хотя бы сам текст, установив стиль font-size: 80%;.
Не проверено, не уверен, что это работает, и не изменяет размер ящиков или изображений.

html {zoom: 0.4;}? -)

Было бы 0,8 для 80%, но это проприетарный Microsoftism, поэтому, вероятно, не подходит. Это также будет работать, только если документ, загруженный во фрейм, можно будет редактировать, что маловероятно.

Quentin 03.10.2008 20:14

Если ваш html оформлен с помощью css, вы, вероятно, можете связать разные таблицы стилей для разных размеров.

Я думаю, вы можете сделать это, вычислив нужную высоту и ширину с помощью 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 18.11.2014 19:40

Я нашел решение, которое работает в 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 из приведенного выше примера кода, и вы поймете, что я имею в виду.)

Я нашел кое-что из этого от этот вопрос.

Решение Кипа должен работать в 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>

Вы также можете указать overflow: hidden в #frame, чтобы предотвратить полосы прокрутки.

@JonathanM - ср meta.stackexchange.com/questions/75043/…, я что-то здесь сделал не так?

lxs 19.03.2012 15:54

@lxs, Совсем нет. Мне он понравился, и я поставил ему +1. Отличная работа.

Jonathan M 27.03.2012 04:20

Я заметил, что на chrome я применяю как масштабирование, так и преобразование webkit, что приводит к двойному применению масштаба.

dennisjtaylor 19.01.2013 03:43

событие с префиксом -ms-zoom, у меня проблемы с Safari iPad (возможно, это слишком много!)

Andiih 30.04.2013 15:20

как говорит @dennisjtaylor, хром, кажется, применяет масштаб дважды - как видно здесь jsfiddle.net/zjTBq/embedded/result

Horse 14.08.2013 20:25

Как говорит отвечать @ r3cgm, замена zoom на -ms-zoom должна решить эту проблему. Не знаю, сломает ли это EG IE6. Вы также можете попробовать удалить строки -webkit-transform.

lxs 22.08.2013 16:59

@Andiih, не знаю, почему Safari на iPad особенный, извините

lxs 22.08.2013 16:59

Мне было трудно понять, как это будет работать, если я захочу контролировать масштаб всего окна просмотра. Вот фрагмент SCSS. gist.github.com/gajus/6b6c49c3c3a0282f4b9d Предполагается, что все содержимое ниже body содержится в #viewport.

Gajus 20.09.2015 20:15

Остерегайтесь, использование масштабных преобразований может вызвать проблемы с типами взаимодействия на основе js / пикселей, такими как перетаскивание и порядок. Я работаю над подобной проблемой и до сих пор заметил, что некоторые из них все еще отлично работают при использовании единиц em, но не с масштабными преобразованиями.

Koert van Kleef 20.04.2016 13:35

Поскольку все современные браузеры уже довольно давно поддерживают преобразование, я бы подумал об использовании версии без префикса (по крайней мере, в качестве альтернативы).

wortwart 12.11.2016 23:28

Вы также можете использовать width: calc(600px / 0.75); height: calc(390px / 0.75); для определения размера окна iframe.

Shane Creighton-Young 21.12.2018 23:45

Продолжение lxs ответ: я заметил проблему, при которой одновременное использование тегов zoom и --webkit-transform, похоже, сбивает с толку Chrome (версия 15.0.874.15), создавая эффект двойного масштабирования. Мне удалось обойти проблему, заменив zoom на -ms-zoom (предназначенный только для IE), оставив Chrome использовать только тег --webkit-transform, и это прояснило ситуацию.

Для тех из вас, у кого возникают проблемы с тем, чтобы это работало в IE, полезно использовать -ms-zoom, как предлагается ниже, и использовать функцию масштабирования в блоке #wrap, а не в идентификаторе iframe. По моему опыту, с функцией zoom, пытающейся масштабировать div iframe #frame, она будет масштабировать размер iframe, а не содержимое в нем (что вы и собираетесь делать).

Похоже на это. У меня работает в IE8, Chrome и FF.

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

Используйте zoom в режиме стандартов IE8, используйте -ms-zoom в режиме совместимости.

Jonathon Hill 18.01.2013 09:13

Думал, что поделюсь тем, что придумал, используя многое из того, что было сказано выше. Я не проверял 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>

Вам не нужно оборачивать 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 того же размера, вам нужно масштабировать размеры.

Решение #wrap #frame работает нормально, если числа в #wrap равны #frame, умноженному на коэффициент масштабирования. Он показывает только ту часть уменьшенного кадра. Вы можете увидеть это здесь, уменьшая размер веб-сайтов и помещая его в интересную форму (с помощью плагина jQuery woodmark):

http://www.genautica.com/sandbox/woodmark-index.html

Это было мое решение на странице шириной 890 пикселей.

#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; 

}

После того, как я часами боролся с этим, пытаясь заставить его работать в IE8, 9 и 10, вот что сработало для меня.

Этот урезанный CSS работает в FF 26, Chrome 32, Opera 18 и IE9-11 по состоянию на 07.01.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>

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

Если вы хотите, чтобы iframe и его содержимое масштабировались при изменении размера окна, вы можете установить следующее для события изменения размера окна, а также для события загрузки 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 (или любого другого процента, который вы хотите). В качестве дополнительного бонуса вам не нужно устанавливать css кадра на жестко закодированные значения, поскольку все они будут устанавливаться динамически, вам просто нужно беспокоиться о том, как вы хотите, чтобы отображался div-обертка.

Я тестировал это, и он работает в Chrome, IE11 и Firefox.

Так что, вероятно, не лучшее решение, но, похоже, работает нормально.

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

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

Очевидно, что не пытаюсь исправить родительский элемент, просто добавляя стиль «zoom: 50%» к телу дочернего элемента с небольшим количеством javascript.

Может быть, можно было установить стиль элемента «HTML», но не пробовал.

Не делай этого. От developer.mozilla.org/en-US/docs/Web/CSS/zoom: «Эта функция нестандартна и не входит в стандартную дорожку. Не используйте ее на рабочих сайтах, обращенных к Интернету: она не будет работать для каждого пользователя. Также могут быть большие несовместимости между реализациями, и поведение может измениться. в будущем."

hackel 26.08.2016 19:21

+1 Это (изменение содержимого iframe, а не самого iframe) кажется лучшей идеей. Мне нужен был способ уменьшить масштаб страницы и показать ее как предварительный просмотр этой страницы, и этот подход решил проблему.

akinuri 22.02.2018 16:05

@akinuri Да, именно для этого я и использовал. Я попробовал несколько решений, но это показалось мне самым простым. Я просто перебирал фреймы и уменьшал их все, чтобы получить страницу с миниатюрами. Никаких изменений на дочерних страницах не требуется.

Graham 30.05.2020 12:31

Я только что протестировал, и для меня ни одно из других решений не помогло. Я просто попробовал это, и он отлично работал в 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).

Вы также хотите добавить overflow: hidden; к элементу .wrap. При использовании iframe { width: 200%; height: 200%; transform: scale(0.5); } iframe начинает переполняться.

ozgrozer 21.03.2019 10:04

Это современный подход. Спасибо!

fuggi 19.05.2020 20:53

Другие вопросы по теме