Тарифы Услуги Сим-карты

Понимание веса CSS-селекторов

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

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

Как это выглядит

Специфичность представляет собой группу из четырех чисел. Например, 0,0,0,0 или 0,0,1,2.

Как подсчитать специфичность

Специфичность считается по селектору. Правила подсчета очень просты:

  • каждый присутствующий в селекторе идентификатор добавляет к специфичности 0,1,0,0;
  • каждый класс, псевдокласс или атрибут добавляет к специфичности 0,0,1,0;
  • каждый элемент или псевдоэлемент добавляет к специфичности 0,0,0,1;
  • универсальный селектор и комбинаторы не учитываются.

Давай закрепим полученные знания и поупражняемся в расчете специфичности.

P {/*какие-то определения */} div p {/*какие-то определения */} p.note {/*какие-то определения */} form.feedbackForm input {/*какие-то определения */} #conten a:hover {/*какие-то определения */}

Превая строка — одинокий селектор типа. Специфичность 0,0,0,1.

Вторая строка — два селектора типа. Специфичность 0,0,0,2.

Теретья строка — селектор типа и класса. Специфичность 0,0,1,1.

Четвертая строка — два селектора типа, один класса и один атрибута. Специфичность 0,0,2,2.

Пятая строка — селектор идентификатора, типа и псевдокласс. Специфичность 0,1,1,1.

Кто победил?

Сравниваются специфичности очень просто. Какое число больше, то определение и выиграло.

Например:
0,0,1,4 больше, чем 0,0,1,2.
0,1,2,0 больше, чем 0,0,2,1.

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

Например, 0,1,0,0 больше, чем 0,0,8,9.

Если тебе так удобнее, можешь мысленно отбросить запятые и рассматривать предыдущий пример, как 100>89. Только не запутайся, если какой-то из разрядов специфичности будет больше девяти (что может быть при сильно навороченном селекторе). Например, если получилась специфичность 0,1,10,14, запятые отбрасывать нельзя, а то все разряды попутаются.

Специфичность и объявления

Специфичность относится как бы не ко всему правилу в целом, а к каждому конкретному объявлению. Поэтому, может получиться что правило «отработает» не полностью. Например:

Подопытный текст

Div { color: #0f0; /* Специфичность 0,0,0,1. */ font-weight: bold; /* Специфичность 0,0,0,1. */ } .box { font-weight: normal; /* Специфичность 0,0,1,0. */ }

Объявление из строки 2 для элемента

отработает нормально, а объявление из строки 3 будет перебито объявлением из строки 6 (так как у него больше специфичность). Текст внутри нашего div будет зеленым, но не жирным.

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

Обрати внимание, что специфичность селектора идентификатора (0,1,0,0) всегда выше, чем селектора атрибута (0,0,1,0). Даже если этот атрибут — ! Поэтому:

Form.feedback input { color: #f00; /* Специфичность 0,0,2,2. */ } #name { color: #0f0; /* Специфичность 0,1,0,0. - победа! */ }

Встроенные стили

По идее, кто-то уже давно должен был спросить, а зачем, собственно, в специфичности самая первая цифра? Ведь мы ее до сих пор никак не использовали!

Все верно. Первая цифра зарезервирована для встроенных стилей. Считается, что их специфичность равна 1,0,0,0. Таким образом, встроенный стиль всегда перебивает стиль заданный во внешней или вложенной таблице стилей. Например:

Этот текст будет зеленым

Даже использовав селектор идентификатора, мы не перебъем встроенный стиль.

Div#box { color: #00f; /* Специфичность 0,1,0,1. - маловато */ }

Это что же получается? На встроенные стили нет никакой управы?

Не волнуйся. Конечно, есть способ перебить встроенные стили (а заодно и все остальные объявления).

Объявление!important

Если очень нужно, можно пометить какое нибудь объявление, как важное (important). Такое объявление будет считаться заведомо победившим при сравнивании специфичностей. Да, да, в том числе победившем и встроенные стили. Давай немного изменим CSS для предыдущего примера:

Div { color: #00f !important; /* важное объявление - сразу победа! */ }

Даже слабенький по специфичности (0,0,0,1) селектор типа перебил встроенный стиль, ведь его объявление теперь стало важным!

Детали применения!important хорошо описаны в нашем CSS-справочнике . Если хочешь узнать подробности — перейди по ссылке .

Теперь, вооружившись знанием о расчете специфичности можно продолжить изучение наследования в CSS.

HTML — основа всех веб-сайтов, служит для размещения основного контента на сайте. Если запустить HTML код в браузере, то можно увидеть текст, картинки и ссылки, которые не особо радуют глаз. Чтобы сделать красивые элементы и создать хороший дизайн веб-страницы нужно воспользоваться CSS

CSS — язык стилизации веб-элементов. Он берет отдельную часть контента или всю страницу целиком, изменяя её визуальную составляющую. Чтобы свойства CSS применялись, им нужно на что-то ссылаться. Для этого используются селекторы, которых существует огромное множество.

Селекторы. CSS

Селекторов существует огромное количество, от общих(ссылающихся на все элементы веб-страницы) до тегов, классов и идентификаторов.

Общие селекторы

"*" — основной селектор в CSS. Он ссылается на каждый элемент веб-страницы находящийся в теге {body}. Чаще всего используется для обнуления отступов на странице:

CSS

Скопировать

Селекторы тегов. CSS

Данный селектор ссылается на каждый указанный тег. Например, если задать изменение шрифта для тегов p, то каждый параграф будет иметь этот стиль. Классы и идентификаторы используются чаще, но теги тоже имеют широкое применение. Например, когда нужно задать общие стили для тега body — шрифт, фон, отступы и т.д.

CSS

body {

font-family: "Tahoma", serif;

Скопировать

Селекторы id. CSS

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

Через id можно обращаться и к другим элементам, используя его как родительский селектор. Об этом позже.

Чтобы использовать селектор идентификатора, задайте его в html, с помощью атрибута id. Введите его в css документе с решеткой вначале, без пробелов.

HTML

Тестовая страница

Hello World!

Любой тестовый текст

Скопировать

В CSS выглядит как:

CSS

body {

font-family: "Tahoma", serif;

background-color: rgba(235, 52, 52, 0.52);

color: rgba(255, 255, 255, 0.71);

#head {

font-size: 1.8rem;

text-align: center;

padding: 15px 0;

Скопировать

Селекторы Классов. CSS

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

С помощью этого селектора можно выделить несколько элементов для определенного стиля. Например, чтобы отличить кнопочные ссылки от обычных.

Для начала задайте имя класса для элемента, через атрибут class. После этого можно обратиться к нему через css. Введите его название, с точкой вначале.

HTML файл остаётся прежним в основе, но к нему добавляется новый атрибут из CSS:

В CSS это выглядит как:

CSS

Text {

font-size: 1.1rem;

text-align: center;

padding: 10px 0;

Скопировать

Родительские и селекторы. CSS

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

Контекстные селекторы позволяют обратиться не ко всему контенту, который находится внутри элемента, а к некоторым его частям. Может послужить заменой классам. Существует несколько типов родительских селекторов, которые применяются ко всем потомкам и только к прямым.

Чтобы обратиться к прямым потомкам элемента используйте запись X Y. Например, чтобы стилизовать все ссылки внутри параграфов, используем селектор "a"

CSS

color: rgba(255, 255, 255, 0.65);

font-weight: bold;

Скопировать

Второй способ обращения к потомкам более конкретный. Например, если в теге

содержится многоуровневый список, а нужно обратиться только к элементам первого уровня. Для этого используйте запись
>
    .

    Стили применяются только к тем тегам

      , которые находятся внутри самого элемента
      . К элементам, которые находятся внутри
    • , стили применяться не будут.

      Соседние селекторы применяются к тем элементам, которые находятся рядом с указателем. Допустим у вас на странице такой текст:

      Тег span находится по соседству с тегом . Поэтому, чтобы обратиться к нему, используем запись + .

      Селекторы атрибутов. CSS

      Дают возможность обратиться не ко всем элементам страницы, а лишь к тем, которые имеют определенный атрибут.

      В HTML это выглядит как:

      HTML

      Скопировать

      В CSS это выглядит как:

      CSS

      color: darkblue;

      text-decoration: none;

      Скопировать

      Можно сослаться на атрибут с определенным значением. Таким образом, для того, чтобы сослаться на ссылки, которые открываются в новой вкладке, необходимо сделать следующую запись:

      Приоритеты

      По приоритету селектору располагаются следующим образом.

      1. #id:not — id c псевдо-классом отрицания. Специфичность — 101.
      2. #id — простой идентификатор. Специфичность — 100.
      3. p.green.bold — тег с двумя классами. Специфичность — 21.
      4. body section div.header — третий потомок тега с классом. Специфичность -13.
      5. body section div — третий потомок тега. Специфичность — 11.
      6. div p — второй потомок. Специфичность — 2.
      7. p — обращение к тегу элемента. Специфичность — 1.
      8. * — обращение ко всем элементам. Специфичность — 0.

      Чем выше специфичность, тем выше приоритет.

      Свойства селекторов. CSS

      В языке CSS существует огромное количество свойств, которые и задают стили элементов. Для создания нужно указать селектор, а затем уже свойство, в фигурных скобках.

      Заключение

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

      Теги:

      От автора: представьте специфичность в виде оценки или степени, которая решает, какие стили применить к элементу. Универсальный селектор (*) имеет низкую специфичность. Селектор id – высокую. Родительские селекторы типа p img и дочерние селекторы типа.panel > h2 имеют более высокую специфичность, чем типовые селекторы p, img и h1.

      По началу, кажется, сложно вычислить точное значение специфичности. В спецификации Selectors Level 3 говорится, что для этого вам необходимо:

      проигнорировать универсальный селектор.

      Значения А, В и С вместе дают конечное значение специфичности. ID селектор типа #foo имеет специфичность 1,0,0. Селекторы атрибутов типа и классы типа.chart имеют специфичность 0,1,0. Если добавить псевдокласс типа:first-child (например, .chart:first-child), специфичность станет 0,2,0. А простые типовые или элементные селекторы типа h1 и p дают всего лишь 0,0,1.

      Заметка: вычисление специфичности

      Выучить и вычислить специфичность селектора можно с помощью ресурсов Specificity Calculator от Keegan Street и CSS Explain от Joshua Peek.

      Сложные селекторы и комбинаторы дают, естественно, большую специфичность. Разберем пример CSS:

      ul#story-list > .book-review { color: #0c0; } #story-list > .book-review { color: #f60; }

      ul #story-list > .book-review {

      color : #0c0;

      #story-list > .book-review {

      color : #f60;

      Эти правила похожи, но не одинаковы. В первом селекторе ul#story-list > .bookreview находится типовой селектор (ul), ID селектор (#story-list) и класс (.bookreview). Специфичность равна 1,1,1. Во втором селекторе #story-list > .book-review хранятся только ID и класс. Специфичность равна 1,1,0. Несмотря на то, что #story-list > .book-review объявлен ниже ul#story-list > .bookreview, высокая специфичность последнего заставить элементы с классом.book-review окраситься в зеленый, а не оранжевый цвет.

      Псевдоклассы:link и:invalid имеют ту же специфичность, что и классы. У a:link и a.external будет одна специфичность, равная 0,1,1. Точно так же псевдоэлементы типа::before и::after имеют одинаковую специфичность с типовыми и элементными селекторами. Если два селектора имеют одинаковую специфичность, в дело вступает каскадирование. Пример:

      a:link { color: #369; } a.external { color: #f60; }

      a : link {

      color : #369;

      a . external {

      color : #f60;

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

      В главе 2 мы обсудим, как поддерживать низкую специфичность.

      Заключение

      После прочтения этой главы у вас должно сложиться четкое понимание CSS селекторов. В частности вы должны знать:

      как использовать селекторы и применять стили к конкретным элементам, псевдоэлементам и псевдоклассам;

      понимать различия между псевдоэлементами и псевдоклассами;

      использовать новые псевдоклассы, представленные в спецификациях Selectors Level 3 и 4;

      вычислять специфичность.

      В следующей главе мы расскажем про золотые правила написания обслуживаемого и масштабируемого CSS кода.


      Chris Coyier

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

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


      • Whiskey

      • Beer

      • Cola

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


      • Whiskey

      • Beer

      • Cola

      Favorite {
      color: olive;
      font-weight: bold;
      }

      Осталось лишь посмотреть на результат работы этого кода. Но увы, мы не получили ожидаемого эффекта – текст выбранного нами напитка (Whiskey ) не будет выделен и отображается также, как и остальные элементы списка. В чем же дело?

      Возможной причиной возникшей проблемы может быть другое правило, которое определено в том же CSS документе, имеющее следующий вид:

      ul#drinks li {
      color: black;
      font-weight: normal;
      font-size: 13px;
      }

      Именно это CSS правило содержит определения, препятствующие визуальному выделению желаемого элемента списка. В используемом документе находится два различных CSS селектора, применяемых к одному элементу (.favorite и ul#drinks li ), которые предусматривают различные значения для цвета и толщины шрифта, содержащегося в нем текста. Что касается размерности шрифта, то здесь все понятно – рассматриваемый код содержит лишь одно выражение, определяющее его значение ( font-size: 13px ), поэтому именно оно и будет использоваться. Проблема, в данном случае, заключается в том, что браузер должен определить, какому из конфликтующих правил отдать предпочтение в процессе обработки документа. Как раз для этих целей и предназначены значения CSS специфичности каждого из правил.

      Большинство проблем возникает у начинающих веб-разработчиков, которые не понимают, по какому принципу производится выбор рабочего правила. Они, как правило, предполагают, что приоритетом должен обладать селектор .favorite , так как он находится ниже в структуре CSS кода или потому, что определение атрибута class="favorite" в HTML разметке документа находится ближе к текстовому содержимому интересующего нас элемента страницы (

    • ). Но все это, конечно же, заблуждения.

      Да, действительно, CSS спецификацией предусмотрено, что положение правила в структуре кода имеет значение. И то из них, которое расположено ниже, действительно обладает приоритетом, но только в том случае, если значения специфичности рассматриваемых выражений одинаковы. Вот пример:

      Favorite {
      color: olive;
      }
      .favorite {
      color: black;
      }

      В этом случае цвет шрифта выбранного элемента списка будет черным (*поскольку последнее правило переопределяет значение первого ). Но мы немного отклонились от темы.

      Здесь работает несколько иной принцип. Всякий раз, когда вы формируете селектор для CSS правила, всегда делайте его настолько специфичным (конкретным), насколько это возможно и оправданно. (*Для этого необходимо применять более сложные селекторы ). При рассмотрении простейшего примера, приведенного выше, вы, вероятно, сами догадались, что использование лишь имени класса .favorite для селектора, выбирающего требуемый напиток из списка, будет недостаточным. И это не позволит извлечь из общего списка «нужный напиток» для его дальнейшего форматирования. А если это все-таки каким-то образом сработало один раз, то нет никакой гарантии, что в будущем все пройдет так же гладко. Для достижения желаемого результата необходимо использовать более конкретный селектор:

      ul#drinks li.favorite {
      color: olive;
      font-weight: bold;
      }

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

      html body div#content ul#dirnks li.favorite {
      color: olive;
      font-weight: bold;
      }

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

      Favorite {
      color: olive! important;
      font-weight: bold! important;
      }

      Использование декларации ! important является универсальным методом задания приоритетности CSS правилам. И с его помощью вы сможете принудительно переопределить назначенные ранее свойства элемента, но этот метод является радикальным и в некоторых случаях его использование не оправданно.

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

      Один из классических примеров, которые я использую:

      Last-block {
      margin-right: 0! important;
      }

      Я применяю данный класс в тех случаях, когда на странице имеется несколько «плавающих» блоков (*с установленным свойством float , в данном случае со значением left ), которые размещаются в один ряд. При этом, назначая это имя класса для последнего в ряду блока (самого правого), я полностью исключаю ситуацию, когда он неплотно прилегает к границе контейнера, что в моем случае недопустимо. Даже если где-то в структуре CSS кода, в рамках правила с более специфичным (конкретным) селектором определены другие значения свойства margin-right для используемых блоков, то применение класса .last-block к крайним элементам позволит обнулить их. При этом мы не используем никаких дополнительных составляющих селектора, конкретизирующих его, что упрощает представление кода.

      Подсчет значения CSS специфичности.

      Рассматривая предыдущий пример, мы с вами выяснили, что наша первая попытка определения цвета и жирности шрифта для элемента списка провалилась из-за того, что мы использовали селектор лишь с одним именем класса, который имеет меньшее значение CSS специфичности и был переопределен селектором, выбирающим неупорядоченный список по его идентификатору ID, который имеет большее значение специфичности. Ключевыми значениями в данном случае являются имена классов (class) и идентификаторы элементов (ID). Очень важно знать, что CSS стандарты предусматривают существенные различия в весовых значениях специфичности для селекторов классов class и идентификаторов ID. Селекторы, использующие идентификаторы элементов, имеют безупречное преимущество над теми, в которых применяются лишь имена классов. При любом количестве имен классов в селекторе, он будет переопределен другим селектором, имеющим в своем составе один идентификатор элемента.

      Теперь давайте схематически рассмотрим метод определения и записи значений CSS специфичности селекторов:

      Другими словами:

      • Если в теге элемента предусмотрен атрибут style , то все определенные в его рамках свойства имеют максимальный приоритет (значение специфичности в этом случае получает высший разряд – 1,0,0,0 ).
      • Для каждого идентификатора элемента, используемого в рамках селектора прибавляется единица в соответствующий разряд специфичности – 0,1,0,0 .
      • Каждое имя класса, а также псевдокласса или селектор атрибута (* element ), присутствующий в селекторе правила добавляет единицу в следующий разряд специфичности – 0,0,1,0 .
      • И последний, самый младший разряд, получает по единице за каждое, присутствующее в селекторе имя элемента – 0,0,0,1 .

      Вы можете избавиться от запятых и преобразовать значения CSS специфичности в более привычную для вас форму представления значений – обычные числа: 1,0,0,0 можно представить как 1000 , что значительно больше значения 0,1,0,0 или 100 . Используемые в этом случае запятые предназначены для четкого разделения значений различных разрядов специфичности. К примеру, если в CSS селекторе используется 13 имен классов, псевдоклассов и/или селекторов атрибутов (что маловероятно), то значение специфичности в этом случае может принять вид 0,1,13,4 , что невозможно представить в десятичном виде.

    • Директива ! important , следующая непосредственно за определенным CSS свойством, априори придает максимальное значение его специфичности. Она отменяет действие даже тех свойств, которые указаны в inline -атрибуте "class" тега элемента. Единственный способ переопределения свойства с директивой ! important — это создание нового правила, содержащего то же свойство и декларацию ! important , которое находится ниже в CSS коде. К тому же, второе правило должно иметь равное или большое значение специфичности, чем первое (которое необходимо отменить). Другими словами, для директивы ! important можно определить еще один разряд в значении специфичности – 1,0,0,0,0 , хотя такой ее записи, конечно же, не существует.
    • * Исчерпывающую информацию по декларации ! important можно прочесть .

      * Примечание переводчика.

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

      Все материалы по таблицам каскадных стилей, которые уже были опубликованы на этом блоге, вы сможете найти в . Сегодня же мы поговорим сначала про то, как можно комбинировать и группировать селекторы, а затем подробно рассмотрим правил, которые применяются для одного и того же элемента в Html коде (Important, подсчет селекторов и запись правил в атрибуте style).

      Комбинации и группировка селекторов в CSS

      Итак, в предыдущих статьях мы успели рассмотреть 7 типов:

      Из этих семи возможных видов в языке CSS можно составлять комбинации. Все комбинации, которые мы будем составлять, имеют непосредственное отношение к (предки — потомки, родители — дети, братья — сестры).

      Первый вид комбинации называется контекстный селектор . Он учитывает взаимоотношение элементов Html кода по принципу «Предок — Потомок»:

      Отдельные селекторы в комбинации записываются через пробел , а читать ее нужно справа налево. Т.о. правила CSS будут применяться только к последнему этой комбинации (самому правому), а все, что стоит перед ним, лишь позволяет задать более точное применение (прицеливание) для наших правил (акцентировать).

      В первом примере говорится, что все элементы B (выделение жирным), у которых в предках есть элементы Div, будут окрашены в зеленый цвет.

      В приведенном коде только подчеркнутый фрагмент будет окрашен в зеленый цвет, т.к. в числе его предков имеется Div, а второй фрагмент кода, выделенный тегами B, останется того цвета, который выбран для него по умолчанию, ибо в числе его предков контейнера Div уже нет (только P и Body):

      Такие комбинации работают в любых браузерах.

      Следующим типом комбинаций будет дочерний селектор , который строится на принципах взаимоотношений элементов кода по типу «Родитель — Ребенок»:

      Записываются они с разделяющим знаком больше (>) :

      Данная запись будет трактоваться браузером так: для , «родителем» (ближайшим предком) которых является контейнер Div, будет использоваться выделение красным цветом.

      В приведенном примере только обведенные абзацы будут окрашены в красный цвет, ибо они заключены непосредственно в контейнер Div, который для них является родителем (ближайшим предком). Если видоизменить приведенный пример дочернего селектора на такой:

      Body > p {color:red}

      То красным уже будет выделен только последний абзац, т.к. его родителем является тег Body, а два первых параграфа останутся того цвета, который был предусмотрен для них по умолчанию (Body для них предок, но не родитель, которым является Div). Дочерние селекторы не работают в браузере Ie 6 .

      Как и для чего группируют селекторы в CSS коде

      Последняя комбинация называется соседние селекторы и отвечает принципам отношений между элементами Html кода по типу «Сестры — Братья». В качестве разделителя у них может использоваться либо «+», либо «~»:

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

      Если записать соседний селектор в Css коде в таком виде:

      H1 ~ p {color:red}

      То это будет означать, что все параграфы (P), у которых выше по коду расположен соседний элемент H1 (заголовок), будут окрашены в красный цвет. Имеются в виду именно соседние элементы (отношения вида «Сестры — Братья»). На приведенном ниже примере заданному селектору будут удовлетворять обведенные абзацы:

      Комбинации соседних селекторов в браузере Ie 6 тоже, к сожалению, не поддерживаются. В Ie 6 поддерживается только первый вид комбинации, а в Ie 7 и выше поддерживаются все остальные. В остальных браузерах никаких проблем возникать не должно.

      Селекторы в Css можно еще и группировать . Например, если у каких-то из них используется одно или несколько одинаковых правил, то их можно объединить в группу для уменьшения объема Css кода.

      В приведенном на скриншоте примере, повторяется для каждого селектора заголовка (h1-3), что может вызвать сложности (многократная работа) при желании поменять значение этого свойства. Поэтому второй вариант сгруппированной записи выглядит немного предпочтительнее.

      Обратите внимание, что при группировке селекторы пишутся через запятую . Если одинаковых правил будет больше, то и экономия кода будет более ощутимой. А те правила, которые были уникальными, нужно по-прежнему записывать индивидуально.

      Приоритеты Css свойств (с important и без него)

      Теперь давайте подумаем, а какое стилевое оформление будет использовать браузер, если никаких стилей для данного элемента Html кода не задано? А для этого существует соответствующая спецификация , где все это описано.

      Как вы можете видеть, сейчас произошло уже окончательное разделение Html и Css. Т.е. даже для чистого ХТМЛ кода браузер все равно будет использовать дефолтные свойства таблиц стилей. Так вот свойства, принятые по умолчанию, имеют самый низший приоритет .

      Более высокий приоритет имеют свойства, которые назначит пользователь в настройках своего браузера. Эти стили будут применены к любым документам, которые он просматривает в этом обозревателе.

      Правда не у всех браузеров есть такая возможность, но по крайней мер, в Ie и Опере она имеется. Т.е. при желании пользователь в качестве источника стилевой разметки сможет подключить свой собственный файл CSS.

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

      Т.е. у пользователя есть возможность заставить любой открываемый в браузере сайт выглядеть в соответствии с его требованиями, описанными в файле CSS. Это называется «пользовательские стили» и они имеют приоритет выше, чем стили, которые определены в спецификации по умолчанию. Но еще больший приоритет будут иметь так называемые авторские стили.

      Т.е., если я (разработчик сайта) захотел использовать в оформлении какого-либо элемента Html кода стили отличные от дефолтных (помните, они в спецификации описаны), то пользователь своим собственным файлом Css перебить мое оформление не сможет.

      Пользователь будет вынужден смириться? Нет. Есть у него возможность повысить приоритет своих свойств CSS с помощью добавления Important в конце каждого из них. Пишется это слово через пробельный символ и перед ним ставится восклицательный знак:

      P {color:red !important;}

      Если у пользователя в его собственном файле стилей, который он подключил к браузеру, будет прописано это же свойство с Important, то все абзацы он будет видеть в красном цвете. Но ведь и автор (разработчик) сайта мог использовать Important для этого свойства. Кто же тогда победит и чей приоритет окажется выше?

      Решили, что пользовательские стили с Important будут иметь по-любому более высокий приоритет, чем авторские стили, что с Important, что без него.

      Давайте обобщим в виде списка всю изложенную информацию по поводу приоритетов стилевых свойств. Приоритет будет убывать сверху вниз:

      1. Пользовательские с Important
      2. Авторские с Important
      3. Авторские
      4. Пользовательские
      5. Стили, принятые для Html элементов в спецификации по умолчанию (когда ни автор, ни пользователь ничего другого не задали)

      Т.е. без Important авторские стили важнее, а с них уже пользовательские стили самые важные и приоритетные. Ну, а теперь давайте разбираться именно с авторскими таблицами, ибо про то, что делает пользователь, нам не ведомо и покрыто мраком.

      Как повышают приоритеты Css свойств в авторских стилях

      Именно сейчас мы с вами и переходим к вопросу каскадности таблиц стилей CSS . Давайте рассмотрим это на примере, чтобы было нагляднее. Допустим, что у нас имеется фрагмент кода со следующими Html элементами (параграф внутри контейнера Div):

      Содержимое контейнера

      Давайте сначала пропишем такие свойства:

      P {color:red} .sbox {background:#f0f0f0}

      В результате будет применено и первое из них к параграфу (ибо он образован тегом P), и свойство, задающее серый фон для элемента с классом «sbox», который опять же имеется у этого параграфа:

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

      P {color:red} .sbox {background:#f0f0f0;color:blue}

      В результате цвет текста параграфа станет синим вместо красного.

      Почему? Потому что именно таким способом разрешается конфликт, когда один и тот же элемент Html кода получает сразу несколько одинаковых правил, но с разными значениями и из разных мест Css кода. Для того, чтобы определить, приоритет какого правила выше, нужно считать его селекторы.

      Кроме этого сами селекторы имеют градацию по приоритетам . Самый высокий приоритет у ID. В этом примере цвет текста будет синим именно потому, что приоритет Id (#out) будет выше, чем у селектора тега (p):

      P {color:red} #out {color:blue}

      Дальше по лесенке приоритетов, направленной вниз, следуют селекторы классов, псевдоклассов и атрибутов. В следующем примере опять проиграет тег (p) и цвет текста абзаца будет синим, ибо тягается он с селектором более высокого приоритета (класса):

      P {color:red} .sbox {color:blue}

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

      Div p {color:red} p {color:blue}

      Какого цвета в результате получится текст параграфа? Правильно, именно красного, т.к. у этого свойства больше селекторов тегов (два против одного). О как. Т.е. сначала считаются Id. Если победитель не выявлен, то считаются классы, псевдоклассы и атрибуты. Ну, а если и там ничего не решилось или таких не было найдено, то считаются селекторы тегов и псевдоэлементов.

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

      Содержимое контейнера

      Вполне можно будет написать такой кусок Css кода:

      Div.box #out{color:red} #in p.sbox{color:blue}

      И какого же цвета должен быть текст параграфа? Обе комбинации описывают именно наш параграф. Первую следует, как и водится, читать справа налево: применить данные свойства (color:red) для элемента с Id #out, который стоит где-то внутри (иметь его среди «предков») контейнера Div с классом.box (div.box). Полностью подходит к нашему абзацу.

      Вторая комбинация: применить данные свойства (color:blue) для элемента параграфа с классом sbox (p.sbox), который стоит внутри любого элемента с Id #in. Опять же, она полностью описывает именно наш параграф. Давайте считать селекторы.

      С ID в обоих комбинациях встречаются по одному разу, тоже самое можно сказать и о классах. Остается только посчитать селекторы тегов, но их тоже в обоих комбинациях используется одинаковое число раз (один). Засада.

      Получились равные приоритеты у одного и того же свойства, имеющего разные значения (цвет текста красный, либо синий). Как же браузер будет решать эту дилемму?

      Тут будет действовать правило — кто последний , тот и прав. Поэтому в моем примере цвет текста параграфа будет синим, ибо это свойство (color:blue) расположено ниже в коде. Если эти правила поменять местами:

      #in p.sbox{color:blue} div.box #out{color:red}

      То в результате цвет текста параграфа изменится на красный. Что и требовалось доказать. Можно дописать, например, к любой комбинации еще один селектор тега и мы перевесим чашу весов в его пользу, даже если она и не стоит ниже в коде:

      Body #in p.sbox{color:blue} div.box #out{color:red}

      В этом случае цвет параграфа измениться на синий. Универсальный селектор «*» вообще никакого влияния на подсчет приоритетов не оказывает. Кстати, чуть выше мы рассмотрели способ повышения приоритета Css правил с помощью добавления Important. В нашем примере это может выглядеть так:

      P {color:green !important} #in p.sbox{color:blue} div.box #out{color:red}

      Какого цвета будет в этом случае текст параграфа? Зеленым, конечно же. И даже считать ничего не нужно, ибо добавление Important к стилевому свойству решает этот спорный вопрос однозначно, где бы оно в коде не стояло и сколько у него селекторов не было.

      Но Important не является единственным способом безоговорочного повышения приоритета свойства. Второй способ повышения может заключаться в использовании стилевых свойств в атрибуте Style нужного вам Html элемента.

      Т.е. прописываете внутри того же многострадального тега P атрибут Style с заданием любого цвета:

      Содержимое контейнера

      Ну и все. Теперь вне зависимости от того, какие свойства прописаны для этого элемента во внешнем файле таблицы стилей или же внутри тегов Style Html кода, цвет текста параграфа будет желтым.

      Но вот свойства с Important он перебить не сможет. Т.е. в последнем примере, где мы добавили правило «p {color:green !important}», цвет текста по-прежнему будет зеленым, даже несмотря на style="color:yellow".

      На самом деле приоритет двух правил (с Important во внешнем файле таблицы стилей и в атрибуте style) равный, а значит нужно переходить к подсчету селекторов. А разве они могут быть внутри атрибута style?

      Да никаких не может быть, а это значит, что правило, прописанное в атрибуте style, всегда проиграет правилу с Important только за счет меньшего числа селекторов (ноль будет меньше любого числа).

      Ну, а что же тогда даст наибольший приоритет Css свойству ? Правильно, его оно будет прописано в атрибуте style да еще с Important:

      Содержимое контейнера

      В этом случае цвет текста параграфа будет желтым и перебить это уже ничем в авторских стилях будет невозможно. Мы нашли абсолютный способ задания стилей. Его сможет перебить только пользователь со своим собственным файлом стилей и прописанным для этого свойства Important.

      Итак, давайте попробует составить список факторов, влияющих на приоритет свойства в авторских стилях по мере их убывания:

      1. Прописывание свойства в атрибуте style нужного тега вместе с Important
      2. Добавление Important к свойству во внешнем файле таблиц стилей или же в теге style прямо в Html коде
      3. Простое прописывание этого свойства в атрибуте style нужно элемента
      4. Использование бОльшего числа Id для данного свойства
      5. Использование большего числа селекторов классов, псевдоклассов или атрибутов
      6. Использование большего числа селекторов тегов и псевдоэлементов
      7. Более низкое расположение свойства в Css коде, при прочих равных условиях

      На самом деле правила в атрибуте style используются крайне редко (представьте себе, как трудно будет в этом случае вносить изменения во всем коде сайта, а не в отдельном файле CSS).

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

      А зачем и как вставлять свой код на чужие страницы? Нам может и незачем, а Яндекс и Гугл это делают, когда или на чужих площадках (наших с вами сайтах).

      Добавив во все элементы кода рекламных блоков атрибут style, с прописанными в нем свойствами и добавленным Important, можно уже не беспокоиться о том, что код объявлений будет изменен каким-либо образом (хотя объявления Яндекса все же можно менять за счет CSS и Important, видимо они не использовали этот метод).

      Удачи вам! До скорых встреч на страницах блога сайт

      посмотреть еще ролики можно перейдя на
      ");">

      Вам может быть интересно

      Селекторы тега, класса (class), Id и универсальные, а так же селекторы атрибутов в современном CSS
      Селекторы псевдоклассов и псевдоэлементов в CSS (hover, first-child, first-line и другие), отношения между тегами Html кода
      List style (type, image, position) - Css правила для настройки внешнего вида списков в Html коде
      Для чего нужен CSS, как подключить каскадные таблицы стилей к Html документу и основы синтаксиса этого языка