По ту сторону Веб-страницы

Техминимум: как сейчас принято

HTML в четвертой редакции (да и в предыдущих тоже) предостав­ляет широкие возможности для написания некорректного кода. Это значит, что, несмотря на наличие определенных правил формирова­ния веб-страницы посредством тэгов, все браузеры очень лояльно относятся к ошибкам кода. Допустим, все открытые тэги следует закрывать, но очень часто встречается

<Р>Текст абзаца вместо корректного

<Р>Текст абзаца</Р>,

Поскольку браузеры автоматически «закрывают» (на уровне ме­ханизма интерпретации разметки, не исправляя код) подобные тэги (<LI>, <TD>, <DD> и другие). Пропускаются даже достаточно важные закрывающие тэги (например, </FORM>), но браузеры и на это смотрят сквозь пальцы. Значения параметров должны быть заключены в кавыч­ки, но это тоже не всегда соблюдается. В самом деле, зачем делать лиш­нюю работу, если она будет сделана за тебя?

А теперь зайдем в мастерскую и посмотрим на работающие меха­низмы.

Во-первых, при интерпретации некорректного кода браузе­ру требуется больше ресурсов, чтобы отобразить страницу корректно. Никто не обещает, что, если страницу корректно отобразит один бра­узер, то второй (или следующая версия первого браузера) отобразит ее так же хорошо. При разработке современных браузеров действуют две противоречивые тенденции: с одной стороны, программы просмотра веб-страниц переваривают и некорректный код (кому охота пользо­ваться браузером, который не отобразит треть сайтов или отобразит их

Техминимум: как сейчас принято

3.1

«криво»?), с другой стороны, в свете движения к стандартизации языка разметки разработчики может получиться так, что через две-три версии (а версии выходят не так уж и редко) браузеры начнут выдавать преду­преждения, что данная страница сверстана неправильно.

Во-вторых, во много раз снижается возможность работать с доку­ментом как с представителем объектной модели. Для статичных сайтов, созданных без лишних сложностей, это ничего не значит, но для сай­тов, построение страниц которых является динамическим (и основано, например, на работе активных сценариев), это критично: правильной работы с кодом не получится.

В-третьих, не получится хорошего взаимодействия с другими сайтами, например, поисковыми системами, которые в первую очередь ориентируются на логическую разметку (а в основе логики лежит ак­куратность и последовательность). В результатах системы могут давать не совсем то, что хотелось бы.

В-четвертых, браузеры на мобильных устройствах воспринимают только правильный код.

Наконец, в-пятых, действует субъективный фактор. Намного приятнее работать с аккуратным кодом, чем с безобразным — даже са­мому, не говоря о тех, кто будет впоследствии вынужден работать с ва­шим кодом (а это случается сплошь и рядом при редизайне и стихийном исправлении кода).

Сейчас (примерно с начала первого десятилетия третьего тыся­челетия нашей эры) сложилась такая ситуация, которая напоминает ситуацию с русском языком конца XVIII — начала XIX столетий. Бо­лее или менее мирно сосуществуют стандартизированный «литератур­ный» язык XHTML, правила которого разработаны и получили широ­кую огласку совсем недавно, и «разговорный» HTML с массой говоров и диалектов. В «разговорном» языке допускаются многочисленные от­клонения от правил и годами наработанные приемы воссоздания тех эффектов, которые в язык не закладывались. В связи с этим произве­дения (сайты), созданные на «литературном» языке, в силу его новизны и жесткости правил выглядят достаточно шаблонно, как произведения раннего классицизма, тогда как «народный» язык производит такие шедевры, которые «литературному» и не снились. Однако и среди но­сителей «литературного» языка встречаются мастера (условно назовем их веб-мастерами), которые и в жестких рамках XHTML ухитряются создать нечто необычное.

Нужно указать на пару особенностей данной ситуации. Во-пер­вых, расширение файла не зависит от того, на каком языке пишется разметка: будь это HTML или XHTML, имена файлов могут заканчи­ваться на. htm, .html, .php, .asp, .phtml, .pl, .jsp, .xml, .xhtml, .bml, .wml, .wbp и другие расширения в зависимости от используемых технологий и настроек сервера. Не секрет, что при определенной конфигурации

Верстка

XHTML

Сервера файлы с расширением. jpg могут работать как PHP-сцена­рии и наоборот. Во-вторых, если не указывать DTD (document type definition, описание типа документа) в начале файлов с помощью тэга <! DOCTYPE>, то часто с трудом можно догадаться, XHTML это или HTML. Дело в том, что код на языке XHTML не противоречит прави­лам языка HTML. Только мелкие особенности (например, невозмож­ность параметра без значения и отсутствие незакрытых тэгов) говорят, что перед нами код на языке XHTML.

Рассмотрим основные особенности современной, модной, ва­лидной, чистой верстки на языке XHTML.

Все теги и параметры должны быть набраны в нижнем регистре (строчными символами) — кроме тэга <!DOCTYPE>.

Значения любых параметров необходимо заключать в кавычки. Это связано не только с тем, что в значениях могут встречаться пробелы, но и с большей структурированностью кода. Код при этом увеличивает­ся ненамного, но с ним намного легче работать.

Требуется закрывать все теги, даже такие, которым не сопоставлен закрывающий тэг. Проблема с тэгами, не требующими пары, решает­ся так: в конце одиночных тэгов ставится пробел и косая черта. То есть <br> превращается в <br />. Старые браузеры расценивают косую чер­ту как новый, неизвестный параметр, и игнорируют ее, а браузеры, ори­ентирующиеся на корректный код, понимают, что тэг завершен. Такое правило применимо для тэгов <br />, <hr />, <img />, <input />, <link />, <meta />. (Возможен также вариант с полным закрытием, например, <hr></hr>, но первый способ более экономен и удобен) Тэги же, для которых ранее возможен был пропуск закрывающего компонен­та, в XHTML должны обязательно закрываться: <р>текст абзаца</р>, <ор^оп>элемент выпадающего списка</ор^оп> и так далее.

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

Нельзя использовать сокращенные атрибуты тегов. Если рань­ше можно было написать <hr noshade>, то теперь у параметра обязательно должно быть значение: <hr noshade="1"> или <hr noshade="noshade"> — то есть значение параметра должно рав­няться единице или по написанию совпадать с именем параметра (еще пример: <input type="checkbox" checked="checked"> вместо <input type="checkbox" checked>).

Вместо параметра name необходимо указывать атрибут id. В бу­дущем авторы спецификации языка XHTML грозятся вообще вывес­ти параметр name из употребления. Но в связи с этим ограничением возникает сразу две проблемы. Во-первых, не все браузеры умеют ссы­латься с помощью якорей (domain. ru/page1.html#anchor1) на фрагмент,

124

Техминимум: как сейчас принято

3.1

Обозначенный тэгом <a> с атрибутом id: в большинстве случаев якорь предпочтительнее ставить конструкцией <a name="anchor1"></a> или — в целях полной совместимости с прошлыми и будущими верси­ями <a name="anchor1" id="anchor1"></a>. Во-вторых, при ис­пользовании элементов <input type="radio" />, которых всегда бывает несколько, но имя (тот самые name) у них все равно одно (по­тому что посылается только одно из значений) заменять name на id нельзя, потому что у нескольких однотипных элементов могут быть только разные идентификаторы id. В частности, элемент <label> ссылается только на конкретно идентифицированный (с помощью id) элемент <input />, значит, id’bi у всех <input />’ов должны быть разные; но для организации «переключателя» имя (name, а по-новому id) должно быть у всех элементов переключателя одинаковое. «Вы­ход» — все-таки использовать атрибут name наряду с id.

Следует определять DTD (document type definition, описание типа документа) с помощью тега <!DOCTYPE>. Основными описаниями типа документа стоит считать следующие:

1. Четкое разделение формы и содержания, строгий DTD

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0

Strict//EN" "Http://www. w3.org/TR/xhtml1/DTD/xhtml1- strict. dtd">

2. Переходный тип, с возможностью использования визуальных

Тэгов:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "Http://www. w3.org/TR/xhtml1/DTD/ xhtml1-transitional. dtd">

3. Версия с фреймами:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "Http://www. w3.org/TR/xhtml1/DTD/xhtml1- frameset. dtd">

4. Версия для XHTML 1.1:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "Http://www. w3.org/TR/xhtml11/DTD/xhtml11.dtd">

Основываясь на этих описаниях, браузер подключает механизмы чтения разметки.

Наконец, последнее. Тэги должны использоваться максимально семантически. Так, для взаимного расположения блоков на странице используется тэг <div> с точным позиционированием, задаваемым при помощи CSS, а таблицы использовать не для верстки, а именно для табличного представления данных (например, таблицы совместимости, расписания и т. п.). Не приветствуется тэг <i>, потому что он переда­ет только визуальное форматирование (курсивное начертание), тогда как тэг <em>, хотя и заставляет текст отображаться курсивом, но делает упор на семантику: em — сокращение от «emphasis» («акцент; выделе-

Ние»). <blockquote> следует использовать не для отступа текста слева, а именно для цитат, как это и было изначально предусмотрено.

HTML 5

подпись: html 5В целом концепция XHTML очень логична и удобна. Возможно, это было бы действительно универсальное решение для будущего бра­узеров. Но после разработки версии XHTML 1.1 стандартизирующая организация прекратила работу над планировавшимся ранее проектом XHTML 2.0 и занялась работой над пятой версией языка HTML. (Для справки: варианты HTML разрабатывались длительное время, вторая версия вышла в 1995 году, третья в 1996, 4.0 — в 1997, а 4.01, распростра­ненная ныне, — в 1999.) Вероятно, полезно будет немного заглянуть в будущее и выяснить, что появится нового в этой версии.

Вот пример корректного кода на HTML 5:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="utf-8">

<base href="">

<title>HTML5 page</title>

<link rel="stylesheet" type="text/css" href=""> <script src="file. js"></script>

<style>

P {

Color: #00F;

}

</style>

<script>

Alert("HTML5");

</script>

</head>

<body>

<p>Paragraph<br>line2</p>

</body>

</html>

Различий с HTML 4 в этом примере совсем немного: сокра­щенный DTD, возможность указания кодировки напрямую через тэг <meta>, отсутствие необходимости указывать типы данных включае­мых файлов и язык активных сценариев. Различия с XHTML — отсутс­твие необходимости закрывать все тэги подряд.

Язык, судя по всему, будет иметь XHTML-разновидность; фун­кциональные их различия пока неясны, но есть разница в синтаксисе. Так, тэг <br/> все-таки будет закрываться, а в случае с включаемым сценарием будет фигурировать чрезвычайно удобная сокращенная за­
пись: <script src="file. js"/> вместо <script src="file. js"> </script>.

На поверку различий оказывается намного больше.

В HTML 5 вводится большое количество новых элементов, на­пример, <article> (заметка в блоге, статья в газете), <aside> (при­мечание сбоку страницы), <dialog> (диалог), <figure> (для объ­единения включаемого медиа-содержимого, например, видеоролика, с подписью), <header> и <footer> (блоки «шапки» и «подвала» стра­ницы или иного блока), <audio> и <video> (для собственно встав­ки медиа-содержимого), <m> (помеченное), <time> (для обозначения времени и даты), <canvas> (для динамически генерируемых изобра­жений — буквально «холст»), <datalist> (комбо-бокс, или выпада­ющее меню, совмещенное с текстовым полем для ввода, когда вместо уже заготовленных значений, оформленных в виде выпадающих меню, пользователь может ввести свое) и некоторые другие. К примеру, диалог теперь можно будет оформлять так:

<dialog>

^^Первый

<dd>Превед! Кагдила?

^^Второй <dd>Ничо так.

</dialog>

У некоторых уже существующих тэгов появятся новые парамет­ры: у тэга <meta> — параметр charset (кодировка), для <input> и <textarea> — параметры autofocus (фокус — или курсор — уста­навливается на элемент, отмеченный этим параметром), replace (что будет с документом, когда данные формы будут отправлены по нажатию кнопки) и required («предназначено для обязательного заполнения») и еще несколько. Например, с помощью новых параметров элементы можно соотносить не с одной, а несколькими формами. Параметры class, dir, id, lang и title могут относиться к любому элементу. Часть атрибутов сможет быть реализована с переработкой механизмов отрисовки веб-страниц браузерами. Так, вместо длинных сценариев для того, чтобы элемент можно было перемещать по веб-странице, доста­точно будет присвоить элементу параметр draggable.

Наконец, поддержка некоторых элементов останется только для обратной совместимости. HTML 5 не будет включать следующие элемен­ты: <acronym>, <applet>, <basefont>, <big>, <center>, <dir>, <font>, <frame>, <frameset>, <isindex>, <noframes>, <s>,

<strike>, <tt> и <u>. Удалены и некоторые редкие параметры тэгов.

Часть из элементов HTML 5 уже поддерживает девятая версия браузера Opera, в проекте такая поддержка и у Firefox.

HTML 4

подпись: html 4 Техминимум: как сейчас принятоЯзык HTML 4 в полной мере поддерживают все современные бра-

Узеры, за исключением текстовых. Рассмотрим его основные правила.

Проще всего понять действие того или иного языка на простых примерах. HTML в этом случае являет собой хороший материал для изу­чения, поскольку для его работы достаточно встроенных средств любой современной операционной системы (отчасти потому, что любая совре­менная операционная система ориентирована не в последнюю очередь на работу в интернете, а отчасти — потому, что простые веб-страницы являются в первую очередь текстовыми документами, только опреде­ленного формата).

Чтобы создать простую веб-страницу, необходимо создать пус­той текстовый документ (с расширением. txt), для чего подойдет любой простой текстовый редактор типа Блокнот (в системе Windows), vim или emacs (для Linux), а также более специализированные текстовые редакторы, поддерживающие работу с несколькими текстовыми фор­матами. Не используйте для этого текстовые процессоры типа MS Word, AbiWord или средства OpenOffice: результат может получиться непред­сказуемым. После этого расширение файла нужно исправить на. html или. htm — выбор не играет роли. В этом случае файл будет открывать­ся браузером, по умолчанию установленным в операционной системе (для Windows — Internet Explorer, для MacOS X — Safari, для разных вер­сий Linux и FreeBSD-основанных систем — Konqueror или Firefox, для QNX, если ее кто-то вдруг станет использовать как настольную систе­му, — Voyager); естественно, он будет пустым. Тот же самый файл сле­дует параллельно открыть средствами одного из упомянутых текстовых редакторов и написать в нем следующий код:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<head>

<title>Заголовок</title>

</head>

<body>

</body>

</html>

После чего нужно обновить страницу в браузере. На самой стра­нице ничего не изменится, но в заголовке окна рядом с названием брау­зера появится слово «Заголовок». Если же в пространстве между <body> и </body> написать какой-то текст и обновить страницу в браузере, то этот текст наконец отобразится на веб-странице. Проанализируем код.

Строка <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> отвечает за определение типа документа (DTD) — об этом тэге уже говорилось выше. Все остальное в докумен­те — это разметка языка HTML (пусть и со включениями кода других языков в ряде случаев): об этом сообщает парный тэг <html>...</html>, являющийся контейнером для остального содержимого.

Содержимое этого контейнера делиться на две неравные части. Одна часть служит для сообщения браузеру и серверу, куда эти данные отправятся, множество технической информации, в том числе неко­торые настройки браузера, сведения об используемых файлах и не­которые элементы навигации — эта часть заключается в парный тэг <head>...</head> — как несложно увидеть, внутри этой пары записан тэг <title>...</title>, включающий текст, который выводится на строке заголовка наверху окна браузера (в нашем случае это слово «За­головок»). Вторая часть, заключаемая в парный тэг <body>...</body>, заключает все то, что будет выводиться в окно браузера. (Кстати заме­тить, что большинство тэгов — парные; в дальнейшем тип тэга будет оговариваться, только если тэг будет одиночный.)

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

Рассмотрим более сложный пример.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<head><title>Создание веб-страницы</title></head> <body>

^1>Создание веб-страницы<^1>

<р>Первый этап создания веб-страниц (при наличии определенных знаний) включает разработку идеи сайта и выбор инструментария...</р>

<р>После этого начинается сам процесс: отрисовка дизайна, написание кода, разработка интерактивных страниц.</р>

</body>

</html>

Верстка

Сразу же обратим внимание, что пробелы и расположение тэгов (на одной строке или на несколько) не играют ровным счетом никакой роли. Весь код может быть записан как длинная строка, но в этом случае он будет не читаемым. Напротив, разные блоки кода можно отделять друг от друга произвольным количеством пробелов и переводов строк — они будут игнорироваться. Именно поэтому для разбиения текста на аб­зацы используется тэг <p>...</p> — если не использовать его, то текст, пусть и разбитый на отдельные строки, в браузере будет отображаться как сплошной абзац без отступов. Если же требуется не создавать но­вый абзац, а просто принудительно перенести текст на другую строку, используется одиночный тэг <br>. Разница не только в оформлении (обычно браузеры форматируют содержимое тэга <p>...</p> как блок текста с отступами сверху и снизу высотой в одну строку, а <br> без отступа), но и в использовании: абзац является логическим тэгом, и ему можно назначить стиль, а <br> не создает контейнера. Для разделения горизонтальной чертой используется тэг <hr> — лучше всего его исполь­зовать не просто так, а с параметрами. Дело в том, что во всех браузерах эта горизонтальная линия создает имитацию эффекта трехмерной тени (что чаще всего вступает в противоречие с дизайном страницы), и что­бы от нее избавиться, нужно включить параметр noshade («без тени») и толщину линии size, измеряемую в пикселях (обычно пиксели как единица измерения в HTML не указываются, в отличие от процентов). После чего тэг примет вид <hr size="1" width="50%" noshade color="black"> — правда, последний параметр, обозначающий цвет линии, не распознается браузером Opera. А из-за параметра width (ши­рина) горизонтальная черта сместится к центру страницы и будет за­нимать ровно половину ширины страницы, какого бы размера окно ни было. Параметры при необходимости используются большинством тэ­гов; правда, тенденция верстки последнего времени — уточнение визу­ального представления тэгов средствами CSS, а не параметров, поэтому в качестве параметра используется class или style, в первом случае с име­нем класса, а во втором — с описанием. Если раньше для форматирова­ния подписи автора под текстом писали <p align="right"><i>MBaH Иванов</і></р> (чтобы содержимое абзаца выравнивалось от право­го края и оформлялось курсивом), то теперь модно (и удобно) писать <p class = "subscr"^BaH Иванов</р>, а классу (названному тут «subscr») в таблице стилей назначить детальное описание: не только выравнивание по правому краю и курсивное начертание, но и отступы, особый рисунок шрифта и другие параметры.

Кроме абзацев, есть логические тэги, обозначающие блоки текста и отрезки текста. Блоки оформляются тэгом <div>...</div> и в брау­зерах форматируются как абзацы, но без отступов. Главная особенность блока — ему можно назначить любое форматирование с помощью CSS. Блоки являются так называемыми блочными элементами (то есть при

130

Техминимум: как сейчас принято

3.1

Расположении блоков на странице они создают что-то вроде абзаца, не вписываясь в другие текстовые элементы), тогда как отрезки текс­та (<span>...</span>) — линейными, то есть внутри абзаца или блока может быть произвольное количество отрезков текста. (Большинство элементов веб-страниц, оформляемых тэгами, являются либо блочны­ми, либо линейными; впрочем, с помощью CSS можно легко изменить тип элемента.)

Блоки часто используются для точного позиционирования на странице. Отрезки текста нужны для визуального выделения фраг­ментов абзацев и блоков, например, другим цветом, особыми пара­метрами отступов, фонового цвета. Форматирование этих двух эле­ментов осуществляется преимущественно средствами CSS, хотя тэг <div> и способен иметь аналогичный тэгу <p> параметр align, от­вечающий за выравнивание текста в пределах блока: например, <div align="center">TeKCT в центре<^^> (что можно написать и как <center>TeKCT в центре</center>,но тэг<center> идеоло­гически некорректен).

Тэгов, отвечающих за визуальное форматирование и не не­сущих почти никакой семантической нагрузки, не так много: это <Ь>полужирный текст</Ь>, <^курсивное начерта­ние^^, <и>подчеркнутый</и> и ^>перечеркнутый<^> текст, ^ир>верхний<^ир> и ^иЬ>нижний<^иЬ> индексы, <^>моноширинный шрифт</^>. Важно соблюдать правильную вложенность тэгов: если мы начинаем с описания полужирного тек­ста, а внутри текстового фрагмента есть и курсив, то закрывающий тэг курсива должен предшествовать закрывающему тэгу полужирно­го начертания. То есть правильным вариантом вложенности является <b><i> такой </i></b>,а не <b><i> такой </b></i> (хотя большинство браузеров корректно интерпретируют эту последова­тельность).

У некоторых из этих тэгов есть «неполные синонимы»: так, тэг <em>.</em>, хотя и отображает текст курсивом, служит для логичес­кого акцента, так же как и <strong>...</strong>, форматирующий текст как полужирный. Вместо <s>...</s> можно использовать полный синоним <strike>...</strike>.

Один тэг визуального форматирования — <pre>...</pre> — вы­бивается из общего ряда. Он форматирует текст на веб-странице так же, как он набран в исходном коде в текстовом редакторе. То есть внутри этого тэга переводы строк и большее, чем один, количество пробелов отобразятся именно как переводы строк и пробелы, а не как один пробел, помести мы тот же текст в тэг абзаца или блока. Тэгом <pre>...</pre> очень удобно форматировать стихи со сложным ритмом (как у Влади­мира Маяковского) или программный код. Внутри этого тэга допуска­ется использование других тэгов.

Большинство других тэгов, употребляемых внутри раздела <body> ...</body>, имеет логический характер, то есть несет определенную смысловую нагрузку. Естественно, браузеры форматируют каждый из се­мантических тэгов определенным образом. Например, <blockquote> блок цитаты </blockquote> оформляется отступом слева, а все уровни заголовков — от <h1> первого </h1>, самого важного, кото­рый должен встречаться на странице только один раз, до <h6> шестого уровня </h6> — имеют собственные параметры отображения. Внутри <ul> маркированных </ul>и<ol> нумерованных </ol>спис­ков <li> элементы </li> этих списков оформляются отступами и значками либо автоматически проставляемыми числами слева. <code> Программный код </code> оформляется моноширинным шрифтом.

Построение таблиц изначально планировалось в HTML исклю­чительно для тех целей, для которых таблицы используются в обычных документах: упорядоченное представление данных, списки в несколько столбцов, парадигмы спряжения и склонения, отчеты и подобные дан­ные. В этих целях HTML-таблицы тоже используются, но чаще их при­меняют для построения каркаса страницы. Дело в том, что в сам язык HTML не заложена возможность разделения страницы на несколько колонок; кроме того, при построении данных в одну колонку возника­ют сложности с точным совмещением изображений. Поэтому веб-ди­зайнеры очень широко применяют таблицы как основу для взаимного расположения элементов на странице. Таблицы могут быть вложенны­ми, что увеличивает возможности компоновки материала.

Таблица состоит минимум из одного ряда, который состоит ми­нимум из одной ячейки. Даже такая структура таблицы используется в некоторых случаях.

Нагляднее будет пояснить на чуть более сложном примере:

<table border="0" cellpadding="5" cellspacing="0">

<tr valign="top">

<td>Текст первой колонки.</td>

<td>Текст второй колонки, <Ьг>расположенной в две строки.</td>

</tr>

</table>

Тэг <table>...</table> используется для вставки самой табли­цы; он сам по себе не может содержать обычный текст. Его обычные параметры — ширина границы (border, в данном случае нулевая), от­ступ текста от границ ячеек (cellpadding, здесь 5 пикселей) и отступ ячеек друг от друга (тут тоже нулевой). Внутри этого тэга есть тэг ряда — <tr>...</tr>. Он содержит параметр valign, отвечающий за верти-

Техминимум: как сейчас принято

3.1

Кальное выравнивание текста: в данном случае текст в обеих ячейках будет выровнен по верхнему краю, несмотря на то, что высота текста разная (в первом случае одна строка, во втором две). Если бы мы на­писали вместо top значение bottom, то текст располагался бы внизу ячеек, а высота ячеек равна совокупной высоте строк самой заполнен­ной ячейки. Если бы значение было middle или параметра не было бы совсем, то текст «повис» бы вертикально по центру ячеек.

Наконец, собственно содержание должно заключаться в тэги яче­ек: <td>...</td>. Эти тэги тоже могут принимать значение вертикаль­ного (valign) и горизонтального (align) выравнивания.

Таблица в два ряда, в каждом из которых находится по две ячейки, записывается в формате HTML так:

<table border="0" cellpadding="5" cellspacing="0">

<tr valign="top">

<td>TeKCT первой колонки.</td>

<td>TeKCT второй колонки, <Ьг>расположенной в две строки.</td>

</tr>

<tr valign="top">

<td>Teкст первой колонки второго ряда.</td> <td>Teкст второй колонки второго ряда.</td>

</tr>

</table>

Количество ячеек в каждом ряду должно быть одинаково, так как интерпретатор языка HTML в браузере создает сетку, где по горизон­тали высчитываются ряды, а по вертикали — входящие в них колонки. Но бывают случаи, когда необходимо объединить несколько соседних ячеек в одну. В этом случае применяется параметр colspan, значением которого является количество объединяемых ячеек:

<table border="1" cellpadding="5" cellspacing="0">

<tr valign="top">

<td>Teкст первой колонки.</td>

<td>Teкст второй колонки, <Ьг>расположенной в две строки.</td>

</tr>

<tr valign="top">

<td colspan="2">Teкст единственной колонки второго ряда.</td>

</tr></table>

В такой таблице сверху будет две ячейки, а во втором ряду — одна, растянутая на ширину двух верхних.

Аналогичную функцию, но по вертикали, выполняет параметр

Rowspan:

<table border="0" cellpadding="5" cellspacing="0">

<^ valign="top">

<td rowspan="2">Текст первой колонки, растянутой на высоту двух строк.</td>

<td>Текст второй колонки, <Ьг>расположенной в две строки.</td>

</tr>

<^ valign="top">

<td>Текст второй колонки второго ряда, которая будет располагаться справа, поскольку область слева занята продолжением верхней первой ячейки.</td>

</^>

<^аЬ1е>

Достаточно удобно бывает разрезать исходное изображение на части и скомпоновать его на веб-странице в форме таблицы с нуле­выми отступами и краями. Это дает возможность часть изображений делать ссылками, внутри массива изображений делать пропуски для текста, а кроме того, визуально ускоряет загрузку

В последнее время все большую популярность приобретает верстка на основе точного и относительного позиционирования бло­ков ^^>...<М^> вместо таблиц. Однако ее внедрение сопряжено с трудностями из-за разницы чтения кода различными браузерами. (Об особенностях такой верстки и верстки на таблицах — чуть ниже в этой главе.) Из-за таких разночтений верстка на основе таблиц остается по­пулярной и по сей день. Следует помнить: несмотря на индифферент­ность HTML к пробелам, лишние пробелы по бокам тэга изображения при верстке изображений вплотную друг к другу породит нежелатель­ные отступы.

Например, чтобы два изображения сверстать вплотную друг к дру­гу без отступов (так поступают, разрезав исходное изображение на части, чтобы визуально оно было одним целым, но на самом деле — фрагмен­тарным, например, в графических навигационных меню; можно было бы поставить изображения просто рядом, но в этом случае потерялась бы возможность использовать фрагменты изображений в качестве фона и некоторые другие особенности), следует написать:

<table border="0" cellpadding="0" cellspacing="0">

<tr valign="top">

<td><img src="/i/logo e. jpg" width="313" height="115" alt=""></td>

<td><img src="/i/logo_rlang. jpg" width="258" height="115" alt=""></td>

</tr>

</table>

(Пример, наряду со всем остальным, прекрасно иллюстрирует неэкономность верстки на основе таблиц.)

Если оставить отступы по краям тэгов изображений или просто перенести тэги ячеек на другие строки:

<table border="0" cellpadding="0" cellspacing="0">

<tr valign="top">

<td><img src="/i/logo e. jpg" width="313" height="115" alt=""> </td>

<td>

<img src="/i/logo rlang. jpg" width="258" height="115" alt="">

</td>

</tr>

</table>

— то изображения будут отступать друг от друга на ширину стандартно­го пробела, что, конечно, нежелательно. Наилучший способ — писать для каждой ячейки (если используется жесткая верстка) точную шири­ну и высоту изображения, то есть дублировать размеры: в этом случае не будет дефектов отображения в Opera 6 и ниже и в Netscape 6 и ниже. Дело в том, что в этих устаревших браузерах паразитные пробелы появ­ляются, даже если написать тэги ячеек вплотную к тэгам изображений. В итоге с учетом особенностей всех браузеров приведенный пример должен выглядеть так:

<table border="0" cellpadding="0" cellspacing="0">

<tr valign="top">

<td width="313" height="115"><img src="/i/ part1.jpg" border="0" width="313" height="115" alt="Логотип, часть 1"></td>

<td width="258" height="115"><img src="/i/ part2.jpg" border="0" width="258" height="115" alt=" Логотип, часть 2"></td>

</tr>

</table>

Тэг изображения — <img> — одиночный. Он никогда не упот­ребляется без параметра src, в качестве значения принимающего путь к файлу. Согласно спецификации, обязательным элементом является также параметр alt — альтернативный текст, появляющийся на стра­нице до загрузки самого изображения, а в некоторых браузерах он также используется как всплывающая подсказка. Параметры width и height («ширина» и «высота») нужно указывать, чтобы еще до загрузки всех изображений каркас страницы сформировался правильно. Правда, в браузерах Opera и Firefox при отключенных изображениях каркас все равно нарушается, если не указать размеры также для ячеек таблицы или иных блоков, содержащих эти изображения. Желательно также указы­вать параметр border, и если вы не хотите, чтобы изображение, высту­пающее в качестве ссылки, было окаймлено синей (фиолетовой после посещения ссылки) рамкой, следует указать значение border, равное нулю. (Стилями CSS можно модифицировать вид и цвет рамки; кроме того, написав в стилевой таблице строчку IMG {border:0px;}, вы из­бавитесь от необходимости использования HTML-параметра border.)

Для указания путей к файлу принято несколько правил. Они в рав­ной степени касаются и ссылок, и других указаний на пути к документам (в тэгах <link>, фреймах и т. п.). Если изображение (или иной файл) на­ходится в той же директории, что и файл, запрашивающий это изображе­ние, достаточно просто указать имя файла: <img src="part2.jpg">. Если файл находится на уровень глубже, то есть в директории, которая находится рядом с текущим файлом, то следует указать эту директо­рию (или цепочку директорий, если файл располагается глубже на не­сколько уровней): <img src="logotype/part2.jpg"> или <img src="logotypes/logotype1/part2.jpg">. Точка обозначает теку­щую директорию, поэтому самый первый пример будет равноценен сле­дующему: <img src="./part2.jpg">. Кроме того, можно использо­вать две точки подряд: они обозначают родительскую директорию (она располагается на уровень выше). Например, в какой-либо директории (допустим, она называется special) располагается две директории: files и images. Текущий файл, запрашивающий изображение, располагает­ся в директории files, а само изображение (image1.gif) — в директории images. Чтобы указать корректный путь к изображению, следует запи­сать адрес в таком формате: <img src="../images/image1.gif">. Алгоритм загрузки изображения таков: браузер отправляет этот адрес серверу, сервер поднимается на уровень выше относительно файла — из директории files в директорию special, в последней находит директорию images, в ней файл image1.gif, который и возвращает браузеру. Однако при перемещении текущего файла или при включении серверным спо­собом его кода в код другой страницы пути к файлам могут нарушить­ся. При такой вероятности лучше использовать не относительные пути к файлам (они указываются относительно текущего документа), а абсо­лютные (относительно корневой директории сайта). Слэш, или косая черта, используемый в начале пути, указывает на то, что адрес указан относительно корневой директории. Поэтому, если указать адрес, как в примере <img src="/images/logotypes/logo1.jpg">,то, где бы ни находился текущий файл, указание пути всегда будет верным, поскольку включаемый файл изображения располагается в директории (корневая директория caьma)/mages/logotypes/ — при любым манипу­ляциях с файлом адрес останется работоспособным. Наконец, можно записывать адрес файла с указанием протокола и имени домена; такой способ используется, если запрашиваемый файл находится на другом сервере или на субдомене: <img src="Http://images. server. ru/ logotypes/logo1.jpg">.

Абсолютно те же правила указания адресов страниц действуют и для ссылок.

Для вставки гиперссылки на веб-страницу применяется тэг <a>...</a>, обладающий обязательным параметром href, в качестве значения которого используется адрес страницы, на которую ссыла­ется текущая. Таким образом, стандартная ссылка выглядит как <а href="info. html">Информация</a> или <a href="Http://www. yandex. ги">Яндекс</а>. Поскольку в адресах слэш обозначает кор­невую директорию, ссылку на главную страницу сайта можно ставить так: <a href="/">Ha главную страницу</а>. Чтобы страница по нажа­тию на ссылку открывалась в новом окне, применяется параметр target: в качестве его значения употребляется слово _blank или имя окна, в котором нужно произвести открытие (последнее полезно при исполь­зовании фреймов). Например: <a href="Http://www. yandex. ru" target=" Ь1апк">Яндекс</а>.

Для списков используется несколько тэгов: маркированные и нумерованные уже упоминались. Кроме них, существуют списки оп­ределений. Общий тэг для всего списка — <dl>...</dl> (сокращение от definition list, «список определений»), в который можно вклады­вать произвольное количество пар тэгов: <dt>...</dt> для терминов и <dd>...</dd> для определений. Например, список из двух терминов с определениями записывается так:

<dl>

<dt>KycT</dt>

<dd>C0B0KynH0CTb веток, торчащих из земли.</

Dd>

^^Браузер<^^

<dd>nporpaMMa просмотра интернет-страниц.</dd>

</dl>

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

Очень важный тип элементов веб-страницы — это формы. Фор­мы — пожалуй, единственный тип элементов, не имеющий аналогов на бумаге (если ссылки можно сравнить со сносками, отсылками к статьям, оглавлением и иными перекрестными указателями в книгах, а фреймы, допустим, с особым приемом при изготовлении полиграфии с «окошка­ми», сквозь которые видны другие страницы, то формы можно сравнить только с почтовой отправкой, да и то отдаленно).

Форма представляет собой набор элементов для ввода пользова­тельских данных или выбора некоторых предоставленных вариантов для последующей их отправки и обработки на сервере. За саму обра­ботку формы не отвечают. Их функции — предоставить поля и пере­ключатели для пользовательских ввода и выбора, а также кнопку для отправки данных. Если на сервере отсутствует средство обработки данных (страница, написанная на языке серверных сценариев, ко­торая способна принять и обработать данные из формы), то отправка данных из формы бессмысленна. Формы на странице также исполь­зуются для обработки клиентскими сценариями, но реже: в этом слу­чае со введенными посетителем страницы данными сценарий, на­пример, на JavaScript, производит некоторые действия, в результате которых выдает результат в режиме реального времени. В качестве подобных примеров можно привести инструмент для подбора и сов­мещения цветов (Http://Wellstyled.Com/Tools/Colorscheme2/Index-En.Html) и инструмент для приведения типографики текста в надлежащий вид (Http://Www.Erlang.Com.Ru/Devanagari).

Основу формы составляет тэг <form>...</form>. В большинс­тве случаев у формы есть два параметра: action (в качестве значения включает адрес страницы, которая содержит серверный сценарий, при­нимающий данные формы; часто бывает, что одна и та же страница включает и форму, и серверный код ее обработки) и method (метод пе­редачи данных: подробнее см. в словаре в конце книги в статье «Методы пересылки данных»). Кроме того, могут использоваться идентификато­ры формы (name="" и id="") и обработчики событий. Однако такая синтаксически корректная запись:

<form method="post" ас^оп="адрес страницы - обработчика">

</form>

Ничего не выведет на страницу. Основное содержимое выводится эле­ментами формы: однострочным текстовым полем, скрытым полем, полем ввода пароля, многострочным текстовым полем, списком, пере­ключателями, полями отметки, кнопкой отправки, кнопкой сброса и кнопкой-изображением. Чаще всего используется однострочное текс­товое поле и кнопка отправки (последнюю можно и не использовать: если курсор стоит на одном из полей формы, то по нажатию клавиши Enter — или Return для MacOS — на клавиатуре данные формы отправ­ляются, как если бы была нажата кнопка отправки в форме). Такой при­мер уже работоспособен (конечно, если слова «адрес страницы-обра­ботчика» будут заменены на реальный адрес страницы-обработчика):

<form method="post" ас^оп="адрес страницы - обработчика">

<input type="text" name="dannye">

<input type="submit" уа1ие="Отправить">

</form>

Текст на кнопке отправки можно произвольно менять. Поле вво­да текста и кнопка будут разделены обычным пробелом: форма является блочным элементом, а элементы формы внутри нее — линейными. В дан­ном примере при нажатии на эту кнопку произойдет отправка данных по указанному адресу, то есть загрузится страница-обработчик, в которой инициализируется переменная $dannye, значением которой будет то, что посетитель ввел в данное поле. Можно предлагать текст по умолчанию:

<form method="post" ас^оп="адрес страницы - обработчика">

<input type="text" name="dannye" уа1ие="Текст по умолчанию" size="40">

<br><input type="submit" уа1ие="Отправить"> </form>

В этом модифицированном примере поле для ввода окажется длиннее, а кнопка отправки перенесется на следующую строку.

Вот простая форма для ввода логина и пароля — после ввода кор­ректных данных и нажатия на кнопку «Войти» произойдет авторизация, если она создана:

<form method="post" а^^п^'адрес страницы- обработчика">

Логин: <input type="text" name="login">

<Ьг>Пароль: <input type="password" name="parol"> <br><input type="submit" value="Войти">

</form>

Используются не только поля ввода строк текста и пароля, но и скрытые поля(<input type="hidden" пате="какое-то имя" value="KaKoe-To значение">). Они нужны для передачи в форму фиксированных значений, не зависящих от желания пользователя (на­пример, нужно, чтобы при каждой передаче данных из формы сохраня­лось то или иное значение, и пользователь не мог его менять: скрытое поле — как раз подходящий случай).

Для передачи текстов писем и сообщений одной строки недоста­точно, но HTML поддерживает и многострочные поля ввода:

<form method="post" ас^оп="адрес страницы - обработчика">

<textarea name="textovoe pole" rows="10" cols="55">

Здесь вы можете ввести текст с произвольным разбиением на строки.

При нажатии Enter или Return не произойдет перехода на страницу-обработчик. Для перехода по элементам формы используйте клавишу Tab.

</textarea>

<br><input type="submit" value="Отправить сообщение">

</form>

В многострочных текстовых полях параметр rows обозначает ко­личество строк текста, которое уместится в поле без возникновения по­лосы прокрутки, а cols — количество «колонок» букв: если шрифт моно­ширинный (то есть все буквы занимают одинаковое пространство), то «колонки» будут видны, в противном случае с помощью этого параметра можно лишь приблизительно задать ширину текстового поля.

Вместо кнопки отправки той же функциональностью обладает тэг <input type="image" src="адрес изображения">: вместо стан­дартной кнопки, предопределенной браузером и общим интерфейсом операционной системы, можно вставить свое изображение, которое бу­дет функционировать как кнопка отправки. Несколько противополож­ный смысл у тэга <input type="reset">: он стирает все, что набра­но в полях ввода данной формы, и возвращает значения по умолчанию.

Кроме возможностей ввода текста и нажатия кнопок, формы пре­доставляют посетителю сайта возможность выбора. Одна из возмож­ностей выбора — использование выпадающего списка:

<form method="post" action="адрес страницы - обработчика'^

<select name="какое-то имя">

<option value^'1'^Первое значение</ор^оп>

<option value="2">Второе значение</ор^оп>

<option value="3">Третье значение</option> </select>

<input type="submit" value="OK">

</form>

Список оформляется тэгом <select>.</select>, который имеет имя. Вообще, любое имя элемента формы, переданное на страни­цу-обработчик, автоматически инициализирует одноименную перемен­ную. Так, если выпадающему списку присвоить имя (name) — например, selector1, то «принимающая сторона» — страница-обработчик — ав­томатически получит переменную $selector1, которой будет присво­ено значение 1, 2 или 3 (в данном примере) — в зависимости от того, что выберет посетитель.

Такой же выбор можно реализовать при помощи круглых пере­ключателей, на программистском жаргоне называемых «радиобаттона - ми» (radio button): в одной форме с одним именем можно выбрать толь­ко один «радиобаттон».

<form method="post" ас^оп="адрес страницы - обработчика">

<input type="radio" name="имя" value="1"> Первое значение

<br><input type="radio" name="имя" value="2"> Второе значение

<br><input type="radio" name="имя" value="3"> Третье значение

<br><input type="submit" value="OK">

</form>

Если нужно, чтобы изначально было выбрано какое-то значение, необходим атрибут checked:

<form method="post" action="адрес страницы - обработчика">

<input type="radio" name="имя" value="1"> Первое значение

<br><input type="radio" name="имя" value="2" checked> Второе значение

<br><input type="radio" name="имя" value="3"> Третье значение

<br><input type="submit" value="OK">

</form>

В этом случае отмечен будет второй вариант выбора. С выпада­ющими списками в аналогичном случае нужно использовать атрибут

Selected:

<form method="post" ас^оп="адрес страницы - обработчика">

<input type="radio" пате="имя" value="1"> Первое значение

<br><input type="radio" пате="имя" value="2" selected> Второе значение

<br><input type="radio" пате="имя" value="3"> Третье значение

<br><input type="submit" value="OK">

</form>

Наконец, можно использовать «чекбоксы» (check box), которых может быть произвольное количество и в которых можно проставлять галочки. Каждый «чекбокс» требует собственного имени, посколь­ку, если снабдить их все одинаковым именем, то на сервер отправится только значение последнего отмеченного «чекбокса»:

<form method="post" ас^оп="адрес страницы - обработчика">

<input type="checkbox" name="email news">

Получать новости на e-mail

<br><input type="checkbox" name="subscribe"> Подписаться на рассылки

<br><input type="checkbox" name="forum auth"> Автоматически авторизоваться в форуме

<br><input type="submit" value="Сохранить"> </form>

Значений, явно назначаемых с помощью параметра value, у этих полей не бывает: если поле отмечено галочкой, на сервер отправляется значение TRUE (истина), в противном случае — FALSE (ложь). Соот­ветственно, обрабатываются только отмеченные значения. Чтобы поле изначально было помечено галочкой, используется атрибут checked:

<form method="post" а^^п^'адрес страницы - обработчика">

<input type="checkbox" name="email news" checked> Получать новости на e-mail

<br><input type="checkbox" name="subscribe" checked> Подписаться на рассылки

<br><input type="checkbox" name="forum auth"> Автоматически авторизоваться в форуме

<br><input type="submit" value="Сохранить настройки">

</form>

В этом примере первые два поля будут отмечены, а третье нет. Особо следует сказать о парном тэге <button>...</button>. Он не является элементом формы и не отправляет значения сам по себе. У него может не быть имени и никогда не бывает параметра value. Но все, что написано между открывающим и закрывающим тэгами, бу­дет отображено на кнопке. На такие кнопки можно помещать изобра­жения, таблицы и большинство других элементов веб-страниц. Нужны же такие кнопки только для того, чтобы обрабатывать событие нажатия: то есть используются они в связке с JavaScript. Например, при нажатии на следующую кнопку:

<button onClick="alert('Здравствуйте')">Нажми меня</button>

На странице появится окошко предупреждения с приветствием. Не­сомненно, можно найти и более осмысленные примеры использования этой кнопки. В частности, такие кнопки требуются для реализации ка­ких-либо преобразований на странице без использования форм: изме­нение настроек, перестройка структуры страницы, выполнение любых функций. Поскольку с помощью языка CSS и внутреннего содержи­мого можно изменять внешний вид кнопки практически неограничен­но, а в сам тэг встраивать разные обработчики событий и с помощью них вызывать любые функции языков активных сценариев, элемент <button>...</button> является достаточно мощным средством. Единс­твенный его недостаток — отсутствие поддержки в старых браузерах.

Фреймы, или возможность загружать в окно браузера несколько веб-страниц сразу, ныне являются устаревающей технологией, активное использование которой ассоциируется с серединой 90-х годов XX сто­летия. Частично это связано с ухудшением навигации (при переходах по страницам адрес в адресной строке не меняется, возникают сложнос­ти с использованием истории браузера, нет возможности дать ссылку на конкретную страницу, не указывая путь в меню), а частично — с тем, что сейчас все большее распространение получают сайты на динами­ческой основе. Дело в том, что чаще всего фреймы использовались для того, чтобы одна страница была посвящена навигации, а другая содер­жимому (сейчас это гораздо легче и безопаснее организовать серверны­ми включениями). При щелчках на ссылках на навигационном фрейме происходит переход по ссылке в содержательном фрейме. Рассмотрим пример — страницу index. html:

Техминимум: как сейчас принято

<html>

<head>

<title>Сайт с фреймами</^^е>

</head>

<frameset rows="100%," cols="250,">

<frame src="nav. html" name="navigation">

<frame src="index1.html" name="stranicy"> </frameset>

<noframes>

К сожалению, ваш браузер не поддерживает технологию фреймов.

<br><a href="/noframes. html">Пожалуйста, перейдите на страницу с ограниченной функциональностью</а>

</noframes>

</html>

На таких страницах отсутствует тэг <body> — он нужен уже на включаемых страницах, составляющих компоненты фреймов. После бло­ка <head>...</head> следует сразу блок <frameset>...</frameset>, включающий, как явствует из названия, набор фреймов — пространств для размещения страниц. Обычно этот тэг имеет два параметра: rows (отвечает за количество и высоту фреймов, расположенных один под другим) и cols (то же самое, но по горизонтали). Нам необходимо раз­местить две страницы друг рядом с другом. Значит, нам нужен только один ряд, и в его параметре мы указываем только одно число, отвечающее за высоту единственного ряда. Напротив, в параметре cols нужно ука­зать два значения. Мы знаем, что навигационный файл включает только логотип и колонку ссылок, значит, он должен быть узким — указываем ширину в 250 пикселей (на то, что ширина указана в пикселях, указывает отсутствие единицы измерения). Ставим запятую и пропускаем второй параметр: браузер вычислит ширину второго фрейма самостоятельно, поскольку мы не знаем, какое разрешение экрана у посетителя. Если бы мы указывали ширину в процентах, тэг можно было бы записать так:

Frameset rows="100%," cols="15%,85%">

Или так:

<frameset rows="100%," cols="15%,">

Внутри тэга используются одиночные тэги, отвечающие за встав­ку каждого из фреймов. Параметр src тэга <frame> в качестве значе-

Ния требует адрес страницы, включаемой во фрейм, а параметру name следует придумать имя, по которому к этому фрейму будут обращать­ся ссылки. Имена фреймов «запоминаются» браузером, поэтому ад­ресация ссылок происходит правильно. Если ссылка внутри файла nav. html будет записана как <a href="firstpage. html">Первая страница<^>, то при щелчке на этой ссылке файл firstpage. html загру­зится в тот же фрейм вместо навигационного файла. Правильным будет указание адресации ссылки внутри тэга: <a href="firstpage. html" target="stranicy">Первая страница<^>. В этом случае файл загрузится в правый фрейм, который назван «stranicy».

Фреймы получили популярность еще тогда, когда не было бра­узеров Firefox и Safari, а Opera умела очень мало. Существовали и дру­гие браузеры с ограниченной функциональностью. Поэтому был со­здан специальный тэг <noframes>...</noframes>, который отвечал за содержимое страницы при отсутствии фреймов. Подход тут прос­той: браузер, не поддерживающий фреймы, просто «не понимает» тэгов фреймов и пропускает их. Соответственно, не знает он и тэга <noframes>...</noframes>, поэтому пропускает эти тэги, но выво­дит на экран то, что между ними. Браузеры же, которые поддерживают технологию фреймов, скрывают содержимое этого тэга, поскольку оно для них неактуально. Указывая пользователям, что их браузер не под­держивает фреймы (сейчас это только текстовые браузеры под Linux и экзотические устаревшие «модели»), будьте корректны и создайте альтернативный вариант страницы без фреймов, на которую удручен­ный пользователь сможет перейти в раздумьях, что же он теряет со сво­им старым браузером. Или не используйте фреймов вообще. Или — как вариант — используйте плавающие фреймы.

Плавающие фреймы, оформляемые тэгом <iframe>, являются блочными элементами и могут располагаться в любой части страницы (поэтому они и названы «плавающими») и быть любого размера. Они поддерживаются всеми современными браузерами (кроме текстовых), могут быть нулевой величины (это используется для динамической подгрузки информации), могут не иметь рамки и полосы прокрутки, так что часто содержимое плавающего фрейма фактически не отделено от остальной части страницы. Для записи плавающего фрейма следует указать тэг со следующими параметрами:

<iframe name="какое-то имя" src="адрес страницы" width="ширина" height="высота">

К сожалению, ваш браузер не поддерживает технологию плавающих фреймов.

<br><a href="/noiframes. html">Пожалуйста, перейдите на страницу с ограниченной функциональностью<^>

</iframe>

Имя, как и у фреймов, требуется для корректной загрузки файла по внешней странице (включающей плавающий фрейм) именно в этот плавающий фрейм: дело в том, что их может быть несколько. Параметр src обязателен: без его содержимого внутри плавающего фрейма будет генерироваться страница об ошибке.

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

Если нужно, чтобы у фрейма не отображались границы, ис­пользуется параметр £гатеЬо^ег="0" (или £гатеЬо^ег="по"), а чтобы принудительно убрать полосы прокрутки, пишут параметр Бсго111пд="по". В этом примере содержимое плавающего фрейма похоже на часть страницы:

^^ате паше="" src="2.html" width="300" height="200" ^атеЬо^ег="0" scrolling="no"></iframe>

Наконец, в HTML есть возможность вставки комментариев. Они не выводятся в браузер, а остаются в исходном коде. Записываются HTML-комментарии так:

<!-- Текст комментария -->

Обратите особое внимание на пробелы по бокам текста коммен­тария. Из-за их отсутствия в некоторых браузерах комментарии могут быть расценены некорректно. Нужны они разработчикам, делающим для себя пометки в коде, и любителям изучать исходные коды страниц. Без сомнения, комментарии вроде

<!-- Годы шли, а он все читал исходный код... -->

Разнообразят скучные строки тэгов, но большое их количество увеличивает объем кода.

Использование этих знаний было в принципе достаточным в се­редине 90-х годов, когда еще очень многие сайты были статическими, а браузеры не могли корректно работать даже с простыми CSS-указа­ниями. Сейчас ситуация в корне другая: HTML может служить основой логической и отчасти визуальной разметки, но для создания полноцен­ного сайта его знания уже недостаточно.

В заключение стоит сказать еще несколько слов об идеологии HTML. Изначально он планировался и разрабатывался исключитель­но как логический язык. Первые версии не содержали тэгов визуаль-

Техминимум: как сейчас принято

3.1

Ного форматирования вообще, а строго структурировали документы. Однако при визуализации HTML-разметки а браузере требовалось как-то отграничить заголовок от обычного текста, выделить ссылку, цитату и пример программного кода. Разработчики браузеров пошли по наиболее логичному пути: они сделали так, чтобы разные логичес­кие элементы по-разному выглядели. Этот ход повлиял на дальнейшее развитие языка: в него стало включаться все больше тэгов визуального форматирования (полужирный и курсивный текст, параметры шрифта и т. п.). И когда появился язык CSS (точнее, его нормальная поддержка в браузерах), практика использования HTML не только для логической разметки, но и для визуального форматирования была столь велика, что <blockquote> использовали для воссоздания отступов слева, а заго­ловками от <h1> до <h6> пренебрегали, пытаясь украсить заголовок средствами HTML — в дело шли и <b>, и <i>, и <big>, и <font>, и другие средства. К счастью, все больше дизайнеров и кодеров пони­мает важность разделения логики и внешнего вида, особенно если сами оперируют информацией, хранящейся на сайте, а не делают статичес­кие страницы. Движение от HTML к XHTML призвано воссоздать пер­воначальное предназначение языков разметки вида HTML.

Итак, разобравшись с историей и основами HTML - и XML-ори­ентированных языков разметки, следует понять, что в первую очередь такая разметка нужна для смысловой организации, а для визуального оформления лучше всего использовать средства CSS — каскадных таб­лиц стилей, необходимых для оформления страниц. Лучше всего — по­тому что часть визуального форматирования все-таки логичнее оставить на совести HTML. Как бы ни были жарки религиозные войны меж­ду теми, кто строит верстку страниц на элементах <div>, и теми, кто на таблицах, часто удобнее оказывается сверстать таблицами, тянущи­мися в любом направлении, чем блоками, которые в разных браузерах окажутся расположенным несколько по-разному. Вопрос типа верстки скорее идеологический, чем практический: и в том, и в другом подходе есть свои плюсы.

В любом случае, язык CSS использовать необходимо хотя бы для того, чтобы придать страницам стилистическую неповторимость: задать параметры шрифта и абзаца (начертание, кегль, насыщенность, прочие параметры стиля, межбуквенное расстояние, интерлиньяж, от­ступы, в том числе отступ «красной строки»), создать поля на странице без «костылей» (когда, например, отступы задаются пустыми ячейками таблицы — под «костылями» понимаются громоздкие методы решения проблем, которые решаются более изящно), уменьшить количество кода, применить один стиль отображения сразу к нескольким объектам, получить возможность динамически менять стили и их описание.

Правила языка CSS ничуть не сложнее для понимания, чем пра­вила HTML, разве что элементов и языковых конструкций побольше.

CSS

Тем не менее, все законы CSS сводятся к правилам включения стилей в (X)HTML-разметку и к описанию тэгов, классов и идентифицирован­ных элементов.

Включать стилевые описания можно тремя способами.

Первый способ подразумевает прямое включение стилей в тэги с помощью параметра style, например: <p style="color: red">TeKCT абзаца красного цвета</р>, <li style="font - weight:bold; со1ог:#999999">элемент списка, выделен­ный полужирным начертанием и серым цветом</^>, <img src="file. jpg" а^="картинка" style="border:1px solid orange" />. Можно заметить, что при описании стиля до двоеточия располагается свойство (насыщенность, цвет, граница), а после двое­точия значение этого свойства (красный, полужирная, серый, ширина в 1 пиксель, непрерывная линия, оранжевый). Несколько свойств раз­деляются между собой точкой с запятой. Если у свойство является объ­единяющим (то есть на самом объединяет в себе несколько свойств), то все значения этого свойства пишутся через пробел. Единицы изме­рения от чисел пробелом не отделяются. Все эти правила в силе и для других типов включения стилей. Так можно очень точно определить вид элемента на веб-странице, однако этот способ не очень удобен: во - первых, получается смесь из двух языков, что при идеологии отделения формы от содержимого не очень логично, а во-вторых, если такое же оформление подобного или другого элемента встретится еще несколь­ко раз, логичнее не повторять их каждый раз, а вынести в отдельный участок кода. Второй и третий способы включения кода как раз осво­бождают от необходимости делать лишнюю работу и позволяют уби­вать по нескольку зайцев сразу.

Второй способ заключается в том, что в определенном участке до­кумента пишется пара тэгов <style>...</style>, а между ними описы­ваются все стили. Например, чтобы сделать цвет всех абзацев зеленым, а все изображения снабдить красной штриховой рамкой толщиной в 2 пикселя, нужно написать:

<style type="text/css">

P {

Color:green;

}

Img { border-width:2px; border-color:red; border-stylle:dashed;

}

</style>

К пробелам в CSS отношение похоже на HTML; с тем же успехом стилевое описание может выглядеть и так:

<style type="text/css">

P {color:green}

Img {border:2px dashed red}

</style>

Или так:

<style type="text/css"> p {color:green}

Img {border-width:2px; border-color:red; border - style:dashed}

</style>

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

Такие «таблицы стилей» лучше всего помещать между тэгами <head> и </head>, чтобы они оказались до элементов, стили кото­рых будут описываться. Впрочем, для частных случаев размещение тэга <style>...</style> допускается где угодно.

Ясно, что в этом случае мы определили вид всех абзацев и всех изображений. Очень удобно, но что делать, если нужно паре или тройке изображений назначить более толстую рамку, а одно изображение ос­тавить вообще без рамки? Можно пойти по первому пути, то есть кон­кретным изображениям назначить стили параметром style, что отме­нит глобальное описание и «переназначит» стиль: <img src="23file. jpg" alt="картинка" style="border-width:4px" /> (рамка становится более толстой), <img src="1file. jpg" alt="картинка" style="border-width:0px" /> (рамка исчезает). Но можно пов­торяющимся элементам назначить классы; в этом случае класс можно описать в той же глобальной таблице стилей. Класс назначается так: <img src="23file. jpg" alt="картинка" class="accented" />. Классу присваивается произвольное имя; главное, чтобы оно было максимально логичным, а не отражало внешний вид элемента (акцен­тировать изображение можно не только толстой рамкой; при редизайне описание класса может измениться, а имя так и останется логически при - вязанным к нему). В описании стиля внутри тэга <style>...</style> перед названием класса ставится точка. Уже приводившаяся таблица стилей приобретает следующий вид:

<style type="text/css"> p {

Color:green;

}

Img { border-width:2px; border-color:red; border-stylle:dashed;

}

Img. accented { border-width:4px;

}

</style>

Можно видеть, что для описания изображений класса accented приводится только описание толщины рамки; остальные свойства на­следуются из описания всех изображений (img). Если же мы решим, что класс accented будет обслуживать не только изображения, но и другие элементы, то имя элемента необязательно указывать, важно ука­зать только класс. Однако наследования при этом не получится, и мы вынуждены будем описывать все свойства этого класса:

<style type="text/css"> p {

Color:green;

}

Img { border-width:2px; border-color:red; border-stylle:dashed;

}

.accented {

Border-width:4px;

Border-color:red;

Border-stylle:dashed;

}

</style>

Или, что короче:

<style type="text/css">

P {color:green}

Img {border:2px dashed red}

.accented {border:4px dashed red}

</style>

Техминимум: как сейчас принято

3.1

Для того изображения, которое осталось без рамки, логичнее ос­тавить прямое включение стиля либо использовать «идентификатор». Это значит, что тэг снабжается параметром id с уникальным именем в качестве значения (<img src="23file. jpg" а^="картинка" id="super" />), а стили для него в таблице описываются в таком фор­мате:

<style type="text/css">

#super {border-width:0px}

</style>

Или

<style type="text/css"> img#super {border-width:0px}

</style>

Наконец, для ссылок есть еще и псевдоэлементы, пишущие­ся через двоеточие после имен тэгов, классов и идентифицированных элементов. Употребление псевдоэлементов таково: a:link отвечает за обычную ссылку, a:visited за посещенную, a:active за актив­ную, a:hover при наведении курсора на ссылку:

A:hover {color:red}

До сих пор все таинство происходило в одном файле. Но бывают ситуации, когда одни и те же стили нужно применить к десяткам и со­тням файлов.

Третий способ позволяет без использования серверных техно­логий включать один файл в другой. Только включаемый стилевой файл должен быть определенного формата, а в каждом включающем файле должна быть инструкция, вызывающая стилевой файл. С помо­щью текстового редактора следует создать обычный текстовый файл с произвольным именем, только с расширением. css (а не. txt или ка­ким-либо иным) и записать туда любые стилевые инструкции, но без тэгов <style>...</style>. Иначе говоря, простое содержание стиле­вого файла (к примеру, style. css) может быть таким:

* { /* Звездочка вместо элемента обозначает все элементы сразу */

Margin:0px; /* Отступы от других элементов нулевые */

Padding:0px; } /* Отступы от границы внутри элемента нулевые */

P {

Text-indent:3em; /* Красная строка: отступ

В три ширины буквы m */

Margin:0px 0px 3px 0px; /* Отступы от

Других абзацев сверху, справа, снизу, слева */

Color:black; /* Цвет текста черный */

}

Как и в любом языке, в CSS есть комментарии. Они оформляют­ся так:

/* текст комментария */

Нужны они скорее для удобства кодера: 1 или 2 лишних килобай­та мало что значат.

Далее нужно в каждый документ между тэгами <head> и </head> включить следующую строку:

<link rel="stylesheet" href="style. css" type="text/css" media="screen" title="Основная таблица стилей" />

Тэг <link> не парный, поэтому в конце в данном примере сто­ит завершающая косая черта (в HTML 4 она не является обязательной). Параметр rel определяет тип взаимосвязи со включаемым докумен­том и говорит, что это таблица стилей. Параметр href (вместо него в Netscape 4 использовался src) сообщает адрес включаемого стилевого файла. Тип данных определяется параметром type. Стиль отображения задается параметром media: если это screen, то стили будут приме­нены к объектам, отображаемым на экране; если print, то при распе­чатке на принтере; если all, то везде. Заголовок title используется скорее для удобства.

В итоге единственная строчка в каждом документе включает универсальный стилевой файл. Теперь для того, чтобы поменять стили отображения абзацев, форм, изображений, таблиц и прочих элементов, достаточно отредактировать единственный css-файл, а не вносить уто­мительную правку в сотни документов.

В заключение обзора CSS стоит коротко описать основные его элементы и значения.

Цвет текста задается элементом color, после двоеточия следу­ют допустимые названия цветов (yellow, black, blue, red, purple, olive, orange, white, green и другие) или их RGB-представление, предваряемое знаком #, например: #ffffff (белый), #000000 (чер­ный), #ff0000 (красный), #00ff00 (зеленый), #0000ff (синий), #ffff00 (желтый), #00ffff (морская волна), #ff00ff (фиолетовый).

Составлять такие значения несложно. Первая пара символов после зна­ка диеза отвечает за красное излучение, вторая за зеленое, третья — за синее. Сочетания разных пучков света с экрана дают совмещенные цвета: из красного и зеленого получается желтый, из красного и сине­го — фиолетовый. Значений может быть 16, от нуля до буквы F (то есть 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E и F). Нуль — отсутствие излучения данного цвета, буква F — максимальное излучение. Максимум всех трех цветов (#FFFFFF) дает белый цвет, отсутствие излучения (#000000) — черный цвет. Различное совмещение этих значений дает более 16 мил­лионов цветов. Экспериментируйте!

Несколько параметров шрифта сразу позволяет установить пара­метр font, например:

Font:200% serif; /* Текст в 2 раза крупнее стандартного, с засечками — типа Times */

Font:12pt sans-serif; /* Кегль: 12 пунктов, шрифт

Без засечек — типа Arial */

Font:italic bold 14pt monospace; /* Курсивный полужирный текст кеглем 14 пунктов, моноширинный — типа Courier */

По отдельности из параметров шрифта можно устанавливать название гарнитуры (font-family), размер шрифта (font-size), начертание (font-style — обычное, курсивное или наклонное, соответственно normal, italic или oblique), капители (font - variant — значения normal и small-caps), полужирное начертание (font-weight:bold).

Из прочих параметров текста можно устанавливать:

— межбуквенное расстояние (letter-spacing:5; возможны и от­рицательные значения);

— интерлиньяж (высоту строки в пределах абзаца, или расстояние между строками, line-height);

— выключку, или выравнивание текста (text-align, значения left, center, right, justify — влево, от центра, вправо, по ширине);

— оформление текста (text-decoration, чаще всего применя­ется значение underline — подчеркивание, но есть еще blink, line-through, overline и none — мигание, перечеркивание, надчеркивание и отсутствие оформления);

— отступ первой строки абзаца, или «красную строку» (text­indent);

— преобразование символов текста в верхний или нижний регистр

(text-transform:capitalize, lowercase, uppercase или none);

— вертикальное выравнивание в пределах блока (vertical - align);

— отображение пробелов (white-space) — как в HTML, то есть все пробелы сливаются в один (значение normal), с запретом разрыва строки (nowrap), с сохранением количества пробелов и переносов строк, то есть как с тэгом <pre> (значение pre);

— интервал между словами (word-spacing).

Фон любого блочного элемента (блочные элементы, как <p>, <div>, <table>, в отличие от линейных, не могут собираться в одну строку и образуют отдельные абзацы) и всего документа задает­ся общим параметром background. Частные правила задаются па­раметрами background-attachment (прокручивание фона вмес­те с содержимым при background-attachment:scroll или его фиксированное положение при background-attachment:fixed), background-color (цвет фона), background-image (фоновое изображение: background-image:URL(адрес изображения)), background-position (позиционирование фона, задается выравни­ванием, например top right, или числовым значением, в том числе и в процентах), background-repeat (повторение фонового изображе­ния: без повторения no-repeat, с обычным размножением по верти­кали и горизонтали repeat, с повторением по горизонтали repeat-x, по вертикали — repeat-y).

Использование свойств фона породило новую возможность для веб-дизайнеров. Ранее для смены изображения при наведении на него курсора мыши нужно было использовать два изображения и сценарий на JavaScript с использованием событий onMouseOver и onMouseOut и быть уверенным, что у посетителя включена поддержка языков актив­ных сценариев (в чем, вообще говоря, никогда нельзя быть уверенным). Теперь есть такой выход: вы готовите одно изображение, в которое вклю­чены сразу два состояния (картинка состоит из двух половинок), заклю­чаете его в качестве фона в ссылку внутри какого-то блока и используете псевдокласс : hover для отображения состояния ссылки при наведении мыши. В нормальном состоянии отображается только половина картин­ки, потому что блоку нужно прописать точные размеры, соответствую­щие половине размеров изображения по одному из измерений, а в «наве­денном» состоянии для фона пишется позиционирование со смещением. Вот как это реализовано на сайте Джеффри Зельдмана, zeldman. com:

<style>

Div#banners { margin: 0;

Padding: 13px 0 0 0;

Background: transparent url(/i04/enjoy. gif) top left no-repeat;

}

TOC o "1-5" h z div#banners h5 {

Margin: 0 0 10px 0;

Padding: 0;

}

Div#banners h5#hcban {

Margin: 10px 0 0 0;

Padding: 0;

text-indent: -9999px; width: 230px; height: 45px;

}

Div#banners h5#hcban a { display: block; margin: 3px 0 0 0; padding: 0;

Width: 100%; height: 100%;

Text-decoration: none;

Background: transparent url(/i04/hcban2.gif) top left no-repeat;

}

Div#banners h5#hcban a:hover { background: transparent url(/i04/hcban2.gif) 0 -45px no-repeat;

}

</style>

<div id="banners">

<h5 id="hcban"><a href="Http://www. happycog. com/" title="Happy Cog Studios. Web design, consulting, and publishing.">Happy Cog </a></h5>

</div>

Требуются некоторые пояснения. В блоке с идентификатором «banners» помещается несколько баннеров (изображений — ссылок на другие сайты). Структура баннера такова: заголовок пятого уровня с идентификатором (например, «hcban»), в который включается ссыл­ка. Заголовок формируется как блок точно заданных размеров, причем для отступа текста внутри этого заголовка пишется больше отрицатель­ное число, чтобы самого текста не было видно на странице даже в случае длинного заголовка: вместо него функцию ссылки будет выполнять... пустое место. Но это пустое место снабжено фоном.

Обратите внимание, что в стилевых описаниях использует­ся вложенность элементов (читается с конца: запись div#banners h5#hcban a: hover следует читать как «наведенное состояние ссыл­ки внутри заголовка пятого уровня с идентификатором „hcban“, на­ходящегося внутри блока с идентификатором „banners“»). В этом случае гарантируется, что ссылка будет приобретать такой вид только внутри этих элементов, вложенных в такой последовательности, и ни в каких других случаях.

Итак, для блока «banners» пишется стили, для вложенного в не­го заголовка пятого уровня — свои, но общие для всех конкретных за­головков пятого уровня, затем происходит конкретизация: для каждо­го из <h5> со своим идентификатором назначаются индивидуальные стили. И только после этого описываются параметры ссылки, вложен­ной в заголовок, которая вложена в блок, который построил Джеффри. Для обычного состояния ссылки описываются все параметры, включая тот фрагмент фона, который будет виден посетителю как графическая ссылка. Для состояния при наведении мыши описывается только фон, смещенный относительно условных границ блока, потому что все ос­тальные свойства ссылки наследуются от записи для обычного состоя­ния ссылки.

Такой подход избавляет не только от необходимости гадать, вклю­чен ли у пользователя JavaScript, еще от одной проблемы: задержки при подгрузке изображения, проявляющейся на низких скоростях: обычно при наведении на изображение с подобным «ролловерным» эффектом изображение, если оно до этого еще не загружалось и не находится в кэ­ше, сначала запрашивается с сервера, а только потом поступает в бра­узер, что заставляет посетителя ждать. В некоторых версиях браузеров возникает побочный эффект: пока изображение загружается, показы­вается его часть, и некоторое время на экране располагается только половина картинки, наложенная на первое изображение, загруженное изначально. Избежать этой проблемы можно, написав небольшой сце­нарий на языке JavaScript, загружающий изображения, которые потре­буются позже, еще во время загрузки страницы:

<script language="JavaScript">

Preloads = new Array("menu web", "menu artf", "menu_diff", "elem_12", "frame_ruler");

For(i=0; i<preloads. length; i++)

{

Kartinko = new Image();

Kartinko. src = "/system/y/"+preloads[i]+" over.

Jpg";

}

</script>

Техминимум: как сейчас принято

31

В этом случае нужно точно знать, какие изображения понадобят­ся при «ролловерных» эффектах, потому что при динамическом фор­мировании такого списка возникнут дополнительные сложности: фраг­мент сценария на одном языке в сценарии на другом языке.

Смысл сценария таков: сначала формируется массив имен изоб­ражений (или фрагментов имен, как в данном случае), элементы кото­рого затем с помощью цикла включаются в полные адреса загружаемых изображений. При каждом проходе цикла генерируется новый объект - изображение, который потом в качестве параметра src принимает пол­ный адрес изображения. CSS-подход этих сложностей лишен.

Вернемся к описанию языка CSS.

Параметры границ блоков, абзацев, цитат, фрагментов текста (<span>) и прочих блочных и линейных элементов можно задавать це­ликом (border), только для левого или правого края (border-left или border-right), только для верхнего или нижнего края (border-top или border-bottom), по отдельности можно задавать цвет (border - color), стиль (border-style — допустимые значения: solid «сплош­ная линия», dotted «пунктир», dashed «штрих», double «двойная линия», groove, ridge, inset и outset для имитации разных видов объемности) и толщину линии (border-width). Легко догадаться, что значат параметры border-left-style, border-bottom-color, border-right-width и подобные. Если сторона рамки не указывает­ся, то значений может быть несколько: они отделяются пробелом. Так, border-width:1px задаст толщину линии для всей рамки. Два значе­ния (border-width:1px 2px) сигнализируют о том, что для верхней и нижней границы толщина будет в 1 пиксель, а для левой и правой в 2. Три значения (border-width:1px 2px 4px) зададут толщину в такой последовательности: 1 пиксель для верхней границы, по 2 пикселя для левой и правой, 4 пикселя для нижней. Четыре значения через пробел устанавливаются поочередно для верхней, правой, нижней и левой гра­ниц (по часовой стрелке, начиная сверху). Помните, что задание шири­ны границы блока увеличивает ширину блока на заданное количество пикселей в Opera и Firefox, а в Internet Explorer рамка будет располагать­ся внутри блока.

Отступы снаружи блока задаются с помощью параметра margin и его разновидностей: margin-top, margin-right, margin-bottom и margin-left. Например, расстояния между абзацами лучше всего редактировать именно с помощью этого параметра. Отступы же внутри блока (от края до содержимого, что особенно видно при наличии гра­ниц у элемента) задаются параметром padding и его разновидностями: padding-top, padding-right, padding-bottom и padding-left.

Для таблиц можно не задавать стандартные параметры cellpadding, cellspacing и border средствами HTML: теперь все можно сделать с помощью CSS. Чтобы на стыке ячеек не получа-

3.

Верстка

Лась рамка двойной толщины, а между самими ячейками не появля­лось расстояние, пишем table {border-collapse:collapse}. Чтобы не было отступов содержимого внутри ячеек, пишем td {padding: 0px}. Само собой, чтобы рамки не было вообще, пишем table, td {border:0px}.

Элементы можно точно позиционировать. Для этого нужно за­дать параметр position:absolute и координаты (в пикселях или процентах): left (слева) и top (сверху) чаще всего, но иногда и right (справа) и bottom (снизу). Следует помнить, что на веб-страницах от­счет координат начинается в левом верхнем углу. Кроме того, можно задать ширину (width) и высоту (height) элемента. Если при абсо­лютном позиционировании несколько элементов накладываются друг на друга (то есть из-за близких координат одни блоки перекрываются другими), то выше остальных оказывается тот, который описан пос­ледним в коде либо тот, у которого параметр z-index больше. Так, при коде <div style="background-color:white; position: absolute; left:10px; top:10px; z-index:100">123</div> <div style="background-color:white; position:absolute; left:10px; top:10px; z-index:50">456</div> на веб-страни­це отобразится число 123. Позиционировать элементы можно также от­носительно друг друга: position:relative.

Элемент можно скрывать, если указать visibility:hidden (и отображать по visibility:visible). Это полезно для динамичес­кого управления видимостью элементов. При скрытии элемента место под него на веб-странице остается. Параметр же display удобнее тем, что позволяет не только скрывать элемент и уничтожать пространство, отведенное под него (display:none), но и умеет отображать один и тот же элемент и как блочный (display:block), и как линейный (display:inline). Делать видимой только часть блока позволяет па­раметр clip:rect(Y1 X1 Y2 X2) , где Y1, X1, Y2 и X2 — числовые параметры обрезки.

Если у элемента жестко заданы высота и (или) ширина, но со­держимое не умещается в эти рамки, то уместным окажется элемент overflow (переполнение). При значении visible параметры высоты и ширины игнорируются: главным оказывается размер содержимого. В случае overflow:scroll в блоке принудительно появляются полосы прокрутки. При overflow:hidden содержимое, оставшееся за предела­ми блока заданных размеров, просто обрезается, а при overflow:auto полосы прокрутки появляются только при необходимости — последние два режима наиболее удобны. В некоторых браузерах также действуют параметры overflow-x и overflow-y.

Для элементов можно назначить отсутствие обтекания текстом с помощью параметра clear (значение both — с обеих сторон, right или left с правой или с левой стороны соответственно и none — с обте-

158

Канием текстом) либо наличие обтекания и одновременное выравнива­ние с помощью параметра float (значения left, right и none).

Кроме того, средствами CSS можно менять внешний вид марке­ров списка (list-style — стиль маркеров списка, совмещенный пара­метр; list-style-image:URL(...) задает изображение в виде маркера списка; list-style-position — размещение маркера списка отно­сительно текста, inside или outside, то есть внутри или вне текста; list-style-type — тип маркера: disc, circle, square, decimal, lower-roman, upper-roman, lower-alpha, upper-alpha, none), полос прокрутки (не во всех браузерах) и курсоры (например, cursor: pointer задаст курсор в виде «руки», как над ссылкой, а cursor:help отобразит стандартный курсор для справочных материалов).

Этих несложных правил достаточно, чтобы правильно оформлять с помощью CSS большинство веб-страниц.

В заключение можно продемонстрировать небольшой трюк: как с помощью CSS-разметки можно кардинально изменить внешний вид HTML-разметки. Допустим, у нас есть HTML-код:

<ul class="nav"><li><a href="1.html">Index</a></ li><li><a href="2.html">About</a></li><li><a href="3. html">Our Tags</a></li><li><a href="4.html">Products</ a></li><li><a href="5.html">Credits</a></li></ul>

В том виде, который предлагают браузеры для отображения по­добного кода, мы увидим столбец ссылок (поскольку есть элемент <a>), оформленный как маркированный список (элемент <ul>), слева от каждого из элементов списка располагается маркер, вид которого за­висит от конкретного браузера — обычно это черный кружок.

Однако чуть выше мы можем расположить несколько CSS-пра­вил, и мы увидим, насколько изменится внешний вид приведенного фрагмента.

<style type="text/css">

* {

Font-size:9pt;

Font-family:Sans-Serif;

}

Ul. nav { display:block; margin:0; padding:0;

List-style-type:none;

}

Ul. nav li {

Background-color:#FFCC9 9; display:inline; padding:0px; margin:0px;

}

Ul. nav li a:link, ul. nav li a:visited, ul. nav li a:active {

Background-color:#FFCC9 9; padding:5px 15px 1px 15px; color:navy; text-decoration:none; border-bottom:2px solid #FFCC99;

}

Ul. nav li a:hover { background-color:#FFFFCC; padding:5px 15px 1px 15px; color:#CC0000; text-decoration:none; border-bottom:2px solid #CC0000;

}

</style>

Попробуйте протестировать в браузере сначала код без CSS, а по­том — добавив таблицу стилей.

Первым правилом мы просто назначаем рисунок и размер шриф­та для всех элементов веб-страницы. Затем мы превращаем элементы списка из блочных элементов в линейные, определяем цвета текста и фона (в обычном состоянии и при наведении мыши), отступы, цвет и толщину рамки (только сверху и снизу, да и то видные только при наведении мыши). В итоге вместо списка мы получаем полноценную и симпатичную строку меню персикового цвета, да еще сдобренную ви­зуальными эффектами. Нужно отметить три важные вещи:

1. Произошло полное разделение содержания (точнее, так на­зываемой бизнес-логики) и формы (внешнего оформления). Можно добавлять и изменять сколько угодно пунктов меню, не заботясь об их внешнем оформлении. И, напротив, вид всех пунктов меню сразу мож­но поменять, не редактируя само меню.

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

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

Теперь одна особенность: чтобы в Internet Explorer не возникало паразитных пробелов, ухудшающих вид меню, пришлось HTML-код

Слить в одну строку. Так он стал менее читаемым, но все равно остался понятен, потому что не загроможден тэгами форматирования.

Теперь мы готовы к тому, чтобы выяснить основные различия в «верстке на таблицах» и «блочной верстке».

По ту сторону Веб-страницы

Словарь

Ботки. Обычно расширения состоят из трех букв (exe, gif, php, mov, bmp, eps, swf, asp, m3u, avi, rtf, txt, zip, cpp), но встречаются также двухбуквенные (js, ai) и четырехбуквенные (html, …

Справочник для внутреннего использования

Навигация есть признание того, что твоя страница далека от иде­ала. Ибо если бы она была близка к нему, зачем бы потребовалось покидать ее? А если ее не требуется покидать, зачем …

Алфавит от Google

Есть такая тестирующаяся поисковая подсистема от Google (Http://Www.Google.Com/Webhp?Complete=1&Hl=En), в которой по введенным первым буквам предлагаются наиболее часто за­прашиваемые слова. Я собрал все первые (наиболее рейтинговые) слова на каждую букву русского …

Как с нами связаться:

Украина:
г.Александрия
тел./факс +38 05235  77193 Бухгалтерия

+38 050 457 13 30 — Рашид - продажи новинок
e-mail: msd@msd.com.ua
Схема проезда к производственному офису:
Схема проезда к МСД

Партнеры МСД

Контакты для заказов оборудования:

Внимание! На этом сайте большинство материалов - техническая литература в помощь предпринимателю. Так же большинство производственного оборудования сегодня не актуально. Уточнить можно по почте: Эл. почта: msd@msd.com.ua

+38 050 512 1194 Александр
- телефон для консультаций и заказов спец.оборудования, дробилок, уловителей, дражираторов, гереторных насосов и инженерных решений.