Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Встраивание страниц: iframe

Тег <iframe> (inline frame — встроенная рамка) показывает внутри вашей страницы другую страницу — со своим адресом, стилями и скриптами. Так на сайты встраивают карты, видео с YouTube, виджеты оплаты и комментариев. Кстати, все превью в этом учебнике — тоже <iframe>.

Встроенная страница

Адрес встраиваемой страницы указывают в атрибуте src:

<iframe src="https://example.com"></iframe>

В превью появилось маленькое окошко с сайтом example.com — его можно прокручивать, а ссылки в нём работают. По умолчанию размер рамки 300 на 150 пикселей.

Размер и название

width и height задают размер рамки. Атрибут title кратко описывает содержимое — его зачитывает программа чтения с экрана, когда пользователь попадает в рамку:

<iframe src="https://example.com" width="400" height="200" title="Сайт example.com"
        style="border: 1px solid #ccc;"></iframe>

Стандартную рамку браузера обычно заменяют своей или убирают в CSS свойством border: none.

Карта

Многие сервисы дают готовый код для встраивания. Например, OpenStreetMap — карту по координатам:

<iframe width="400" height="250" title="Карта центра Лиссабона"
        src="https://www.openstreetmap.org/export/embed.html?bbox=-9.15,38.70,-9.13,38.72&layer=mapnik"></iframe>

Карту можно двигать и масштабировать прямо в превью. Видео с YouTube встраивают так же: в меню «Поделиться» есть пункт «Встроить», который выдаёт готовый <iframe>.

Своя разметка: srcdoc

Вместо адреса можно передать HTML прямо в атрибуте srcdoc. Страница внутри рамки полностью отделена от внешней — её стили не действуют снаружи, и наоборот:

<p style="color: crimson;">Этот текст снаружи — красный.</p>
<iframe srcdoc="<p>А этот внутри рамки — обычный.</p>" height="60"></iframe>

Стиль внешнего абзаца не повлиял на абзац в рамке: это отдельный документ.

Отложенная загрузка

Каждая встроенная страница грузится как целый сайт и замедляет ваш. Атрибут loading="lazy" откладывает загрузку, пока рамка не окажется рядом с видимой областью:

<p style="height: 200px;">Прокрутите вниз — карта загрузится, когда до неё дойдёт очередь.</p>
<iframe loading="lazy" width="300" height="150" title="Карта"
        src="https://www.openstreetmap.org/export/embed.html?bbox=-0.13,51.50,-0.12,51.51&layer=mapnik"></iframe>

Ограничения: sandbox

Атрибут sandbox (песочница) запрещает встроенной странице почти всё: запускать скрипты, отправлять формы, открывать окна. Нужное разрешают по одному словами через пробел:

<iframe sandbox="allow-scripts" title="Виджет"
        srcdoc='<button onclick="this.textContent = 1 + 1">Сколько будет 1 + 1?</button>'></iframe>

Нажмите кнопку — скрипт посчитает ответ. Без allow-scripts кнопка бы не сработала. Используйте sandbox, когда встраиваете содержимое, которому не до конца доверяете.

Частая ошибка

Встроить можно не любой сайт. Банки, почта и многие крупные сервисы запрещают показывать себя в чужих рамках, чтобы злоумышленники не могли обернуть их своей страницей и обманом заставить нажать не ту кнопку. Вместо сайта появится сообщение об отказе в подключении:

<iframe src="https://www.google.com" width="300" height="120" title="Google"></iframe>

Это не ошибка в вашем коде — ищите у сервиса специальный адрес для встраивания.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.