В чем разница между псевдоклассом и псевдоэлементом в CSS? - PullRequest
81 голосов
/ 09 ноября 2011

Такие вещи, как a:link или div::after ...

Информация о разнице кажется скудной.

Ответы [ 8 ]

75 голосов
/ 28 июля 2012

Рекомендация по выбору CSS 3 довольно ясна в обоих случаях, но я все равно попытаюсь показать различия.

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

Официальное описание

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

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

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

Источник

Что это значит?

Важная природа псевдоклассов изложена в самом первом предложении: "концепция псевдокласса [...] разрешение выбора " .Это позволяет автору таблицы стилей различаться между элементами на основе информации, которая «лежит вне дерева документа» , например, текущего статуса ссылки (:active, :visited).Они не сохраняются нигде в DOM, и не существует интерфейса DOM для доступа к этим параметрам.

С другой стороны, к :target можно получить доступ с помощью манипуляций с DOM (вы можете использовать window.location.hash длячтобы найти объект с помощью JavaScript), но это "не может быть выражено с помощью других простых селекторов" .

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

Пример

В следующем примере все четные строки будут окрашены в серый цвет (#ccc), все неровные строки, которые не делятсяна 5 белых и все остальные строки пурпурного цвета.

table tr:nth-child(2n) td{
   background-color: #ccc;
}

table tr:nth-child(2n+1) td{
   background-color: #fff;
}

table tr:nth-child(2n+1):nth-child(5n) td{
   background-color: #f0f;
}

Псевдоэлементы

Официальное описание

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

Псевдоэлемент-элемент состоит из двух двоеточий (::), за которыми следует имя псевдоэлемента.

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

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

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

Источник

Что этозначит?

Наиболее важной частью здесь является то, что "псевдоэлементы позволяют авторам ссылаться на [..] в противном случае недоступную информацию " и что они "могут также предоставлять авторам способ ссылки на контент, который не существует в исходном документе (например, псевдоэлементы ::before и ::after предоставляют доступ к сгенерированному контенту).". Самое большое отличие состоит в том, что они фактически создают новый виртуальный элемент, к которому могут применяться правила и даже селекторы псевдоклассов. Они не фильтруют элементы, они в основном фильтруют контент (::first-line, ::first-letter) и помещают его в виртуальный контейнер, который автор может стилизовать так, как ему хочется (ну, почти).

Например, псевдоэлемент ::first-line не может быть восстановлен с помощью JavaScript, поскольку он сильно зависит от текущего используемого шрифта, размера шрифта, ширины элементов, плавающих элементов (и, вероятно, времени суток). Ну, это не совсем так: все равно можно вычислить все эти значения и извлечь первую строку, однако это очень громоздкое занятие.

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

Пример

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

q:lang(de)::after{
    content: " (German) ";
}

q:lang(en)::after{
    content: " (English) ";
}

q:lang(fr)::after{
    content: " (French) ";
}

q:not(:lang(fr)):not(:lang(de)):not(:lang(en))::after{
    content: " (Unrecognized language) ";
}

TL; DR

Псевдоклассы действуют как простые селекторы в последовательности селекторов и тем самым классифицируют элементы по непрезентативным характеристикам, псевдоэлементы создают новые виртуальные элементы.

Ссылки

W3C

37 голосов
/ 09 ноября 2011

Псевдокласс фильтрует существующие элементы.
a:link означает все <a> с :link.

Псевдоэлемент - это новый поддельный элемент.
div::after означает несуществующие элементы после <div> с.

::selection - еще один пример псевдоэлемента.
Это не означает, что все элементы выбраны; это означает диапазон контента, который выбран, который может охватывать части нескольких элементов.

15 голосов
/ 22 июля 2016

Краткое описание, которое помогло мне понять разницу:

  • Псевдоклассы описывают особое состояние.
  • Псевдоэлементы соответствуют виртуальным элементам.
9 голосов
/ 09 ноября 2011

Из документов Sitepoint:

A псевдокласс похож на класс в HTML, но он явно не указан в разметке.Некоторые псевдоклассы являются динамическими - они применяются в результате взаимодействия пользователя с документом.- http://reference.sitepoint.com/css/pseudoclasses. Это были бы вещи типа :hover, :active, :visited.

Псевдоэлементы соответствуют виртуальным элементам, которые явно не существуют в дереве документа.Псевдоэлементы могут быть динамическими, поскольку виртуальные элементы, которые они представляют, могут изменяться, например, при изменении ширины окна браузера.Они также могут представлять контент, который генерируется правилами CSS.- http://reference.sitepoint.com/css/pseudoelements. Это будут такие вещи, как before, :after, :first-letter.

5 голосов
/ 17 июня 2015

Концептуальный ответ:

  • Псевдоэлемент относится к вещам, которые являются частью документа, но вы просто еще этого не знаете. Например первая буква. Раньше у тебя был только текст. Теперь у вас есть первая буква, на которую вы можете нацелиться. Это новая концепция, но она всегда была частью документа. Это также включает в себя такие вещи, как ::before; в то время как там нет фактического содержания, концепция чего-то раньше была всегда там - теперь вы указываете это.

  • Псевдокласс - это состояние чего-то в DOM. Так же, как класс - это тег, который вы связываете с элементом, псевдокласс - это класс, который связывается браузером или DOM или чем-то еще, обычно в ответ на изменение состояния. Когда пользователь посещает ссылку - эта ссылка может перейти в состояние «посещено». Вы можете представить, как браузер применяет класс «посещенный» к элементу «Якорь». :visited будет таким, каким вы выберете этот псевдокласс.

4 голосов
/ 09 декабря 2013

Псевдо-Class

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

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

ОГРАНИЧЕНИЯ: В отличие от псевдоэлементов, псевдоклассы могут появляться где угодно в цепочке селекторов.

Пример кода псевдокласса:

a:link /* This selects any "a" element whose target has not been visited.*/
{
padding : 4px;
text-decoration : none;
width : 10%;
color : #000000; /* black text color */
background-color : #99FF99; /* set to a pastel green */
border-top : 2px solid #ccffcc; /* highlight color */
border-left : 2px solid #ccffcc; /* highlight color */
border-bottom : 2px solid #003300; /* shadow color */
border-right : 2px solid #003300; /* shadow color */
}

a:visited /* This selects any "a" element whose target has been visited.*/
{ padding : 4px;
text-decoration : none;
color : #000000; /* black text color */
background-color : #ccccff; /* set to a lavender */
border-top : 2px solid #ffffff; /* highlight color */
border-left : 2px solid #ffffff; /* highlight color */
border-bottom : 2px solid #333366; /* shadow color *
border-right : 2px solid #333366; /* shadow color */
}

a:hover /* This selects any "a" element which is in a hover state. This is a state during pointer movement within the rendering region of an element. The user designates an element but does not activate it. */
{
color : #000000; /* black text color */
background-color : #99cc99; /* desaturated color */
border-top : 2px solid #003300; /* shadow color */
border-left : 2px solid #003300; /* shadow color */
border-bottom : 2px solid #ccffcc; /* highlight color */
border-right : 2px solid #ccffcc; /* highlight color */
}

a:focus /* This selects any "a" element which currently has focus. Focus is a state during which an element accepts keyboard input or other forms of text input. */
{
padding : 4px;
text-decoration : none;
width : 10%;
color : #000000; /* black text color */
background-color : #ffff99; /* set to a pastel yellow */
border-top : 2px solid #ffffcc; /* highlight color */
border-left : 2px solid #ffffcc; /* highlight color */
border-bottom : 2px solid #666633; /* shadow color */
border-right : 2px solid #666633; /* shadow color */
}

a:active /* This selects any "a" element which is in a state of activation. Active is a state during pointer activation (eg: press and release of a mouse) within the rendering region of an element.*/
{
padding : 4px;
text-decoration : none;
width : 10%;
color : #000000; /* black text color */
background-color : #ff99ff; /* set to a pink */
border-top : 2px solid #ffccff; /* highlight color */
border-left : 2px solid #ffccff; /* highlight color */
border-bottom : 2px solid #663366; /* shadow color */
border-right : 2px solid #663366; /* shadow color */
}

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

Псевдо-элементы

PSEUDO-ЭЛЕМЕНТЫ используются для адресации частей элементов. Они позволяют вам устанавливать стиль для части содержимого элемента сверх того, что указано в документах. Другими словами, они позволяют определять логические элементы, которых на самом деле нет в дереве элементов документа. Логические элементы позволяют учитывать подразумеваемую семантическую структуру в селекторах CSS.

ОГРАНИЧЕНИЯ: Псевдоэлементы могут применяться только к внешнему контексту и контексту на уровне документа, но не к встроенным стилям. Псевдоэлементы ограничены тем, где они могут появляться в правиле. Они могут появляться только в конце цепочки селектора (после темы селектора). Они должны следовать за любым именем класса или идентификатора, найденным в селекторе. Для каждого селектора может быть указан только один псевдоэлемент. Чтобы обратиться к нескольким псевдоэлементам в единой элементной структуре, необходимо сделать несколько заявлений селектора / объявления стиля.

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

/ * Следующее правило выбирает первую букву заголовка 1 и устанавливает шрифт 2em, cursive, с зеленым фоном. First-letter выбирает первую визуализированную букву / символ для элемента уровня блока. * /

h1:first-letter {
font-size : 2em;
font-family : "Lucida Handwriting", "Lucida Sans", "Lucida Console", cursive;
background-color : #ccffcc;
}

/* The following rule selects the first displayed line in a paragraph and makes it bold. First-line selects the first rendered line on the output device of a block-level element. */

p:first-line {
font-weight : bold;
}

/* The following rule selects any content placed before a blockquote and inserts the phrase "Quote of the day:" in bold small caps with a green background. */

blockquote:before {
content : "Quote of the day:";
background-color : #ccffcc;
font-weight : bold;
font-variant : small-caps;
}

/* The following rule selects any content placed before a "q" element and inserts the smart open quote. */

q:before {
content : open-quote;
}

/* The following rule selects any content placed after a "q" element and inserts the smart close quote. */

q:after{
content : close-quote;
}

Источники: Ссылка

3 голосов
/ 26 июня 2017

Ниже приведен простой ответ:

Мы используем псевдокласс , когда нам нужно применить CSS на основе состояние элемента.Например:

  1. Применить css при наведении на элемент привязки (:hover)
  2. Применить css, когда получает фокус на элемент html (:focus).и т. д.

Мы используем псевдоэлемент , когда нам нужно применить CSS к определенным частям элементов или недавно вставленный контент .Например:

  1. Применить CSS к первой букве или первой строке элемента (::first-letter)
  2. Вставить содержимое до или после содержимого элемента (* 1035)*, ::after)

Ниже приведен пример обоих:

<html>

 <head>
   <style>
   p::first-letter {  /* pseudo-element */
     color: #ff0000;
   }

   a:hover {          /* pseudo-class */
     color: red;      
   }
   </style>
 </head>

 <body>
   <a href="#" >This is a link</a>
   <p>This is a paragraph.</p>
 </body>

</html>
0 голосов
/ 22 августа 2017

Вкратце, от Псевдоклассы на MDN:

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

div:hover {
  background-color: #F89B4D;
}

А, из Псевдоэлементы по MDN:

CSS псевдоэлемент - это ключевое слово, добавленное к селектору, которое позволяет вам стиль определенной части выбранного элемента (ов). Например, ::first-line можно использовать для стилизации первой строки абзаца.

/* The first line of every <p> element. */
p::first-line {
 color: blue;
 text-transform: uppercase;
}
...