HTML тег <frameset>
Тег <frameset> задаёт структуру фреймов, количество столбцов и строк. Описание, атрибуты и примеры использования тега.
Тег <frameset> определял структуру страницы, разделённой на несколько фреймов — отдельных прокручиваемых областей, каждая из которых загружает собственный HTML-документ. Он заменял элемент <body> и использовал атрибуты rows и cols для размещения фреймов в виде сетки.
Теги <frameset> и <frame> являются устаревшими HTML-тегами. Они были удалены из HTML5 и не должны использоваться на новых страницах. HTML5-документ (начинающийся с <!DOCTYPE html>) не может использовать фреймсет вообще. Данная страница описывает устаревший элемент и объясняет, что использовать вместо него.
Эта страница рассказывает о том, что делал <frameset>, почему он устарел, и о современных доступных заменах: макетах CSS Grid и Flexbox для разделения страницы на панели, а также элементе <iframe> для встраивания другого документа.
Почему <frameset> устарел
Фреймсеты были исключены из веб-платформы, поскольку они нарушали фундаментальное поведение браузера и создавали проблемы с доступностью. Основные недостатки:
- Нарушение навигации, закладок и истории. Адресная строка показывала только URL внешнего фреймсета, но никогда не документ внутри фрейма. Пользователи не могли добавить в закладки или поделиться тем, что они реально просматривали, а кнопка «Назад» работала непредсказуемо.
- Нарушение печати. При печати фреймсета обычно выводился не тот фрейм или пустая страница, поскольку не существовало единого документа для печати.
- Проблемы с доступностью. Программы чтения с экрана испытывали затруднения при передаче того, что страница состоит из нескольких независимых документов; пользователи клавиатуры могли застрять при переключении фокуса между фреймами, а порядок фокусировки был непоследовательным.
- Безопасность (кликджекинг). Загрузка произвольных страниц во фреймы открывала возможность для атак типа кликджекинг. Современные сайты защищаются от этого с помощью заголовков
X-Frame-OptionsиContent-Security-Policy, которые нередко полностью запрещают загрузку внутри фрейма. - Удалено из HTML5. По всем перечисленным причинам спецификация HTML5 полностью отказалась от фреймсетов.
Доступность
Фреймсеты враждебны вспомогательным технологиям (AT). Программа чтения с экрана представляет один документ за раз, поэтому окно, состоящее из нескольких фреймов, не имеет естественного порядка чтения — пользователи вынуждены самостоятельно обнаруживать фреймы и переключаться между ними, практически не понимая, как они связаны. Клавиатурная навигация также страдает: порядок обхода клавишей Tab через границы фреймов ненадёжен, а фокус может застрять во фрейме, из которого сложно выйти. Ни одна из этих проблем не существует в едином, хорошо структурированном HTML5-документе, оформленном с помощью CSS.
Синтаксис
Тег <frameset> используется парами. Содержимое записывается между открывающим (<frameset>) и закрывающим (</frameset>) тегами.
Тег <frameset> может содержать один или несколько тегов <frame>. При необходимости разделить окна на ещё меньшие допускается вкладывать один тег <frameset> в другой.
Документ с фреймсетом использует элемент <frameset> вместо элемента <body>. Элемент frameset не может содержать никакого контента — вместо этого он определяет и именует фреймы, расположенные в строках и/или столбцах.
Пример HTML-тега <frameset>:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<title>Title of the document</title>
</head>
<frameset cols="50%,50%">
<frame src="https://www.w3docs.com/learn-html/html-basic.html">
<frame src="https://www.w3docs.com/learn-css/css-syntax.html">
</frameset>
</html>Результат

Пример HTML-тега <frameset> с атрибутом rows:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<title>Title of the document</title>
</head>
<frameset rows="30%,40%,30%">
<frame src="https://www.w3docs.com/learn-javascript.html">
<frame src="https://www.w3docs.com/learn-git.html">
<frame src="https://www.w3docs.com/learn-php.html">
</frameset>
</html>Современные замены
Всё, что делал <frameset>, теперь реализуется лучше с помощью CSS и <iframe>.
Разделение страницы на панели (CSS Grid)
Чтобы разделить один документ на боковую панель, заголовок и область контента — классический сценарий использования фреймсета — используйте CSS Grid. Это единый документ, поэтому навигация, закладки, печать и программы чтения с экрана работают нормально.
<!DOCTYPE html>
<html lang="en">
<head>
<title>Two-pane layout with CSS Grid</title>
<style>
body { margin: 0; }
.layout {
display: grid;
grid-template-columns: 200px 1fr;
height: 100vh;
}
.sidebar { background: #f4f4f4; padding: 1rem; overflow: auto; }
.content { padding: 1rem; overflow: auto; }
</style>
</head>
<body>
<div class="layout">
<nav class="sidebar">Sidebar</nav>
<main class="content">Main content</main>
</div>
</body>
</html>Гибкий макет из строк и столбцов можно также создать с помощью Flexbox.
Встраивание внешней страницы (<iframe>)
Чтобы загрузить отдельную веб-страницу внутри вашего документа — единственная возможность <frame>, которую CSS не предоставляет, — используйте <iframe>. В отличие от фреймсетов, iframe является допустимым элементом HTML5, сохраняет URL родительской страницы доступным для закладок и поддерживает изолирование (sandboxing) в целях безопасности.
<!DOCTYPE html>
<html lang="en">
<head>
<title>Embedding with an iframe</title>
</head>
<body>
<h1>My page</h1>
<iframe
src="https://www.w3docs.com/"
title="W3docs home page"
width="600"
height="400">
</iframe>
</body>
</html>Всегда указывайте для <iframe> описательный атрибут title, чтобы вспомогательные технологии могли сообщить о его назначении.
Атрибуты
В реальном фреймсете стандартными были только два атрибута: rows и cols.
| Атрибут | Значение | Описание |
|---|---|---|
| cols | пиксели, %, * | Определяет количество и размер столбцов фреймов. Удалён в HTML5. |
| rows | пиксели, %, * | Определяет количество и размер строк фреймов. Удалён в HTML5. |
Примечание: В HTML 4.01 атрибут
frameborderможно было задавать как у<frameset>(в качестве значения по умолчанию для его фреймов), так и у каждого отдельного<frame>. Атрибутframespacingбыл нестандартным расширением Netscape/Internet Explorer и никогда не входил в спецификацию HTML. Оба атрибута устарели и не должны применяться.
Элемент <frameset> также поддерживал глобальные атрибуты.