6  Установка значений свойств, Каскадирование и Наследование

Содержание


6.1 Специфицированные, вычисленные и нынешние значения

После того, как ПА разобрал документ и сконструировал дерево документа, он обязан назначить всякому элементу дерева значение для всего свойства, применимое для целевого типа носителя.

Конечное значение свойства является итогом трёхступенчатого процесса вычисления: значение определяется по спецификации ("специфицированное значение"), после этого, если нужно, выводится безусловное значение ("вычисленное значение") и наконец - трансформируется в соответствии с ограничениями локальной среды ("настоящее значение").


6.1.1 Специфицированные значения

ПА обязаны вначале назначить свойству специфицированное значение на основе следующих механизмов (по приоритету):

  1. Если каскад даёт значение, применять его.
  2. Иначе, если качество унаследовано, применять значение элемента-прародителя, традиционно - вычисленное значение.
  3. Иначе, применять начальное значение свойства. Начальное значение всего свойства указано в определении свойства.

Не имея прародителей, корневой элемент дерева документа не может применять значения, унаследованные от элемента-прародителя; в этом случае применяется, если нужно, исходное значение.


6.1.2 Вычисленные значения

Специфицированные значения могут быть безусловными (т.е. не специфицированными касательно других значений: 'red' либо '2mm') либо относительными (т.е. специфицированными касательно других значений: 'auto', '2em', '12%'). Для безусловных значений не требуется никаких вычислений, дабы обнаружить вычисленное значение.

Относительные значения, с иной стороны, обязаны быть трансформированы в вычисленные значения: процентные рассчитываются касательно данного значения-ссылки (всякое качество определяет соответствующее значение), значения с указанием единиц измерения (em, ex, px) обязаны быть сделаны безусловными путём использования подходящих по размеру шрифтов либо в пикселах, значения 'auto' обязаны высчитываться по формулам, данным для всего свойства, ключевые слова ('smaller', 'bolder', 'inherit') обязаны быть замещены в соответствии со своими определениями.

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


6.1.3 Реальные значения

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


6.2  Наследование

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

Предположим, имеется элемент H1 с выделенным элементом (EM) внутри:

<H1>The headline <EM>is</EM> important!</H1>

Если цвет элементу EM не назначен, выделенное "is" будет наследовать цвет элемента-прародителя, и, от того что H1 имеет голубой цвет, элемент EM будет, соответственно, голубым.

Чтобы установить качество жанра "по умолчанию" в документе, авторы могут установить это качество в корне дерева документа. В HTML, скажем, эту функцию могут исполнить элементы HTML либо BODY. Подметьте, что это будет трудиться, даже если автор опустит тэг BODY в тексте HTML, от того что разборщик HTML вставит отсутствующие тэги.

Пример(ы):

Скажем, от того что качество 'color' наследуется, все потомки элемента BODY будут наследовать цвет 'black':

BODY { color: black; }

Специфицированные процентные значения не наследуются, а вычисленные значения - наследуются.

Пример(ы):

В данной таблице:

BODY { font-size: 10pt }
H1 { font-size: 120% }

и в этом фрагменте документа:

<BODY>
  <H1>A <EM>large</EM> heading</H1>
</BODY>

свойство 'font-size' элемента H1 будет иметь вычисленное значение'12pt' (120% от 10pt, значения-прародителя). От того что значение свойства 'font-size' наследуется, элемент EM также получит вычисленное значение '12pt'. Если ПА не имеет доступного шрифта в 12pt, настоящее значение 'font-size' и для H1, и для EM может быть, скажем, '11pt'.


6.2.1 Значение 'inherit'

Каждое качество может иметь специфицированное значение 'inherit', которое обозначает, что для данного элемента качество принимает то же самое вычисленное значение, что и качество элемента-прародителя. Наследуемое значение, которое как водится применяется только как возвращаемое значение, может быть усилено путём очевидной установки 'inherit'.

Пример(ы):

В дальнейшем примере свойства 'color' и 'background' установлены в элементе BODY. Во всех других элементах значение 'color' будет наследоваться, а фон будет прозрачным. Если эти правила являются частью пользовательской таблицы жанров, чёрный текст на белом фоне будет форсирован по каждому документу.

BODY { 
  color: black !important; 
  background: white !important;
}

* { 
  color: inherit !important; 
  background: transparent;
}

6.3 Правило  @import

Правило '@import'  даёт пользователям возможность импортировать правила жанра из других таблиц жанров. Всякое правило @import обязано предшествовать каждому комплектам правил в таблице жанров. Позже ключевого слова '@import' обязан следовать URI подключаемой таблицы жанров. Возможна также строка; она будет интерпретироваться так, как словно имеет вокруг себя url(...).

Пример(ы):

Следующие строки равнозначны по значению и обе иллюстрируют синтаксис '@import' (одно с "url()", а другое - с легкой строкой):

@import "mystyle.css";
@import url("mystyle.css");

Поскольку ПА могут исключать запрос источников неподдерживаемых типов носителя, авторы могут специфицировать медиа-зависимые правила @import. Эти условные @import специфицируют список разделённых запятыми типов носителя позже URI.

Пример(ы):

Следующие правила имеют такой же результат, как если бы импортированная таблица жанров была перенесена в правило @media для того же типа, но данные правила дозволят исключить непотребную нагрузку на ПА.

@import url("fineprint.css") print;
@import url("bluish.css") projection, tv;

При отсутствии всяких типов носителя, импорт является абсолютным. Спецификация 'all' для носителя имеет тот же результат.


6.4  Каскад

Таблицы жанров могут иметь три самостоятельных источника: автор, пользователь и ПА.

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

Каскад CSS назначает вес всем правилу жанра. Если используются несколько правил, одно, имеющее больший вес, будет иметь приоритет.

По умолчанию правила авторской таблицы жанров имеют больший вес, чем правила  таблицы жанров пользователя. Преобладание зарезервировано, впрочем, для правил "!important". Все правила пользователя и автора имеют больший вес, чем правила таблицы жанров по умолчанию в ПА.

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


6.4.1 Порядок каскадирования

Чтобы обнаружить значение для комбинации элемент/свойство, ПА обязаны использовать дальнейший порядок сортировки:

  1. Обнаружить все объявления, применяемые в запросе к элементу и свойству, для целевого типа носителя. Объявления используются, если ассоциированный селектор подбирает элемент в запросе.
  2. Вначале объявления сортируются по весу и источнику: для типичных объявлений - авторские таблицы жанров переопределяют пользовательские, которые, в свою очередь, переопределяют таблицу жанров по умолчанию. Для объявлений "!important" - пользовательские таблицы жанров переопределяют авторские таблицы, которые, в свою очередь, переопределяют таблицу жанров по умолчанию. Объявления "!important" переопределяют типичные объявления. Импортированная таблица жанров имеет тот же источник, что и таблица жанров, импортировавшая её.
  3. Вторая сортировка производится по специфике селектора: больше специфические селекторы переопределяют больше всеобщие. Псевдоэлементы и псевдоклассы обсчитываются как типичные элементы и классы соответственно.
  4. Наконец, идёт сортировка по специфицированному порядку: если два правила имеют идентичные вес, источник и специфику, выбирается специфицированное позднее. Правила в импортируемых таблицах жанров рассматриваются перед всякими правилами имеющейся таблицы жанров.

Независимо от установок "!important" индивидуальных объявлений, эта тактика даёт авторским таблицам жанров больший вес, чем таблицам читателя. Это тем больше главно, от того что ПА предоставляют пользователю возможность отключить могущество определённых таблиц жанров, скажем, в выпадающих меню.


6.4.2  Правила  !important

CSS пытается сделать равновесие между авторскими и пользовательскими таблицами жанров. По умолчанию правила авторской таблицы жанров переопределяют правила пользовательской таблицы (см. каскадное правило 3).

Однако, для равновесия, объявление "!important" (ключевое слово "!" и "important" следуют за объявлением) имеет преобладание перед типичной декларацией. И авторские, и пользовательские таблицы жанров могут содержать объявление "!important", и пользовательские правила "!important" переопределяют авторские "!important". Это качество CSS улучшает доступность документов путём предоставления пользователям со специфическими требованиями (огромные шрифты, комбинации цветов и т.п.) контроля над представлением.

Примечание. Это семантическое метаморфоза в сопоставлении с CSS1. В CSS1 авторские правила "!important" имели приоритет перед пользовательскими правилами "!important".

Объявление сокращённого свойства (скажем, 'background') как "!important" равнозначно объявлению всех его подсвойств как "!important".

Пример(ы):

Первое правило пользовательской таблицы жанров в данном примере содержит объявление "!important", которое переопределяет соответствующее объявление в авторской таблице жанров. Второе объявление также будет иметь приоритет как помеченное "!important". Впрочем третье правило пользовательской таблицы жанров - не "!important" - и следственно будет отброшено в пользу второго правила авторской таблицы жанров (которое устанавливает жанр сокращённого свойства). Таким образом, третье авторское правило будет отброшено в пользу второго авторского правила, от того что второе правило - "!important". Это показывает, что объявления "!important" имеют действие также и внутри авторских таблиц жанров.

/* Из пользовательской таблицы жанров */
P { text-indent: 1em ! important }
P { font-style: italic ! important }
P { font-size: 18pt }

/* Из авторской таблицы жанров  */
P { text-indent: 1.5em !important }
P { font: 12pt sans-serif !important }
P { font-size: 24pt }

6.4.3 Вычисление специфики селектора

Специфика селектора высчитывается так:

Конкатенация трёх чисел a-b-c (в числовой системе с огромный базой) дают специфику.

Пример(ы):

*             {}  /* a=0 b=0 c=0 -> особенность =   0 */
LI            {}  /* a=0 b=0 c=1 -> особенность =   1 */
UL LI         {}  /* a=0 b=0 c=2 -> особенность =   2 */
UL OL+LI      {}  /* a=0 b=0 c=3 -> особенность =   3 */
H1 + *[REL=up]{}  /* a=0 b=1 c=1 -> особенность =  11 */
UL OL LI.red  {}  /* a=0 b=1 c=3 -> особенность =  13 */ 
LI.red.level  {}  /* a=0 b=2 c=1 -> особенность =  21 */
#x34y         {}  /* a=1 b=0 c=0 -> особенность = 100 */ 

В HTML значения признака "style" элемента являются правилами таблицы жанров. Эти правила не имеют селекторов, но для целей шага 3 каскадного алгорифма они рассматриваются как имеющие селектор ID (особенность: a=1, b=0, c=0). Для целей шага 4 они рассматриваются позже всех других правил.

<HEAD>
<STYLE type="text/css">
  #x97z { color: blue }
</STYLE>
</HEAD>
<BODY>
<P ID=x97z style="color: red">
</BODY>

В данном примере цвет элемента P будет красным. Правда особенность - одна и та же для обоих объявлений, объявление признака "style" переопределит объявление в элементе STYLE в соответствии с каскадным правилом 4.


6.4.4 Старшинство не-CSS подсказок

ПА могут выбрать подсказки (hints) из других источников, а не из таблиц жанров, скажем, элемент FONT либо признак "align" в HTML. Если это так, не-CSS подсказки обязаны быть переведены в соответствующие правила CSS со особенностью=0. Принимается, что правила находятся в начале авторской таблицы жанров и могут быть переопределены последующими правилами таблиц жанров.

Примечание. В фазе переноса эта политика облегчит сосуществование стилистических признаков с таблицами жанров.

Примечание. В CSS1 не-CSS подсказки получали специфику=1, а не 0. Это метаморфоза сделано из-за вступления универсального селектора, имеющего специфику 0.