Тег frame в HTML: обязательные атрибуты и чем заменить

Тег <frame> создаёт одно окно внутри <frameset>: в окне загружается отдельный документ со своим адресом. Он одиночный, закрывающий тег не нужен. Обязательных атрибутов у него нет, даже src можно не писать. Стандарт HTML запрещает тег и советует брать iframe и CSS.

HTML
<frameset cols="30%,*">
  <frame name="menu" src="menu.html">
  <frame name="main" src="main.html">
</frameset>

Что делает тег frame в HTML

Каждый тег frame открывает своё окно, и в нём можно загрузить другую страницу. Окон в документе столько, сколько тегов frame. Для него в DOM используется тип HTMLFrameElement, на странице он показывается как блок.

Теги frame работают только внутри <frameset>. Этот тег заменяет <body>: в документе с окнами обычного тела нет, а document.body возвращает сам frameset. Как делить экран на столбцы и строки, написано на странице про frameset, а запасной текст для браузеров без окон описан на странице про noframes.

Пример: документ с body и документ с frameset

Результат

Кнопки выбирают, как устроен документ. Под рамкой записаны тело документа, число тегов frame и число окон.

В обычном документе окон нет. В документе с frameset вместо body стоит frameset, а окон два. Текст в окнах дают загруженные в них документы, в самом теге frame его нет.

Атрибуты frame: обязательных нет

Обязательных атрибутов у frame нет. Тег без записи src создаёт пустое окно about:blank, и оно работает так же, как окно с адресом. Все остальные атрибуты задают поведение окна.

АтрибутЧто задаётЗначения
srcАдрес документа в окнеЛюбой адрес
nameИмя окна для атрибута target у ссылокЛюбое имя
noresizeЗапрещает тянуть границу между окнамиПишется без значения
scrollingПолосы прокрутки в окнеyes, no, auto
marginwidthОтступы слева и справа внутри окнаЧисло пикселей
marginheightОтступы сверху и снизу внутри окнаЧисло пикселей
frameborderРамка между окнами, действует у frameset0 или 1

Пример: noresize, scrolling и marginwidth

Результат

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

Без noresize граница двигается и ширина левого окна меняется, с noresize остаётся прежней. Значение no у scrolling убирает полосу у длинного текста, а marginwidth меняет левый отступ документа с 8px на заданный. Остальные значения таблицы здесь не показаны.

Рамка между окнами: frameborder, border и framespacing

По умолчанию между окнами остаётся зазор в 6px. Атрибут frameborder пишется у <frameset>, а у отдельного frame он обычно ничего не меняет. Ширину зазора задаёт border у frameset. Атрибут framespacing зазор обычно не меняет.

HTML
<frameset cols="50%,50%" border="0">
  <frame src="a.html">
  <frame src="b.html">
</frameset>

Пример: какая запись меняет зазор

Результат

Кнопки выбирают запись. Под рамкой записан зазор между окнами и сказано, изменила ли его запись.

Зазор убирают frameborder=0 и border=0 у frameset, а border=20 увеличивает его до 20px. Записи frameborder=0 у frame и framespacing=30 зазор обычно не трогают. У таблицы есть свой атрибут frame, он про линии вокруг таблицы и описан в таблице атрибутов table, с тегом frame его связывает только название.

Атрибут name и ссылки с target

Атрибут name даёт окну имя. Ссылка с target="имя" загружает документ в окно с таким именем, а ссылка без target открывается в том же окне, где она стоит. Адрес документа с окнами остаётся прежним. Про target и значения _blank, _self, _parent, _top написано на странице тега a.

HTML
<a href="page.html" target="main">Страница</a>

Пример: ссылка с target и без него

Результат

Кнопки нажимают ссылку в левом окне. Под рамкой записано, что открыто в каждом окне и изменился ли адрес документа.

Ссылка с target меняет правое окно, а ссылка без него меняет левое, где нажата. Те же правила действуют для атрибута name у iframe, а в уроке «Ссылки: тег a и его атрибуты» разобраны сами ссылки.

Почему frame вне frameset не работает

Тег frame нельзя писать в обычном теле страницы: браузер его убирает. Тег frameset тоже убирается, если перед ним стоит текст или тег body, даже пустой. Работает только документ, где frameset стоит сразу после head, без body.

HTML
<head>
  <title>Окна</title>
</head>
<frameset cols="50%,50%">
  <frame src="a.html">
  <frame src="b.html">
</frameset>

Пример: какую разметку сохраняет браузер

Результат

Кнопки выбирают разметку. Под рамкой записано, сколько тегов осталось после разбора и какое у документа тело.

Если после разбора тегов не осталось, окон нет, а страница остаётся обычной. Ошибки при этом не появляется: браузер молча выбрасывает теги, поэтому проблему легко не заметить.

Чем заменить тег frame: iframe и CSS grid

Окно заменяет тег iframe, а раскладку на столбцы строит CSS grid. Окно iframe стоит в обычной странице, поэтому у документа остаётся обычное тело, а ссылки с target работают так же.

HTML
<div class="layout">
  <iframe name="menu" src="menu.html"></iframe>
  <iframe name="main" src="main.html"></iframe>
</div>
CSS
.layout {
  display: grid;
  grid-template-columns: 30% 1fr;
}

Пример: frameset и frame рядом с iframe и grid

Результат

Кнопки выбирают способ. Под рамкой записаны ширины окон и то, что открыла ссылка с target.

Раскладка получается такой же, и ссылка открывает документ в нужное окно. Проверка в Nu Html Checker для <frame> сообщает: The “frame” element is obsolete. Use the “iframe” element and CSS instead, or use server-side includes. Такой же совет дан для <frameset>. Ещё устаревшие теги: tt, big и strike.

Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×