Итак, я недавно много работал с Concrete5. Однако я заметил, что тема по умолчанию имеет много правил CSS, которые определены следующим образом:
#page #central #sidebar p{line-height:24px}
Поскольку «боковая панель» является идентификатором, на всей странице должна быть только одна «боковая панель» (при условии, что она проверяет, что я позаботился о ней). Поэтому, если #sidebar
находится в #page #central
, оно должно всегда быть в #page #central
. Не важно что. На каждой странице.
По этой логике следующее правило делает то же самое:
#sidebar p{line-height:24px}
Тестирование это, конечно же, это сработало. Так что мой вопрос - что будет лучше? Есть ли причина, связанная со скоростью, что команда Concrete5 пошла с более длинной спецификацией, или это было просто для того, чтобы помочь будущим разработчикам найти #sidebar
div? Я вижу аргументы в пользу того, что это будет быстрее в любом случае.
Если случай 1 быстрее (#page #central #sidebar
):
Если браузер использует алгоритм поиска в ширину для поиска правильного элемента DOM, то поиск #sidebar
будет включать поиск второго уровня КАЖДОГО элемента DOM, у которого есть дочерние элементы, до того, как он достигнет третьего уровня , в этот момент у него все еще будет несколько элементов, на которые он смотрит, прежде чем найти #sidebar
. При указании элементов таким способом поиск в ширину распознал бы #page
и знал бы, что ему нужно только продолжить поиск в этом элементе, а не продолжать весь DOM.
Если случай 2 быстрее (#sidebar
):
Если браузер ищет весь документ в том порядке, в котором он написан, а не обрабатывает DOM как дерево, то он будет выполнять один линейный поиск, а не три линейных поиска. На самом деле, даже в лучшем случае, когда он достаточно умен, чтобы распознавать начальную и конечную точки ранее найденного элемента DOM (по сути, поиск в глубину), ему все равно придется читать столько же строк кода в линейный поиск - сначала он будет читать, пока не найдет #page
, затем он начнет читать с начала #page
до тех пор, пока не найдет #center
, затем он будет читать с начала #center
, пока не найдет #sidebar
. Единственная разница в этом случае заключается в небольшом количестве накладных расходов, связанных с переключением с одного поиска на другой