2015-02-11 2 views
0

Я ищу часть стандарта CSS, которая объясняет это (весьма разумное) поведение. То есть, если я напишу свойство body { color: green; }, я бы ожидал (прочитав документацию, а не по опыту), что все дети body имеют зеленый цвет, в том числе (побывали и не посетили) a. Я знаю, есть определения агента пользователя, но order of the cascade, в возрастающем порядке предпочтения, являются:Почему цвет ссылок UA превосходит цвет автора (скажем)?

  1. заявление агента пользователя
  2. пользователя нормальных заявлений
  3. автора нормальных заявлений
  4. автор важными заявлениями
  5. пользователем важные заявления

Почему тогда не наследуется значение color используется для ссылок? Я понимаю, что это значительно ограничило бы полезность таблиц стилей по умолчанию для пользовательского агента, но мне просто интересно, почему это не является нарушением стандарта. Мне явно чего-то не хватает!

Редактировать: Мое «почему» относится строго к явной поддержке в стандарте CSS, а не к тому, почему это имеет смысл.

+1

Цвета ссылок определены в UA css, однако они определены специально для якорей, которые переопределяют значение наследования от тела – Huangism

+0

Спасибо, Хуангизм. Да, я знаю, что на практике это работает так, но на основе того, что я могу читать, это не должно ... Похоже, что стандарт должен иметь примечание о взаимодействии между каскадом и наследованием. –

+0

Есть записка где-то, был задан другой вопрос о подобных вещах, и кто-то связал объяснение, но я забыл, что вопрос был назван – Huangism

ответ

0

Существует второй порядок каскада, и это порядок, при котором селекторы переопределяют другие селекторы.

Например, если вы определяете в вашей таблицы стилей:

body { color: green; } 
h1 { color: purple; } 

h1 имеет более высокий порядок важности и переназначающую зеленость в body.

Что касается общего порядка каскада, это правильный порядок, но вы должны понимать, что объявления пользовательских агентов и вещи, которые вы определяете в таблице стилей, переопределены SEPERATELY FOR EACH ELEMENT.

Например, допустим, что агент пользователя определил:

body { font-size: 10px; } 
h1 { font-size: 20px; } 
a { color: purple; } 

и вы определяете в таблице стилей:

body { font-size: 30px; color: green; } 

Все в body будет 30px зеленый для тех, кроме прочего два тега, которые уже определены в таблице стилей пользовательского агента. Вы должны переопределить ВСЕ их. Не только одно определение пользовательского агента должно быть переопределено, но и ВСЕ ОТ ИХ должны быть переопределены. Ваши стили будут иметь приоритет над таблицей стилей пользователя. Просто будьте осторожны, чтобы поймать их всех.

Это официально называется «наследство». Вы правы, я думаю, что авторы w3 явно не указали, как только один элемент за раз из таблицы стилей UA становится переопределенным вашей собственной личной таблицей стилей.Возможно, они думали, что это очевидно, но они, вероятно, должны добавить в официальную документацию, как эти два должны «сливаться» здесь, в этой официальной документации о наследовании: w3.org/TR/CSS2/cascade.html

Они упомянули об этом в вики, ве обсуждали, так что я буду включать его в ответ, а также: w3.org/wiki/Inheritance_and_cascade

+0

Спасибо за ваш вклад. Хорошо, я знаю, что это работает так, но я в основном ищу юриста ... где это указано в стандарте? Очевидно, что 'h1' явно пурпурный должен без дополнительного объяснения« блокировать »зеленый цвет, который он иначе унаследовал бы от« тела »(и передать фиолетовый его потомкам). И я знаю, что на самом деле ваш пример работает так, как он делает ... но опять же, читая стандарт, я чувствую, что ваше определение 'font-size: 30px' в качестве автора должно применяться везде, где есть наследование, и переопределить все затронутые свойства UA ... –

+1

@ ezequiel-garzon в «legalese» это официально называют «наследством». С http://www.w3.org/wiki/Inheritance_and_cascade: Элементы в разметке HTML наследуют свойства от своих родительских (содержащих) элементов и передают их своим детям. Но если дочерний элемент имеет стиль, явно определенный для него, конечно, это явное определение переопределит наследование. Это в основном официальный термин для того, что я уже объяснил в ответе. В таблице стилей пользовательского агента явно определен стиль для '', который является дочерним элементом ''. – cake

+0

Это ближе, хотя все еще вики! Я не могу поверить, что этот вопрос не рассматривается в стандарте. –

1

Это порядок каскада (taken from w3.org)

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

  1. Найдите все объявления, относящиеся к рассматриваемому элементу и свойству, для целевого типа носителя.
  2. Сортировка по значению (нормальному или важному) и происхождению (автор, пользователь или пользовательский агент). В порядке возрастания старшинства:

    • декларации агента пользователя
    • пользователя нормальных декларации
    • автора нормальных декларации
    • автора важных декларации
    • пользователя важных декларации
  3. Сортировать правила с такое же значение и происхождение по специфичности селектора: more sp специальные селекторы будут перекрывать более общие функции. Псевдоэлементы и псевдоклассы считаются нормальными элементами и классами соответственно.

  4. Наконец, выполните сортировку по указанному порядку: если два объявления имеют одинаковую массу, происхождение и специфичность, последний указывает выигрыши. Объявления в импортированных таблицах стилей считаются перед любыми объявлениями в самой таблице стилей. Помимо «важного» параметра в отдельных объявлениях эта стратегия дает стили стилей автора выше, чем у читателя. Пользовательские агенты должны предоставлять пользователю возможность отключать влияние отдельных стилей стилей автора, например, в раскрывающемся меню.

Так поведение вы наблюдаете происходит из-за специфичности.

+0

Спасибо за ваш вклад. На самом деле речь идет не о специфичности, поскольку каскад (механизм размыкания цепи) вообще не используется: см. Ответ, который я опубликовал. Более того, специфика не должна применяться, поскольку мы имеем дело с разным происхождением. Наконец, если бы это применило специфику, мы могли бы использовать '#all {color green; } 'и вставьте' 'в начале документа, получив спецификацию (0,1,0,0), против (0,0,1,1) от пользовательского агента , Вы можете проверить [ссылка все еще не зеленая] (http://jsfiddle.net/rj0d19ap/). –

0

Я довольно смущен ... Я попытался удалить этот вопрос, но было уже слишком поздно. В случае, если другой человек обнаружит ту же проблему, ответ довольно четко объяснен в начале раздела, который я цитировал в стандарте. А именно, the definition of specified value:

Агенты пользователей должны сначала присвоить указанное значение каждого свойства на основе следующих механизмов (в порядке приоритета):

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

Таким образом, наследование применяется только если нет никакого предварительного определения, будь то при условии, агентом пользователя, пользователь или автор (только тогда мы добраться до пункта 2) ... Довольно ясно , и снова я смущен, что пропустил это!

Я не буду выбирать свой собственный ответ. Не стесняйтесь копировать и вставлять!

Смежные вопросы