Sự khác biệt giữa lớp giả và phần tử giả trong CSS là gì?


94

Những thứ như a:linkhoặc div::after...

Thông tin về sự khác biệt dường như khan hiếm.


1
@ ŠimeVidas đến bài nào? liên kết?
tybro0103

1
Tôi nghĩ rằng spec là khá rõ ràng ...
zzzzBov

1
@ tybro0103 Tôi không tìm thấy cái nào. Tôi đoán đây thực sự chưa bao giờ được hỏi ở đây ... Tôi thấy điều này mặc dù: stackoverflow.com/questions/7757943/what-is-a-pseudo-element
Šime Vidas

@zzzzBov Tôi cảm thấy như tôi cần một người phiên dịch để hiểu rằng :)
tybro0103

Cảm ơn bạn đã gửi câu hỏi này. Tôi không chắc tại sao mình không nghĩ đến việc tự mình đăng nó sau trò chơi blitzkrieg gần đây của tôi về các câu hỏi có thẻ [pseudo-selector] ...
BoltClock

Câu trả lời:


79

Các CSS 3 chọn giới thiệu là khá rõ ràng về cả hai, nhưng tôi sẽ cố gắng thể hiện sự khác biệt nào.

Lớp giả

Mô tả chính thức

Khái niệm lớp giả được giới thiệu để cho phép lựa chọn dựa trên thông tin nằm bên ngoài cây tài liệu hoặc không thể được thể hiện bằng các bộ chọn đơn giản khác.

Một lớp giả luôn bao gồm một "dấu hai chấm" ( :) theo sau là tên của lớp giả và có thể là một giá trị giữa các dấu ngoặc đơn.

Các lớp giả được cho phép trong tất cả các chuỗi các bộ chọn đơn giản có trong một bộ chọn. Các lớp giả được phép ở bất kỳ đâu trong chuỗi các bộ chọn đơn giản, sau bộ chọn loại hàng đầu hoặc bộ chọn phổ quát (có thể bị bỏ qua). Tên lớp giả không phân biệt chữ hoa chữ thường. Một số lớp giả loại trừ lẫn nhau, trong khi những lớp khác có thể được áp dụng đồng thời cho cùng một phần tử. Các lớp giả có thể là động, theo nghĩa là một phần tử có thể nhận được hoặc mất lớp giả trong khi người dùng tương tác với tài liệu.

Nguồn

Điều đó có nghĩa là gì?

Bản chất quan trọng của lớp giả được phát biểu ngay trong câu đầu tiên: "khái niệm lớp giả [...] cho phép lựa chọn " . Nó cho phép tác giả của một biểu định kiểu khác nhau giữa các phần tử dựa trên thông tin "nằm ngoài cây tài liệu" , ví dụ: trạng thái hiện tại của một liên kết ( :active, :visited). Chúng không được lưu ở bất kỳ đâu trong DOM và không tồn tại giao diện DOM để truy cập các tùy chọn này.

Mặt khác, :targetcó thể được truy cập thông qua thao tác DOM (bạn có thể sử dụng window.location.hashđể tìm đối tượng bằng JavaScript), nhưng điều này "không thể được thể hiện bằng các bộ chọn đơn giản khác" .

Vì vậy, về cơ bản một lớp giả sẽ tinh chỉnh tập hợp các phần tử được chọn như bất kỳ bộ chọn đơn giản nào khác trong một chuỗi các bộ chọn đơn giản . Lưu ý rằng tất cả các bộ chọn đơn giản trong một chuỗi các bộ chọn đơn giản sẽ được đánh giá cùng một lúc. Để có danh sách đầy đủ các lớp giả, hãy kiểm tra đề xuất bộ chọn CSS3.

Thí dụ

Ví dụ sau sẽ tô màu tất cả các hàng chẵn là màu xám ( #ccc), tất cả các hàng không đồng đều không chia hết cho 5 màu trắng và mọi hàng khác là màu đỏ tươi.

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;
}

Yếu tố giả

Mô tả chính thức

Các phần tử giả tạo ra những điều trừu tượng về cây tài liệu ngoài những điều được chỉ định bởi ngôn ngữ tài liệu. Ví dụ: ngôn ngữ tài liệu không cung cấp cơ chế để truy cập vào chữ cái đầu tiên hoặc dòng đầu tiên của nội dung phần tử. Yếu tố giả cho phép các tác giả tham khảo thông tin này nếu không thì không thể truy cập được. Pseudo-yếu tố cũng có thể cung cấp cho tác giả một cách để tham khảo nội dung không tồn tại trong tài liệu nguồn (ví dụ, ::before::aftergiả yếu tố cung cấp cho truy cập vào nội dung được tạo ra).

Phần tử giả được tạo bởi hai dấu hai chấm ( ::) theo sau là tên của phần tử giả.

Đây ::ký hiệu được giới thiệu bởi các tài liệu hiện tại để thiết lập một phân biệt đối xử giữa pseudo-class và pseudo-yếu tố. Để tương thích với các biểu định kiểu hiện có, tác nhân người dùng cũng phải chấp nhận ký hiệu một dấu hai chấm trước đó cho các phần tử giả được giới thiệu trong CSS cấp 1 và 2 (cụ thể là: first-line,: first-letter,: before và: after). Tính tương thích này không được phép đối với các phần tử giả mới được giới thiệu trong đặc tả này.

Chỉ một phần tử giả có thể xuất hiện trên mỗi bộ chọn và nếu có, nó phải xuất hiện sau chuỗi các bộ chọn đơn giản đại diện cho các đối tượng của bộ chọn.

Lưu ý: Phiên bản trong tương lai của đặc tả này có thể cho phép nhiều phần tử giả trên mỗi bộ chọn.

Nguồn

Điều đó có nghĩa là gì?

Phần quan trọng nhất ở đây là "phần tử giả cho phép tác giả tham chiếu đến [..] thông tin không thể truy cập được " và chúng "cũng có thể cung cấp cho tác giả một cách để tham chiếu đến nội dung không tồn tại trong tài liệu nguồn (ví dụ: ::before::afterphần tử giả cung cấp quyền truy cập vào nội dung đã tạo). ". Sự khác biệt lớn nhất là chúng thực sự tạo ra một phần tử ảo mới mà trên đó các quy tắc và thậm chí bộ chọn lớp giả có thể được áp dụng. Họ không lọc các phần tử, về cơ bản họ lọc nội dung ( ::first-line, ::first-letter) và bọc nó trong một vùng chứa ảo, tác giả có thể tạo kiểu theo cách mà anh ta muốn (tốt, gần như vậy).

Ví dụ: ::first-linephần tử giả không thể được tạo lại bằng JavaScript, vì nó phụ thuộc nhiều vào phông chữ được sử dụng hiện tại, kích thước phông chữ, chiều rộng phần tử, phần tử nổi (và có thể là thời gian trong ngày). Chà, điều đó không hoàn toàn đúng: người ta vẫn có thể tính toán tất cả các giá trị đó và trích xuất dòng đầu tiên, tuy nhiên làm như vậy là một hoạt động rất cồng kềnh.

Tôi đoán sự khác biệt lớn nhất là "chỉ có một phần tử giả có thể xuất hiện trên mỗi bộ chọn" . Ghi chú nói rằng điều này có thể thay đổi, nhưng kể từ năm 2012, tôi không tin rằng chúng ta sẽ thấy bất kỳ hành vi nào khác trong tương lai ( nó vẫn còn trong CSS4 ).

Thí dụ

Ví dụ sau sẽ thêm một thẻ ngôn ngữ vào mọi trích dẫn trên một trang nhất định bằng cách sử dụng lớp :langgiả và phần tử giả ::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

Các lớp giả hoạt động như các bộ chọn đơn giản trong một chuỗi các bộ chọn và do đó phân loại các phần tử trên các đặc điểm không trình bày, các phần tử giả tạo ra các phần tử ảo mới.

Người giới thiệu

W3C


4
Tôi đồng ý với nhận xét của DanMan về câu trả lời của SLaks rằng các lớp giả không thực sự hoạt động như "bộ lọc" mà giống như "bộ mô tả". Ví dụ: :not(.someclass):nth-child(even)không có nghĩa là lọc ra các phần tử không có .someclassvà trong số các phần tử còn lại lọc ra các phần tử chẵn. Thay vào đó, đại diện cho bất kỳ yếu tố đó là cả hai :not(.someclass) :nth-child(even) cha của nó cùng một lúc. Có thể tìm thấy nhiều giải thích sâu hơn trong câu trả lời nàycâu trả lời này .
BoltClock

2
@BoltClock: Tôi tin rằng tôi thích thuật ngữ "đặc trưng-phân loại" nhất, vì đó là những gì chúng được mô tả ban đầu như trong CSS2: "Pseudo-class phân loại các phần tử dựa trên các đặc điểm khác với tên của chúng" . Tuy nhiên, tôi vẫn chưa tìm thấy từ ngữ chính xác mà tôi hài lòng.
Zeta

42

Lớp giả lọc các phần tử hiện có.
a:linkcó nghĩa là tất cả những <a>điều đó :link.

Phần tử giả là một phần tử giả mới.
div::aftercó nghĩa là các phần tử không tồn tại sau <div>s.

::selectionlà một ví dụ khác về phần tử giả.
Nó không có nghĩa là tất cả các phần tử được chọn; nó có nghĩa là phạm vi nội dung được chọn, có thể kéo dài các phần của nhiều phần tử.


12
+1 mặc dù về mặt kỹ thuật div::afterlà con của div, xuất hiện sau nội dung của nó hơn là bản thân phần tử.
BoltClock

1
Thay vì "bộ lọc", tôi muốn nói "mô tả thêm".
DanMan

17

Mô tả ngắn đã giúp tôi hiểu sự khác biệt:

  • Các lớp giả mô tả một trạng thái đặc biệt.
  • Yếu tố giả phù hợp với yếu tố ảo.

10

Từ tài liệu Sitepoint:

Lớp giả tương tự như lớp trong HTML, nhưng nó không được chỉ định rõ ràng trong đánh dấu. Một số lớp giả là động — chúng được áp dụng do tương tác của người dùng với tài liệu. - http://reference.sitepoint.com/css/pseudoclasses . Đây sẽ là những thứ như thế này :hover, :active, :visited.

Phần tử giả khớp với các phần tử ảo không tồn tại rõ ràng trong cây tài liệu. Phần tử giả có thể là động, mặc dù các phần tử ảo mà chúng đại diện có thể thay đổi, ví dụ, khi chiều rộng của cửa sổ trình duyệt bị thay đổi. Chúng cũng có thể đại diện cho nội dung được tạo bởi các quy tắc CSS. - http://reference.sitepoint.com/css/pseudoelements . Đây sẽ là những thứ như thế này before, :after, :first-letter.


7

Dưới đây là câu trả lời đơn giản:

Chúng tôi sử dụng lớp giả khi cần áp dụng css dựa trên trạng thái của một phần tử. Nhu la:

  1. Áp dụng css khi di chuột của phần tử neo ( :hover)
  2. Áp dụng css khi tập trung vào phần tử html ( :focus). Vân vân.

Chúng tôi sử dụng phần tử giả khi chúng tôi cần áp dụng css cho các phần cụ thể của phần tử hoặc nội dung mới được chèn . Nhu la:

  1. Áp dụng css cho chữ cái đầu tiên hoặc dòng đầu tiên của một phần tử ( ::first-letter)
  2. Chèn nội dung trước hoặc sau nội dung của một phần tử ( ::before, ::after)

Dưới đây là ví dụ của cả hai:

<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>

6

Một câu trả lời khái niệm:

  • Phần tử giả đề cập đến những thứ là một phần của tài liệu, nhưng bạn chưa biết về nó. Ví dụ chữ cái đầu tiên. Trước khi bạn chỉ có văn bản. Bây giờ bạn có một chữ cái đầu tiên mà bạn có thể nhắm mục tiêu. Đó là một khái niệm mới, nhưng luôn là một phần của tài liệu. Điều này cũng bao gồm những thứ như ::before; trong khi không có nội dung thực tế ở đó, khái niệm về một thứ gì đó trước một thứ khác luôn ở đó - bây giờ bạn đang xác định nó.

  • Lớp giả là trạng thái của một thứ gì đó trong DOM. Giống như lớp là một thẻ mà bạn liên kết với một phần tử, lớp giả là lớp được liên kết bởi trình duyệt hoặc DOM hoặc bất cứ thứ gì, thường là phản hồi cho một thay đổi về trạng thái. Khi người dùng truy cập một liên kết - liên kết đó có thể ở trạng thái 'đã truy cập'. Bạn có thể tưởng tượng trình duyệt áp dụng lớp 'đã thăm' cho phần tử Anchor. :visitedsau đó sẽ là cách bạn chọn cho lớp giả đó.


4

Lớp giả

Lớp giả là cách chọn các phần nhất định của tài liệu HTML, về nguyên tắc không dựa trên cây tài liệu HTML và các phần tử của nó hoặc dựa trên các đặc điểm như tên, thuộc tính hoặc nội dung, mà dựa trên các điều kiện ảo khác như mã hóa ngôn ngữ hoặc trạng thái động của một phần tử.

Các trạng thái động xác định của lớp giả ban đầu của một phần tử được nhập và thoát theo thời gian hoặc thông qua sự can thiệp của người dùng. CSS2 đã mở rộng khái niệm này để bao gồm các thành phần tài liệu khái niệm ảo hoặc các phần được suy ra của cây tài liệu, ví dụ: con đầu tiên. Các lớp giả hoạt động như thể các lớp ảo được thêm vào các phần tử khác nhau.

HẠN CHẾ: Không giống như phần tử giả, lớp giả có thể xuất hiện ở bất kỳ đâu trong chuỗi bộ chọn.

Mã lớp giả mẫu:

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 */
}

Trang thể hiện sự hiển thị của mã lớp giả ở trên

Yếu tố giả

PSEUDO-ELEMENTS được sử dụng để giải quyết các phần con của phần tử. Chúng cho phép bạn thiết lập kiểu trên một phần nội dung của phần tử ngoài những gì được chỉ định trong tài liệu. Nói cách khác, chúng cho phép xác định các phần tử lôgic không thực sự có trong cây phần tử tài liệu. Các yếu tố logic cho phép cấu trúc ngữ nghĩa ngụ ý được giải quyết trong các bộ chọn CSS.

HẠN CHẾ: Phần tử giả chỉ có thể được áp dụng cho các ngữ cảnh bên ngoài và ở cấp độ tài liệu - không áp dụng cho các kiểu nội dòng. Phần tử giả bị hạn chế ở nơi chúng có thể xuất hiện trong một quy tắc. Chúng chỉ có thể xuất hiện ở cuối chuỗi bộ chọn (sau chủ đề của bộ chọn). Chúng phải đứng sau bất kỳ tên lớp hoặc ID nào được tìm thấy trong bộ chọn. Chỉ một phần tử giả có thể được chỉ định cho mỗi bộ chọn. Để giải quyết nhiều phần tử giả trên một cấu trúc phần tử, phải thực hiện nhiều câu lệnh khai báo / bộ chọn kiểu.

Phần tử giả có thể được sử dụng cho các hiệu ứng chữ phổ biến như chữ viết đầu và chữ viết hoa. Họ cũng có thể giải quyết nội dung được tạo không có trong tài liệu nguồn (với "trước" và "sau") Một biểu định kiểu mẫu về một số phần tử giả có các thuộc tính và giá trị được thêm vào sau.

/ * Quy tắc sau đây chọn chữ cái đầu tiên của tiêu đề 1 và đặt phông chữ thành 2em, chữ thảo, với nền màu xanh lá cây. Chữ cái đầu tiên chọn chữ cái / ký tự được hiển thị đầu tiên cho phần tử cấp khối. * /

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;
}

Nguồn: Liên kết


0

Tóm lại, từ Pseudo-class trên MDN:

Lớp giả CSS là một từ khóa được thêm vào một bộ chọn chỉ định trạng thái đặc biệt của (các) phần tử đã chọn. Ví dụ: :hover có thể được sử dụng để áp dụng một kiểu khi người dùng di chuột qua một nút.

div: hover {
  màu nền: # F89B4D;
}

Và, từ Pseudo- Elements trên MDN:

Phần tử giả CSS là một từ khóa được thêm vào bộ chọn cho phép bạn tạo kiểu cho một phần cụ thể của (các) phần tử đã chọn. Ví dụ, ::first-linecó thể được sử dụng để tạo kiểu cho dòng đầu tiên của đoạn văn.

/ * Dòng đầu tiên của mọi phần tử <p>. * /
p :: dòng đầu tiên {
 màu sắc: xanh lam;
 text-biến đổi: chữ hoa;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.