2.
Псевдо-классы и псевдо-элементы.
Спецификация CSS1
В CSS1 стиль обычно применяется к
элементу в соответствии с его позицией в
структуре документа. Эта простая модель
достаточна для широкого спектра стилей, но
она не покрывает несколько типичных
эффектов. Концепция псевдо-классов и псевдо-элементов
расширяет механизм адресации в CSS1, чтобы
позволить информации, внешней по отношению
к документу, оказывать влияние на процесс
форматирования.
Псевдо-классы и псевдо-элементы
могут использоваться в селекторах CSS, но они
не существуют в исходном тексте HTML.
Напротив, они "вставляются" UA в
соответствии с некоторыми условиями. Их
поведение можно описать с помощью
фиктивной последовательности тэгов.
Псевдо-элементы используются для
адресации подчастей элементов, в то время
как псевдо-классы позволяют различать
различные типы элементов.
2.1 Псевдо-классы ссылок
UA часто отображают недавно
посещенные ссылки не так как не посещенные
или посещенные давно.. В CSS1 эти ситуации
обрабатываются с помощью псевдо-классов
элемента 'A':
A:link { color: red }
/* unvisited link */
A:visited { color: blue } /* visited links */
A:active { color: lime } /* active links */
Все элементы 'A' с атрибутом 'HREF'
будут помещены в одну и только одну из этих
групп (т.е. псевдо-классы не влияют на ссылки-якоря).
UA могут по собственному усмотрению
перемещать элемент из 'visited' в 'link' после
некоторого периода времени. Ссылка типа
'active' - это ссылка, которая в данный момент
выбрана (например нажатием на кнопку мыши)
читателем.
Форматирование псевдо-класса
ссылки происходит также, как если бы класс
был указан вручную. UA не обязан
переформатировать уже отображаемый
документ при переходе ссылки из одного
псевдо-класса в другой. Например таблица
стилей может законно указывать, что 'font-size'
ссылки типа 'active' должен быть больше, чем у
ссылки типа 'visited', но UA не обязан
динамически переформатировать документ,
когда читатель выбирает ссылку типа 'visited'.
Селекторы псевдо-класса не
соответствуют обычным классам и наоборот.
Правило в следующем примере не будет
оказывать никакого влияния:
A:link { color: red }
<A CLASS=link NAME=target5> ... </A>
В CSS1 псевдо-классы ссылок не
оказывают влияния ни на один элемент, кроме
'A'. Поэтому тип элемента в селекторе можно
опускать:
A:link { color: red }
:link { color: red }
Эти два селектора будут идентичны
в CSS1.
Имена псевдо-классов не зависят от
регистра.
Псевдо-классы могут
использоваться в контекстных селекторах:
A:link IMG { border: solid blue }
Псевдо-классы также могут
комбинироваться с простыми классами:
Если ссылка в этом примере была
посещена, то она будет синей. Обратите
внимание, что имя обычного класса
предшествует имени псевдо-класса в
селекторе.
2.2 Типографские псевдо-элементы
Некоторые распространенные
типографские эффекты связаны не со
структурными элементами, а с элементами
форматирования на холсте. В CSS1 определены
два таких типографских элемента, которые
можно адресовать с помощью псевдо-элементов:
первая строка элемента и первая буква.
Ядро CSS1: UA могут игнорировать все
правила с ':first-line' или ':first-letter' в селекторе,
или поддерживать только подмножество
свойств псевдо-элементов. (см. раздел 7)
2.3 Псевдо-элемент 'first-line'
Псевдо-элемент 'first-line'
используется для применения особых стилей
к первой строке элемента в соответствии с
форматированием на холсте:
В текстовом UA это могло бы быть
отформатировано так:
THE FIRST LINE OF AN
article in Newsweek.
Фиктивная последовательность
тэгов в этом случае такова:
<P>
<P:first-line>
The first line of an
</P:first-line>
article in Newsweek.
</P>
Концевой тэг 'first-line' вставляется в
конец первой строки в соответствии с тем,
как документ форматируется на холсте.
Псевдо-элемент 'first-line' может
применяться только к блочным элементам.
Псевдо-элемент 'first-line'
соответствует строчным элементам за
некоторыми исключениями. Только следующие
свойства могут быть применены к элементу
'first-line': свойства шрифтов (5.2), свойства цвета
и фона (5.3), 'word-spacing' (5.4.1), 'letter-spacing' (5.4.2),
'text-decoration' (5.4.3), 'vertical-align (5.4.4), 'text-transform' (5.4.5),
'line-height' (5.4.8) и 'clear' (5.5.26).
2.4 Псевдо-элемент 'first-letter'
Псевдо-элемент 'first-letter'
используется для создания эффекта буквицы,
являющимся распространенным типографским
эффектом. Он соответствует строчному
элементу, если его свойство 'float' равно 'none',
иначе он соответствует плавающему элементу.
К псевдо-элементу 'first-letter' применимы
следующие свойства: свойства шрифтов (5.2),
свойства цвета и фона (5.3), 'text-decoration' (5.4.3),
'vertical-align (только если 'float' равно 'none', 5.4.4),
'text-transform' (5.4.5), 'line-height' (5.4.8), свойства границ
(5.5.1-5.5.5), свойства отступов (5.5.6-5.5.10),
свойства рамки (5.5.11-5.5.22), 'float' (5.5.25), 'clear' (5.5.26).
Следующий пример позволяет
создать эффект буквицы, когда высота первой
буквы равна высоте двух строк:
<HTML>
<HEAD>
<TITLE>Title</TITLE>
<STYLE TYPE="text/css">
P
{ font-size: 12pt; line-height: 12pt }
P:first-letter { font-size: 200%; float: left }
SPAN {
text-transform: uppercase }
</STYLE>
</HEAD>
<BODY>
<P><SPAN>The first</SPAN> few words
of an article in The Economist.</P>
</BODY>
</HTML>
Если некий текстовый UA
поддерживает псевдо-элемент 'first-letter' (что
скорее всего не так), предыдущий пример мог
бы быть отформатирован следующим образом:
___
| HE FIRST few
| words of an
article in the
Economist.
Фиктивная последовательность
тэгов в этом случае выглядит так:
<P>
<SPAN>
<P:first-letter>
T
</P:first-letter>he first
</SPAN>
few words of an article in the Economist.
</P>
Обратите внимание, что тэг псевдо-элемента
'first-letter' заключает контент (т.е. первую букву),
в то время как начальный тэг псевдо-элемента
'first-line' вставляется сразу после тэга
элемента, к которому он применяется.
UA сам определяет, какие символы
включаются в элемент 'first-letter'. Обычно
кавычки, предшествующие первой букве,
должны включаться:
|| /\ bird in
/ \ the hand
/----\ is worth
/ \ two in
the bush," says an
old proverb.
Когда параграф начинается с
другого знака пунктуации (например скобка)
или других символов, которые не являются
буквами (например цифры или математические
знаки), псевдо-элементы 'first-letter' обычно
игнорируются.
Некоторые языки могут иметь
специфические правила, как обрабатывать
определенные комбинации букв. В
голландском, например, если слово
начинается с "ij", то обе буквы
считаются принадлежащими псевдо-элементу
'first-letter'.
Псевдо-элемент 'first-letter' может
применяться только к блочным элементам.
2.5 Псевдо-элементы в селекторах
В контекстных селекторах псевдо-элементы
допускаются только в конце селектора:
BODY P:first-letter { color: purple }
Псевдо-элементы могут в селекторах
комбинироваться с классами:
P.initial:first-letter { color: red }
<P CLASS=initial>First paragraph</A>
Этот пример позволит сделать темно
красными первые буквы всех параграфов,
имеющих класс initial. При комбинировании с
классами или псевдо-классами псевдо-элементы
должны указываться в конце селектора. В
одном селекторе может быть указан только
один псевдо-элемент.
2.6 Множество псевдо-элементов
Можно комбинировать несколько
псевдо-элементов:
P { color: red; font-size: 12pt }
P:first-letter { color: green; font-size: 200% }
P:first-line { color: blue }
<P>Some text that ends up on two lines</P>
В этом примере первая буква
каждого элемента 'P' будет зеленой с
размером шрифта 24pt. Остаток первой строки (в
соответствии с форматированием на холсте)
будет синим, в то время как весь остальной
параграф будет красным. Предположив, что
перенос строки произойдет перед словом
"ends", фиктивная последовательность
тэгов будет такова:
<P>
<P:first-line>
<P:first-letter>
S
</P:first-letter>ome text that
</P:first-line>
ends up on two lines
</P>
Обратите внимание, что элемент
'first-letter' находится внутри элемента 'first-line'.
Свойства, установленные в 'first-line' будут
унаследованы 'first-letter', но будут
переопределены, если то же свойство
установлено в 'first-letter'.
Если псевдо-элемент разрывает
настоящий элемент должны быть
сгенерированны дополнительные тэги в
фиктивной последовательности тэгов.
Например, если элемент SPAN длится дальше
тэга </P:first-line>, должен быть сгенерирован
дополнительный набор тэгов SPAN, т.е.
фиктивная последовательность тэгов примет
следующий вид:
<P>
<P:first-line>
<SPAN>
This text is inside a long
</SPAN>
</P:first-line>
<SPAN>
span элемент
</SPAN>