Связь между! Важным и CSS спецификой - PullRequest
28 голосов
/ 27 апреля 2011

Глядя на спецификацию CSS , нет упоминания о том, сколько "очков" стоит правило !important.

Когда один переопределяет другой? Что произойдет, если один будет объявлен после другого? Какое правило объявлено более важным? Есть ли какая-то модель?

Из , !important относится к тому, что имеет больше точек специфичности для начала. Но что произойдет, если я объявлю, что bazillion id заполнен классами и вложен глубоко? Будет ли он переопределять правила, установленные в другом, менее определенном правиле, помеченном !important?

Ответы [ 2 ]

37 голосов
/ 27 апреля 2011

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

Однако !important влияет на каскад , который является общим вычислениемстили для определенного элемента, когда к нему применяется более одного объявления свойства.Или , как кратко описывает Кристофер Альтман, :

  1. !important - это карта пик .Он превосходит все точки специфичности.

Но не только это: потому что он влияет на каскад в целом, если у вас есть более одного селектора !important с правилом, содержащим объявление !important, соответствующеетот же элемент, то специфичность селектора будет продолжать применяться.Опять же, это просто из-за того, что к одному элементу применяется более одного правила.

Другими словами, для двух правил с неодинаковыми селекторами в одной и той же таблице стилей (например, одна и та же таблица стилей пользователя, одна и та же внутренняя таблица стилей автора илита же самая внешняя авторская таблица стилей), применяются правила с наиболее конкретным селектором.Если есть какие-либо стили !important, побеждает тот, который находится в правиле с самым конкретным селектором.Наконец, поскольку у вас может быть только что-то важное или нет, это достаточно далеко, чтобы влиять на каскад.

Вот иллюстрация различных вариантов использования !important и их применения.:

  • Объявление !important всегда переопределяет без него (за исключением IE6 и старше):

    /* In a <style> element */
    #id {
        color: red !important;
        color: blue;
    }
    
  • Если естьболее одного !important объявления в правиле с одинаковым уровнем специфичности, позже объявленный выигрывает:

    /* In a <style> element */
    #id {
        color: red !important;
        color: blue !important;
    }
    
  • Если вы объявляете то же правило и то же свойство вв двух разных местах, !important следует каскадному порядку, если важны оба объявления:

    /* In an externally-linked stylesheet */
    #id {
        color: red !important;
    }
    
    /* In a <style> element appearing after the external stylesheet */
    #id {
        color: blue !important; /* This one wins */
    }
    
  • Для следующего HTML:

    <span id="id" class="class">Text</span>
    

    Если у вас есть дваразные правила и одно !important:

    #id {
        color: red;
    }
    
    .class {
        color: blue !important;
    }
    

    Это !important всегда выигрывает.

    Но когда у вас более одного !important:

    #id {
        color: red !important;
    }
    
    .class {
        color: blue !important;
    }
    

    Правило #id имеет более конкретный селектор, поэтому выигрывает один.

7 голосов
/ 27 апреля 2011

Я думаю об этом так:

  1. !important - это карта пиков . Это превосходит все особенности. На ваш конкретный вопрос !important переопределит bazillion id / classes.

  2. !important сбрасывает каскад. Итак, если вы используете !important ниже другого !important, правила второго экземпляра.

Существует более технический ответ, но я думаю о !important.

Еще одно замечание: если вы используете !important, вам нужно сделать шаг назад и проверить, что вы делаете что-то не так. !important подразумевает, что вы работаете против каскада CSS. Вы должны использовать !important в редких случаях.

...