Фреймы
Директивы создания
фреймов не входят в официальную спецификацию HTML 3.2,поскольку их активное
использование началось с появлением языка разметки гипертекста версии
4.0. Однако здесь я сделаю краткий экскурс в теорию использования фреймов,
так как полагаю, что данный раздел может заинтересовать ряд начинающих
web-дизайнеров, уже сталкивавшихся с этим способом представления web-страниц.
Фреймы — способ организации
структуры сайта, при котором web-страницадробится на ряд отдельных составляющих
и «собирается» в главном окне броузера из нескольких независимых
или вложенных окон. При таком представлении каждый компонент страницы
является самостоятельным документом HTML и встраивается в ту область
экрана, которая задается директивой<FRAMESET>. Данный способ применяется
в основном для дробления web-страницы на логические разделы: например,
в верхнем фрейме выводится рекламный баннер, в левом — элементы навигации,
в правом — основной текст страницы, в нижнем — сообщение об авторских
правах и адрес электронной почты разработчика ресурса. При этом нажатие
на любую из навигационных кнопок приводит к изменению содержимого лишь
одного окна, все остальные фреймы остаются без изменений. Если содержимое
фрейма не умещается в видимые границы окна, броузер отображает полосы
прокрутки.
В случае применения
фреймов индексный html-файл (index.html) несколько отличается от обычного.
Как известно, стандартный документ HTML имеет два логических раздела:
раздел заголовков <HEAD> и раздел <BODY>, определяющий тело
документа. При использовании фреймов раздел <BOOY> заменяется
на раздел <FRAMESET>. Все остальные документы, отображаемые в
отдельных фреймах,имеют стандартное представление.
В общем виде синтаксис
записи директивы <FRAMESET> выглядит следующим образом:
<FRAMESET ROWS="значение"
COLS="значение" FRAMEBORDER="значение"
FRAMESPACING="значение">
<FRAME МАМЕ="имя"
TARGET="значение" SCROLLING="yes. no или auto" SRC="URL"
FRAMEBORDER="значение"
NORESIZE>
<NOFRAMES>
<BODY>
Текст, отображаемый
в броузерах, не поддерживающих фреймы.
</BODY>
</NOFRAMES>
</FRAMESET>
Очевидно, что общая
структура представления фреймов во многом схожа с представлением таблиц:
тег <FRAMESET>, задающий параметры отображения всех фреймов в
документе, содержит необходимое количество тегов <FRAME>, описывающих
каждый отдельный фрейм. Причем некоторые атрибуты, применяемые совместно
с командой <FRAME>, могут отменять параметры, заданные в атрибутах
команды <FRAMESET>. Как и в случае с <ТАВ1Е>, директива
описания фреймов допускает вложение одного элемента <FRAMESET>
в другой.
Атрибут тега <FRAMESET>
FRAMEBORDER определяет, надо ли отображать на экране пользователя границы
фреймов. Параметр этого атрибута может принимать одно из двух значений:
1, если разделители нужны (используется по умолчанию), или 0, если программист
желает сделать их невидимыми. Атрибут FRAMESPACING указывает на толщину
разделителей в пикселах. Атрибуты ROWS и COLS определяют соответственно
количество горизонтальных и вертикальных отрезков во фреймовом наборе.
Параметры атрибутов
ROWS и COLS можно задавать различными способами: в пикселах, процентах
и в относительных длинах. Если атрибут ROWS в теге<FRAMESET> не
указан, каждый столбец будет занимать всю длину страницы, если
не указан атрибут
COLS, каждая строка растянется на всю видимую ширину экрана. Параметры
фреймов задаются слева направо для горизонтальных элементов и сверху
вниз для вертикальных. Например, запись <FRAMESET COLS="50*.50Х">
разделит страницу вертикально на две равные части, запись <FRAMESETROWS="250.
10%. *"> задаст горизонтальное разделение страницы на три участка:
первый — с фиксированной высотой 250 пикселов, второй — высотой в 10
% от оставшегося пространства, третий же займет все пространство, которое
останется свободным после создания первых двух окон. В этом примере
при задании параметров атрибута ROWS были использованы все три варианта
определения отрезков фреймового набора: в пикселах (250 точек), процентах
(10 %) и в относительных длинах (включение символа *). Разделения web-страницы
на сетку 2x3 ячейки можно добиться, например, применением следующих
значений атрибутов директивы <FRAMESET>: <FRAMESET ROWS="40%.
60%" COLS="33%. 34%. *">.
Команда <FRAME>
может включать следующие атрибуты: NAME, в котором задается уникальное
имя для данного конкретного фрейма, набранное с использованием символов
латинского алфавита, TARGET, содержащий информацию о целевом фрейме
(рекомендуется использовать значение по умолчанию — "contents"),
SCROLLING, определяющий наличие ("yes"), отсутствие ("по")
или отображение по мере необходимости ("auto") полос прокрутки
в текущем фрейме, SRC, в котором указывается адрес открываемой в данном
фрейме страницы, FRAMEBORDER, правила записи и назначение которого аналогичны
таковым в составе тега <FRAMESET>, и, наконец, атрибут NORESIZE,
наличие которого устанавливает запрет на изменение пользователем размеров
окна фрейма. Тег <FRAME> может также содержать ряд других необязательных
атрибутов, таких как MARGINWIDTH, определяющий размер в пикселах пустого
пространства, оставляемого во фрейме в качестве правого и левого полей,
и MARGIN-HEIGHT, задающий верхний и нижний отступы.
Директива <NOFRAMES>,
включающая вложенные теги <BODY> и </BODY>, позволяет записать
произвольное количество html-кода, который будет динамически преобразован
в самостоятельную web-страницу в случае, если клиентский броузер не
поддерживает фреймы.
Представление гиперссылок
для страниц, использующих фреймы, также требует определенной модификации,
а именно — обязательного использования атрибута TARGET:
<А HREF="URL"
ТАР6ЕТ="_значение">Текст или элемент IMG</A>
Допустимые значения
атрибута TARGET для применения тега <А> во фреймовых наборах следующие:
_self — документ,
с которым установлена гиперсвязь, открывается в текущем фрейме;
_parent — отображение
осуществляется в родительском окне фреймов, независимо от того, какие
параметры указаны в директиве <FRAMESET>;
_top — при активизации
гиперссылки фреймы перестают отображаться, а содержимое целевого документа
выводится в отдельном окне.
Если вместо значения
атрибута TARGET подставить имя фрейма, заданное вами ранее в качестве
параметра атрибута NAME тега <FRAME>, при активизации ссылки целевой
документ загружается в окне с указанным именем.
Ярким примером использования
директивы <FRAMESET> может служить приведенный ниже листинг индексного
документа HTML, использующего фреймы:
<!DOCTYPE HTML
PUBLIC "-//W3C//DTD HTML 4:0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>FRAMESET
EXAMPLE PAGE</TITLE>
</HEAD>
<FRAMESET FRAMESPACING="0"
rows="64.*.64" FRAMEBORDER="0">
<FRAME NAME="top"
SCROLLING="no" TARGET="contents" SRC="page_l.htm">
<FRAMESET COLS="150.*">
<FRAME NAME="contents"
SRC="page_2.htm" SCROLLING="auto">
<FRAME NAME="main"
SRC="page_3.htm" SCROLLING="auto">
</FRAMESET>
<FRAME NAME="bottom"
SCROLLING="no" NORESIZE SRO"page_4.htm">
<NOFRAMES>
<BODY>
<P ALIGN="CENTER">Этa
страница содержит фреймы, но ваш броузер не поддерживает их отображение.</Р>
</BODY>
</NOFRAME>
</FRAMESET>
</HTML>
Обратите внимание
на то, что определитель DOCTYPE в данном случае содержит указание на
версию языка HTML 4.O. Это необходимо, поскольку ссылка на HTML 3.2,
не позволяющий использовать фреймы, может вызвать в некоторых броузерах
ошибку при трансляции кода.
Приведенный выше
листинг html-документа делит web-страницу так, как это показано на рис.
6.11.
Рис. 6.11. Внешний
вид web-страницы, созданной с применением директивы FRAMESET
На первый взгляд
фреймы кажутся весьма привлекательными с точки зрения удобства обслуживания
сайта: например, для того чтобы изменить состав навигационных элементов,
нет необходимости вносить изменения во все страницы вашего ресурса,
достаточно лишь подправить документ, отображающийся в соответствующем
фрейме. Однако на практике оказывается, что объективных недостатков
у данной формы представления web-страниц значительно больше, чем достоинств.
Во-первых, фреймы
весьма сложны в разработке и настройке: достаточно трудно оптимизировать
такую страницу для корректного отображения в разных версиях броузеров
со всеми допустимыми экранными разрешениями. В некоторых фреймах возможно
периодическое появление полос прокрутки, затрудняющих просмотр документа,
а жесткий запрет на отображение средств скроллинга может повлечь за
собой исчезновение части отображаемых во фреймах страниц заграницей
видимой области экрана. Во-вторых, фреймы распознаются далеко не всеми
броузерами, в полной мере их поддерживают лишь современные версии Microsoft
Internet Explorer и Netscape Navigator. Излишне говорить, что во Всемирной
сети достаточно много пользователей, на компьютерах которых установлены
старые броузеры. В-третьих, применение фреймов существенно затрудняет
управление навигацией сайта при помощи встроенных в броузер кнопок «Вперед»
и «Назад», поскольку они рассчитаны, в первую очередь, на
работу с документами размером в целый экран, но никак не с отдельными
окнами, в которые загружено множество документов. Нажатие на одну из
этих кнопок иногда может привести к совершенно непредсказуемым последствиям.
И последним, самым
существенным недостатком фреймов является то, что использующие их страницы
не всегда корректно индексируются поисковыми серверами. Проблема заключается
в том, что большинство поисковых машин индексирует не страницу, а текст.
Предположим, посетитель поискового сервера ищет ресурсы, в тексте которых
встречается словосочетание «web-дизайн». Такая фраза действительно
содержится в одном из документов вашего сайта, загружающемся, допустим,
в правом окне фреймового набора. Ссылка, которую включит в свой файл
отчета поисковый сервер, приведет пользователя именно на эту страницу,
но не на индексный документ, обеспечивающий разбиение сайта на фреймы.
Таким образом, страница, обычно появляющаяся в собственном окне, отобразится
на экране клиентской машины во весь экран, при этом элементы навигации,
сообщение об авторских правах и заголовок ресурса будут недоступны.
Из всего сказанного
напрашивается простой и вполне очевидный вывод: использовать фреймы
лучше всего только тогда, когда это действительно необходимо, например,
при создании web-чата или интерактивной доски объявлений. Во всех остальных
случаях от их применения лучше отказаться.