Статьи

Знакомство с селекторами CSS3: другие псевдоклассы

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

UI Элемент State Псевдоклассы

В то время как структурные псевдоклассы полагаются на относительное положение элемента, псевдоклассы на основе состояния нацеливают элементы в соответствии с их состоянием, например, является ли элемент активным или сфокусированным. Вы уже должны быть знакомы с идеей псевдоклассов состояния (таких как :link ,: visit,: :hover и :active ), которые были введены в CSS1 для якорных ( <a> ) элементов.

В CSS2.1 был представлен псевдокласс :focus , который расширил селекторы на основе состояния за пределы гиперссылок, чтобы сформировать такие элементы, как input и textarea. CSS3 содержит еще три псевдокласса, которые вы можете использовать для нацеливания состояний пользовательского интерфейса для элементов формы :disabled :enabled и :checked .

Обзор синтаксиса

Синтаксис для всех псевдоклассов прост. Каждое имя псевдокласса начинается с двоеточия:

:pseudo-class {}

Ваш селектор может включать в себя только псевдокласс, как в предыдущем примере, который будет нацелен на все соответствующие элементы, или вы можете быть более точным, добавив псевдокласс к элементу ( e ), селектору класса или идентификатора, например так:

 e:pseudo-class {} .class:pseudo-class {} #id:pseudo-class {} 

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

 a:hover { background-color: #ccc; text-decoration: none; } 

:отключен

Псевдокласс : disabled предназначается для элементов ввода, у которых есть атрибут disabled, что делает элемент ввода не кликабельным и непригодным для использования:

<input type="text" name="name" disabled />

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

<input type="text" name="name" disabled="disabled" />

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

Default Styling of Disabled and Enabled Form Inputs

Однако вы можете использовать псевдокласс :disabled чтобы переопределить этот стиль по умолчанию и получить результаты, показанные здесь.

 input:disabled { background-color: #ccc; border: 0; padding: 3px 2px; } 

Disabled Form Input with Unique Style

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

 input[disabled="disabled"] { background-color: #ccc; border: 0; padding: 3px 2px; } 

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

: включен

Псевдокласс : enabled предназначен для состояния входов по умолчанию:

 input:enabled { background-color: rgb(255, 255, 255); border: 1px solid rgb(125,104,99); } 

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

 <form> <legend>What's your favorite zombie movie?</legend> <input type="radio" name="FavMovie" id="28Days" /> <label for="28Days">28 Days Later</label> <input type="radio" name="FavMovie" id="Army" /> <label for="Army">Army of Darkness</label> <input type="radio" name="FavMovie" id="Night" /> <label for="Night">Night of the Living Dead</label> <input type="radio" name="FavMovie" id="Reanim" /> <label for="Reanim">Re-Animator</label> <input type="radio" name="FavMovie" id="Shaun" /> <label for="Shaun">Shaun of the Dead</label> <input type="radio" name="FavMovie" id="Other" /> <label for="Other">Other</label> <input type="text" id="OtherEntry" disabled /> <input type="submit" /> </form> 

Form with a Disabled Text Input Field

В HTML текстовый ввод для параметра «Другое» отключен, и я оставил стиль браузера по умолчанию на месте. Но когда пользователь выбирает переключатель «Другой», я хочу включить отключенный ввод. Атрибут disabled можно удалить с помощью небольшого JavaScript , а стиль может немного измениться, как показано здесь, чтобы помочь пользователю уведомить, что поле ввода может принимать запись. Форма теперь появляется так, как показано ниже.

 input:enabled { background-color: rgb(255, 255, 204); } 

Selecting the Other Option Enables the Input Field and Applies a Style

: проверено

Псевдокласс : флажок предназначен для выбранных входов радио и флажков. Это позволяет вам стилизовать элементы, которые предварительно выбираются разработчиком через проверенный атрибут или выбираются пользователем в пользовательском интерфейсе. Псевдокласс :checked может быть полезен в матрице или длинном списке переключателей (или флажков), в которых у пользователя могут возникнуть трудности при определении того, какая опция выбрана. Для краткости давайте посмотрим, как :checked можно применить к простой форме отказа, в которой предварительно выбран переключатель (см. Рисунок 6).

HTML-код для этого примера включает переключатель с логическим атрибутом флажка:

  <Форма>

     <legend> Хотите ли вы текстовые уведомления о зомби-апокалипсисе? </ legend>

     <input type = "radio" name = "notify" id = "yes" проверено /> <label for = "yes"> Да </ label>

     <input type = "radio" name = "notify" id = "no" /> <label for = "no"> No </ label>

     <input type = "submit" />

 </ Форма> 

И вот CSS, чтобы нацелиться на выбранный переключатель:

 input:checked { border: 1px solid rgb(255, 0, 0); } 

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

 input[type="radio"]:checked { border: 1px solid rgb(255, 0, 0); } 

Opera Rendering of a Preselected Radio Button

К сожалению, большинство браузеров ограничивают стили ввода радио и чекбоксов. В этих случаях стили, указанные с помощью селектора :checked просто не будут отображаться. Из браузеров, которые я использую, только Opera / OS X показала показанные результаты, и, честно говоря, это просто ужасно и, вероятно, сбило бы с толку пользователя. Тем не менее, вы можете использовать псевдокласс :checked вместе со смежным одноуровневым комбинатором, чтобы стилизовать текст метки для переключаемого флажка. Вот CSS. Вы можете увидеть результаты ниже.

 input:checked + label { background-color: rgb(255, 255, 204); color: rgb(255, 0, 0); } 

figure6

The: целевой псевдокласс

CSS3 также включает в себя несколько новых псевдоклассов, которые не являются структурными или основанными на состоянии. Псевдокласс : target выбирает элемент с идентификатором, с которым связан идентификатор фрагмента. Идентификаторы фрагмента появляются в конце URL-адреса, обозначенного хеш-меткой ( # ), за которой следует имя привязки ( <a> ) или id элемента.

Например, в длинной статье я мог бы включить оглавление, которое ссылается на основные разделы статьи. Чтобы настроить это, мне нужно назначить id s, которые будут служить идентификаторами фрагментов для контента, на который я хочу ориентироваться (в данном случае заголовки):

 <h2 id="rotnruin">Rot &amp; Ruin</h2> <p>Zombie ipsum reversus ab viral inferno, nam rick grimes malum cerebro. De carne lumbering animata corpora quaeritis. Summus brains morbo vel maleficia? De apocalypsi gorger omero undead survivor dictum mauris...</p> <h2 id="romero">Romero Zombies</h2> <p>Cum horribilem walking dead resurgere de crazed sepulcris creaturis, zombie sicut de grave feeding iride et serpens. Pestilentia, shaun ofthe dead scythe ...<p> 

Тогда мне нужно сделать ссылку на эти идентификаторы:

 <ul> <li><a href="#rotnruin">Rot &amp; Ruin</a></li> <li><a href="#romero">Romero Zombies</a></li> ... </ul> 

A Table of Contents with Links to Main Sections

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

 h2:target { background: rgb(125,104,99); border: 0; color: rgb(255, 255, 255); padding-left: 10px; } 

Heading That Is the Target of the Referring Link

Псевдокласс отрицания

Называется псевдоклассом отрицания : not (x) предназначается для элементов, которые не соответствуют селектору ( x ), указанному в скобках. Синтаксис для :not(x) позволяет указывать практически все типы селекторов, от простых селекторов элементов, id или class до комбинаторов и других псевдоклассов.

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

 :not(section) a {} p:not(.intro) {} input:not([type="submit"]) {} 

Зачем использовать псевдо-классы?

Легко взглянуть на эти псевдоклассы (и те, что описаны в части 1 ) и удивиться, почему вы бы использовали их в пользу (возможно) более простых селекторов. Ответ связан с проектом, над которым вы работаете.

Иногда CMS ограничивает доступ к разметке, что означает, что вы не можете добавлять id или class . То же самое верно для некоторых устаревших систем. И иногда возникают уникальные ситуации, в которых эти псевдоклассы имеют смысл.

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

Поддержка и обработка браузера

Как я подробно описал в части 1 , все современные браузеры, включая Internet Explorer 10 и 9, поддерживают псевдоклассы CSS3 . Если вы ориентируетесь на более старую версию браузера, которая предлагает ограниченную или некорректную поддержку селектора CSS3, вам нужно будет использовать полифил, такой как Selectivizr . Стоит также отметить, что браузерная обработка селекторов CSS3 сравнительно менее эффективна, чем для других селекторов. Опять же, то, что вы используете, всегда должно сводиться к вашему проекту. Если вам нужна помощь в оценке производительности ваших селекторов, посмотрите CSS Lint и CSS Test Creator .

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

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

Также я очень рекомендую потрясающую CSS3 Зои Джилленуотер. В этой книге вы получите много практических примеров псевдоклассов, а также массу другой фантастической информации и ресурсов по CSS3.

См. Также справочник CSS SitePoint и книги по CSS .