Мне нужен iframe, который занимает все доступное пространство по горизонтали и автоматически изменяет размеры по вертикали, чтобы соответствовать его содержимому (в том числе при изменении содержимого или изменении размера окна), но также может изменять размер вручную пользователем, используя свойство CSS resize: both
. Цель состоит в том, чтобы встроить дизайн, по умолчанию заполняя доступное пространство, а также дать пользователю возможность увидеть, как он работает на экранах разных размеров.
Элемент iframe имеет одинаковое происхождение, поэтому проблем с безопасностью нет - родительское окно может делать все, что угодно, с iframe.contentDocument
.
Автоматически изменить размер фрейма так, чтобы он соответствовал его содержимому, просто:
<iframe srcdoc="<h1>The quick brown fox jumps over the lazy doggerel."
style="width:calc(100% - 2px);border:1px solid black"
onload="
recalculate = () => {
this.style.height = this.contentDocument.documentElement.offsetHeight + 'px';
}
new ResizeObserver(recalculate).observe(this.contentDocument.documentElement);
recalculate();
"></iframe>
(Вау, что HTML Подсветка синтаксиса там действительно развалилась! Кроме того, здесь нет правильного «фрагмента», потому что CSP, кажется, нарушает contentDocument
доступ.)
И создание изменяемого пользователем iframe прямолинейно:
<iframe srcdoc="<h1>The quick brown fox jumps over the lazy doggerel."
style="resize:both"></iframe>
… но эти методы плохо сочетаются, потому что изменение размера пользователя происходит точно так же, как изменение размера из-за изменений размера окна и лайков, так что, как только пользователь изменяет размер, код авто-высоты включается и игнорирует только что указанную высоту.
Так что, если пользователь вручную изменяет размер iframe, я хочу, чтобы мое авто-изменение размера Чтобы отключить ResizeObserver.
Можно ли как-то отличить guish изменение размера из-за действий пользователя (изменение размера iframe с помощью углового адаптера) от изменения размера из-за изменения среды (изменение содержимого) внутри iframe или изменение макета без iframe, включая изменение размера области просмотра)?