Приоритеты в Css (Important), примеры комбинаций и группировки селекторов, пользовательские и авторс…




Приоритеты в Css (Important), примеры комбинаций и группировки селекторов, пользовательские и авторские стили

Рубрика: Уроки CSS

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

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

Комбинации Css селекторов — контекстные


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

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

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

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

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

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

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

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

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

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

body > p {color:red}

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

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


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

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

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

h1 ~ p {color:red}

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

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

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

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

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

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


Теперь давайте подумаем, а какое стилевое оформление будет использовать браузер, если никаких Css стилей для данного элемента Html кода не задано? А для этого существует соответствующая спецификация валидатора WC3, где все это описано. Для этого на странице со спецификацией CSS нужно прокрутить текст до конца и перейти по ссылке «Default style sheet for HTML 4»:

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

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

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

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

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

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

p {color:red !important;}

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

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

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

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

Приоритеты Css свойств в авторских стилях

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

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

<div id="in" class="box">
     <p id="out" class="sbox">Содержимое контейнера </p>
</div>

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

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

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

А теперь давайте добавим ко второму селектору (класса) еще одно Css свойство, которое будет конфликтовать со свойством селектора параграфа:

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

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

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

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

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

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

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

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

div p {color:red}
p {color:blue}

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

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

<div id="in" class="box">
     <p id="out" class="sbox">Содержимое контейнера </p>
</div>

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

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

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

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

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

Тут будет действовать правило — кто последний, то и прав. Поэтому в моем примере цвет текста параграфа будет синим, ибо это Css свойство (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 к Css свойству решает этот спорный вопрос однозначно в пользу свойства с Important, где бы оно в коде не стояло и сколько у него селекторов не было.

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

<div id="in" class="box">
     <p id="out" class="sbox" style="color:yellow">Содержимое контейнера </p>
</div>

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

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

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

<head>
<style>
p {color:green !important}
#in p.sbox{color:blue}
div.box #out{color:red}
</style>
</head>
<body>
<div id="in" class="box">
     <p id="out" class="sbox" style="color:yellow !important">Содержимое контейнера </p>
</div>
</body>

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

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

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

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

На этом изучение Css селекторов можно считать законченным и в следующей статье мы уже начнем разбирать Css правила.

0
6

Этой страницей поделились 27 раз(а). Показать твиты.

Самое интересное и полезное из категории Уроки CSS:
  1. CSS (Ксс) селекторы псевдоклассов и псевдоэлементов (hover, first-child, first-line и др.)
  2. CSS селекторы тега, класса (class), Id, универсальный селектор и селекторы атрибутов
  3. Единицы размеров (пикселы, Em и Ex) в CSS для шрифтов, цвет и наследование правил в CSS
  4. CSS (таблицы каскадных стилей) — что это такое, Style и Link для связывания языка Css и Html
  5. Для чего нужен CSS, как подключить каскадные таблицы стилей к Html документу, синтаксис CSS
  6. Z-index и CSS правило Cursor
  7. Position (absolute, relative и fixed) — способы позиционирования Html элементов в CSS (правила left…
  8. Float и clear в CSS — инструменты блочной верстки
  9. Height, width и overflow — CSS правила для описания области контента при блочной верстке


http://ktonanovenkogo.ru/html/uroki-css/prioritety-css-important-kombinacii-gruppirovka-selektorov-polzovatelskie-avtorskie-stili.html

Губарь Маргарита Александровна