Синтаксис фреймов

Если весь сайт построен на фреймах, а не отдельная его часть, то тогда в индексном файле, вместо блока <body>...</body> должен находиться блок <frameset>...</frameset>. Внутри этого блока <frameset>...</frameset> могут быть дополнительные блоки <frameset>...</frameset>, если страница имеет сложную фреймовскую структуру с делением экрана монитора и по горизонтали и по вертикали, как, например, этот сайт. Таким образом, тэг frameset задает структуру страницы.

А сами отдельные фреймы описываются тэгами <frame>. Обратите внимание, что тэг frame не является парным. К нему не нужен закрывающийся тэг </frame>.

Кроме блока <frameset>...</frameset> может быть еще и необязательный блок <noframes>...</noframes>. Внутри этого блока содержится то, что должно выводиться на экран монитора, если браузер пользователя не поддерживает фреймы. Это либо старые версии браузеров, либо браузер Opera и некоторые другие, где можно отключить возможность просмотра сайта с фреймами. Обычно в этом блоке размещают сообщение для пользователя о том, что для просмотра сайта необходимо, чтобы браузер поддерживал просмотр фреймов.

Чтобы включит просмотр фреймов в таком браузере, как Opera, надо пройти по пунктам меню: "Инструменты" --> "Быстрые настройки" --> "Настройки для сайта..." --> "Вид" и там поставить галочку "Включить фреймы".

В некоторых книгах по сайтостроению и по раскрутке сайтов дается очень нелепый совет разместить в блоке <noframes>...</noframes> набор ключевых слов сайта. Дескать, пользователи их все равно не увидят, а поисковики проиндексируют. На самом деле сейчас поисковики научились корректно работать с фреймами и рассматривают блок <noframes>...</noframes> как альтернативную полноценную страницу сайта для тех, у кого браузер не поддерживает фреймы. По идее с этой страницы должна начинаться другая версия сайта уже без фреймов. Значит простой набор ключевых слов в блоке <noframes>...</noframes> поисковики расценят как попытку поискового спама.

Тэг <frameset> может содержать следующие атрибуты:
rows="n1,n2,...,nm"Высота горизонтальных блоков на экране монитора. Значения высот перечисляются через запятую в направлении блоков сверху вниз. В перечислении присутствует столько значений, на сколько горизонтальных блоков разбит экран монитора (или его часть описываемая данным frameset). Сами параметры n1, n2 и т.д. могут принимать значения:
1. число, и тогда это число пикселей
2. число не более 100 и со знаком %, значит разбивка экрана идет в процентном соотношении
3. * (звездочка) - относительный размер (что осталось, как получится и что бог на душу положит)
cols="n1,n2,...,nm"Ширина вертикальных блоков на экране монитора. Значения ширины перечисляются через запятую в направлении блоков слева направо. В перечислении присутствует столько значений, на сколько вертикальных блоков разбит экран монитора (или та его часть, которая описывается данным frameset). Сами параметры n1, n2 и т.д. могут принимать значения:
1. число, и тогда это число пикселей
2. число не более 100 и со знаком %, значит разбивка экрана идет в процентном соотношении
3. * (звездочка) - относительный размер (что осталось, как получится и что бог на душу положит)
border="n"Ширина границ между фреймами. По умолчанию, при отсутствии этого атрибута, во многих браузерах n=1, а не ноль, то есть границы по умолчанию есть.
frameborder="yes|no"Есть или нет границы между фреймами
bordercolor="#FFFFFF"Цвет границ между фреймами. Атрибут работает не во всех браузерах.

Обратите внимание, что атрибуты rows и cols являются взаимоисключаемыми, то есть в одном конкретном тэге frameset может быть или только атрибут rows или только атрибут cols, но никак не оба вместе. Применение в одном тэге frameset сразу двух атрибутов rows и cols может привести к непредсказуемой ошибке.

Если тэг frameset не содержит ни атрибута rows, ни атрибута cols, то это значит, что он описывает только один блок, то есть в нем нет разбивки на блоки.

Описывать разбивку на фреймовские окна в атрибутах rows и cols фиксированными значениями, заданными только в пикселах, очень неудобно, так как у разных пользователей разное разрешение экрана монитора. Поэтому жесткую разбивку в пикселах лучше сочетать со значением звездочка (*) хотя бы для одного фрейма в списке. Такое значение для размера фрейма будет означать, что этот фрейм по своему размеру займет все оставшееся пространство.

Если значение звездочка (*) в одном атрибуте rows или cols будет присутствовать несколько раз, то соответствующие им окна поделят оставшееся пространство равными долями, то есть будут одинаковыми по площади. Если необходимо, чтобы эти блоки были разными по размеру, то перед звездочкой можно написать числа, которые зададут нужные пропорции. Например, если размеры трех блоков заданы как (2*,*,3*), то это значит, что первый блок будет в два раза больше второго, а третий в три раза больше второго, и, значит соотношение площадей первого и третьего окон будет как 2:3.

Если Вы применяете только процентную разбивку в атрибутах rows и cols и при этом ошиблись в числах так, что сумма всех процентов не равна 100%, то ничего страшного не произойдет. Если сумма меньше 100%, то все размеры пропорционально увеличатся так, что сумма реальных размеров на экране монитора будет 100%. Если сумма больше 100%, то реальные размеры на экране монитора соответственно пропорционально уменьшатся.

Тэг <frame> может содержать следующие атрибуты:
src="url"Задает путь и файл, содержимое которого будет выводится в данном фрейме. Понятно, что файл может находиться даже на другом сайте. Этот атрибут является обязательным для тэга frame.
name="..."Задает имя фрейма, чтобы потом можно было обратиться к этому фрейму по его имени.
noresizeЗапрет посетителям сайта самим менять размеры фрейма с помощью мышки.
scrolling="yes|no|auto"Задает полосы (вертикальную и горизонтальную) прокрутки. Для "yes" полосы всегда видны, даже когда в них нет необходимости. Для "no" полос никогда нет, но прокрутку в некоторых браузерах все же можно сделать при помощи колесика мыши. Для "auto" нужная полоса прокрутки автоматически появляется когда вся информация не отображается во фрейме (обычно auto используется по умолчанию).
marginwidth="n"Отступ содержимого фрейма от левой и правой границ в пикселах.
marginheight="n"Отступ содержимого фрейма от верхней и нижней границ в пикселах.
frameborder="yes|no"Задает наличие границы вокруг фрейма. Работает только если в frameset явно не задается граница.
bordercolor="#FFFFFF"Задает цвет границы вокруг фрейма. Работает не во всех браузерах.

Если в тэге frame не будет атрибута url, то окно фрейма на экране монитора будет создано, но оно будет пустым. Иногда в таких окнах бывает необходимость.

Задаваемые имена фреймов не должны начинаться со знаков препинания, скобок, знаков арифметики и с символа подчеркивания. Они должны начинаться с буквы или цифры. Фреймы могут и не иметь имен. К поименнованным фреймам можно обратиться из другого фрейма и даже из другого html-документа при помощи специального атрибута target, который рассмотрим чуть позже.

Если у какого-нибудь фрейма установлен атрибут noresize, а у других фреймов такого атрибута нет, то размеры других фреймов можно менять мышкой только так, чтобы не менялись размеры фрейма с атрибутом noresize.

В заключение рассмотрим, как фреймы связываются друг с другом через свои имена. Это знание позволит Вам организовать и спланировать взаимодействие фреймов, когда, например, клик мыши по ссылке в одном фрейме меняет содержание другого фрейма.

На этом сайте, если Вы нажимаете на ссылки левого меню, у Вас меняется информация в центральном окне. Скачайте шаблон по ссылке слева и посмотрите, как устроен файл lefter.html, который отображается в левом меню. Вы видите, что в ссылках присутствует атрибут target, значение которого равно content. Если Вы теперь посмотрите на файл index.html, то увидите, что имя content имеет фрейм центрального окна. Значит, значение content атрибута target в ссылке указывает на то, что содержимое файла, к которому переходим в ссылке, должно отображаться в окне фрейма с именем content. Это и есть основная идея того, как идет связь фреймов друг с другом.

Рассмотрим, как работает атрибут target в разных тэгах.

Применение атрибута target в разных тэгах
<a>...</a>При отсутствии атрибута target в тэге ссылки (по умолчанию), документ "сливается" в то же самое окно, в котором стоит ссылка. Атрибут target показывает имя того фрейма, в окно которого будет "слит" контент при активации ссылки.
<base>Если при работе сайта все ссылки из одного файла должны "сливать" информацию только в один и тот же фрейм, то тогда можно не указывать атрибут target в каждой ссылке. В этом случае атрибут target указывается в этом файле один единственный раз в одинарном тэге <base>, который в свою очередь помещается в контейнер <htad>...</head>.
<area>При создании карты изображения, атрибут target действует точно также, как и в простых ссылках, указывая в какой фрейм "сливать" информацию при клике мышки на частиизображения.
<form>...</form>В тэге <form> атрибут target задает фрейм, в окно которого будут выводиться результаты обработки данных формы. По умолчанию, когда такой атрибут отсутствует, результат обработки формы выводится в то же самое окно, где была форма ввода.

Существуют зарезервированные значения атрибута target, которые могут применяться даже тогда, когда на сайте не используются фреймы. Например, в обычных ссылках.

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