2012-02-03 2 views
6

В двух словах, как CSS определяет, когда применять один стиль над другим?Специфика CSS. Как «он» определяет, какие стили применять?

В прошлом году я работал с большим количеством JavaScript, а селекторы на основе CSS, используемые в jQuery, заставили меня узнать больше о том, как они работают. Я несколько раз проходил через W3 CSS3 selectors document, и это помогло мне понять, как лучше использовать селектора CSS в jQuery, но это не помогло мне понять, когда одно правило CSS будет применено к другому.

Я покажу вам пример того, чего я не понимаю.

У меня есть следующий HTML-код:

<div class='item'> 
    <a>Link 1</a> 
    <a class='special'>Link 2</a> 
</div> 

У меня есть следующие CSS:

.item a { 
    text-decoration: none; 
    color: black; 
    font-weight: bold; 
    font-size: 1em; } 

.special { 
    text-decoration: underline; 
    color: red; 
    font-weight: normal; 
    font-size: 2em; } 

Учитывая вышеизложенное, как Link 1 и Link 2 будет стиль же, как определено .item a CSS. Почему стиль, связанный с .special, не имеет приоритета для ссылки 2?

Очевидно, что я могу получить вокруг него, как это:

.special { 
    text-decoration: underline !important; 
    color: red !important; 
    font-weight: normal !important; 
    font-size: 1em !important; } 

Но я чувствую, что это хак, что я должен посыпать из-за мое отсутствие понимания. Когда я использую !important, я чувствую себя немного похож на наркомана, который скользит по небольшому количеству запрещенного вещества, заявляя, что нормально заниматься «одним-единственным», прежде чем уйти навсегда.

Кроме того, если бы я хотел действительно узнать CSS, есть ли отличные книги, чтобы рекомендовать?

+4

Эта ссылка выглядит довольно тщательной, и в качестве бонуса есть фотографии штурмовиков и Дарта Вейдера. [Специфика CSS] (http://coding.smashingmagazine.com/2007/07/27/css-specificity-things-you-should-know/) –

+1

Спасибо, что задали этот вопрос. Я в той же лодке, что и ты. – srijan

+0

@JamesMontagne +1 для темной стороны. – Jonathan

ответ

9

Основано на IDs, classes и tags. IDs имеют самую высокую специфичность, то classes затем tags, так:

.item a  == 0 1 1  0 (id) 1 (class=item) 1 (tag=a) 
.special == 0 1 0 
#foo  == 1 0 0 
#foo .bar a == 1 1 1 
#foo #bar == 2 0 0 

зависимости от того, имеет наибольшее количество побед :) Если это галстук, в зависимости от того один приходит последним в выигрывает документ. Обратите внимание, что 1 0 0 бьет 0 1000 1000

Если вы хотите .special применить, сделать его более конкретным: .item a.special

+0

Это фантастически понятно. Итак, если бы я изменил '.special' на' a.special', он бы выиграл, потому что он последний в документе? – Jonathan

+2

@ Джонатан - да, они свяжутся, а 'a.special' победит. –

+0

Что касается «примечания», выигрышный стиль зависит от того, что имеет наибольшее количество очков, но оно смещено в сторону большей специфичности? Например, '1 0 0' будет бить' 0 100 100'. Аналогично, '0 1 100' будет бить' 0 0 1000'? – Jonathan

1

http://www.w3.org/TR/CSS21/cascade.html#specificity является официальной спецификацией специфичности.

Но если это TL; DR, (слишком) короткая версия - это больше слов, которые у вас есть в вашем селекторе, тем выше специфика. И с! Важно еще выше. Вот и все.

Редактировать: О, я вижу, что ваша ссылка имеет ту же информацию, что и моя. Извини за это.

+0

Это неправда, это зависит от того, что такое «слова». Больше не всегда означает, что это более конкретно. –

+1

Возможно, именно поэтому это была «слишком короткая» версия. – Jonathan

+0

Да, это правда. W3C так говорит! Подожди, ты имеешь в виду мое замечание. Это подразумевалось как ответ на вопрос, почему «.item a» более специфичен, чем «.специальный». Извините, если я не сделал это ясно. Ссылка содержит дополнительную информацию. –

2

Я предлагаю вам ознакомиться с this для справок в будущем. В данном конкретном случае, обратите внимание, пункт 3 под каскадным заказом:

  1. Count количество атрибутов ID в селекторе.
  2. Подсчитайте количество атрибутов CLASS в селекторе.
  3. Подсчитайте количество имен тегов HTML в селекторе.

Если они применяются к коду, .item a имеет 1 атрибута класса + 1 HTML имя тега, в то время как .special имеет только один атрибут класса. Следовательно, первый выигрывает право стилизовать специальную ссылку.

+0

Отличная ссылка. Благодарю. Я буду хранить его для дальнейшего использования. – Jonathan

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