Сложные селекторы css: Комплексные селекторы | WebReference

Селектор потомка — CSS — Дока

  1. Кратко
  2. Пример
  3. Как понять
  4. Как пишется
  5. Подсказки
  6. На практике
    1. Алёна Батицкая советует

Кратко

Секция статьи «Кратко»

Цепочка перечисленных через пробел селекторов обозначает вложенность от родительских элементов к потомку. Это позволяет управлять стилями вложенных элементов.

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

Пример

Секция статьи «Пример»

Скажем, цвет текста в абзацах карточки новостей должен отличаться от текста на всей странице. При этом все остальные стили для абзацев одинаковые.

<div>  <!-- Абзац текста на странице -->  <p>Если вам скажут...</p>  <div>    <h3>Все новости должны быть такими</h3>    <!-- Абзац текста внутри новостной карточки -->    <p>      У пингвинов, живущих в Московском зоопарке. ..    </p></div></div>
          <div>
  <!-- Абзац текста на странице -->
  <p>Если вам скажут...</p>
  <div>
    <h3>Все новости должны быть такими</h3>
    <!-- Абзац текста внутри новостной карточки -->
    <p>
      У пингвинов, живущих в Московском зоопарке...
    </p>
</div>
</div>

Стили текста для всей страницы:

.text {  color: #ffffff;  line-height: 1.4;}
          
.text { color: #ffffff; line-height: 1.4; }

Стили для текста, вложенного в блок .news-card:

.news-card .text {  color: #000000;}
          .news-card .text {
  color: #000000;
}
Открыть демо в новой вкладке

Как понять

Секция статьи «Как понять»

Часто пробел не имеет особого значения. Но не в CSS. При написании стилей пробел между селекторами является указателем взаимоотношений между элементами.

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

Подробнее можно прочитать в статье «Специфичность».

Как пишется

Секция статьи «Как пишется»

Всё просто! Берём один селектор. Берём второй селектор. Соединяем их при помощи пробела. Profit! 😉

Подсказки

Секция статьи «Подсказки»

💡 Кроме пробела есть разные комбинаторы для соединения двух селекторов: +, ~, >. Подробнее о них можно почитать в статье «Комбинированные селекторы». Но чаще всего вы будете пользоваться именно пробелом.

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

💡 Если разметка написана оптимально, и вы используете одну из методологий, то, скорее всего, обойдётесь в своих стилях вообще без вложенных селекторов.

На практике

Секция статьи «На практике»

Алёна Батицкая советует

Секция статьи «Алёна Батицкая советует»

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

Если вы нашли ошибку, отправьте нам пул-реквест!

Во время отправки формы что-то пошло не так. Попробуйте ещё раз?

Селектор по идентификатору

alt +

Универсальный селектор

alt +

Сложные селекторы с состояниями ссылок на CSS

Все сложные селекторы, которые мы изучали ранее, можно применять и для ссылок.

Давайте посмотрим на примере. Пусть наши ссылки находятся в блоке с заданным id:

<div> <a href="#">ссылка</a> <a href="#">ссылка</a> <a href="#">ссылка</a> </div>

Давайте зададим стили для ссылок из этого блока:

#block a:link, #block a:visited { color: red; } #block a:hover { text-decoration: none; }

Как правило, состояния link

и visited не разделяют, поэтому код можно упростить следующим образом:

#block a { color: red; } #block a:hover { text-decoration: none; }

Ссылка с классом

Пусть теперь сами ссылки имеют класс:

<a href="#">ссылка</a> <a href="#">ссылка</a> <a href="#">ссылка</a>

Давайте зададим стили для ссылок, имеющих такой класс:

a:link. eee, a:visited.eee { color: red; } a:hover.eee { text-decoration: none; }

Не имеет значения в каком порядке писать класс ссылки и псевдоклассы состояний. Можно переставить их местами и от этого ничего не изменится:

a.eee:link, a.eee:visited { color: red; } a.eee:hover { text-decoration: none; }

Практические задачи

Расскажите, что выбирает селектор в приведенном ниже коде. Затем напишите HTML код, подходящий под этот селектор. Вот код с селектором:

a { color: red; } a:hover { text-decoration: none; }

Расскажите, что выбирает селектор в приведенном ниже коде. Затем напишите HTML код, подходящий под этот селектор. Вот код с селектором:

a.zzz { color: red; } a.zzz:hover { text-decoration: none; }

Расскажите, что выбирает селектор в приведенном ниже коде. Затем напишите HTML код, подходящий под этот селектор. Вот код с селектором:

#block a.zzz { color: red; } #block a.zzz:hover { text-decoration: none; }

Расскажите, что выбирает селектор в приведенном ниже коде. Затем напишите HTML код, подходящий под этот селектор. Вот код с селектором:

.block a.zzz { color: red; } .block a.zzz:hover { text-decoration: none; }

расширенных селекторов | Проект Один

Введение

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

Эти селекторы могут быть особенно полезны, когда вы не можете (или не хотите) изменять HTML-разметку.

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

Как всегда, не стесняйтесь открывать редактор кода и проводить свои собственные эксперименты с этими селекторами — практика делает совершенным!

Результаты обучения

  • Понимание того, как использовать родительские и одноуровневые селекторы
  • Признать разницу между псевдоклассами и псевдоэлементами
  • Узнайте о некоторых наиболее полезных и распространенных псевдоэлементах и ​​псевдоклассах
  • Узнайте о различных способах выбора атрибута или его частей

Комбинаторы родителей и братьев и сестер

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

  • > — дочерний комбинатор
  • + — смежный родственный комбинатор
  • ~ — общий родственный комбинатор

Мы рассмотрим несколько практических примеров, используя этот образец разметки.

 <основной>
  <дел>
    <дел>
  
<дел> <дел>
<дел> <дел>

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

 основной раздел {
  /* Наш крутой CSS */
}
 

Но что, если мы хотим быть более конкретными и выбрать только дочерние или внучатые div? Вот где дочерний комбинатор > пригодится. В отличие от комбинатора потомков, он будет выбирать только прямых потомков.

 /* Это правило будет выбирать только элементы div с дочерним классом */
основной > раздел {
  /* Наш крутой CSS */
}
/* Это правило будет выбирать только элементы div с классом внука */
основной> раздел> раздел {
  /* Еще крутой CSS */
}
 

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

 /* Это правило выберет только div с дочерним классом group2 */
.группа1 + раздел {
  /* Наш крутой CSS */
}
/* Это правило выберет только div с дочерней группой group3 */
.group1 + div + div {
  /* Еще крутой CSS */
}
 

Наконец, если мы хотим выбрать всех дочерних элементов элемента, а не только первый, мы можем использовать общий комбинатор родственных элементов ~ .

 /* Это правило выберет все одноуровневые элементы .group1 — в данном случае 2-й и 3-й .child div */
.group1 ~ раздел {
  /* Наш крутой CSS */
}
 

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

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

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

обычно не существует в разметке . Если сразу это не имеет смысла, не волнуйтесь — мы рассмотрим несколько примеров ниже.

Псевдоклассы

Псевдоклассы предлагают нам различные способы нацеливания на элементы в нашем HTML. Их довольно много, и они бывают разных вкусов. Некоторые из них основаны на их положении или структуре в HTML. Другие основаны на состоянии определенного элемента или на том, как пользователь взаимодействует с ним в данный момент. Их слишком много, чтобы подробно описывать здесь, но мы рассмотрим некоторые из наиболее полезных. Псевдоклассы имеют ту же специфику, что и обычные классы (0, 0, 1, 0). Как и обычные классы, большинство из них можно объединить в цепочку.

Примечание: Приведенные выше (0,0,1,0) обозначения для расчета специфичности. Чтобы узнать больше о том, как это работает, просмотрите раздел «Вычисление значения специфичности CSS» в этой статье о специфичности CSS.

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

Динамические псевдоклассы и псевдоклассы действий пользователя

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

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

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

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

Вы когда-нибудь задумывались, почему ссылки синие, но становятся фиолетовыми при нажатии в нестилизованном HTML? Это потому, что браузеры реализуют этот стиль по умолчанию. Чтобы реализовать собственный стиль для ссылок, воспользуйтесь преимуществами псевдоклассов :link и :visited . Упрощенная версия стиля браузера по умолчанию может выглядеть примерно так:

.
 /* Это правило будет применяться ко всем ссылкам */
  а {
    оформление текста: подчеркивание;
  }
  /* Это относится к непосещенным ссылкам */
  ссылка {
    цвет синий;
  }
  /* Как вы уже догадались, это относится ко всем ссылкам, на которые нажимал пользователь */
  а: посетил {
    цвет: фиолетовый;
  }
 
Структурные псевдоклассы

Структурные псевдоклассы — это мощный способ выбора элементов на основе их положения в DOM.

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

:root , как правило, это место, где вы размещаете свои «глобальные» правила CSS, которые должны быть доступны везде — например, ваши пользовательские свойства и переменные CSS, или такие правила, как box-sizing: граница-коробка; .

:first-child и :last-child будут соответствовать элементам, которые являются первым или последним родственным элементом.

Аналогично, :empty будет соответствовать элементам, у которых вообще нет дочерних элементов, а :only-child будет соответствовать элементам, у которых нет родственных элементов.

Для более динамичного подхода мы можем использовать :nth-child . Это гибкий псевдокласс с несколькими вариантами использования.

 .myList:nth-child(5) {/* Выбирает 5-й элемент с классом myList */}
  .myList:nth-child(3n) { /* Выбирает каждый третий элемент с классом myList */}
  .myList:nth-child(3n + 3) { /* Выбирает каждый третий элемент класса myList, начиная с третьего */}
  .myList:nth-child(even) {/* Выбирает каждый четный элемент с классом myList */}
 

Псевдоэлементы

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

::маркер позволяет настроить стиль вашего

  • маркеров или номеров элементов.

    ::first-letter и ::first-line позволяют вам (как вы уже догадались!) придать особый стиль первой букве или строке некоторого текста.

    ::selection позволяет изменить подсветку, когда пользователь выбирает текст на странице.

    ::before и ::after позволяют нам добавлять дополнительные элементы на страницу с помощью CSS вместо HTML. Использование его для украшения текста различными способами является одним из распространенных вариантов использования.

     <стиль>
      .emojify:: перед {
        содержание: '😎 🥸 🤓';
    }
      .emojify :: после {
        содержание: '🤓 🥸 😎';
    }
    
    <тело>
      
    Давайте эмоджиифицируемэтот промежуток!

    Использование этих псевдоэлементов таким образом даст нам следующий результат:

    Давайте 😎 🥸 🤓 emojify 🤓 🥸 😎 этот промежуток времени!

    Есть намного больше! Быстро просмотрите документацию по псевдоэлементам, чтобы увидеть полный список того, что возможно.

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

    Последний инструмент, который мы собираемся добавить, — это селекторы атрибутов. Напомним, что атрибут — это любой элемент в открывающем теге HTML-элемента, например src='picture.jpg' или href="www.theodinproject.com" .

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

    Селекторы атрибутов имеют ту же специфичность, что и классы и псевдоклассы (0, 0, 1, 0).

    Давайте рассмотрим несколько примеров основного использования.

    • [атрибут] — Этот общий селектор выберет все, где существует данный атрибут. Его значение не имеет значения.
    • selector[attribute] — При желании мы можем комбинировать наши селекторы атрибутов с другими типами селекторов, такими как селекторы классов или элементов.
    • [attribute="value"] — Чтобы получить действительно конкретную информацию, мы можем использовать = для сопоставления определенного атрибута с определенным значением.
     [источник] {
        /* Это будет нацелено на любой элемент, имеющий атрибут src. */
      }
      изображение [источник] {
        /* Это будет нацелено только на элементы img, у которых есть атрибут src. */
      }
      img[src="puppy.jpg"] {
        /* Это будет нацелено на элементы img с атрибутом src, который точно равен «puppy.jpg» */
      }
     

    Иногда нам требуется более общий подход к доступу к этим атрибутам. Например, возможно, нас интересуют только элементы img , где значение атрибута src заканчивается на 9.=’аус’] { /* Классы тоже являются атрибутами! Это будет нацелено на любой класс, который начинается с «aus»: */ } [источник$=’.jpg’] { /* Это будет нацелено на любой атрибут src, оканчивающийся на ‘.jpg’: src=’щенок.jpg’ src=’котенок.jpg’ */ } [для*=’больной’] { /* Это будет нацелено на любой атрибут for, внутри которого есть ‘ill’: для = «счет» для = «Джилл» для = «глупо» для = «больной» */ }

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

    Назначение

    1. Полная закусочная CSS. Вы должны быть знакомы с большей частью содержания первых двух упражнений, но практика и повторение никогда не помешают! Не забудьте прочитать примеры и пояснения справа.
    2. Прочтите статью Шэя Хоу о сложных селекторах. Это охватывает большую часть содержания этого урока немного более подробно.

    Дополнительные ресурсы

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

    • У Кевина Пауэлла есть множество видеороликов по некоторым из этих тем, если вы хотите глубже погрузиться в них.
    • Альманах CSS Tricks содержит отличный справочник по всем псевдоэлементам и селекторам. Он включает примеры, дополнительные ресурсы и таблицы поддержки браузеров.
    • W3 Schools также имеет солидный и более краткий справочный список. Включает интерактивный инструмент выбора, если вы хотите поиграть с примерами.
    • Шпаргалка по селектору Free Code Camp содержит подробный обзор некоторых из наиболее распространенных селекторов.
    • Хорошая краткая статья о различиях между псевдоклассами и псевдоэлементами. Также предоставляет исчерпывающую информацию о различных типах селекторов.
    • Smashing Magazine об укрощении расширенных селекторов CSS
    • Уловки CSS для селекторов атрибутов помогут, если вам нужно глубже изучить атрибуты.

    Проверка знаний

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

    • В чем разница между комбинатором-потомком и комбинатором-потомком?
    • Чем отличается синтаксис псевдоклассов и псевдоэлементов?
    • Существуют ли где-нибудь в HTML псевдоклассы? Есть ли псевдоэлементы?
    • Назовите два способа выбора каждого второго дочернего элемента элемента, начиная с первого.
    • В чем разница между div:first-child и div:last-child ? Что выберет каждый?
    • Какой селектор вы бы использовали для стилизации кнопки, над которой в данный момент находится курсор? Как насчет того, на который в данный момент нажимают?
    • Как можно выбрать все элементы ввода с типом текста?
    • Как вы могли выбрать все классы, которые начинаются с гром ?

    Расширенные селекторы CSS для распространенных сценариев

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

    CSS Grid, BEM, Dart Sass, всегда есть что-то новое, что можно узнать о CSS. Это потрясающе! Вместо того, чтобы смотреть на то, что нового, давайте сосредоточимся на фундаментальном строительном блоке CSS — селекторе. Благодаря лучшему пониманию селектора и тому, как использовать его более продвинутыми способами, вы сможете решать распространенные сценарии с меньшим количеством кода и более чистым CSS.

    Что такое селектор?

    Давайте удостоверимся, что мы на одной волне. Селектор CSS — это то, как вы можете указать браузеру, к какому элементу применить свойства. Они могут быть общими и применяться к большой группе элементов или быть более конкретными и применяться только к одному элементу HTML. Существует пять типов селекторов:

    • Простые селекторы для выбора элементов HTML, таких как div , #id или .class
    • Селекторы комбинатора, основанные на кодовых связях, таких как «дочерние» p > div или «соседний брат» div + div
    • Селекторы псевдокласса для выбора определенного состояния элемента, такого как :hover , :first-child или :nth-of-type
    • Селекторы псевдоэлементов для выбора конкретных частей элемента, например ::after , ::selection или ::first-letter . Обратите внимание, что они всегда используют нотацию с двойным двоеточием :: по сравнению с селекторами псевдоклассов, которые используют одно двоеточие
    • Селекторы атрибутов для выбора элементов с определенными атрибутами, такими как ( [class|="class-name"] , [type="text"] или [target]

    Если для объявления стиля одного и того же элемента используются два отдельных селектора, победит более конкретный селектор — независимо от их порядка в вашем файле CSS. Например, селектор класса, такой как .class-name , является более конкретным, чем обычный селектор элемента HTML, такой как span . Если вам нужно освежить в памяти то, как браузеры решают, какие стили CSS применять, также известный как каскад CSS, попробуйте этот тест.

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

    :n-последний-потомок(-n + 2)

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

     <родительский>
        <ребенок>
        <ребенок>
     

    Есть :first-child , :nth-child , :nth-of-type , и этот список можно продолжить. Эти селекторы становятся еще более мощными, когда они превращаются в выражения с использованием чисел, счетчика n , нечетного или четного . Вы можете выполнить математику, чтобы выбрать практически любое количество элементов в группе. Например, n — это способ создания алгебраических выражений. Итак, (2n+4) приравнивается к (2*n)+4 , что выберет все остальные элементы, начиная с четвертого:

     (2*0)+4 = 4
    (2*1)+4 = 6
    (2*2)+4 = 8
    (2*4)+4 = 10 

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

     .item:nth-last-child(-n+2) 

    Этот селектор можно прочитать как «выбрать двух последних дочерних элементов .item ». Глядя на то, как это работает, -n+2 соответствует (-0+2)=2 или предпоследний элемент, затем (-1+2)=1 или последний элемент, затем (-2+2)=0 , который ничего не выбирает , затем (-3+2=-1) , что снова ничего не выбирает, и так далее для общего количества дочерних элементов. Выбраны только два элемента из-за отрицательного знака перед n , что приводит к обратному отсчету. Если вы хотите выбрать последние три элемента, -n+3 сделает именно это. Это позволяет нам выбирать эти элементы, ничего не добавляя в HTML!

    См. демонстрацию селектора Pen
    — :nth-last-child(-n+2) Эндрю Спенсера (@iam_aspencer)
    на CodePen.

    :не(:последний ребенок)

    Чтобы еще больше развить последний пример, вы можете комбинировать :last-child с селектором :not . Это может помочь в случаях, когда последний элемент в группе имеет другой стиль. Веб-сайты часто запрашивают список элементов с некоторым интервалом между ними. Распространенной проблемой в этих сценариях является необходимость удаления пробела под последним элементом в группе.


    Часто с помощью CSS может показаться естественным сначала задать стиль наиболее распространенному сценарию, а , а затем учитывать любые отдаленные сценарии с более конкретным селектором. Затем стили более конкретного селектора переопределяют стили более общего селектора. Что в нашем примере может привести к чему-то вроде этого:
     .изображение {
      поле внизу: 2re;
      &:последний ребенок {
        нижняя граница: 0;
      }
    } 

    Или вы могли добавить в HTML совершенно новый класс, используя структуру CSS БЭМ. Что даст вам это:

     .изображение {
      поле внизу: 2re;
    }
    .изображение -- последний {
      нижняя граница: 0;
    } 

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

     .image: не (: последний ребенок) {
      поле внизу: 2re;
    } 

    Читая селектор выше, он говорит: «выберите изображение, которое не является последним потомком». Три строки кода и никаких переопределяющих стилей — неплохо!

    См. демонстрацию селектора Pen
    — :nth-last-child(-n + 2) Эндрю Спенсера (@iam_aspencer)
    на CodePen.

    element:hover + соседний брат

    Давайте рассмотрим другой сценарий — состояния наведения. Иногда вам нужно настроить элемент, который отличается от элемента, на который наведен курсор. В JavasScript это довольно просто, поскольку JavaScript упрощает поиск определенного элемента, что также называется обходом DOM. Однако часто с правильной структурой HTML вам нужен только CSS.

    С помощью CSS вы можете использовать селекторы-комбинаторы, такие как .parent > .child или .element + .general-sibling , для выбора различных элементов. Единственное, что не может сделать CSS, — это настроить таргетинг на элемент, являющийся родителем элемента, на который наведен курсор. Вот диаграмма того, на что может ориентироваться CSS:

    .
     <дел>
      <а>
        Элемент, на который наведен курсор
        Это дочерний элемент, CSS может стилизовать его
      
      Это родственный элемент, CSS может стилизовать его
      «Родительский» 
    не может быть оформлен с помощью CSS при наведении курсора на

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

    См. демонстрацию селектора Pen
    — :hover + sibling by Andrew Spencer (@iam_aspencer)
    на CodePen.

    Селектор того же уровня можно также использовать для полей формы. С помощью селектора label:hover + input взаимодействие с элементом можно использовать для выделения , который является родственным после .

    См. демонстрацию селектора Pen
    — ссылка :hover + sibling by Andrew Spencer (@iam_aspencer)
    на CodePen.

    Ваша очередь

    В следующий раз, когда вы подумаете, что CSS — это второстепенный язык, подумайте еще раз. Это просто… другое. И это может быть разочаровывающим или полезным в зависимости от вашей точки зрения. Прежде чем вы откажетесь от CSS и прибегнете к добавлению большего количества HTML или раздуете все вокруг с помощью JavaScript, взгляните на селекторы и свойства CSS, которые вы можете использовать.