Статьи

Псевдоклассы CSS:: not () и: target

cssmasterthumb

Ниже приводится выдержка из нашей книги CSS Master , написанной Тиффани Б. Браун. Копии продаются в магазинах по всему миру, или вы можете купить их в электронном виде здесь .

Как упоминалось ранее в этой главе, псевдоклассы помогают нам определять стили для документов на основе информации, которую невозможно извлечь из дерева документов или на которую нельзя ориентироваться с помощью простых селекторов. К ним относятся логические и лингвистические псевдоклассы, такие как :not() и :lang() . Он также включает инициируемые пользователем псевдоклассы, такие как :hover и :focus .

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

Выделение фрагментов страницы с помощью :target

Идентификатор фрагмента — это часть URL, которая следует за # ; например, #top или #footnote1 . Вы, вероятно, использовали их для создания навигации внутри страницы: так называемой «ссылки перехода». С помощью псевдокласса :target мы можем выделить часть документа, которая соответствует этому фрагменту, и мы можем сделать это без JavaScript.

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

 <section id="comments"> <h2>Comments on this post</h2> <article class="comment" id="comment-1146937891">...</article> <article class="comment" id="comment-1146937892">...</article> <article class="comment" id="comment-1146937893">...</article> </section> 

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

TargetPseudoClass

Каждый комментарий в вышеупомянутом коде имеет идентификатор фрагмента, что означает, что мы можем напрямую ссылаться на него. Например, <a href="#comment-1146937891"> . Затем все, что нам нужно сделать, это указать стиль для этого комментария, используя псевдокласс :target :

 .comment:target { background: #ffeb3b; border-color: #ffc107 } 

Когда часть идентификатора фрагмента URL совпадает с частью комментария (например, http://example.com/post/#comment-1146937891 ), этот комментарий будет иметь желтый фон, как показано ниже.

TargetPseudoClass2

Вы можете использовать любую комбинацию CSS с :target , что открывает некоторые забавные возможности, такие как закладки без JavaScript. Крейг Баклер подробно описывает эту технику в своем уроке «Как создать элемент управления вкладками только для CSS3 с помощью :target Selector». Мы немного его обновим, чтобы использовать больше функций CSS3. Сначала давайте посмотрим на наш HTML:

 <div class="tabbed-widget"> <div class="tab-wrap"> <a href="#tab1">Tab 1</a> <a href="#tab2">Tab 2</a> <a href="#tab3">Tab 3</a> </div> <ul class="tab-body"> <li id="tab1"> <p>This is tab 1.</p> </li> <li id="tab2"> <p>This is tab 2</p> </li> <li id="tab3"> <p>This is tab 3.</p> </li> </ul> </div> 

Это довольно просто, состоит из вкладок и связанного с ними содержимого вкладок. Давайте добавим немного CSS:

 [id^=tab] { position: absolute; } [id^=tab]:first-child { z-index: 1; } [id^=tab]:target { z-index: 2; } 

Вот где происходит волшебство. Во-первых, мы абсолютно позиционировали все наши вкладки. Затем мы сделали нашу первую вкладку самым верхним слоем, добавив z-index: 1 . Это важно, только если вы хотите, чтобы первая вкладка в исходном порядке была первой вкладкой, которую увидят пользователи. Наконец, мы добавили z-index: 1 к нашей целевой вкладке. Это гарантирует, что целевой слой всегда будет самым верхним. Вы можете увидеть результат ниже.

PseudoClassTabs

Совет: улучшение доступности

Более доступная версия может также использовать JavaScript для переключения атрибутов hidden или aria-hidden=true зависимости от видимости каждого тела вкладки.

Нажатие на вкладку обновляет URL с новым идентификатором фрагмента документа. Это в свою очередь вызывает состояние :target .

Отключение селекторов с помощью :not()

Возможно, самым мощным из этого нового поколения псевдоклассов является :not() . Он возвращает все элементы, кроме тех, которые соответствуют аргументу селектора. Например, p:not(.message) выбирает каждый элемент p котором отсутствует класс message .

Псевдокласс :not() — это то, что называется функциональным псевдоклассом . Он принимает один аргумент, как и функции в других языках программирования. Любой аргумент, передаваемый :not() должен быть простым селектором, таким как тип элемента, имя класса, идентификатор или другой псевдокласс. label.checkbox потерпят неудачу, как и составные селекторы, такие как label.checkbox или сложные селекторы, такие как p img .

Вот пример формы, которая использует текстовые типы ввода и переключатели:

 <form method="post" action="#"> <h1>Join the Cool Kids Club</h1> <p> <label for="name">Name:</label> <input type="text" id="name" name="name" required> </p> <p> <label for="email">Email:</label> <input type="email" id="email" name="email" required> </p> <fieldset> <legend>Receive a digest?</legend> <p> <input type="radio" id="daily" name="digest"> <label for="daily" class="label-radio">Daily</label> <input type="radio" id="weekly" name="digest"> <label for="weekly" class="label-radio">Weekly</label> </p> </fieldset> <button type="submit">Buy Tickets!</button> </form> 

В HTML метки, связанные с типом radio имеют .label-radio . Мы можем использовать псевдокласс :not() : для нацеливания на эти элементы без класса label-radio , как показано на рисунке ниже:

 label:not(.label-radio) { font-weight: bold; display:block; } 

NotSelector1

Вот более хитрый пример. Давайте создадим стили для ввода текста. К ним относятся типы ввода, такие как number , email и text а также password и url . Но давайте сделаем это, исключив переключатель, переключатель и диапазон ввода. Ваш первый инстинкт может заключаться в использовании следующего списка селекторов:

 ([type=radio]), input:not([type=checkbox]), input:not([type=range]) { ... } 

К сожалению, это не сработает, так как каждый селектор отменяет предыдущий. Это эквивалент ввода:

 input:not([type=radio]){ ... } input:not([type=checkbox]) { ... } input:not([type=range]) {... } 

Вместо этого нам нужно связать псевдоклассы our :not() , чтобы они все фильтровали элемент input : [4]

 input:not([type=radio]):not([type=checkbox]):not([type=range]) { ... } 

Использование псевдоклассов (и псевдоэлементов) без простого селектора эквивалентно использованию его с универсальным селектором. Другими словами :not([type=radio]) — это то же самое, что и *:not([type=radio]) . В этом случае каждый элемент, у которого отсутствует атрибут type и значение radio будет соответствовать ―, включая html и body . Чтобы предотвратить это, используйте :not() с селектором, таким как имя класса, идентификатор или селектор атрибута. Кстати, это также верно для имен классов, идентификаторов и селекторов атрибутов: .warning и [type=radio] такие же, как *.warning и *[type=radio] .

Селекторы CSS Уровень 4 уточняет способ :not() работает, так что он может принимать список в качестве аргумента, а не только простые селекторы. Вместо того, чтобы связывать псевдоклассы, как ранее, мы сможем использовать аргумент через запятую:

 input:not([type=radio], [type=checkbox], [type=range]) { ... } 

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


[4] Селекторная цепочка ниже также будет соответствовать элементам [type=image] , [type=reset] , [type=color] и [type=submit] .