Является ли использование содержимого, созданного с помощью CSS (т.е. псевдоэлементов), более эффективным (т.е. анализируется / обрабатывается быстрее), чем добавление дополнительных элементов DOM?

Чтобы мое мобильное веб-приложение оставалось компактным и эффективным, я пытаюсь ограничить количество элементов в DOM в любой момент времени. Один из способов, которым я намерен ограничить использование элементов DOM, - это использование псевдо-элементов :before и :after для генерации контента там, где это возможно.

Например, вместо представления элемента списка с такими метаданными:

<dd class="item">
    <div class="name">Name</div>
    <div class="desc">Description</div>
    <div class="location">Location</div>
    <div class="genre">Genre</div>
</dd>

Я мог бы представить это так (и использовать свойство content: для отображения метаданных):

<dd class="child" 
    data-name="Name" 
    data-desc="Description" 
    data-location="Location" 
    data-genre="Genre">
</dd>

Итак, один элемент DOM с атрибутами данных, а не 5 отдельных элементов и, возможно, более чистая разметка.
Демо здесь: http://jsfiddle.net/quc8b/2/

Действительно ли этот метод улучшит производительность? Я считаю, что с меньшим количеством элементов DOM javascript должен анализировать быстрее, и я смогу быстрее добавлять / удалять узлы элементов списка. Но будет ли рендеринг (например, рисование, макет и перекомпоновка) происходить быстрее? Другими словами, отображается / анализируется ли контент, сгенерированный CSS, быстрее или эффективнее, чем традиционные элементы и текстовые узлы?

Как браузеры внутренне обрабатывают сгенерированный CSS контент в дереве рендеринга и дереве документов, мне неизвестно (возможно, теневой DOM?). Есть ли статьи, в которых это обсуждается?


person BigMacAttack    schedule 15.04.2013    source источник
comment
Псевдоэлементы не существуют в DOM, пока правило CSS не вставляет их до или после элемента. Это означает дополнительные манипуляции с DOM, хотя никакой дополнительной логики для сопоставления с самим селектором не требуется.   -  person ricardohdz    schedule 16.04.2013
comment
С семантической точки зрения существует большая разница между двумя представлениями данных. Первый указывает определение с названием, описанием, местоположением и жанром. Второй указывает на определение. И это все. По крайней мере, рендеринг содержимого через CSS, безусловно, недоступен.   -  person Heretic Monkey    schedule 16.04.2013
comment
@ricardohdz Но действительно ли этот метод манипуляции с DOM более эффективен, чем манипуляция через javascript?   -  person BigMacAttack    schedule 16.04.2013
comment
Если вас больше беспокоит производительность, я бы пошел и реализовал его через CSS, потому что Javascript будет перемещаться / манипулировать DOM только после того, как все элементы будут нарисованы и документ готов (на этом этапе ваш псевдоселектор CSS уже был применен ).   -  person ricardohdz    schedule 16.04.2013
comment
@MikeMcCaughan Согласен, но в моем конкретном сценарии то, как данные представлены в разметке, меня беспокоит меньше, чем эффективность. Я хочу понять взаимосвязь производительности между различными типами узлов DOM и то, как они могут повлиять на время макета / потока и время обхода DOM через javascript. Если через JS и CSS доступно меньше, то, возможно, это может улучшить производительность?   -  person BigMacAttack    schedule 16.04.2013
comment
@BigMacAttack Достаточно честно. Однако единственный способ ответить на подобные вопросы о производительности - это проверить его самостоятельно, поскольку ваша конкретная модель DOM может уступать одной методике другой. См. Эту статью, чтобы узнать, как тестировать псевдоэлементы CSS: stackoverflow.com/questions/13028891/   -  person Heretic Monkey    schedule 16.04.2013


Ответы (2)


Мне тоже было интересно в этом разобраться. Итак, я сделал простой небольшой тестовый пример.

Я создал две html-страницы для сравнения:

А. Псевдоселекторы:

  • HTML: 50 000 из них: <p>paragraph</p>

  • CSS: p:before { display: inline-block; width: 10px; height: 10px; margin-right: 5px; background-color: red; content: ""; }

Б. Многие DOM-элементы:

  • HTML: 50 000 из них: <p><span class="icon"></span> paragraph</p>

  • CSS: .icon { display: inline-block; width: 10px; height: 10px; margin-right: 5px; background-color: red; }


Тесты:

Я использовал монитор производительности Chrome Devtools на Macbook Pro 2015 года выпуска.

Test1: «Начать профилирование и перезагрузить страницу»

Вариант Б проиграл ~ 400 мс. На синтаксический анализ потребовалось 2452 мс, в то время как для «псевдо» варианта потребовалось 2033 мс. Я провел этот тест трижды с аналогичными результатами.

скриншот

Test2: изменение размера окна

Чтобы измерить повторную компоновку, я начал отдельную запись, в которой я 3 раза изменил размер окна браузера, переключившись с полноэкранного на полуэкранный (с помощью сочетаний клавиш в диспетчере окон).

«Многие DOM-элементы» были победителями, показав время рендеринга 1136 мс, в то время как «псевдоэлементы» заняли 1463 мс.

введите описание изображения здесь

Test3: Reflows

Я попытался вызвать перекомпоновку, измерив высоту страницы с помощью этого фрагмента Javascript: document.body.offsetHeight;

Но это никогда не занимало более 4 мсек ... недостаточно времени для надежного измерения производительности.

Очевидно, 50 000 элементов недостаточно, чтобы вызвать существенное замедление в этой области.

PS: Выбор тестов не был таким уж научным, просто они были первыми, о которых я подумал.

person Drkawashima    schedule 22.02.2018

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

Я не знаю о производительности псевдоэлементов, но меня беспокоит, что вы ставите производительность превыше всего.

Псевдоэлементы имеют существенные недостатки по сравнению с "настоящими" DOM-узлами:

  • Их нельзя перемещать или анимировать
  • Вы не можете динамически изменять их внешний вид с помощью Javascript
  • Они гораздо менее "важны" для поисковых систем.
  • Они громоздки, когда дело доходит до отладки
  • Их количество ограничено одним :before и одним :after элементом.
  • Они не могут содержать HTML-теги, например ссылки или дополнительные контейнеры.
  • Вы задели концепцию разделения содержания и внешнего вида
  • Некоторые HTML-элементы не могут иметь псевдоэлементы.

Для дальнейшего чтения см. Tag-Wiki

Я уверен, что есть еще кое-что. С другой стороны, есть своего рода прирост производительности, который, я считаю, будет незначительным.

person nirazul    schedule 15.04.2013
comment
При разработке встроенных веб-приложений, подобных нативным (что является моим вариантом использования), производительность имеет решающее значение. Я готов терпеть определенные ограничения доступности CSS, если общая техника может сделать приложение более отзывчивым. - person BigMacAttack; 16.04.2013
comment
Да, это не ответ на вопрос. - person Michael Matthew Toomim; 11.12.2013
comment
Они МОГУТ быть перемещены / анимированы. Они МОГУТ изменять внешний вид с помощью JS (путем добавления классов / атрибутов, но это возможно). Они НЕ являются громоздкими при отладке (когда-либо использовались инструменты разработчика Google Chrome?). Они могут содержать несколько данных с single: before или: after, поэтому достаточно одного из них. В этом нет НИКАКОЙ проблемы разделения содержания и внешнего вида. Кроме того, во многих случаях производительность имеет решающее значение, и использование CSS для преобразования некоторых элементов в полезные виджеты намного проще, чем использование JS, и вам не нужно его очищать. - person Dracco; 22.09.2015
comment
Это было написано более двух лет назад. В настоящее время никакие инструменты разработчика не могут отображать эти элементы. - person nirazul; 23.09.2015