В HTML и псевдокласс :lang()
, и селектор атрибутов будут соответствовать элементу с соответствующим атрибутом lang
.
Разница в том, что у браузера могут быть другие способы определения языка данного элемента при тестировании псевдокласса :lang()
, который может быть определен языком документа и/или реализацией, тогда как селектор атрибута будет только< /em> проверить элемент на наличие данного атрибута без какой-либо сопутствующей семантики на основе документа.
Например, в HTML псевдокласс также будет соответствовать любому потомку элемента, для которого нет другого lang
, в зависимости от того, как браузер определяет язык для этих потомков. Обычно потомки наследуют атрибут языка от своего предка, если он не установлен явно.
Вот что говорится в спецификации:
Разница между :lang(C)
и оператором «|=» заключается в том, что оператор «|=» выполняет сравнение только с заданным атрибутом элемента, в то время как псевдокласс :lang(C)
использует знания UA о семантике документа для выполнения сравнения.
В этом примере HTML только BODY соответствует [lang|=fr]
(поскольку у него есть атрибут LANG), но и BODY, и P соответствуют :lang(fr)
(поскольку оба они на французском языке). P не соответствует [lang|=fr]
, потому что у него нет атрибута LANG.
<body lang=fr>
<p>Je suis français.</p>
</body>
Обратите внимание на конкретные формулировки «имеет атрибут LANG» и «на французском языке». Эти две фразы имеют очень разные значения в английском языке, как вы можете себе представить.
В вашем примере следующий селектор также будет соответствовать вашему элементу .foo
:
.foo:lang(en)
Но следующие селекторы не будут работать, если для них не установлен собственный атрибут lang
:
.foo[lang="en"]
.foo[lang|="en"]
Что касается поддержки браузеров, псевдокласс :lang()
поддерживается, начиная с IE8, поэтому IE7 действительно является единственным браузером, который вы не сможете поддерживать, используя псевдокласс вместо селектора атрибутов.
Основываясь на этом понимании, вы можете затем ответить на вопрос «что мне следует использовать»: вы должны всегда использовать псевдокласс :lang()
по умолчанию, если только некоторые особенности (или необходимость поддержки IE7) не требуют обходного пути. вместо этого используйте селектор атрибутов.
Селекторы 4 не только привносят в псевдокласс :lang()
расширенную функциональность ( тем самым увеличивая разрыв в функциональности между ним и селекторами атрибутов), но также вводит :dir()
псевдокласс для сопоставления элементов на основе их направленности. Поскольку направленность является свойством, связанным с языком, атрибуты dir
и lang
в HTML работают одинаково, а разница между :dir()
и соответствующим ему селектором атрибутов аналогична разнице между :lang()
и соответствующим ему селектором атрибутов — до точки, где первое предложение следующая цитата на самом деле является дословной копией того же абзаца в разделе, описывающем :lang()
:
Разница между :dir(C) и ''[dir=C]'' заключается в том, что ''[dir=C]'' выполняет сравнение только с заданным атрибутом элемента, в то время как :dir(C) псевдо- class использует знания UA о семантике документа для выполнения сравнения. Например, в HTML направление элемента наследуется, так что дочерний элемент без атрибута dir будет иметь ту же направленность, что и его ближайший предок с допустимым атрибутом dir. В качестве другого примера, в HTML элемент, который соответствует ''[dir=auto]'', будет соответствовать либо :dir(ltr), либо :dir(rtl) в зависимости от разрешенной направленности элементов, определяемой его содержимым. [HTML5]
person
BoltClock
schedule
18.01.2012