Как использовать iframe
<iframe> показывает другую страницу внутри вашей. Укажите адрес страницы в src, title с ее описанием и размер:
<iframe src="https://example.com/" title="Example site" width="600" height="400"></iframe>
Фрейм загружает страницу как отдельный документ со своими стилями и скриптами. Примеры на этой странице используют srcdoc вместо src: он помещает HTML фрейма прямо в атрибут, поэтому примеры работают без загрузки другого сайта:
Внешний абзац синий и жирный; абзац внутри фрейма нет, хотя на странице то же правило для p. Стили никогда не пересекают границу фрейма ни в одну сторону. Рамка по умолчанию и размер 300×150 по умолчанию задает браузер; атрибуты width и height переопределяют размер.
Встроить видео YouTube или карту
Видеосайты и картографические сервисы дают готовый код iframe. На YouTube нажмите «Поделиться», затем «Встроить»:
<iframe width="560" height="315"
src="https://www.youtube.com/embed/VIDEO_ID"
title="YouTube video player"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
Для Google Maps откройте место, нажмите «Поделиться», затем «Встраивание карт» и так же скопируйте iframe. Оставьте title (программы чтения с экрана объявляют его при входе во фрейм) и замените фиксированные размеры адаптивным CSS ниже. Атрибут allow дает фрейму возможности вроде автовоспроизведения или полноэкранного режима, которые у встроенных страниц по умолчанию выключены.
Размер, рамка и адаптивные iframe
Скопированные коды встраивания используют фиксированные размеры в пикселях, которые на телефонах вылезают за экран. width: 100% вместе с aspect-ratio заставляет фрейм заполнять контейнер и сохранять форму, а border: 0 убирает рамку по умолчанию:
Замените max-width: 480px на другое значение, и фрейм сохранит пропорцию 16:9 при любой ширине. Уберите border: 0, чтобы увидеть рамку браузера по умолчанию. Старые атрибуты frameborder, scrolling и marginheight устарели; используйте CSS.
sandbox: ограничьте возможности фрейма
Фрейм может выполнять скрипты, отправлять формы и открывать всплывающие окна, как любая страница. Атрибут sandbox отнимает эти возможности; пустой sandbox блокирует почти все, а каждое ключевое слово возвращает одну из них. Оба фрейма ниже получают одинаковый HTML с небольшим скриптом:
Первый фрейм сохраняет текст-заглушку, потому что его скрипт не выполняется (консоль Chrome выводит для него сообщение «Blocked script execution»). Используйте sandbox всегда, когда показываете во фрейме содержимое, которому не доверяете полностью, например HTML, написанный пользователями, и добавляйте только нужные ключевые слова:
| Ключевое слово | Что разрешает |
|---|---|
allow-scripts | Выполнение JavaScript |
allow-forms | Отправку форм |
allow-popups | window.open и ссылки с target="_blank" |
allow-modals | alert(), confirm() и prompt() |
allow-same-origin | Считать содержимое пришедшим из его настоящего источника (cookies, хранилище) |
allow-top-navigation | Уводить всю вкладку с вашей страницы |
Никогда не сочетайте allow-scripts и allow-same-origin для содержимого с вашего собственного источника: тогда скрипт во фрейме сможет снять с себя sandbox.
Общение с фреймом: postMessage
Внешняя страница и фрейм это разные документы. Когда их источники различаются, они не могут трогать DOM друг друга, но могут отправлять сообщения. Введите сообщение и отправьте его во фрейм:
В настоящем коде передавайте точный источник фрейма (например, 'https://maps.example.com') вместо '*' и проверяйте e.origin у получателя, чтобы сообщения уходили только на ожидаемый сайт и приходили только с него.
Производительность и отказ сайтов
- Ленивая загрузка. Добавьте
loading="lazy"фреймам далеко внизу страницы; браузер загрузит их, только когда читатель прокрутит к ним. Каждый iframe это полная загрузка страницы, поэтому без этого страница с множеством встраиваний становится медленной. - «Отказано в подключении». Многие сайты (банки, большинство соцсетей, поиск Google) отправляют заголовок
X-Frame-Optionsилиframe-ancestors, который запрещает показ во фрейме, и браузер показывает во фрейме ошибку. Ваша страница не может это обойти. Используйте официальный URL для встраивания или ссылку. - Доступность. Всегда задавайте
title. Так программа чтения с экрана называет фрейм, а по странице с несколькими безымянными фреймами трудно перемещаться.
Частые ошибки
- Нет
title. Программы чтения с экрана объявляют фрейм безымянным. - Фиксированная ширина из скопированного кода встраивания. Замените ее на
width: 100%иaspect-ratio. - Обычный видеофайл во фрейме. Для собственного файла
.mp4используйте элемент video; iframe нужен для страниц. - Доверие содержимому во фрейме. Добавляйте
sandboxдля всего, что писали не вы. - Ожидание, что внешний CSS оформит фрейм. Оформляйте страницу во фрейме изнутри нее.
Часто задаваемые вопросы
Что такое iframe в HTML?
<iframe> (inline frame, встроенный фрейм) это блок, который показывает отдельную веб-страницу внутри текущей. У него собственный документ, стили и скрипты, поэтому его используют для встраивания видео, карт, рекламы и превью кода.
Как встроить видео YouTube через iframe?
На YouTube выберите «Поделиться», затем «Встроить» и скопируйте код. Это iframe, у которого src это https://www.youtube.com/embed/ плюс id видео. Оставьте атрибуты title и allowfullscreen, а чтобы сделать его адаптивным, используйте CSS aspect-ratio: 16 / 9 с width: 100%.
Почему iframe пишет, что сайт отказался подключаться?
Сайт отправляет заголовок X-Frame-Options или Content-Security-Policy: frame-ancestors, который запрещает другим сайтам показывать его во фрейме. Многие сайты делают так для защиты от кликджекинга. Со своей страницы это не обойти; используйте официальный URL для встраивания, если он есть.
Как убрать рамку у iframe?
Задайте в CSS border: 0. Старый атрибут frameborder="0" устарел, хотя многие скопированные коды встраивания его еще содержат.
Как сделать iframe адаптивным?
Задайте ему в CSS width: 100% и aspect-ratio, например aspect-ratio: 16 / 9 для видео, и не указывайте фиксированную высоту. Тогда iframe масштабируется вместе с контейнером и сохраняет форму.
Что делает атрибут sandbox у iframe?
Пустой атрибут sandbox блокирует внутри фрейма скрипты, отправку форм, всплывающие окна и многое другое и считает его содержимое пришедшим из уникального источника. Затем вы разрешаете только то, что нужно встраиванию, ключевыми словами вроде allow-scripts или allow-forms.