Некоторые концепции для новичков: Как работают селекторы в CSS

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

В примере, приведенном ниже, CSS будет содержаться в файле с именем style.css ссылка на который будет содержаться в HTML - документе с именем index.html. Это - два разных файла. И это - одна из важных особенностей CSS, хранение дизайна отдельно от разметки.

Вот как выглядит HTML - файл:

Index.html:

<!DOCTYPE html>
 <html lang="en"> 
 <head>  
 <title> Мы изучаем селекторы!</title> 
  <link rel="stylesheet" href="style.css">
 </head>
  <body>      
<h1 id="yay">Yay</h1> 
 <body> 
</html>

А CSS - файл будет содержать лишь блок селекторов, который мы видим ниже.

ID selector

CSS:

#happy-cake {  }

HTML:

<!-- БУДЕТ работать -->
 <div id="happy-cake"></div>  
<!-- БУДЕТ работать --> 
<aside id="happy-cake"></aside>  
<!-- НЕ БУДЕТ работать --> 
<div id="sad-cake">НЕ ВЕРНЫЙ  ID!</div>
  <!-- НЕ БУДЕТ работать --> 
<div class="happy-cake">Это не является ID!</div>

Повышаем уровень

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

Селектор класса

CSS:

.module {  }

HTML:

<!-- БУДЕТ работать -->
 <div class="module"></div> 
 <!-- БУДЕТ работать --> 
<aside class="country module iceland"></aside> 
 <!-- НЕ БУДЕТ работать -->
 <div class=".module">Точка для CSS, не для HTML</div> 
 <!-- НЕ БУДЕТ работать--> 
<div class="bigmodule">Неверный класс</div>

Повышаем уровень

Селекторы классов - наши друзья. Возможно, это самые используемые и универсальные селекторы. Отчасти потому, что они поддерживаются всеми браузерами.

Отчасти потому, что вы можете добавить несколько классов (разделяемых пробелами) для HTML-элементов. Отчасти потому, что есть некоторые JavaScript-трики, с помощью которых вы можете манипулировать классами.

Селектор тегов

CSS:

h2 {  }

HTML:

<!-- БУДЕТ работать --> 
<h2>Привет, мама </h2>  
<main> 
  <div>      
<!-- Будет работать--> 
     <h2> Везде </h2> 
  </div>
 </main>  
<!-- НЕ будет работать--> 
<div class="h2">Неверный тег, не сработает </div>  
<!-- НЕ будет работать -->
 <h2class="yolo"> Убедитесь, что после тега есть пробел! </h2>

Повышаем уровень

Наибольшая польза от селекторов тегов ощущается при изменении свойств, которые являются уникальными для HTML - элемента. К примеру, установка list-style для элемента <ul> или tab-size для элемента <pre>. А также там, где нужно сбросить стили, которые браузер применяет к определенным элементам.

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

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

CSS:

[data-modal="open"] {  }

HTML:

<!-- БУДЕТ работать -->
 <div data-modal="open"></div> 
 <!-- БУДЕТ работать --> 
<aside class='closed' data-modal='open'></aside>
  <!-- НЕ БУДЕТ работать --> 
<div data-modal="false"> Неверное значение </div> 
 <!-- НЕ БУДЕТ работать --> 
<div data-modal>Нет значения </div> 
 <!-- НЕ БУДЕТ работать -->
 <div data-modal-open> Неверный атрибут </div>

Повышаем уровень

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

Что ж, резонно, но учтите, что селекторы атрибутов НЕ поддерживаются в IE6.

Селекторы позиций

CSS:

:nth-child(2) {  }

HTML:

<ul>   
<li>nope</li>  
 <!-- БУДЕТ работать-->  
 <li>yep, I'm #2</li>
   <li>nope</li> 
</ul>

Повышаем уровень

Есть несколько различных позиционных селекторов :nth-child. Используя простые выражения (как 3n = "каждый третий") вы можете выбирать элементы на основе их положения в HTML-документе. Вы можете поэкспериментировать с этой идеей здесь или же использовать несколько готовых рецептов.

Псевдо-селекторы

CSS:

:empty {  }

HTML:

<!-- БУДУТ работать -->
 <div></div>
  <!-- БУДУТ работать -->
 <aside data-blah><!-- nothin' --></aside>
  <!-- НЕ БУДУТ работать -->
 <div> </div>
  <!-- НЕ БУДУТ работать --> 
<div>
 </div>

Повышаем уровень

:empty является одним из множества псевдо-селекторов, которые вы можете узнать по двоеточию (:). Как правило, они представляют собой нечто, что вы не сможете распознать по элементу или атрибуту по - отдельности.

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

Повышаем уровень

Селекторы можно объединять:

CSS:

.module.news {    
 /* Выбирает элементы из этих классов */
 } 
#site-footer::after {   
/* Добавляет  контент после элемента с ID */ 
} 
section[data-open] {  
 /* Выбирает только элементы раздела, если у них есть этот атрибут */ 
}

Есть также комбинации селекторов, таких как ~ и + и > которые влияют на селекторы, следующим образом:

CSS:

.module > h2 {   
/* Выбирает h2 элементы, которые являются прямыми потомками элемента этого класса */ 
}  
h2 + p {  
 /* Выбирает элементы p которые следуют непосредственно за элементом h2 */
 } 
li ~ li {   
/* Выбирает элементы li которые родственны (и следуют) за другими элементами li. */
 }

РедакцияПеревод статьи «Beginner Concepts: How CSS Selectors Work»