:lang
选择器与所有其他选择器(AFAIK)非常不同。
其他选择器仅(直接)影响实际匹配的元素本身,而:lang
伪类非常不同,因为:lang选择器所针对的元素中的所有元素也直接定位
因此,我要说我在ul
元素周围放置一个边框 - 只有ul
本身才能获得边框 - 而不是所有列表项(demo)。不是这样的:lang如果我的目标是同一个具有lang =" en"的属性的ul。 - 所有列表项也将获得边界 - 为了覆盖该规则(在孩子上!!)我必须使用具有更高规格的选择器(DEMO !!!)。
:lang(en) {
border: 5px solid red;
}

<ul lang="en">
<li>item
<li>item
<li>item
<li>item
<li>item
</ul>
&#13;
所以我想知道为什么:lang选择器是以这种非常奇怪的方式实现的。 (除that's what it says in the spec之外的事实),原因如下:
如果我们使用逻辑,所有具有lang属性的元素的后代应该匹配 - 因为它们共享相同的语言 - 那么概念上[lang]属性选择器应该以完全相同的方式匹配!
a)通常,在处理文档中的不同语言时,您需要调整与文本相关的属性,如font-family,font-size,color,quotes等,以适应其他语言。问题是这些属性无论如何都继承了这样,通过匹配父元素元素 - 所有后续后代都会得到这些更改。 (demo)
b)如果出于某种原因需要此功能,可以使用通用选择器实现此功能,如.parent,.parent * {}
(demo)
答案 0 :(得分:1)
所以我想知道为什么:lang选择器是以这种非常奇怪的方式实现的。
它的工作方式是这样,因为大多数时候我们都希望它能够工作。这样,我们可以通过将lang
属性只放在顶层一次,为整个文档或文档的某些部分指定语言。
例如,我们假设我为德语提供引用规则(请参阅this question):
q:before { content: open-quote; }
q:after { content: close-quote; }
:lang(de) { quotes: "«" "»"; }
为了使这项工作,我当然不希望将lang
属性应用于我可能想要应用引号的HTML中的每个元素。相反,我只需要将它应用于<html>
元素。
一个半相关的例子(见this question)。在这里,我们希望text-transform
属性与希腊语一起正常工作。要实现这一点,需要知道语言。同样,我们可以通过将lang='el'
放在html
元素上指定整个页面的语言来使这项工作正常运行。
所以,让我说我在
ul
元素周围放置一个边框 - 只有ul
本身才能获得边框 - 而不是所有列表项(演示)。:lang
不是这样。如果我定位具有属性ul
的相同lang="en"
- 所有列表项也将获得边框(DEMO !!!)。
是的,这就是为什么你不会这样做的原因。如果您要定位ul
,请以其他方式定位,或者如果必须,可以使用属性选择器[lang='en']
。
另一方面,也许你想让页面上的所有日文文本都变红。如果您已正确部署lang
属性,那么 是您希望使用:lang
选择器进行定位的情况:
:lang(ja) { color: red; }
答案 1 :(得分:0)
您定位了lang
设置为en
的每个元素,并且lang
值确实继承。但您只想选择ul
。因此,只需添加ul
选择器,就像您应该的那样,并且可以与其他所有普通的伪选择器一起使用。
ul:lang(en) {
border: 5px solid red;
}
&#13;
<ul lang="en">
<li>item</li>
<li>item</li>
<li>item</li>
<li>item</li>
<li>item</li>
</ul>
&#13;
如果由于某种原因,您不想使用ul
选择器,请使用属性lang
本身,因为它不会继承,如下所示:
[lang="en"] {
border: 5px solid red;
}
&#13;
<ul lang="en">
<li>item</li>
<li>item</li>
<li>item</li>
<li>item</li>
<li>item</li>
</ul>
&#13;
答案 2 :(得分:0)
:lang
伪类没有任何反直觉。所有伪类都以这种方式工作,因为它们代表元素状态 - 因此该特定状态中的所有元素都是目标。
另一方面,[lang]属性选择器只会选择具有属性的元素本身 - 因为属性选择器会检查属性而不是状态。
:lang
属性是绝对必要的,还是使用其他选择器可以实现其功能可能是有争议的,但:lang
的工作方式肯定没什么奇怪的。