CSS приоритет - PullRequest
       35

CSS приоритет

24 голосов
/ 20 марта 2009

Моя веб-страница содержит:

<link href="/Content/Site.css" rel="stylesheet" type="text/css" />
<style type="text/css">
td {
    padding-left:10px;
} 
</style>

Ссылочная таблица стилей содержит:

.rightColumn * {margin: 0; padding: 0;}

У меня есть таблица с идентификатором rightcolumn, где я хочу, чтобы в ячейках было небольшое отступление. Однако ссылочная таблица стилей имеет приоритет над встроенным стилем. Я вижу это визуально, а также через Firebug. Если я отключу инструкцию padding:0 в Firebug, вступит в силу отступ слева.

Как мне заставить padding-left работать?

Ответы [ 8 ]

41 голосов
/ 20 марта 2009

Большинство ответов верны, когда говорят, что это проблема специфичности, но неверны или неполны в объяснении правил специфичности.

В основном в вашем случае .rightColoumn * "более конкретен", чем td, и поэтому правило выигрывает, даже если оно наступает раньше.

Правила CSS 2.1 находятся здесь . Эти правила:

  • count 1, если декларация from является атрибутом 'style', а не правилом с селектором, 0 иначе (= a) (В HTML значения атрибута "style" элемента являются правилами таблицы стилей. Эти правила имеют селекторов нет, поэтому a = 1, b = 0, c = 0 и d = 0.)
  • подсчитать количество атрибутов ID в селекторе (= b)
  • подсчитать количество других атрибутов и псевдоклассов в селекторе (= c)
  • подсчитать количество имен элементов и псевдоэлементов в селекторе (= d)

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

Так что в вашем случае у вас есть два правила:

.rightColumn * {} /* a = 0, b = 0; c = 1, d = 0 : Specificity = 0010*/
td {} /* a = 0, b = 0, c = 0, d = 1 : Specificity = 0001 */

0001 ниже, чем 0010, и поэтому первое правило выигрывает.

Есть два способа исправить это:

  1. Используйте !important, чтобы сделать правило более "важным". Я бы избегал этого, потому что это сбивает с толку, когда у вас много правил, распределенных по нескольким файлам.
  2. Используйте селектор более высокой специфичности для тд, который вы хотите изменить. Вы можете добавить к нему имя класса или идентификатор, и это позволит вам заменить правило из связанного файла CSS.

Пример:

<style>
  .rightColomn * { padding: 0; } /* 0010 */
  td#myUnpaddedTable { padding: 10px; } /* 0101 */
  td.anUnpaddedTable { padding: 10px; } /* 0011 */ 
</style>

Редактировать: Исправлены правила специфичности для *. Комментарий Дэвида побудил меня перечитать спецификацию, которая показывает, что селектор * ничего не влияет на оценку специфичности.

19 голосов
/ 20 марта 2009

Как уже упоминали другие, у вас есть проблема специфичности. При определении того, какое из двух правил должно иметь приоритет, механизм CSS считает количество #id s в каждом селекторе. Если один имеет больше, чем другой, он используется. В противном случае он продолжает сравнивать .class es и tag s таким же образом. Здесь у вас есть класс в правиле таблицы стилей, но не во встроенном правиле, поэтому таблица стилей имеет приоритет.

Вы можете переопределить это с помощью !important, но это очень большой молоток, который можно использовать здесь. Вам лучше улучшать специфику вашего встроенного правила. Исходя из вашего описания, кажется, что ваш элемент .rightColumn либо содержит, либо содержит table, и вы хотите, чтобы ячейки в этой таблице имели дополнительный интервал? Если это так, то вам нужен селектор ".rightColumn td", который более конкретен, чем правило таблицы стилей, и будет иметь приоритет.

4 голосов
/ 20 марта 2009

Самый простой способ заставить его работать, это добавить "! Важное" в CSS, чтобы гарантировать его приоритет (если у вас нет нескольких! Важных правил):

td {
    padding-left: 10px !important;
} 

Если вы ищете ответ без! Важно, вы должны прочитать Спецификации CSS спецификаций . Связанный сайт имеет хорошее объяснение того, как он работает, хотя в основном он идет от самого важного к наименьшему, с наиболее важными селекторами идентификаторов, вторыми селекторами классов и третьими селекторами элементов.

1 голос
/ 02 марта 2012

хорошо, я признаю, что я немного опаздываю к игре здесь ... но 3 года спустя, я думаю, я все еще могу стрелять в ответ за первое место ..

дополнительный соус в моем ответе состоит в том, что есть пример css с 2 уровнями имени класса ..

в приведенном ниже примере вы можете видеть, что 'td' без класса получает стиль ".interval td", а td с классом "indragover" получает стиль "table.interval td.indragover" ..

(этот код предназначен для перетаскивания html, поэтому есть некоторый javascript, применяющий класс indragover к td в событиях dragenter, dragleave)

// put this in a css file
.interval {
    height: 100%;
    width: 100%;
    background: #FFFFCC;
    border: 2px solid #000000;
    border-collapse: collapse;
}

table.interval tr td {
    border: 2px solid black;
    color:#112ABB;
    background: #FFFFCC;
    height: 20px;
}

table.interval td.indragover {
    background: #AAAA00;
}

// put this in a html file
<table class="interval">
<tr><td>blah</td><td class="indragover">blah</td></tr>
<tr><td class="indragover">blah</td><td>blah</td></tr>
</table>
1 голос
/ 20 марта 2009

Сделайте это:

.rightColumn *,
td.rightColumn * {
  margin: 0;
  padding: 0;
}

Приоритет в CSS выглядит следующим образом:

  • Если какое-то правило имеет идентификатор, то оно будет предшествовать чему-либо еще.
  • Если какое-то правило имеет атрибут класса, оно будет предшествовать правилам только для тегов.
  • Если у двух правил есть оба идентификатора или тега, то их число развязывает «бой».

Пример:

<style type="text/css">
  #myid{
    padding: 10px;
  }

  .class{
    padding: 20px;
  }
</style>
<div id="myid" class="class"></div>

Хотя у вашего div есть и ID, и класс, правило ID переопределит правило .class.

Чтобы узнать больше о приоритетах правил CSS, я бы порекомендовал http://www.w3.org/TR/CSS2/cascade.html#specificity.

1 голос
/ 20 марта 2009

Вы можете попробовать добавить! важный флаг для вашего встроенного CSS.

, например

td {padding-left: 10px! важный; }

Кроме того, для ознакомления с общими правилами упорядочения правил CSS:

http://www.w3.org/TR/CSS2/cascade.html#specificity

1 голос
/ 20 марта 2009

Попробуйте вместо этого:

td.rightColumn * {margin: 0; padding: 0;}

td во внешней таблице стилей более конкретен, поэтому он выигрывает. Если вы квалифицируете класс rightColumn с именем элемента, тогда будут применяться стили уровня страницы.

0 голосов
/ 29 сентября 2015
1.div p.bio {font-size: 14px}
#sidebar p {font-size: 12px}

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

id является более специфичным, чем class, который является более специфичным, чем элемент.

2.p {font-size: 12px}
p.bio {font-size: 14px}

Вторая строка CSS (p.bio) более конкретна, чем первая, когда речь идет о вашем class="bio" абзаце.

уровень приоритета class выше, чем у элемента p.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...