В каком порядке таблицы стилей CSS переопределяются?


157

В заголовке HTML я получил это:

<head>
<title>Title</title>
<link href="styles.css" rel="stylesheet" type="text/css"/>
<link href="master.css" rel="stylesheet" type="text/css"/>

styles.cssмой лист для конкретной страницы. master.cssэто лист, который я использую в каждом из моих проектов, чтобы переопределить настройки браузера по умолчанию. Какой из этих стилей имеет приоритет? Пример: первый лист содержит конкретные

body { margin:10px; }

И связанные границы, но второй содержит мои сбросы

html, body:not(input="button") {
    margin: 0px;
    padding: 0px;
    border: 0px;
}

По сути, работает ли каскадный элемент CSS с точки зрения ссылок на таблицы стилей так же, как в типичных функциях CSS? Это означает, что отображается последняя строка?


Я только сейчас понял, что это будет лучше подходит для веб-мастеров. Будет ли лучшее место, чтобы опубликовать это?
ian5v

10
Прямо здесь хорошо.
Блендер

4
body:not(input="button")кстати, не является допустимым селектором. Вы, вероятно, хотели разделить это на body, input:not([type="button"]).
BoltClock

Это интересно. Я не верю, что видел такой синтаксис раньше. Я все еще новичок, но эти двойные скобки чужды мне.
ian5v

эти скобки предназначены для селекторов атрибутов: developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors @topic: возможно, вы хотите изменить порядок таблиц стилей: master.cssсначала следует загрузить общий код , затем его проще отменить мастер-стили в вашем styles.css.
решительно

Ответы:


163

Правила каскадного правила CSS сложны - вместо того, чтобы пытаться их перефразировать, я просто отсылаю вас к спецификации:

http://www.w3.org/TR/2011/REC-CSS2-20110607/cascade.html#cascade

Вкратце: более конкретные правила имеют приоритет перед более общими. Специфичность определяется на основе количества идентификаторов, классов и имен элементов, а также от того, !importantбыло ли использовано объявление. Когда существует несколько правил одного и того же «уровня специфичности», какое бы из них ни появилось, последние выигрывают.


1
Тогда нет конкретного правила относительно того, в каком порядке загружаются таблицы стилей? Я понимаю, как CSS отображается с точки зрения специфичности, но потом я предполагаю, что мой основной лист будет загружен, если не будет переопределен.
ian5v

11
На самом деле, !importantнепосредственно участвует в каскаде и не имеет ничего общего со спецификой. Специфика связана с селекторами, тогда !importantкак используется с объявлениями свойств. (Таким образом, вы правы, говоря, что правила сложны!;)
BoltClock

2
Так загружаются ли таблицы стилей так же, как элементы, причем последний имеет приоритет, если они имеют одинаковую специфику?
ian5v

3
@iananananan: По сути, браузер никогда не видит CSS с точки зрения отдельных таблиц стилей. Если существует несколько таблиц стилей, все они обрабатываются так, как если бы они были одной гигантской таблицей стилей, и правила оцениваются соответствующим образом.
BoltClock

2
@ user34660 Комментарий BoltClock с точки зрения стиля CSS. Вы правы в том, что таблицы стилей хранятся отдельно в DOM, но это разделение не влияет на то, как эти стили применяются к чему-либо.
duskwuff -неактивный-

31

Наиболее специфический стиль применяется:

div#foo {
  color: blue; /* This one is applied to <div id="foo"></div> */
}

div {
  color: red;
}

Если все селекторы имеют одинаковую специфичность, то используется самое последнее объявление:

div {
  color: red;
}

div {
  color: blue; /* This one is applied to <div id="foo"></div> */
}

В вашем случае, body:not([input="button"])более конкретно, поэтому используются его стили.


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

1
Правило специфичности усложняет ситуацию, когда нам нужно переопределить не редактируемую таблицу стилей!
Ари

23

Порядок имеет значение. Последнее объявленное значение множественного вхождения будет принято. Пожалуйста, посмотрите тот же, который я разработал: http://jsfiddle.net/Wtk67/

<div class="test">Hello World!!</div>


<style>
    .test{
        color:blue;
    }

    .test{
        color:red;
    }
</style>

Если вы поменяете местами порядок .test{}, то вы увидите, что HTML принимает значение последнего, объявленного в CSS


3
Таким образом, вы должны добавить наиболее конкретный последний CSS.
live-love

17

Последняя загрузка CSS - это МАСТЕР, который переопределит все CSS с теми же настройками CSS

Пример:

<head>
    <link rel="stylesheet" type="text/css" href="css/reset.css">
    <link rel="stylesheet" type="text/css" href="css/master.css">
</head>

reset.css

h1 {
    font-size: 20px;
}

master.css

h1 {
    font-size: 30px;
}

Вывод для тега h1 будет иметь размер шрифта: 30 пикселей;


1
Здравствуй. В моем случае первое определенное .cssзагружается последним. Применяются ли они в порядке их загрузки или в порядке их определения?
Евгений Коньков

Спасибо, это именно то объяснение, которое я искал.
HunterTheGatherer

7

Попробуем упростить правило каскадирования на примере. Правила идут более конкретно к общему.

  1. Применяет правило первого идентификатора (над классом и / или элементами независимо от порядка)
  2. Применяет классы к элементам независимо от порядка
  3. Если нет класса или идентификатора, применяются общие
  4. Применяет последний стиль в порядке (порядок объявления на основе порядка загрузки файлов) для той же группы / уровня.

Вот код CSS и HTML;

<style>
    h2{
        color:darkblue;
    }
    #important{
        color:darkgreen;
    }
    .headline {
        color:red;
    }
    article {
        color:black;
        font-style:italic;
    }
    aside h2 {
        font-style:italic;
        color:darkorange;
    }
    article h2 {
        font-style: normal;
        color: purple;
    }
</style>

Вот стиль CSS

<body>
<section>
    <div>
        <h2>Houston Chronicle News</h2>
        <article>
            <h2 class="headline" id="important">Latest Developments in your city</h2>
            <aside>
                <h2>Houston Local Advertisement Section</h2>
            </aside>
        </article>
    </div>

    <p>Next section</p>
</section>

Вот результат. Независимо от порядка файлов стиля или объявления стиля, id="important"применяется в конце (обратите внимание на class="deadline"объявленный последний, но не имеет никакого эффекта).

<article>Элемент содержит <aside>элемент, однако последний объявил стиль вступит в силу, в этом случае article h2 { .. } на третий элемент h2.

Вот результат для IE11: (Недостаточно прав для публикации изображения) DarkBlue: Houston Chronicle News, DarkGreen: последние события в вашем городе, Фиолетовый: Раздел местной рекламы Хьюстона, Черный: Следующий раздел

введите описание изображения здесь


6

Это зависит как от порядка загрузки, так и от специфики фактических правил, применяемых к каждому стилю. Учитывая контекст вашего вопроса, вы хотите сначала загрузить общий сброс, а затем страницу. Затем, если вы все еще не видите ожидаемого эффекта, вам нужно изучить специфику используемых селекторов, как уже указывали другие.


2

РЕДАКТИРОВАТЬ: апрель 2020 года, согласно комментарию @ LeeC, это уже не так

Да, это работает так же, как если бы они были на одном листе, однако:

Загрузка заказов имеет значение!

<link href="styles.css" rel="stylesheet" type="text/css"/>
<link href="master.css" rel="stylesheet" type="text/css"/>

В приведенном выше коде нет гарантии, что master.cssзагрузится после styles.css. Поэтому, если master.cssон загружен быстро и styles.cssзанимает некоторое время, styles.cssон станет второй таблицей стилей, и любые правила с той же спецификацией master.cssбудут перезаписаны.

Лучше всего сложить все свои правила на одном листе (и минимизировать) перед развертыванием.


Рассмотрим случай использования альтернативных почти идентичных таблиц стилей, загружаемых из раздела <head> страницы, содержащих условные атрибуты мультимедиа для загрузки таблицы стилей, характерной для смартфонов и планшетов. В этом случае логика, указанная на носителе, должна быть строго исключающей для каждой таблицы стилей, если порядок загрузки не определен.
Линдсей Хейсли

@n_i_c_k Ваш ответ неверный. Порядок декларации имеет значение, а не порядок загрузки . Я только что проверил это с Fiddler, остановив загрузку master.cssи дав styles.cssзагрузку полностью. Затем я позволю master.cssзагрузить. Стиль «перекрытия» master.cssвсе еще применяется - и рендеринг блокировался до master.cssзагрузки и был проанализирован. Примечание : я попробовал rel=preloadна master.css' (no halting) and that apparently alters its _declaration_ order by hoisting it above styles.css`.
LeeC

Спасибо @LeeC, я знаю, что на момент написания мой ответ был правильным, но я верю вашему слову, что он исправлен, и отредактирую свой ответ.
n_i_c_k

1

Лучший способ - максимально использовать классы. В любом случае избегайте селекторов идентификаторов (#). Когда вы пишете селекторы только с одним классом, наследование CSS становится намного проще.

Обновление: узнайте больше о специфике CSS в этой статье: https://css-tricks.com/specifics-on-css-specificity/


1
Это отличная статья о специфике CSS: css-tricks.com/specifics-on-css-specificity
Jeroen

0

Из вашего вопроса я подозреваю, что у вас есть дубликаты выбора, основной набор, который распространяется на все страницы, и более конкретный набор, который вы хотите переопределить основные значения для каждой отдельной страницы. Если это так, то ваш заказ правильный. Мастер загружается первым, и правила в последующем файле будут иметь приоритет (если они идентичны или имеют одинаковый вес). На этом веб-сайте настоятельно рекомендуется ознакомиться со всеми правилами http://vanseodesign.com/css/css-specificity-inheritance-cascaade/. Когда я начал разработку внешнего интерфейса, эта страница прояснила множество вопросов.


0

Это каскад, который определяет приоритет объявлений. Я могу рекомендовать официальную спецификацию; эта часть хорошо читается.

https://www.w3.org/TR/css-cascade-3/#cascading

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

  1. Сочетание происхождения и важности:

    1. Transition декларации
    2. Объявления агента пользователя, отмеченные !important
    3. Пользовательские объявления отмечены !important
    4. Авторские объявления страницы отмечены !important
      1. Определения для элемента с styleатрибутом
      2. Определения для всего документа
    5. Animation декларации
    6. Страница авторских деклараций
      1. Определения для элемента с styleатрибутом
      2. Определения для всего документа
    7. Пользовательские объявления
    8. Объявления агента пользователя
  2. Если два объявления имеют одинаковое происхождение и важность, в игру вступает конкретность , то есть то, насколько четко определен элемент, вычисляя оценку.

    • 100 баллов за каждый идентификатор ( #x34y)
    • 10 баллов за каждый класс ( .level)
    • 1 балл за каждый тип элемента ( li)
    • 1 балл за каждый псевдоэлемент ( :hover), исключая:not

    Например, селектор main li + .red.red:not(:active) p > *имеет специфику 24.

  3. Порядок появления только играет роль , если два определения имеет одинаковое происхождение, значение и специфику. Более поздние определения предшествуют более ранним определениям в документе (включая импорт).


0

Я полагаю, что при выполнении кода он читается сверху вниз, что означает, что последняя ссылка CSS будет переопределять аналогичные стили в любых таблицах стилей над ней.

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

<link rel="stylesheet" href="style1.css"> 
<link rel="stylesheet" href="style2.css">

и в обоих из них вы устанавливаете цвет фона тела на два разных цвета - цвет тела в style2.css будет иметь приоритет.

Вы можете избежать проблемы приоритета стиля, используя !IMPORTANTстиль класса, который вы хотите использовать в качестве приоритета, или, возможно, переупорядочив свой <link>заказ.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.