The CSS language pseudo-class to allow us specify different styles for different languages, like so:
html:lang(en) .foo { ... }
However, this doesn’t work in IE7, so I’ve been using an attribute selector:
html[lang="en"] .foo { ... }
They seem to do the same thing, but are there any subtle differences? And if not, why does CSS even have a language pseudo-class, when the attribute selector does the exact same thing?
In HTML, both the
:lang()pseudo-class and the attribute selector will match an element with the correspondinglangattribute.The difference is that a browser may have other ways of determining the language of a given element when testing against the
:lang()pseudo-class which may be defined by the document language and/or the implementation, whereas an attribute selector will only check an element for that given attribute, without any accompanying document-based semantics.For example, in HTML, the pseudo-class will also match any of the element’s descendants for which there isn’t a different
lang, depending on how a browser determines the language for those descendants. Usually, the descendants will inherit the language attribute from their ancestor if it is not explicitly set.Here’s what the spec says:
Notice the specific phrasings of “has a LANG attribute” and “are in French”. These two phrases have very different meanings in English, as you might imagine.
In your example, the following selector will also match your
.fooelement:But the following selectors won’t, if it doesn’t have its own
langattribute set:As for browser support, the
:lang()pseudo-class is supported starting from IE8, so IE7 really is the only browser you will be unable to support by using the pseudo-class over the attribute selector.Based on this understanding you can then answer the question “which should I use”: you should always use the
:lang()pseudo-class by default, unless certain quirks (or the need to support IE7) require working around by using an attribute selector instead.Selectors 4 not only brings enhanced functionality to the
:lang()pseudo-class (thereby widening the gap in functionality between it and attribute selectors), but also introduces the:dir()pseudo-class for matching elements based on their directionality. Because directionality is a language-related property, thedirandlangattributes work similarly in HTML, and the difference between:dir()and its corresponding attribute selector is analogous to that between:lang()and its corresponding attribute selector — to the point where the first sentence of the following quotation is in fact a word-for-word copy of the same paragraph in the section describing:lang():