CSS урок 1. Селекторы, псевдоклассы и псевдоэлементы
Вряд ли кто-то будет спорить с тем, что без хорошего фундамента по математике и физике практически невозможно совершать невероятные открытия в естественных науках, равно как без знания химии изобретать новые лекарства. В любой отрасли есть основополагающие знания, прочный фундамент на котором строится успешная работа.
При работе с каскадными таблицами стилей одним из обязательных к изучению вещей являются CSS селекторы. Хорошее знание CSS селекторов и умение ими пользоваться - это та прочная основа, на которой строится успешная работа по внешнему оформлению и разметке сайта.
Хотя с интеграцией CSS 3 селекторов стало еще больше, познакомиться с ними и использовать их по назначению не составит большого труда, потому как все они имеют одну цель - разгрузить HTML код. С ней они справляются настолько хорошо, что для каждого элемента веб- страницы можно использовать несколько видов селекторов. Потому как современный CSS определил для нас довольно широкий арсенал, я разделил данный урок на следующие блоки:
- Создание CSS правил в 2 словах
- Селектор тегов
- Групповой вид селекторов
- Селектор классов
- Селектор идентификаторов
- Древовидная форма HTML
- Селектор потомков
- Дочерние селекторы
- Псевдоклассы
- Псевдоэлементы
- Новый селектор - ::selection
- Дочерние элементы по типу
- Селектор смежных элементов
- Селектор атрибутов
- Псевдокласс отрицания
Создание CSS правил в 2 словах
Каскадная таблица стилей представляет собой набор CSS правил, каждое из которых призвано форматировать определенный элемент веб-страницы. Само правило состоит из 2 частей:
- Селектор
- Блок объявлений
При помощи селектора мы указываем элемент, на который будем воздействовать. С помощью блока объявлений мы задаем параметры для выбранных элементов. Блок объявлений в свою очередь состоит из 2 частей:
- Свойство
- Значение
Свойство служит для выбора параметра, который мы будем настраивать.
Селектор тегов
Самый простой и универсальный вид селекторов. Суть его состоит в том, что мы напрямую указываем форматируемый тег. Например, для отображения всех абзацев шрифтом Verdana мы указываем следующую запись:
p {
font-family: Verdana;
}
Если мы захотим принять шрифт Verdana для заголовков первого уровня, будет справедлива следующая запись:
h1 {
font-family: Verdana;
}
Основной и единственный принцип этого вида селекторов заключается в указании тега, который нужно отформатировать.
Групповой вид селекторов
Создание одинаковых блоков объявлений для разных тегов не является ошибкой. Однако, для грамотных веб-мастеров подобная запись неприемлема. В примере выше мы придали одинаковый шрифт для 2 тегов, причем сделали это создав два отдельных правила, хотя можно было обойтись и одним. Для этого достаточно перечислить форматируемые теги через запятую:
p, h1 {
font-family: Verdana;
}
Групповой вид селекторов очень удобен и способен значительно сократить объем css файла. Как уже было сказано до этого, достаточно перечислить форматируемые теги через запятую.
Универсальный селектор
А что делать если нужно придать одни и те же значения для всех элементов веб-страницы? Перечислить все теги через запятую? Вовсе не обязательно, вместо перечислений всех тегов стоит просто указать '*'. Да, именно звездочку, при помощи которой выделяются все элементы веб-страницы.
* {
font-family: Verdana;
}
Селектор классов
Как видно из названия, при помощи этого вида селекторов мы выбираем элементы по определенным классам. При необходимости в форматировании блочных элементов с классом 'container' используется следующая запись:
.container {
font-family: Verdana;
}
Достаточно прописать точку и название класса. Хочется отметить что все элементы, вложенные в блочный элемент с классом 'container' также будут отформатированы.
Селектор идентификаторов
Здесь та же история как и с классами. Разница лишь в том что вместо точки мы прописываем - '#'. Для форматирования абзаца с id 'unique' необходима следующая запись:
#unique {
font-family: Verdana;
}
Древовидная форма HTML
Довольно часто можно стать свидетелем того, как новички не могут подобрать правильный вид селектора. Причиной этого является неясное понимание древовидной формы гипертекстовой разметки.
Для решения этой проблемы будет нелишним освежить память и вспомнить отношения тегов между собой в HTML.
Как видно из иллюстрации выше, тег body является предком для всех остальных тегов. Вложенный в него тег div является его дочерним элементом, сам будучи родителем тегов h2, p и предком тега a. А маркированный список первого уровня имеет 3 дочерних (li, ul) и 2 потомственных элемента (li).
Все вышеперечисленные теги вписываются в три вида отношений:
- предок - потомок
- родитель - дочерний элемент
- сестринские элементы (теги одного уровня с общим родителем)
Важно понимать, что в момент форматирования какого-либо элемента часто его потомки наследуют эти же свойства. Для точечной настройки определенных тегов существуют специальные селекторы, с которыми мы познакомимся дальше.
Селектор потомков
В случае необходимости форматирования потомков определённого тега мы пользуемся соответствующим селектором. Например, для форматирования всех вложенных абзацев в блочный элемент (div) используется следующая запись:
div p {
color: blue;
}
Вначале мы указываем предка, затем через пробел - потомственный элемент. Запись выше означает: 'Отобразите синим цветом все абзацы находящиеся внутри тега div'. Для форматирования всех ссылок внутри абзаца мы пишем следующее:
p a {
color: red;
}
Запись выше означает: 'Отобразите красным цветом все ссылки, находящиеся внутри абзацев'. Как видите - все очень просто.
Дочерние селекторы
Если присмотреться на разметку современных сайтов, то невооруженным глазом можно увидеть нечто наподобие матрешки - блочные элементы обернуты в другие блочные элементы, находящиеся внутри других блочных элементов.
Все бы хорошо, но это порождает определенные проблемы. 'Какие именно?' - спросите вы. Ну, хотя бы то что в случае придания определенных свойств 'предку' они унаследуются потомственными элементами. Чтобы мы могли точечно выбирать элементы для форматирования, были придуманы некоторые виды селекторов, в том числе и дочерний.
Давайте представим что нам необходимо воздействовать только на дочерние абзацы блока с классом 'info', потомственные нас не интересуют. Для этого мы используем дочерний селектор:
.info>p {
font-family: Arial;
}
Запись выше означает: 'Отобразить шрифтом Arial все абзацы, являющиеся дочерними блоку с классом info'. Если же нам нужно выделить дочерние пункты маркированного списка, аналогично пишем следующее:
ul>li {
color: blue;
}
Запись выше означает: 'Перекрасить все дочерние пункты маркированного списка в синий цвет'. Такое правило CSS вполне может пригодиться, ведь внутри одного списка вполне может располагаться другой.
В некоторых случаях может возникнуть необходимость выделения не всех дочерних элементов, а только некоторых. Для управления первым дочерним элементов необходимо воспользоваться псевдоэлемнтом :first-child
.wrapper:first-child {
font-family: Tahoma;
}
Правило выше означает: 'Отобразить первый дочерний элемент класса 'wrapper' шрифтом Tahoma'.
Псевдоэлемент :last-child помогает управлять последним дочерним элементом:
.wrapper:last-child {
font-family: Tahoma;
}
У нас также есть возможность выбирать любой по счету дочерний элемент при помощи псевдоэлемента :nth-child
.wrapper:nth-child(even) {
color: pink;
}
Запись выше означает: 'Выделить все чётные дочерние элементы класса 'wrapper' розовым цветом'. Для выделения нечетных элементов even нужно заменить на odd.
Для выделения каждого 5 элемента необходимо добавить 5n. Если же стоит выделить каждый 4-й элемент начиная с шестого необходимо в скобках указать - 4n+6. Значения в скобках можно менять по-своему усмотрению:
.wrapper:nth-child(3n+2) {
border-bottom: 1px solid black;
}
Правило выше указывает на необходимость подчеркнуть каждый третий дочерний элемент начиная со второго.
Псевдоклассы
Порой бывает необходимо управлять элементами веб-страниц, которые не имеют тегов. Для решения этих задач существуют псевдоклассы и псевдоэлементы. Для управления разными состояниями ссылок есть 4 вида псевдоклассов:
- a:link
- Отвечает за внешний вид ссылки в спокойном состоянии
- a:hover
- Отвечает за внешний вид ссылки в момент наведения на неё курсором мыши
- a:active
- Отвечает за внешний вид ссылки в момент нажатия на неё
- a:visited
- Отвечает за внешний вид уже посещенной ссылки
Пример того, как могут быть использованы эти псевдоклассы:
a:link {
color: blue;
}a:hover {
color: orange;
}a:active {
color: red;
}a:link {
color: grey;
}
Запись выше означает: 'Выделить синим цветом ссылки в обычном состоянии. Отображать их оранжевым цветом в момент наведения по ним. Отображать ссылки красного цвета в момент нажатия. Выделить серым цветом уже посещенные ссылки.'
Псевдокласс :hover
Этот псевдокласс можно использовать не только по отношению к ссылкам, ведь мы можем наводить мышкой на любые другие элементы веб-страницы. Например:
img:hover {
border: 1px solid grey;
}
Запись выше означает: 'Выделить все изображения рамкой серого цвета в момент наведения по ним.' Таким же образом можно настраивать любые другие элементы в момент проведения по ним курсором.
Псевдоэлементы
При помощи псевдоэлементов :before и :after мы можем добавлять тот или иной контент впереди или в конце элементов веб-страницы. При необходимости добавить что-нибудь впереди абзацев мы пишем следующее:
p.attention:before {
content: "Внимание!";
}
Запись выше означает: 'Добавить слово 'Внимание!' перед абзацами с классом attention'. Для добавления в конце элемента мы пишем:
p.attention:after {
content: "Внимание!";
}
Псевдоэлемент :focus помогает управлять внешним видом полей для ввода:
input:focus {
background-color: blue;
font-style: italic;
}
Запись выше означает - 'Окрасить фон полей для ввода в синий цвет и использовать курсивное начертание шрифта в момент набора текста'.
При помощи псевдоэлемента ::selection мы можем выбирать цвет шрифта и задний фон в момент выделения текста. По умолчанию текст выделяется синим цветом, а мы можем написать следующее:
::selection {
color: white;
background-color: black;
}
Правило выше означает: 'Отображать фон черным, а цвет шрифта белым в момент выделения текста'. Этот селектор незнаком для браузера Firefox, и для решения этой задачи необходимо перед правилом добавить следующее:
::-moz-selection {
color: white;
background-color: black;
}
Дочерние элементы по типу
Данный вид селекторов ценен тем, что мы можем управлять не просто дочерними элементами, а теми которые относятся к определенному типу.
Например, мы можем выделить первый дочерний нумерованный список блока с классом container:
.container>ol:first-of-type {
color: yellow;
}
Плюс ко всему мы имеем в распоряжении псевдоэлементы :last-of-type и :nth-of-type, которые имитируют :last-child и :nth-child соответственно.
#main>h2:last-of-type {
color: yellow;
}
В примере выше мы выделили последний дочерний заголовок второго уровня относящийся к блоку с идентификатором main.
Селектор смежных элементов
При помощи данного вида селекторов мы можем форматировать определённый фрагмент веб-страницы, но при условии что ему предшествуют другой элемент. Например, нам нужно выделить каждый первый абзац после заголовка первого уровня. Для этого мы создаем следующее правило:
h1+p {
font: italic 20px Arial;
}
Согласно правилу выше, если между заголовком h1 и абзацем окажется что-то ещё, например изображение, то в этом случае тег p не будет отформатирован. Также вместо знака плюс можно использовать ~ (тильда). При помощи неё будут отформатированы все маркированные списки после заголовка h1:
h1~ul {
color: orange;
}
Селектор атрибутов
Используя этот вид селектора можно форматировать элементы выбрав их по атрибуту. Для управления всеми внешними ссылками нужно указать следующее:
a[href^="http://"] {
color: aqua;
}
Запись href^="http://" означает что необходимо выделить все ссылки, начинающиеся на http://. Такие css правила имеют место быть, потому что абсолютные адреса в основном используются для внешних ссылок.
У нас есть возможность выделять ссылки на изображения, видео, книги и прочее. Например, для управления ссылками ведущими на pdf книги можно создать следующее правило:
a[href$=".pdf"] {
color: brown;
}
Знак доллара помогает выбрать только те ссылки, которые оканчиваются на '.pdf'. В "http://.pdf" вместо ссылки на книгу можно использовать .jpeg, .png, .mov, .mp4 и так далее.
У вас может возникнуть ситуация, когда нужно выделить те изображения, которые содержат в своем названии определенное слово. Возьмем к примеру интернет-магазин, где нужно сделать рамку для изображений футбольных бутс. С большой долей вероятности их названия содержат в себе слово boots. В таком случае создаем ccs правило:
img[src*="boots"] {
border: 2px dashed grey;
}
Знак звездочки помогает выбрать те изображения, которые в своем названии содержат слово boots.
Для выделения всех изображений, находящихся в блоке с классом relative мы создаем следующее css правило:
.relative[src] {
border: 2px dashed grey;
}
Псевдокласс отрицания
Если вам когда-нибудь приходилось иметь дело с движком WordPress, вы должны знать что в ней все ссылки имеют абсолютный вид. Как мы рассматривали выше, при необходимости выделить внешние ссылки можно использовать селектор по атрибуту, те которые начинаются на http://. Как вы понимаете, такой вариант решения вопроса с движком WordPress не прокатит. Но у нас в арсенале есть гениальный псевдокласс отрицания, который мы можем задействовать:
.a[href^="http://"]:not([href^="http://mysite.com"]) {
border: 2px dashed brown;
}
Правило выше означает: 'Выделить коричневым цветом все ссылки, начинающиеся на http:// кроме тех, которые начинаются на http://mysite.com'. Псевдокласс отрицания можно использовать не только с селекторами атрибутов, но и с другими простыми селекторами.
Стоит знать что для каждого селектора можно использовать только один псевдокласс отрицания. Следующая запись будет неверной - .container:not(#info):not(h3)
Наверняка вам будет сложно запомнить все виды CSS селекторов, да это и не нужно. Многие из них вы запомните в ходе работы, верстая страницу за страницей. И для того чтобы вы могли в нужный момент найти интересующий вас селектор, как говорится освежить свою память, будет весьма кстати добавить эту страницу в закладки.
На этом у меня все. Надеюсь, данный материал оказался для вас полезным. Если это так, сделайте репост данной статьи в социальных сетях, чтобы больше людей получили от нее пользу.
На этом я с вами не прощаюсь. Спасибо за внимание и до встречи в следующих публикациях!
Спасибо огромное за уроки.
Очень понятно изложен материал, после видео вопросов не остаётся. Радует, что есть два формата. Мне по душе сначала смотреть видео-версию, а потом читать текст, закрепляя пройденное.
Ещё раз большущее спасибо за это чудо)
Марина приветствую! Очень рад слышать. Желаю удачи в изучении CSS. Если возникнут вопросы, обязательно задвайте :)