在哪个方向做选择引擎读取,到底是什么?在哪个方向做选择引擎读取,到底是什么?(In which di

2019-05-13 12:00发布

我一直相信(虽然我现在怀疑这些信念的有效性)认为:

div.name

比速度更快:

.name

不过我最近读从右读到最左边的CSS选择器引擎,在这种情况下也不会第一个例子实际上是慢? 由于选择器引擎只会找到一个类名的每一个元素,然后必须确定其中哪些是div S'

哪种方式做一般阅读CSS选择器引擎? 从左至右或从右到左? 如果他们通常从右向左读可能有人请给我一个解释,为什么(我看不出它是如何有意义的阅读权利,在选择发动机方面左)?

Answer 1:

不过我最近读从右读到最左边的CSS选择器引擎,在这种情况下也不会第一个例子实际上是慢?

哪种方式对CSS选择器引擎一般读? 从左至右或从右到左? 如果他们通常从右向左读可能有人请给我一个解释,为什么(我看不出它是如何有意义的阅读权利,在选择发动机方面左)?

坦率地说,这是几乎不可能知道哪些选择将在一个给定的浏览器速度较慢,跨浏览器的要少得多。 性能趋于波动,是不可预测的,尤其是在这样的微观尺度和不可预测的文档结构。 即使我们谈论的理论性能,它最终还是要看执行情况。

话虽如此,如图鲍里斯Zbarsky的回答这个其他问题 ,并在Guffa的回答你 ,一个典型的浏览器(这是目前真正的所有主要布局引擎)需要的元素,并评估所有候选选择,看看它匹配哪些,而不是寻找一组给定的选择器匹配元素。 这是一个微妙的,但很重要的区别。 鲍里斯提供这不仅令人难以置信的详细,而且权威的(因为他的作品上壁虎,Firefox浏览器使用的引擎)技术的解释,所以我强烈建议阅读它。

不过,我想我应该解决什么似乎是在你的问题的另一个问题:

由于选择器引擎只会找到一个类名的每一个元素,然后必须确定其中哪些是div S'

除了帕特里克McElhaney的评论 :

链接的问题,解释了为什么选择读从右到左一般,所以#foo ul.round.fancy li.currentli.current, ul.round.fancy, #foo ,但它确实没有看错,以-left内的每个元件( .current, li, .fancy, .round, ul, #foo )? 应该是什么?

我从来没有实现CSS,也没看到其他浏览器如何实现它。 我们从以上链接的答案知道浏览器使用权到左匹配选择,如内跨组合子走>在这个例子中组合子:

section > div.second > div.third

如果一个元素是不是div.third ,那么就没有一点检查,如果其母公司是div.second其父是一个section

不过,我不相信这从右到左的顺序钻一路下跌到简单的选择级别。 换句话说,我并不认为浏览器使用从右到左穿过由分开的一系列化合物的选择器的右至左的评价中的评价为一个简单的选择器序列(也被称为化合物选择器)的每个部分组合子。

例如,考虑这种做作和高度夸张选择:

div.name[data-foo="bar"]:nth-child(5):hover::after

现在,谁也不能保证一个浏览器一定会检查这些条件,按以下顺序的元素:

  1. 是指针悬停在此元素?
  2. 这是元素其父的第5子?
  3. 这是否元素有data-foo与价值属性bar
  4. 这是否元素有一个name的类?
  5. 这是一个div元素?

这个选择器,它在功能上等同于上述除以其简单选择也不会混乱周围,以下面的顺序不一定进行评估:

div:hover[data-foo="bar"].name:nth-child(5)::after
  1. 这是元素其父的第5子?
  2. 这是否元素有一个name的类?
  3. 这是否元素有data-foo与价值属性bar
  4. 是指针悬停在此元素?
  5. 这是一个div元素?

是根本不存在的理由,这样的秩序将被强制执行的性能的原因。 事实上,我认为表现会由某些种类的简单选择的采摘第一,无论身在何处,他们都在一个序列中得到增强。 (您还会注意到::after不占-这是因为伪元素不是简单的选择甚至从来没有进入配对方程式。)

例如,它是非常有名的ID选择是最快的。 好了,鲍里斯说,这在他的回答的最后一段,以链接的问题:

还需要注意的是还有其他的优化浏览器已经做,以避免甚至试图匹配肯定不会匹配规则。 例如,如果最右边的选择有一个id和id不匹配的元素的ID,那么就没有试图对抗元素选择在壁虎在所有符合:一组正在试图“用的ID选择”来自该元素的ID的哈希表查找。 所以这是它有一个很好的匹配仍然不考虑只是标签/班/最右边的选择的ID匹配后的机会,规则70%。

换句话说,无论你有一个选择,看起来像这样:

div#foo.bar:first-child

或这个:

div.bar:first-child#foo

壁虎将经常检查ID和类第一,无论在哪里它被定位的序列中 如果元素没有ID和该选择那么它立即丢弃匹配类。 相当不错的快,如果你问我。

这只是壁虎作为一个例子。 这可以实现之间也不同(例如壁虎和WebKit可以从三叉戟或甚至的Presto做不同)。 有策略以及由厂商普遍商定的办法,当然(有没有可能是在第一检查ID的区别),但是小细节可能有所不同。



Answer 2:

选择器引擎不查找元素应用规则,它会查找适用于特定元素的规则。 因此它是有道理的从右至左读的选择。

一个选择是这样的:

div span.text a.demo

将使选择器引擎做这些检查,看是否选择适用于某个元素:

  • 它是一个a与类元素demo
  • 它有一个祖先是一个span与类元素text
  • 这是否元素有一个祖先是一个div元素?


文章来源: In which direction do selector engines read, exactly?