К содержанию

Wiki · Техническая оптимизация

Фреймы

Фреймы – это HTML-элементы, которые показывают внутри одной страницы другой документ со своим адресом. Старые фреймы (frameset и frame) делили окно браузера на независимые части и сейчас считаются устаревшими, а встроенный фрейм iframe используют для карт, видео, виджетов и платёжных форм.

В начале 2000-х так собирали целые сайты: меню слева, шапка сверху, содержимое в середине, и каждая часть грузилась отдельным файлом. Адрес в строке браузера при переходах не менялся, ссылку на нужную страницу было не отправить, а поисковик приводил человека в средний фрейм без меню. Сейчас frameset в стандарте HTML числится среди устаревших элементов, а iframe встречается постоянно: в нём живут карта на странице контактов и видео в карточке товара.

Как устроены фреймы

Фрейм работает как окно в другой документ. Браузер загружает его отдельным запросом, со своими стилями, скриптами и cookies. Два варианта для сравнения:

<!-- устаревший вариант: окно делится на части -->
<frameset cols="25%,75%">
  <frame src="menu.html">
  <frame src="content.html">
</frameset>

<!-- iframe: встроенный документ внутри обычной страницы -->
<iframe src="https://example.ru/map/" width="600" height="400"
  loading="lazy" title="map"></iframe>

У страницы на frameset нет обычного тела: окно целиком состоит из фреймов. iframe, наоборот, вставляется в любое место обычной страницы, как картинка. Атрибут title в примере стоит не для красоты: без него программа экранного доступа зачитает фрейм как безымянный блок, и человек не поймёт, что внутри.

Сравнение устаревших фреймов frameset и frame со встроенным фреймом iframe для карт, видео и виджетов на сайте
Старые фреймы и iframe

Как поисковики видят фреймы

Для робота содержимое фрейма остаётся отдельным документом по адресу из src. Яндекс в справке пишет, что индексирует контент, который загружается во frameset и frame, и позволяет найти исходный документ по содержимому фреймов. Отсюда старая беда: в выдачу попадает внутренний фрейм, и человек приходит на голый текст без меню и шапки.

С iframe то же самое. Текст внутри встроенного документа принадлежит другому адресу, часто другому сайту, и рассчитывать, что он добавит релевантности вашей странице, не стоит. У Google есть правило indexifembedded: если встраиваемая страница закрыта тегом noindex, оно разрешает индексировать её содержимое в составе страницы, которая её встроила. Это настройка владельца встраиваемого контента, и решает её он, а не вы.

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

Схема индексации фреймов: текст в HTML страницы учитывается на ней, текст во фрейме относится к адресу из атрибута src
Чей текст видит поисковик

Где iframe уместен, а где нет

ЗадачаiframeПочему
Карта проездаподходиткарта живёт на сервисе карт, адрес текстом остаётся на странице
Видео в карточке товараподходитплеер грузится с видеохостинга, описание пишут рядом
Форма записи или оплаты стороннего сервисаподходитданные уходят прямо в сервис
Магазин с конструктора, каталог или блог с другого доменане подходитдля поиска этих страниц на вашем сайте нет
Меню и основной текстне подходитробот не свяжет их со страницей

С формами во фрейме есть подвох для аналитики. Метрика сама не увидит отправку заявки: счётчик страницы не видит событий внутри чужого фрейма, поэтому цель настраивают через сам сервис записи или оплаты.

Встраивание, настройка и замена фреймов

Как вставить на страницу карту или видео через iframe?

Сервис карт или видеохостинг обычно сам выдаёт готовый код с тегом iframe. Вставьте его в HTML страницы, в CMS для этого есть режим кода или блок для произвольного HTML. Затем проверьте три вещи: заданы ли ширина и высота, стоит ли ленивая загрузка для блока ниже первого экрана и есть ли понятный title.

Почему вместо чужого сайта во фрейме пустое окно?

Скорее всего, тот сайт запрещает встраивать себя заголовком X-Frame-Options или правилом frame-ancestors, и браузер честно показывает пустую рамку. Причина видна в консоли инструментов разработчика. Обойти запрет со своей стороны нельзя: остаётся ссылка или официальный виджет. Вторая частая причина: адрес во фрейме начинается с http, а ваша страница открыта по https.

Как растянуть iframe на всю ширину экрана телефона?

Задайте фрейму в CSS ширину 100%, а высоту привяжите к пропорциям свойством aspect-ratio, для видео обычно 16 / 9. Тогда плеер сжимается вместе с экраном и не вылезает за край. Карте пропорции не так важны, ей хватит фиксированной высоты.

Как сделать, чтобы ссылка открывалась внутри iframe?

Дайте фрейму имя атрибутом name и укажите это же имя в атрибуте target у ссылки. Так когда-то связывали меню и содержимое на frameset, сейчас приём встречается в основном во внутренних интерфейсах.

Где посмотреть адрес документа, который загружен во фрейм?

Найдите в коде страницы тег iframe: адрес встроенного документа записан в атрибуте src, и его можно открыть в отдельной вкладке. В инструментах разработчика тот же тег виден на вкладке Elements, а на вкладке Network видно, какие запросы делает сам фрейм.

Чем iframe отличается от виджета, который подключают скриптом?

Скрипт виджета вставляет свои блоки прямо в вашу страницу: он видит её код, может менять оформление и навредить, если сервис взломают. iframe держит чужой код в отдельном документе. Зато виджет на скрипте проще подогнать по стилю и высоте, а отправку формы в нём легче отследить счётчиком.

Зачем атрибут sandbox и когда он ломает виджет?

Пустой sandbox запирает содержимое фрейма: запрещены скрипты, отправка форм, всплывающие окна и переходы в родительском окне. Нужные права возвращают по одному значениями вроде allow-scripts и allow-forms. Если виджет записи после этого перестал работать, ему не хватает какого-то разрешения, и консоль браузера подскажет, какого.

Как проверить, получится ли встроить ваш сайт в чужой фрейм?

Откройте страницу сайта с инструментами разработчика, на вкладке Network выберите сам документ и посмотрите заголовки ответа. X-Frame-Options со значением SAMEORIGIN или DENY либо Content-Security-Policy с frame-ancestors закрывают встраивание на чужих доменах. Если нет ни того, ни другого, страницу можно показать в чужом фрейме, а это лазейка для кликджекинга.

Как перевести старый сайт на frameset без потери позиций?

Сначала соберите адреса из индекса и аналитики: у таких сайтов в поиске часто стоят внутренние документы фреймов вроде content.html. Новый сайт делают на обычной вёрстке, а со старых адресов ставят 301 редиректы на соответствующие новые страницы. По сути это SEO-переезд, и готовят его так же.

Чем фрейм в HTML отличается от фрейма в Figma?

В HTML фрейм показывает внутри страницы другой документ со своим адресом. В Figma так называют контейнер макета: экран приложения, страницу сайта или отдельный блок, в котором лежат элементы. Общее у них только идея рамки, а работают они совсем по-разному.

Как фреймы замедляют страницу

Каждый iframe тянет за собой ещё одну полноценную страницу: свой HTML, стили, скрипты, шрифты. Плеер или виджет карты загружается, даже если до него никто не долистал. Страница контактов с тремя картами и двумя видео без ленивой загрузки сразу при открытии грузит пять дополнительных документов. Это бьёт по скорости сайта и метрикам Core Web Vitals.

  • Добавьте loading="lazy": фрейм ниже первого экрана загрузится, когда до него долистают.
  • Вместо плеера покажите обложку с кнопкой и подгружайте iframe по клику.
  • Задайте ширину и высоту, чтобы блок не сдвигал страницу при загрузке. Подробнее в статье CLS.

Кликджекинг и защита от чужих фреймов

Фрейм работает в обе стороны: чужой сайт может встроить ваш. На этом построен кликджекинг, когда посетитель видит одну страницу, а кликает по спрятанной вашей. Защита ставится заголовком ответа сервера:

X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'

Оба варианта запрещают встраивать страницы сайта на чужие домены. Для сторонних виджетов на своём сайте есть обратная мера: атрибут sandbox ограничивает, что код внутри iframe может делать.

Как проверить фреймы на сайте

  1. Откройте код страницы (Ctrl+U) и поищите «frame». Нашлись frameset или frame: сайт пора переделывать.
  2. Для каждого iframe посмотрите, что внутри. Карта и видео в порядке, основной текст и каталог нет.
  3. В DevTools на вкладке Network оцените, сколько весят запросы из фреймов.
  4. Проверьте заголовки ответа: есть ли X-Frame-Options или frame-ancestors.
Чек-лист проверки фреймов: нет frameset, в iframe только виджеты, текст в HTML, ленивая загрузка, title и защита от встраивания
Как проверить фреймы на сайте

Фреймы, их вес и заголовки защиты смотрим на техническом аудите сайта. Защиту от встраивания и других атак настраиваем в услуге Информационная безопасность сайтов, а старые сайты на фреймах переводим на современную вёрстку при редизайне.

Документация и справки

См. также: Индексация сайта, Скорость сайта, Core Web Vitals, Хост.

Остались вопросы по теме «Фреймы»?

Напишите нам в Telegram или MAX. Ответит специалист, который отвечает за эту тему, или руководитель проектов в рабочее время.

Сергей ПимкинОтвечает по темеСергей ПимкинВедущий SEO-специалист

Тарифы

Тарифы по теме

Все тарифы →
от 70 000 ₽/мес при оплате за 3 месяца, помесячно 80 000 ₽

Стартовый тариф для небольшого бизнеса: наводим порядок на сайте и получаем первые заявки из Яндекса и Google.

  • Техническая оптимизация сайта
  • Контентная оптимизация
  • Семантическое ядро под город или регион
  • Настройка Яндекс Вебмастера и Google Search Console
  • Цели в Яндекс Метрике
  • Ежемесячный отчёт по позициям, трафику и заявкам
  • Оптимизация поведенческих факторов
  • Оптимизация коммерческих факторов и E-A-T
SEO ProХит
от 90 000 ₽/мес при оплате за 3 месяца, помесячно 99 000 ₽

Тариф для растущего бизнеса. Работаем на количество заявок: считаем звонки через коллтрекинг и дорабатываем сайт под конверсию.

  • Техническая оптимизация сайта
  • Контентная оптимизация
  • Семантическое ядро под город или регион
  • Настройка Яндекс Вебмастера и Google Search Console
  • Цели в Яндекс Метрике
  • Ежемесячный отчёт по позициям, трафику и заявкам
  • Оптимизация поведенческих факторов
  • Оптимизация коммерческих факторов и E-A-T
от 135 000 ₽/мес при оплате за 3 месяца, помесячно 149 000 ₽

Для масштабирования бизнеса: SEO, A/B-тесты, карточки в Яндекс.Бизнесе и 2ГИС, техподдержка сайта. Нейросети берут на себя рутину, итог проверяют специалисты.

  • Техническая оптимизация сайта
  • Контентная оптимизация
  • Семантическое ядро под город или регион
  • Настройка Яндекс Вебмастера и Google Search Console
  • Цели в Яндекс Метрике
  • Ежемесячный отчёт по позициям, трафику и заявкам
  • Оптимизация поведенческих факторов
  • Оптимизация коммерческих факторов и E-A-T

Проверим ваш сайт бесплатно

Экспресс-аудит за 24 часа: скорость, индексация, мета-теги, коммерческие факторы и цели Метрики.