Такие вещи, как a:link
или div::after
...
Информация о разнице кажется скудной.
css
css-selectors
pseudo-class
pseudo-element
tybro0103
источник
источник
Ответы:
Рекомендация селектор 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
псевдоэлементы предоставляют доступ к сгенерированному контенту). ". Самая большая разница в том, что они фактически создают новый виртуальный элемент, к которому могут применяться правила и даже селекторы псевдоклассов. Они не фильтруют элементы, они в основном фильтруют контент (::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
источник
:not(.someclass):nth-child(even)
это не означает отфильтровывать элементы, которых нет.someclass
, а среди остальных элементов отфильтровывать одинаковые вхождения. Вместо этого он представляет любой элемент, который является одновременно:not(.someclass)
и:nth-child(even)
его родительским элементом . Более подробные объяснения можно найти в этом ответе и в этом ответе .Псевдокласс фильтрует существующие элементы.
a:link
означает все,<a>
что есть:link
.Псевдоэлемент - это новый фальшивый элемент.
div::after
означает несуществующие элементы после<div>
s.::selection
еще один пример псевдоэлемента.Это не означает, что выбраны все элементы; это означает диапазон выбранного контента, который может охватывать части нескольких элементов.
источник
div::after
является дочерним элементомdiv
, появляющимся после его содержимого, а не самого элемента.Краткое описание, которое помогло мне понять разницу:
источник
Из документов Sitepoint:
источник
Вот простой ответ:
Мы используем псевдокласс, когда нам нужно применить CSS в зависимости от состояния элемента. Такие как:
:hover
):focus
). и т.п.Мы используем псевдоэлемент, когда нам нужно применить css к определенным частям элемента или вновь вставленному содержимому . Такие как:
::first-letter
)::before
,::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>
источник
Концептуальный ответ:
Псевдоэлемент относится к вещам, которые являются частью документа, но вы этого еще не знаете. Например первая буква. Раньше у вас был только текст. Теперь у вас есть первая буква, на которую вы можете настроить таргетинг. Это новая концепция, но она всегда была частью документа. Это также включает такие вещи, как
::before
; пока там нет фактического содержания, всегда была концепция чего-то до чего-то еще - теперь вы указываете это.Псевдокласс - это состояние чего-то в DOM. Точно так же, как класс - это тег, который вы связываете с элементом, псевдокласс - это класс, который связывается браузером, DOM или чем-то еще, обычно в ответ на изменение состояния. Когда пользователь переходит по ссылке, эта ссылка может принять состояние «посещено». Вы можете представить, как браузер применяет класс «посещенный» к элементу привязки.
:visited
тогда будет то, как вы выберете этот псевдокласс.источник
Псевдо-класс
Псевдокласс - это способ выбора определенных частей HTML-документа, основанный, в принципе, не на самом дереве HTML-документа и его элементах или характеристиках, таких как имя, атрибуты или содержимое, а на других фантомных условиях, таких как кодирование языка или динамическое состояние. элемента.
Исходный псевдокласс определял динамические состояния элемента, которые вводятся и выходят с течением времени или посредством вмешательства пользователя. CSS2 расширил эту концепцию, включив в нее компоненты виртуального концептуального документа или предполагаемые части дерева документа, например first-child. Псевдоклассы работают так, как если бы фантомные классы были добавлены к различным элементам.
ОГРАНИЧЕНИЯ: в отличие от псевдоэлементов, псевдоклассы могут появляться где угодно в цепочке селекторов.
Пример кода псевдокласса:
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 */ }
Страница, демонстрирующая рендеринг вышеуказанного кода псевдокласса
Псевдоэлементы
Псевдоэлементы используются для обращения к частям элементов. Они позволяют вам установить стиль для части содержимого элемента за пределами того, что указано в документах. Другими словами, они позволяют определять логические элементы, которых на самом деле нет в дереве элементов документа. Логические элементы позволяют адресовать подразумеваемую семантическую структуру в селекторах CSS.
ОГРАНИЧЕНИЯ: Псевдоэлементы могут применяться только к внешнему контексту и контексту уровня документа, но не к встроенным стилям. Псевдоэлементы ограничены в том месте, где они могут появляться в правиле. Они могут появляться только в конце цепочки селектора (после предмета селектора). Они должны стоять после любых имен классов или идентификаторов, найденных в селекторе. Для каждого селектора можно указать только один псевдоэлемент. Чтобы адресовать несколько псевдоэлементов в структуре одного элемента, необходимо сделать несколько операторов выбора / объявления стилей.
Псевдоэлементы могут использоваться для общих типографских эффектов, таких как начальные заглавные буквы и буквицы. Они также могут адресовать сгенерированный контент, которого нет в исходном документе (с помощью «до» и «после»). Ниже приводится пример таблицы стилей некоторых псевдоэлементов с добавленными свойствами и значениями.
/ * Следующее правило выбирает первую букву заголовка 1 и устанавливает шрифт 2em, курсив, с зеленым фоном. Первая буква выбирает первую отображаемую букву / символ для элемента уровня блока. * /
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; }
Источники: Ссылка
источник
Вкратце, из Псевдоклассов на MDN:
И из Псевдоэлементов на MDN:
источник