2012-01-18 103 views
17

Ngôn ngữ CSS pseudo-class cho phép chúng ta xác định phong cách khác nhau cho các ngôn ngữ khác nhau, như vậy:Sự khác nhau giữa html [lang = "en"] và html: lang (en) trong CSS là gì?

html:lang(en) .foo { ... } 

Tuy nhiên, điều này không làm việc trong IE7, vì vậy tôi đã sử dụng một bộ chọn thuộc tính:

html[lang="en"] .foo { ... } 

Có vẻ như chúng cũng giống nhau, nhưng có sự khác biệt nào không? Và nếu không, tại sao CSS thậm chí có một lớp giả ngôn ngữ, khi bộ chọn thuộc tính làm điều tương tự?

Trả lời

25

Trong HTML, cả hai lớp :lang() giả và công cụ chọn thuộc tính sẽ khớp với phần tử có thuộc tính tương ứng lang.

Sự khác biệt là trình duyệt có thể có các cách xác định ngôn ngữ khác của một yếu tố nhất định khi kiểm tra lớp học :lang() giả có thể được xác định bằng ngôn ngữ tài liệu và/hoặc việc triển khai, trong khi bộ chọn thuộc tính sẽ chỉ kiểm tra phần tử cho có thuộc tính mà không có bất kỳ ngữ nghĩa dựa trên tài liệu nào đi kèm.

Ví dụ: trong HTML, lớp giả cũng sẽ khớp với bất kỳ phần tử con nào của phần tử không có khác nhau lang, tùy thuộc vào cách trình duyệt xác định ngôn ngữ cho các hậu duệ đó. Thông thường, các hậu duệ sẽ kế thừa thuộc tính ngôn ngữ từ tổ tiên của chúng nếu nó không được thiết lập rõ ràng.

Từ spec:

Sự khác biệt giữa :lang(C) và '| =' hành là '| =' nhà điều hành chỉ thực hiện một so sánh với một thuộc tính nhất định trên nguyên tố này, trong khi :lang(C) pseudo- lớp sử dụng kiến ​​thức UAs về ngữ nghĩa của tài liệu để thực hiện so sánh.

Trong ví dụ HTML này, chỉ có BODY phù hợp [lang|=fr] (vì nó có một thuộc tính LANG) nhưng cả BODY và ​​P trận đấu :lang(fr) (vì cả hai đều bằng tiếng Pháp). P không khớp với [lang|=fr] vì nó không có thuộc tính LANG.

<body lang=fr> 
    <p>Je suis français.</p> 
</body> 

Trong ví dụ của bạn, chọn sau đây cũng sẽ phù hợp .foo yếu tố của bạn:

.foo:lang(en) 

Nhưng selectors sau sẽ không, nếu nó không có lang thuộc tính riêng của mình set:

.foo[lang="en"] 
.foo[lang|="en"] 

Đối với hỗ trợ trình duyệt, :lang() pseudo-class được hỗ trợ bắt đầu từ IE8, vì vậy IE7 thực sự là trình duyệt duy nhất bạn sẽ không thể hỗ trợ bằng cách sử dụng lớp giả trên bộ chọn thuộc tính.


Selectors 4 giới thiệu :dir() pseudo-class cho phù hợp với các yếu tố dựa trên directionality của họ.Bởi vì directionality là một thuộc tính liên quan đến ngôn ngữ, các thuộc tính dirlang hoạt động tương tự trong HTML và sự khác biệt giữa :dir() và bộ chọn thuộc tính tương ứng của nó tương tự như giữa :lang() và bộ chọn thuộc tính tương ứng của nó - đến điểm mà câu đầu tiên của báo giá sau đây là trong thực tế, một word-cho-word copy của cùng một đoạn trong phần mô tả :lang():

sự khác biệt giữa: dir (C) và '' [dir = C] '' là '' [dir = C] '' chỉ thực hiện so sánh với thuộc tính đã cho trên phần tử, trong khi lớp giả: dir (C) sử dụng kiến ​​thức UAs về ngữ nghĩa của tài liệu để thực hiện so sánh. Ví dụ, trong HTML, định hướng của một phần tử kế thừa sao cho một đứa trẻ không có thuộc tính dir sẽ có cùng một hướng như tổ tiên gần nhất của nó với một thuộc tính dir hợp lệ. Một ví dụ khác, trong HTML, một phần tử khớp với '' [dir = auto] '' sẽ khớp với: dir (ltr) hoặc: dir (rtl) tùy thuộc vào định hướng được giải quyết của các phần tử được xác định bởi nội dung của nó. [HTML5]

+0

Giải thích tuyệt vời, cảm ơn bạn! – john

+0

Thuộc tính 'xml: lang' có thể ẩn với trình duyệt web không (vì trình duyệt web là trình phân tích cú pháp HTML chứ không phải trình phân tích cú pháp XML)? Tôi đã cố gắng sử dụng các bộ chọn được liệt kê trong [bài viết w3 này] (http://www.w3.org/International/questions/qa-css-lang) thông qua CSS của người dùng nhưng chúng không hoạt động trên [trang web này ] (http://www7a.biglobe.ne.jp/~nifongo/av/t23_1.htm). Phần tử '' trên trang web tiếng Nhật đó chỉ xác định thuộc tính 'xml: lang' chứ không chỉ định thuộc tính' lang'. –

+1

@ 3to5businessdays: Có, mặc dù tôi nên chỉ ra rằng các trình duyệt hiện đại thực sự có cả hai trình phân tích cú pháp HTML và XML - cái nào được sử dụng được xác định bởi loại nội dung do máy chủ đưa ra. Bất kể, nếu phần tử '' chỉ chứa thuộc tính 'xml: lang' chứ không phải thuộc tính' lang', thì nó không hợp lệ. Điều này là do, trong HTML, chỉ có thuộc tính 'lang' được áp dụng, và đó là lý do tại sao': lang() 'giả không khớp. – BoltClock

0

Css hỗ trợ bộ chọn attribtue cho tất cả các thành phần, không chỉ cho thuộc tính html thẻ lang. Ví dụ: html như <a title="Jeeha" href="foo.html">bar</a> có thể được chọn như a[title=Jeeha] { ... } trong css.

Xem liên kết this để biết thêm chi tiết về đối sánh một phần và biến thể.

+1

Đó không phải là những gì anh ta yêu cầu. – BoltClock

+0

Dường như tôi chỉ học một chút. – kontur

2

According to the spec,

Nếu ngôn ngữ tài liệu quy định cụ thể như thế nào ngôn ngữ loài người của một nguyên tố được xác định, nó có thể viết selectors trong CSS mà phù hợp với một yếu tố dựa trên ngôn ngữ của nó. Ví dụ, trong HTML [HTML4], ngôn ngữ được xác định bởi sự kết hợp của thuộc tính "lang", phần tử META và có thể là thông tin từ giao thức (chẳng hạn như tiêu đề HTTP). XML sử dụng một thuộc tính được gọi là xml: lang, và có thể có các phương pháp cụ thể về ngôn ngữ tài liệu khác để xác định ngôn ngữ.

Lớp giả ': lang (C)' phù hợp nếu phần tử bằng ngôn ngữ C. Cho dù có khớp chỉ dựa trên từ định danh C bằng hoặc chuỗi con được phân tách bằng dấu gạch ngang, giá trị ngôn ngữ của phần tử, giống như cách được thực hiện bởi toán tử '| ='. Kết hợp của C với giá trị ngôn ngữ của phần tử được thực hiện phân biệt chữ hoa chữ thường cho các ký tự trong phạm vi ASCII. Mã định danh C không phải là tên ngôn ngữ hợp lệ.

Đó là:

  1. Nó hoạt động cho nhiều cách khác để xác định một ngôn ngữ bên cạnh những lang thuộc tính đơn giản.
    • Quan trọng nhất, như được nêu chi tiết trong câu trả lời của @ BoltClock, nó sẽ sử dụng ngôn ngữ được chỉ định (theo bất kỳ cách nào) trên phần tử vùng chứa, không chỉ trên chính phần tử đó, vì ngôn ngữ được thừa hưởng bởi các phần tử con.
  2. Nó sử dụng |= ngữ nghĩa, ví dụ: :lang(en):lang(us) sẽ cả hai trận đấu span[lang=en-us].
  3. Đó là đảm bảo được case-insensitive, trong khi

Trường hợp độ nhạy của tên thuộc tính và giá trị trong bộ chọn phụ thuộc vào ngôn ngữ tài liệu.

+0

Cảm ơn bạn đã trả lời! – john

4

Một điều nữa không được đề cập bởi bất kỳ ai khác - :lang() pseudoclass không quan tâm đến cách đặt ngôn ngữ của phần tử. Trong tài liệu XHTML (đúng XHTML với loại MIME XML), bạn có thể sử dụng xml:lang="en" và phần tử sẽ khớp với :lang(en) nhưng không phải là [lang="en"].

+0

Tôi đã đề cập đến nó !! : P – Domenic

+0

Hay đúng hơn, thông số đề cập đến nó. – BoltClock

+0

Cộng với điểm của tôi 1 ... – Domenic

Các vấn đề liên quan