Блог Vaden Pro

Все о самостоятельном создании и продвижении сайтов

Все о селекторах потомка в CSS

Раздел: 

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

CSS селекторы потомка

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

Подробнее о "родственных" связях тегов

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

Например:

p a {
   text-decoration: underline;
}

Всем ссылкам, которые имеют родителя «p», будет применён стиль text-decoration.

Стоит отметить, что уровень вложенности никак не влияет на применения стиля. Так, например, если код будем иметь вид:

<div>
   <p>в тексте идёт<a href=#”>ссылка </a></p>
   <ul>
      <li>затем список и в нём <a href=#”>тоже есть ссылка</a></li>
      <li>и строка без ссылки</li>
   </ul>
</div>

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

Стоит обратить внимание на длину цепочки селекторов - она ни чем не ограничена. Добавляя в неё дополнительные элементы мы лишь уточняем область, в которой будет применён стиль.

Рассмотрим наш пример с данной точки зрения: CSS добавит подчёркивание всем ссылкам на странице, у которых есть родственник «p», однако если изменить его на:

p li a {
   text-decoration: underline;
}

То первая ссылка, которая вложена только в «p», оформлена не будет, а та, которая вложена как в «p», так и в «li» получит стиль text-decoration.

Где используют?

Этот селектор встречается в практике наиболее часто. И это не удивительно, ведь с помощью его можно определить область влияния стилей. Он даёт нам гарантию, естественно при правильном написании, что стиль будет применён к необходимому нам элементу. Так, если в CSS написано:

.mainContent p {
   font-size: 20px;
   color: red;
}

То весь текст на странице внутри тэга с классом mainContent, который заключён в тэг p будет иметь размер шрифта в 20px и будет красного цвета. Так мы ограничиваем область применения наших стилей.

Часто стоит задача, что бы к одному и тому же элементу на странице были применены разные стили. Конечно, можно добавить к каждому элементу свой индивидуальный класс, например:

<div class=”left”>
   <h1>Список слева</h1>
   <ul>
      <li>Строка красная</li>
      <li>Строка красная </li>
   </ul>
</div>
<div class=”right”>
   <h2>Список справа</h2>
   <ul>
      <li> Строка синяя </li>
      <li> Строка синяя </li>
   </ul>
</div>
 
<style>
   .left li {
      color:red;
   }
   .right li {
      color:blue;
   }
</style>

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

header .button {
   width:500px;
   background: url(image/pic.jpg) no-repeat;
}
footer .button {
   width:150px;
   background: #000;
}

Рассмотренные выше примеры являются лишь частными случаями, из огромного списка задач для которых используется данный селектор. Во многом именно благодаря ему CSS обрёл такую гибкость в составлении селекторов.

Подводя итоги

  • Если элемент встречается один раз на странице, то использование селектора потомка может быть не оправданно.
    header .headerNav li {
       vertical-align:top;
       display: inline-block;
    }

    Достаточно будет:

    .headerNav li {
    vertical-align:top;
    display: inline-block;
    }
  • Использование лишних потомков говорит лишь о низкой квалификации верстальщика и не даёт ни чего кроме замедления процесса обработки файла CSS.
    form .webform .username input[type=”text”]{
    padding:5px;
    }

    Эту цепочку можно сократить до:

    form input[type=”text”]{
    padding:5px;
    }
  • Так как уровень вложенности не влияет на применение оформления к потомку, то стоит лишний раз проверить, не цепляют ли наши стили лишние элементы на странице.