Как сделать iframe отзывчивым, не предполагая соотношения сторон? Например, контент может иметь любую ширину или высоту, которые неизвестны до рендеринга.
Обратите внимание, вы можете использовать Javascript.
Пример:
<div id="iframe-container">
<iframe/>
</div>
Измените размер iframe-container
так, чтобы его содержимое едва помещалось внутри без дополнительного пространства, другими словами, для содержимого достаточно места, чтобы его можно было отображать без прокрутки, но без лишнего пространства. Контейнер отлично оборачивает фрейм.
Это показывает, как сделать iframe отзывчивым, предполагая, что соотношение сторон контента составляет 16: 9. Но в этом вопросе соотношение сторон является переменным.
Ответы:
Невозможно взаимодействовать с другим источником iFrame, используя Javascript, чтобы получить его размер; единственный способ сделать это - использовать
window.postMessage
сtargetOrigin
установленным на ваш домен или подстановочным символом*
из источника iFrame. Вы можете проксировать содержимое различных исходных сайтов и использовать ихsrcdoc
, но это считается хаком и не будет работать с SPA и многими другими динамическими страницами.Тот же самый размер кадра iFrame
Предположим, у нас есть два одинаковых исходных фрейма: один с небольшой высотой и фиксированной шириной:
и большая высота кадра:
Мы можем получить размер iFrame для
load
события, используяiframe.contentWindow.document
который мы отправим в родительское окно, используяpostMessage
:Мы получим правильную ширину и высоту для обоих кадров; Вы можете проверить это онлайн здесь и увидеть скриншот здесь .
Размер взлома iFrame различного происхождения ( не рекомендуется )
Метод, описанный здесь, является хакерским, и его следует использовать, если он абсолютно необходим и другого пути нет; это не будет работать для большинства динамически генерируемых страниц и SPA. Метод извлекает исходный код HTML страницы, используя прокси-сервер для обхода политики CORS (
cors-anywhere
это простой способ создания простого прокси-сервера CORS и имеет интерактивную демонстрациюhttps://cors-anywhere.herokuapp.com
), затем внедряет код JS в этот HTML для использованияpostMessage
и отправляет размер iFrame к родительскому документу. Он даже обрабатывает событие iFrameresize
(в сочетании с iFramewidth: 100%
) и отправляет размер iFrame обратно родителю.patchIframeHtml
:Функция пропатчить плавающий фрейм HTML - код и ввести пользовательские Javascript , который будет использовать
postMessage
для отправки размера IFrame родителя наload
иresize
. Если дляorigin
параметра есть значение , то к заголовку<base/>
будет добавлен элемент HTML, использующий этот исходный URL, поэтому HTML-идентификаторы URI, такие как,/some/resource/file.ext
будут правильно извлечены исходным URL-адресом внутри iFrame.getIframeHtml
:Функция для получения HTML страницы в обход CORS с использованием прокси, если
useProxy
задан параметр. Могут быть дополнительные параметры, которые будут переданыpostMessage
при отправке данных о размере.Функция обработчика событий сообщения точно такая же, как и в «Тот же самый размер iFrame источника» .
Теперь мы можем загрузить домен перекрестного происхождения внутри iFrame с добавленным нашим пользовательским кодом JS:
И мы увеличим размер iFrame до его содержимого в полную высоту без вертикальной прокрутки, даже не используя
overflow-y: auto
тело iFrame ( так должно быть,overflow-y: hidden
чтобы полоса прокрутки не мерцала при изменении размера ).Вы можете проверить это онлайн здесь .
Еще раз заметить, что это взлом, и его следует избегать ; мы не можем получить доступ к документу Cross-Origin iFrame или ввести какие-либо вещи.
источник
cors-anywhere
, в данный момент не работает, поэтому вы не можете увидеть демонстрационную страницу. Я не хочу добавлять скриншот внешнего сайта по причинам авторского права. Я добавлю другой прокси-сервер CORS, если он не будет работать долго.Их сложность заключается в определении размера контента в iframe, в основном из-за того, что CSS позволяет вам делать вещи, которые могут помешать измерению размера контента.
Я написал библиотеку, которая заботится обо всех этих вещах, а также работает в междоменной сфере. Возможно, вы найдете это полезным.
https://github.com/davidjbradshaw/iframe-resizer
источник
Мое решение на GitHub и JSFiddle .
Представление решения для отзывчивого iframe без предположения о соотношении сторон.
NB. Не забудьте вызвать функцию изменения размера после загрузки страницы, так как размер окна не изменяется сам по себе после загрузки страницы.
Код
index.html
style.css
main.js
Я провел некоторое время на этом. Я надеюсь, вам понравится =)
Редактировать Это, вероятно, лучшее общее решение. Однако, когда сделан очень маленький, iframe не дан надлежащий размер. Это зависит от используемого вами фрейма. Невозможно закодировать правильный ответ для этого явления, если у вас нет кода iframe, поскольку ваш код не может определить, какой размер iframe предпочтителен для правильного отображения.
Только некоторые хаки, такие как представленные @Christos Lytras, могут сделать трюк, но он никогда не сработает для каждого iframe. Просто в конкретной ситуации.
источник
Сделайте одну вещь, установите контейнер Iframe, установите CSS и ширину и высоту.
источник