2013-10-08 1 views
7

Как вы, вероятно, знаете, если вы будете использовать :before и/или :after псевдоэлементы, не задавая в нем текст, вы все равно должны объявить content: ''; на них, чтобы сделать их видимыми.Объявляет свойство «content» на: before и: after для каждого элемента массивная проблема с производительностью?

Я просто добавил следующее к моей базовой таблицы стилей:

*:before, *:after { 
    content: ''; 
} 

... так что я не должен объявить его больше дальше.

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

Кто-нибудь испытал это глубоко? Что вы можете сказать об этом?

(Кстати, я знаю правильный синтаксис CSS3 использует двойные запятой (::before, ::after), поскольку они являются pseudoelements и не pseudoclasses.)

ответ

4

Итак, я провел несколько тестов, основанных на совете @ SWilk. Вот как я это сделал:

1) Настройка основной HTML страницы с пустым <style> тегом в <head> и простом примере он представил в <script> тег в нижней части <body>:

<!DOCTYPE html> 
<html> 

<head> 
    <meta charset="utf-8" /> 
    <title>Performance test</title> 

    <style> 
/**/ 
    </style> 
</head> 

<body onload="onLoad()"> 
    <div class="container"></div> 

    <script> 
function onLoad() { 
    var now = new Date().getTime(); 
    var page_load_time = now - performance.timing.navigationStart; 
    console.log("User-perceived page loading time: " + page_load_time); 
} 
    </script> 
</body> 

</html> 

2) Заполните div.container loaaads HTML. В моем случае я пошел на html-ipsum.com (никакой рекламы не было), скопировал каждый образец, объединил все вместе и продублировал его несколько раз. Мой последний файл HTML был 1.70 MB, а div.container имел потомков (прямой или нет, я узнал по телефону console.log(document.querySelectorAll('.container *').length);).

3) Я запустил эту страницу 10 раз в последних версиях Firefox и Chrome, каждый раз с пустым кешем.

Вот результаты без страшном CSS набор правил (в мс):

Firefox : 
1785 
1503 
1435 
1551 
1526 
1429 
1754 
1526 
2009 
1486 
Average : 1600 

Chrome : 
1102 
1046 
1073 
1028 
1038 
1026 
1011 
1016 
1035 
985 
Average : 1036 

(Если вам интересно, почему существует такая разница между этими двумя, у меня есть гораздо больше расширений на Firefox. Я позволяю им, потому что я думал, что это будет интересно разнообразить среду тестирования даже больше)

4) Добавьте CSS мы хотим проверить в пустой <style> тег:.

html:before, html:after, 
body:before, body:after, 
div:before, div:after, 
p:before, p:after, 
ul:before, ul:after, 
li:before, li:after, 
h1:before, div:after, 
strong:before, strong:after, 
em:before, em:after, 
code:before, code:after, 
h2:before, div:after, 
ol:before, ol:after, 
blockquote:before, blockquote:after, 
h3:before, div:after, 
pre:before, pre:after, 
form:before, form:after, 
label:before, label:after, 
input:before, input:after, 
table:before, table:after, 
thead:before, thead:after, 
tbody:before, tbody:after, 
tr:before, tr:after, 
th:before, th:after, 
td:before, td:after, 
dl:before, dl:after, 
dt:before, dt:after, 
dd:before, dd:after, 
nav:before, nav:after { 
    content: ''; 
} 

... и начать снова. Здесь я указываю каждый тег, используемый на странице, а не * (поскольку он сам является контр-исполнителем, и мы хотим отслеживать только запуск псевдоэлемента).

Итак, вот результаты со всеми псевдо-элементов сработавших (еще в мс):

Firefox : 
1608 
1885 
1882 
2035 
2046 
1987 
2049 
2376 
1959 
2160 
Average : 1999 

Chrome : 
1517 
1594 
1582 
1556 
1548 
1545 
1553 
1525 
1542 
1537 
Average : 1550 

Согласно этим цифрам, мы можем заключить, загрузилась страница действительно медленнее (около 400 -500 мс) при объявлении content: '' на каждый псевдоэлемент.

Теперь оставшийся вопрос: - это дополнительное время загрузки, которое мы видим здесь значительным, учитывая относительно большую тестовую страницу, которая была использована? Я думаю, это зависит от размера веб-сайта/проекта, но я позволю более опытным людям, работающим в Интернете, дать свое мнение здесь, если они захотят.

Если вы проводите собственные тесты, не стесняйтесь публиковать свои выводы здесь, так как мне очень интересно их читать, и я думаю, что я не буду единственным.

+1

Объяснение, которое приходит в голову, состоит в том, что это добавит псевдоэлемент до и после каждого тега, включая те, которые в противном случае им не нужны (что в этом тесте каждый тэг). Это в основном утроит количество элементов на странице. – user1618143

+0

@ user1618143 Это хороший момент, но я думаю, что он может быть зависимым от браузера, поскольку правила '*: before' и' *: after' являются технически * просто * правилами стилизации, а не правилами создания псевдоэлементов (теоретически) , Возможно, некоторые браузеры всегда создают два скрытых псевдоэлемента с каждым реальным элементом на странице, поэтому правила CSS не вызовут проблему, о которой вы указали. С другой стороны, другие браузеры могут только создавать псевдоэлементы только в том случае, если правила стиля нацелены на них, и в этом случае действительно создается избыточное псевдоэлементы на всех реальных элементах с этими правилами. – ajp15243

+1

Я также задаюсь вопросом, не может ли отдельный таргетинг на тег (в отличие от использования '*') не допускать определенных оптимизационных предположений браузером, поскольку теперь он должен проверять каждый тег на список стилей, а не знать, * 'правило будет применяться к любому тегу независимо от того, что. Кроме того, я думаю, что было бы более справедливо FF, если бы вы сделали это без расширений/надстроек. Нельзя сказать, какие заглавные вещи делают расширения на странице, поэтому ваша статистика FF может быть запутана ими. – ajp15243

2

Мой ответ: я не знаю, но это можно проверить.

Читайте о Navigation Timing и проверить этот example page

Самый простой пример использования:

function onLoad() { 
    var now = new Date().getTime(); 
    var page_load_time = now - performance.timing.navigationStart; 
    console.log("User-perceived page loading time: " + page_load_time); 
} 

Итак, идти генерировать несколько МБ HTML полной случайных тегов и испытания.

+0

Спасибо! Я проведу несколько тестов и отправлю результаты. – neemzy

+0

@neemzy: ожидание информации о результатах. Было бы хорошо знать такие вещи. –