CSS. Селекторы

Селектор - это формальное описание того элемента или группы элементов, к которым применяется указанное правило стиля.

selector {
    style: properties;
}
		

Простой селектор представляет собой селектор типа, селектор класса либо id-селектор, за которым могут следовать селекторы псевдоклассов и селекторы атрибутов.

Часть 1

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

CSS предоставляет универсальный селектор * для выборки всех тегов веб-страницы. Например, если вы хотите, чтобы все отображалось полужирным шрифтом, нужно добавить следующий код:

a, p, img, h1, h2, h3, h4, h5 ...... {
    font-weight: bold;
}
				

Использование символа * - более быстрый способ сообщить CSS о выборке всех HTML-тегов веб-страницы:

* { font-weight: bold; }
				
Пожалуй самый известный случай применение универсального селектора - это отмена внешних и внутрених отступов.
* {
    padding: 0;
    margin: 0;
}
					

Кроме того, вы можете задействовать универсальный селектор в составе селектора потомков: применяете стиль ко всем тегам-потомкам, подчиненным определенному элементу веб-страницы. Например, .E * выбирает все теги внутри элемента, имеющего атрибут class со значением .E.

.E * {
   ....
}
				

Идентификаторы и классы

Идентификатор (называемый также «ID селектор») определяет уникальное имя элемента, которое используется для изменения его стиля и обращения к нему через скрипты.

#E {
    style: properties;
}
				

При описании идентификатора вначале указывается символ решётки (#), затем идет имя идентификатора. Оно должно начинаться с латинского символа и может содержать в себе символ дефиса (-) и подчеркивания (_).

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

/* Выбирает элемент по значению атрибута class, 
   который может быть использован повторно несколько раз на одной странице */
E.class {
    style: properties;
}
/* так же доступно другое написание; без указания имени тэга */
.class {
    style: properties;
}
				

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

Пользовательское имя класса начинается с точки. Имена классов должны начинаться с латинского символа и могут содержать в себе символ дефиса (-) и подчеркивания (_).

К любому тегу одновременно можно добавить несколько классов, перечисляя их в атрибуте class через пробел. В этом случае к элементу применяется стиль, описанный в правилах для каждого класса. Поскольку при добавлении нескольких классов они могут содержать одинаковые стилевые свойства, но с разными значениями, то берётся значение у класса, который описан в коде ниже.
В стилях также допускается использовать запись вида .class1.class2, где class1 и class2 представляют собой имена классов. Стиль применяется только для элементов, у которых одновременно заданы классы class1 и class2.

Контекстные селекторы или селекторы потомка

При создании веб-страницы часто приходится вкладывать одни теги внутрь других. Чтобы стили для этих тегов использовались корректно, помогут селекторы, которые работают только в определённом контексте. Например, задать стиль для тега <b> только когда он располагается внутри контейнера <p>. Таким образом можно одновременно установить стиль для отдельного тега, а также для тега, который находится внутри другого.

p b {
    font-weight: 600;
}
				

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

article p {
    color: #f0b;
}
				

Пример 1 →

Прямой дочерние селекторы

Порой селекторы потомка заходят слишком далеко, выбирая больше, чем хотелось бы. Иногда должны быть выбраны только прямые дети родительского элемента, а не каждый экземпляр элемента вложенный глубоко внутри предка. В этом случае может быть использован прямой дочерний селектор путём размещения знака больше (>) между родительским и дочерним элементом в селекторе.

Например, article > p является прямым дочерним селектором только когда элементы <p> находятся непосредственно внутри элемента <article>. Любой элемент <p> размещённый вне элемента <article> или вложенный внутри другого элемента, кроме <article>, не будет выбран.

article > p {
    opacity: 0.5;
}
				

Пример 2 →

Соседние селекторы

Соседними называются элементы веб-страницы, когда они следуют непосредственно друг за другом в коде документа. Рассмотрим несколько примеров отношения элементов.

<p>Lorem ipsum <b>dolor</b> sit amet.</p>
				

В этом примере тег <b> является дочерним по отношению к тегу <p>, поскольку он находится внутри этого контейнера. Соответственно <p> выступает в качестве родителя <b>.

<p>Lorem ipsum <b>dolor</b> <var>sit</var> amet.</p>
				

Здесь теги <var> и <b> никак не перекрываются и представляют собой соседние элементы. То, что они расположены внутри контейнера

, никак не влияет на их отношение.

<p>Lorem <b>ipsum</b> dolor sit amet, <var>consectetuer</var> adipiscing <i>elit</i>.</p>
				

Соседними здесь являются теги <b> и <var>, а также <var> и <i>. При этом <b> и <i> к соседним элементам не относятся из-за того, что между ними расположен контейнер <var>.

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

selector1 + selector2 {
    style: properties;
}
				

Пример 3 →

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

Сестринские или сиблинговые селекторы

Так же в литературе именуется как "правые соседи".

E ~ F {
    style: properties;
}
				

Этот CSS-селектор очень похож на соседний селектор(E + F), однако, является менее строгим. При использовании соседнего селектора E + F будет выбран только первый элемент F, идущий за E. В данном же случае будут выбраны все элементы F, идущие за E.

Пример 4 →

Часть 2. Селекторы атрибутов

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

Селектор наличия атрибута

Первый селектор атрибута определяет элемент на основе того, включен ли этот атрибут или нет, независимо от его фактического значения. Чтобы выбрать элемент основываясь на том, присутствует атрибут или нет, просто включите имя атрибута в квадратных скобках ([]) в селекторе. Квадратные скобки могут идти после любого селектора типа или класса, в зависимости от желаемого уровня специфичности.

E[foo] { .... }
/* так же доступна запись */
[foo] { .... }
				

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

/* если для абзаца задан пользовательский атрибут - сделать абзац жирным */
p[data-my] { 
   font-weight: 600;
}
				

В теге данного абзаца задан пользовательский атрибут

В теге данного абзаца задан пользовательский атрибут НО он ПУСТОЙ

Атрибут со значением

Устанавливает стиль для элемента в том случае, если задано определённое значение специфичного атрибута.

E[foo="bar"] { .... }
/* так же доступна запись */
[foo="bar"] { .... }
				

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

a[href="https://yandex.ru"] {
    background-color: yellow; /* зададим жёлтый фон для всех ссылок на Яндекс */
}
				

Значение атрибута содержит указанный текст

Когда мы пытаемся найти элемент на основе части значения атрибута, для не точного совпадения, может быть использован символ звёздочки (*) в квадратных скобках селектора. Звёздочка должна идти сразу после имени атрибута, непосредственно перед знаком равенства. Это означает, что следующее за ним значение только должно появиться или содержаться в значении атрибута.

E[foo*="bar"] { .... }
/* так же доступна запись */
[foo*="bar"] { .... }
				

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

a[href*="login"] {
    font-weight: 600; /* зададим жирное начертание для ссылок, в адресе которых надоится данная подстрока */
}
				

Значение атрибута начинается с определённого текста

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

E[foo^="bar"] { .... }
/* так же доступна запись */
[foo^="bar"] { .... }
				
a[href^="https://"] {
    color: green; /* сделаем зелёным ссылки указывающие на защищённые сайты */
}
				

Значение атрибута оканчивается определённым текстом

Противоположностью предыдущего селектора является селектор атрибутов, где значение оканчивается определённым текстом. Вместо использования символа ^ применяется знак доллара ($) в квадратных скобках селектора между именем атрибута и знаком равенства. Использование знака доллара означает, что значение атрибута должно заканчиваться указанным текстом.

E[foo$="bar"] { .... }
/* так же доступна запись */
[foo$="bar"] { .... }
				

Таким способом можно автоматически разделять стиль для ссылок на сайты домена ru и для ссылок на сайты других доменов вроде com.

a[href$=".ru"] {
    background: url(images/ru.png) no-repeat 0 6px;;
    padding-left: 12px;
}
				

Стилевые свойства будут применяться только для тех ссылок, атрибут href которых оканчивается на «.ru». Заметьте, что добавив к имени домена слэш (http://www.yandex.ru/) или адрес страницы (http://www.yandex.ru/fun.html), мы изменим тем самым окончание и стиль применяться уже не будет. В этом случае лучше воспользоваться селектором, у которого заданный текст встречается в любом месте значения атрибута.

Одно из нескольких значений атрибута

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

E[foo~="bar"] { .... }
/* так же доступна запись */
[foo~="bar"] { .... }
				

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

a[class~="tag"] { .... }
				
<a href="/" class="tag nofollow"> .... </a>
				

Дефис в значении атрибута

В именах идентификаторов и классов разрешено использовать символ дефиса (-), что позволяет создавать значащие значения атрибутов id и class. Для изменения стиля элементов, в значении которых применяется дефис, следует воспользоваться следующим синтаксисом.

E[foo|="bar"] { .... }
/* так же доступна запись */
[foo|="bar"] { .... }
				

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

[lang|="en"] { .... } /* примениться ко всем тэгам где определён данный атрибут и начинается на en */
				

Часть 3. Псевдоклассы

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

selector:pseudoclass {
    style: properties;
}
			

Вначале указывается селектор, к которому добавляется псевдокласс, затем следует двоеточие, после которого идёт имя псевдокласса. Допускается применять псевдоклассы к именам идентификаторов или классов, а также к контекстным селекторам. Если псевдокласс указывается без селектора впереди, то он будет применяться ко всем элементам документа.

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

Псевдоклассы включают в себя два псевдокласса, относящиеся к ссылкам. Это псевдоклассы :link и :visited и они определяют, что ссылка была или не была посещена. Чтобы задать стиль ссылки, которая ещё не была посещена, в игру вступает псевдокласс :link, а псевдокласс :visited задаёт стиль ссылок, которые пользователь уже посетил на основе их истории просмотра.

a:link {
    color: rgba(0,0,0, 0.5);
}

a:visited {
    color: rgba(255,50,50, 0.5);
}
				

Ссылка с :visited

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

Псевдоклассы действия пользователя

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

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

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

Несмотря на то, что активным может стать практически любой элемент веб-страницы, псевдокласс :active используется преимущественно для ссылок.

Пример ссылки с :active

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

Example works :focus

Псевдоклассы пользовательского интерфейса

Подобно ссылкам существуют также некоторые псевдоклассы, связанные с состоянием элементов пользовательского интерфейса, в частности, внутри форм. Эти псевдоклассы включают в себя :enabled, :disabled, :checked и :indeterminate.

Псевдокласс :enabled выбирает поля, которые включены и доступны для использования, а псевдокласс :disabled выбирает поля, которые содержат привязанный к ним атрибут disabled. Многие браузеры по умолчанию затемняют такие заблокированные поля для информирования пользователей о том, что поле не доступно для взаимодействия, однако их стиль может быть настроен по желанию через псевдокласс :disabled.

input:enabled { .... }

input:disabled  {
    margin: 10px;
    box-shadow: 0 0 10px rgba(0,0,0, 0.5);
}
				

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

input:indeterminate { .... }

input:checked  {
    width: 3vh;
    height: 3vh;
    box-shadow: 0 0 10px rgba(0,0,0, 0.5);
}
				
Псевдокласс UI


Псевдоклассы, имеющие отношение к дереву документа

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

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

:first-child, :last-child и :only-child

Первые структурные псевдоклассы, которые вам скорее всего попадутся, это :first-child, :last-child и :only-child. Псевдокласс :first-child выберет элемент, если это первый ребёнок в родителе, в то время как псевдокласс :last-child выберет элемент, если он последний в родителе. Эти псевдоклассы идеально подходят для выбора первого или последнего элемента в списке и др. Кроме того, :only-child выберет элемент, если он является единственным элементом в родителе.

p b:first-child { 
    color: green;
    text-transform: uppercase;
}

p b:last-child {
    color: red;
    text-transform: uppercase;
}
				

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

p b:only-child { 
    font-weight: 600;
    color: hsl(190, 60%, 70%);
    text-transform: uppercase;
}
				

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

:first-of-type, :last-of-type и :only-of-type

Нахождение первого, последнего и единственного ребёнка у родителя очень полезно и часто только это и требуется. Однако иногда вы хотите выбрать только первого, последнего или единственного ребёнка определённого типа элемента. К примеру, вы желаете выбрать только первый или последний абзац внутри статьи или, возможно, только изображение в статье. К счастью, в этом помогают псевдоклассы :first-of-type, :last-of-type и :only-of-type.

Псевдокласс :first-of-type выберет первый элемент своего типа внутри родителя, в то время как псевдокласс :last-of-type выберет последний элемент этого типа внутри родителя. Псевдокласс :only-of-type выберет элемент, если он является единственным такого типа в родителе.

div p:first-of-type { 
    color: green;
    text-transform: uppercase;
}

div p:last-of-type {
    color: red;
    text-transform: uppercase;
}

div img:only-of-type {
    border: thin solid #000;
}
				

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

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

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

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

В приведённом выше примере псевдоклассы div p:first-of-type и div p:last-of-type выберут, соответственно, первый и последний абзацы в статье, независимо от того, являются ли они на самом деле первыми или последними детьми в статье. Селектор div img:only-of-typeопределяет изображение, как единственное изображение появляющееся в статье.

:nth-child(n), :nth-last-child(n), :nth-of-type(n) и :nth-last-of-type(n)

Наконец, есть несколько псевдоклассов структуры и положения, которые выбирают элементы, основанные на номере или алгебраическом выражении. Эти псевдоклассы включают в себя :nth-child(n), :nth-last-child(n), :nth-of-type(n) и :nth-last-of-type(n). Все эти уникальные псевдоклассы начинаются с nth и принимают число или выражение внутри круглых скобок, которое обозначается символом n.

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

Так же в каестве значения могут выступать ключевые слова odd - нечётные номера элементов и even - чётные номера элементов.

Пример использования :nth- селекторов
Фио Дата
1 Иванов Иван 2015.10.09
2 Петров Пётр 1985.11.25
3 Сидоров Сидр 2000.03.11
4 Максимов Максим 1999.06.30
5 Зайцев Андрей 1990.08.07

Использование чисел и выражений в псевдоклассах

Как уже упоминалось, использование конкретного числа в псевдоклассе вычисляет с начала или с конца дерева документа и выбирает один соответствующий элемент. Например, селектор li:nth-child(4) выберет четвёртый пункт в списке. Подсчёт начинается с первого пункта списка и увеличивается на единицу для каждого пункта списка, пока, наконец, не обнаружит четвёртый пункт и выберет его. При указании конкретного числа оно должно быть положительным.

Выражения для псевдоклассов бывают в формате an, an+b, an-b, n+b, -n+b и -an+b. То же самое выражение может быть переведено и читаться как (a*n)±b. Переменная a обозначает множитель, с учётом которого будут вычисляться элементы, в то время как переменная b обозначает, откуда будет начинаться или происходить отсчёт.

Например, селектор li:nth-child(3n) будет определять каждый третий элемент пункта списка. Использование этого выражения соответствует 3×0, 3×1, 3×2 и так далее. Как вы можете видеть, результаты этого выражения выбирают третий, шестой и каждый элемент кратный трём

Кроме того, в качестве значений могут быть использованы ключевые слова odd и even. Как и следовало ожидать, они будут выбирать, соответственно, нечётные или чётные элементы. Если ключевые слова не привлекают, то выражение 2n+1 выберет все нечётные элементы, а выражение 2n выберет все чётные элементы.

Селектор li:nth-child(4n+7) определит каждый четвёртый пункт списка, начиная с седьмого пункта. Опять же, использование этого выражения эквивалентно (4×0)+7, (4×1)+7, (4×2)+7 и так далее. Результаты этого выражения приведут к выбору седьмого, одиннадцатого, пятнадцатого и каждого четвёртого элемента.

При использовании аргумента n без числа впереди, переменная a расценивается как равная 1. Селектор li:nth-child(n+5) выберет каждый пункт списка, начиная с пятого, оставив первые четыре пункта списка не выбранными. В выражении это разбирается как (1×0)+5, (1×1)+5, (1×2)+5 и так далее.

Для создания более сложных вещей могут быть задействованы отрицательные числа. Например, селектор li:nth-child(6n-4) будет отсчитывать каждый шестой пункт списка, начиная с -4, выбрав второй, восьмой, четырнадцатый пункты списка и так далее. Тот же селектор li:nth-child(6n-4) также может быть записан как li:nth-child(6n+2), без использования отрицательной переменной b.

Отрицательная переменная или отрицательный аргумент n должен сопровождаться положительной переменной b. Когда аргументу n предшествует отрицательная переменная a, то переменная b определяет, насколько высоко будет достигнут отсчёт. Например, селектор li:nth-child(-3n+12) выберет каждый третий пункт списка в первых двенадцати пунктах. Селектор li:nth-child(-n+9) выберет первые девять пунктов списка, так как переменная a без заявленного числа по умолчанию равна -1.

Комбинация псевдоклассов

При стилизации элементов возможна комбинация псевдоклассов, например:

/* добавит стили при наведении каждой чётной строке таблицы (отсчёт в обратном порядке) */
tr:nth-last-child(even):hover { ... }
				

Часть 4. Псевдоэлементы

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

Текстовые псевдоэлементы

Первыми реализованными псевдоэлементами были текстовые псевдоэлементы :first-letter и :first-line. Псевдоэлемент :first-letter определяет первую букву текста внутри элемента, в то время как :first-line определяет первую строку текста внутри элемента.

#elem-letter:first-letter, #elem-line:first-line { 
    color: #ed1c24;
    font-size: 1.25rem;
}
				

Далеко-далеко за словесными горами в стране гласных и согласных живут рыбные тексты. Вдали от всех живут они в буквенных домах на берегу Семантика большого языкового океана.

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

К псевдоэлементу :first-line могут применяться не все стилевые свойства. Допустимо использовать свойства, относящиеся к шрифту, изменению цвет текста и фона, а также: clear, line-height, letter-spacing, text-decoration, text-transform, vertical-align и word-spacing.

Псевдоэлементы, генерируемые содержимое

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

Псевдоэлемент :before создаёт псевдоэлемент до или впереди выбранного элемента, в то время как :after создаёт псевдоэлемент после или позади выбранного элемента. Эти псевдоэлементы выводятся вложенными внутри выбранного элемента, а не за его пределами. Ниже псевдоэлемент :after используется для отображения значения атрибута href у ссылок в круглых скобках после самой ссылки. Такая информация полезна, но, в конечном итоге, не всякий браузер поддерживает эти псевдоэлементы.

#elem-ba a:before { 
    content: "\21BB ";
    color: #56a0d3;
}

#elem-ba a:after { 
    content: "(" attr(href) ")";
    color: rgba(0,0,0, 0.8);
    font-size: 0.8rem;
}
				

Псевдоэлемент ::selection

Псевдоэлемент ::selection определяет выделенную пользователем часть документа. Выделение затем может быть стилизовано, но только с помощью свойств color, background, background-color и text-shadow. Стоит отметить, что свойство background-image игнорируется. В то же время сокращённое свойство background может быть использовано для добавления цвета, но любые изображения будут игнорироваться.

Двоеточие (:) и двойное двоеточие (::)

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

При выделении любого текста в демонстрации ниже фон становится оранжевым благодаря псевдоэлементу ::selection.

.elem-select p:selection { 
    background: #ff7b29;
}
				

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

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

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

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

Префиксы

Вендорные префиксы — это приставки к названию CSS свойства, которые добавляют производители браузеров для нестандартизированных свойств.

Префиксы CSS для браузеров
IE Chrome Opera Safari Firefox Android iOS
-ms- -webkit- -o- -webkit- -moz- -webkit- -webkit-
Согласно спецификации CSS 2.1 CSS идентификаторы, которые начинаются с "-" или "_" зарезервированы для CSS расширений браузеров. Наличие этих знаков в начале свойства гарантирует то, что в будущем расширения браузеров никогда не пересекутся со стандартными CSS свойствами. Т.е. ни один браузер не начнет «случайно» понимать свойство, которое для него не предназначено.
div {
    -webkit-transform: rotate(-45deg);
       -moz-transform: rotate(-45deg);
        -ms-transform: rotate(-45deg);
         -o-transform: rotate(-45deg);	
            transform: rotate(-45deg);	
}
			

Браузер из такого кода интерпретирует только то свойства, которое написано под него, а написанные для других браузеров игнорирует.

Причин для появления префиксов было достаточно много:

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