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

Содержание

Сложные селекторы с состояниями ссылок на 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 • Селекторы: подводные камни

  1. Селекторы по ID #

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

    Селектор по ID — самый тяжелый из всех, а это означает, что если вы задали стили по ID (например, #header A), переопределить их будет довольно сложно: для этого потребуется !important или ещё один селектор с ID.

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

  2. Составные селекторы #

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

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

    Например, сравните: .post .header SPAN и .post__author. У второго селектора ниже специфичность, сразу понятно что это за элемент, а кроме того, стили применятся только к элементам с таким классом, не затрагивая все прочие спаны, которые есть там сейчас, и которые могут появиться там в будущем.

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

    Проблему составных селекторов хорошо решает методология именования классов по БЭМ. При её грамотном использовании представление о разметке можно получить не выходя из CSS, а необходимость использовать сложные селекторы возникает крайне редко.

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

  3. nth-child и nth-of-type #

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

    Использование таких селекторов вместо классов выглядит заманчивой идеей, но развивать и поддерживать такой код может быть неудобно. Лучше использовать БЭМ-классы с модификаторами.

    Исключением могут быть совсем простые случаи, когда надо, например, покрасить строки таблицы через одну. Это удобно делать с помощью nth-child(odd).

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

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

Расширенные селекторы относятся к селекторам CSS, которые делают что-то более сложное, чем выбор тега, класса или идентификатора. Это включает в себя выбор типа тега внутри другого тега или выбор элемента с определенным идентификатором или классом, но только при наведении на него мышки.

Обязательное видео

Расширенные селекторы

Продолжая серию видео DevTips «Основы CSS» на YouTube, посмотрите следующее видео о продвинутых селекторах CSS:

Расширенные селекторы

Для справки, вот пример обсуждаемых расширенных типов и форматов селекторов. в видео:

Селектор Stacking

Селектор Stacking выбирает несколько типов элементов. Элементы перечислены в той же строке, что и правило CSS, разделенные запятой, например:

 а, сильный {
  красный цвет;
}
 

В этом примере все теги и будут окрашены в красный цвет. Селекторы стекирования помогают сохранить таблицы стилей СУХИМИ, применяя одинаковые стили к нескольким элементам в одном правиле.

Селектор All/Universal

Селектор all

, также называемый универсальным селектором , обозначается символом * . Он выбирает всего в HTML:

 * {
  маржа: 0;
}
 

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

Селектор потомков

Список нескольких селекторов с пробелом между ними создает селектор потомков , например:

 li a {
  красный цвет;
}
 

Это правило превратит все теги , которые являются дочерними тегами

  • теги красные.

     ли ли {
      красный цвет;
    }
     

    Во втором примере тега вложены в

  • тега, из которых также вложены в другой
  • тег красного цвета.

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

    s с акцентом класса красным:

     div .emphasis {
      красный цвет;
    }
     

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

    Селектор прямого потомка

    Селектор прямого потомка выбирает дочерние элементы, вложенные в один слой глубоко внутри DOM. Обозначается символом > . Левая сторона символа содержит родителя, а правая сторона содержит прямого потомка, на которого мы ориентируемся, например:

     .контейнер > ул {
      граница: 4 пикселя сплошного красного цвета;
    }
     

    Если бы это правило применялось к следующему HTML-коду, один

      имел бы красную рамку, а другой — нет, потому что только один является прямым потомком элемента div с контейнером класса :

       ...
      <дел>
        // Этот 
        будет иметь красную рамку, потому что он вложен непосредственно в // родитель с классом 'контейнер': <ул>
      • Один
      • Два
      • Три
      • // Этот второй
          *НЕ* будет иметь красную рамку, потому что это не напрямую // внутри div-контейнера: <ул>
        • Красный
        • Синий
        • Зеленый
    . ..

    Смежный селектор

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

    элементов красным, а — только , если они сразу следуют за
  • Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *