Легче/быстрее оценить CSS-селектора LTR или RTL?

Учитывая селектор CSS, например

ul > li a

Было бы проще/быстрее оценить его слева направо или справа налево? (Я понимаю, что ответы на "легкие" и "быстрые" могут быть разными. Мне нужен ответ на оба вопроса). Я собираюсь запустить один из этих путей, и я не хочу получать половину пути, а затем понимаю, что выбрал неправильный путь:)

LTR: Итерируйте по всем элементам документа, выделите те, которые являются ul, затем проверьте все их дочерние элементы на li, а затем посмотрите на их потомки для a.

RTL: перейдите по всем элементам документа, найдите все a, отфильтруйте те, у которых нет предка, который является li, если он имеет предка li, проверьте если его родительский элемент ul, если нет, отбросьте его a.

Кроме того, на самом деле нет другого способа сделать это, чем есть итерация по всем элементам?


Я думаю в контексте поиска элементов, как это делает jQuery, а не в контексте применения стилей.

Ответы

Ответ 1

Браузеры и JS-движок Sizzle (что используется в jQuery и других фреймворках) используют сопоставление справа налево.

Справа налево работает как наиболее оптимальное решение для перемещения в большинстве ситуаций.

Sizzle оптимизирует селектор, который начинается с идентификатора. Сначала он решает элемент с идентификатором. Затем он использует это как контекст для дальнейшего прохождения.

Итак, если у вас есть селектор

#myID > ul a

Sizzle сначала найдет элемент С#myID, считая, что в этом случае более точно, слева направо.

Ответ 2

Это один из тех вопросов, которые повторяются на каждом форуме дизайна и программирования. Общим примером является также тот, который дает исходный плакат по этой теме:

ul > li a

если вы пересекаете ltr, вы найдете все uls, а затем все lis этих uls, а затем все теги в этих lis. Обратите внимание на то, что разметка может выглядеть так:

<ul>
    <li>
        <a href="#">Click Here</a>
    </li>
</ul>

или это может выглядеть так:

<ul>
    <li>
        <span>
            <p>
                <div class="someuselessclass">
                    <span class="JunkClass">
                        <a href="#">Click Here</a>
                    </span>
                </div>
            </p>
        </span>
    </li>
</ul>

Дело в том, что вы не знаете, как глубоко пройти обход, и могут быть тысячи таких ссылок в тысячах таких LI. Мне кажется, что на опыте разработчики браузеров пришли к выводу, что быстрее разобрать право налево.

Что мои два цента.