Повечето отговори тук се фокусират върху ефективността на селектора, сякаш това е единственото нещо, което има значение. Ще се опитам да разгледам някои любопитни факти за spriting (предупреждение за спойлер: те не винаги са добра идея), ефективността на използваната стойност на css и изобразяването на определени свойства.
Преди да стигна до отговора, позволете ми да премахна IMO: лично аз категорично не съм съгласен с заявената необходимост от „данни, базирани на доказателства“. Това просто прави твърдението за ефективност да изглежда достоверно, докато в действителност областта на машините за изобразяване е достатъчно разнородна, за да направи всяко подобно статистическо заключение неточно за измерване и непрактично за приемане или наблюдение.
Тъй като оригиналните констатации бързо остаряват, бих предпочел да видя предните разработчици да имат разбиране за основните принципи и тяхната относителна стойност спрямо точките за поддръжка/четимост - в края на краищата, преждевременната оптимизация е коренът на всяко зло ;)
Нека започнем с ефективността на селектора:
Плитките, за предпочитане едно ниво, специфични селектори се обработват по-бързо. Липсват изрични показатели за ефективност от първоначалният отговор, но ключовият момент остава: по време на изпълнение HTML документ се анализира в DOM дърво, съдържащо N
елемента със средна дълбочина D
и след това се прилагат общо S
CSS правила. За да намалите изчислителната сложност O(N*D*S)
, трябва
Нека най-десните клавиши съвпадат с възможно най-малко елементи - селекторите се съпоставят отдясно наляво^ за допустимост на индивидуално правило, така че ако най-десният ключ не съвпада с определен елемент, няма нужда от допълнителна обработка на селектора и той се отхвърля.
Общоприето е, че селекторът *
трябва да се избягва, но тази точка трябва да се разгледа допълнително. „Нормалното“ нулиране на CSS всъщност съответства на повечето елементи – когато тази SO страница е профилирана, нулирането е отговорно за около 1/3 от цялото време за съвпадение на селектора, така че може да предпочетете normalize.css (все пак, това добавя само до 3,5ms - точката срещу преждевременната оптимизация стои силно)
Избягвайте селектори на наследници, тъй като те изискват до ~D
елемента да бъдат итерирани. Това засяга основно потвържденията на несъответствията - например положителното .container .content
съвпадение може да изисква само една стъпка за елементи във връзка родител-дете, но DOM дървото ще трябва да бъде обходено до html
, преди да може да бъде потвърдено отрицателно съвпадение.
Намалете до минимум броя на DOM елементите, тъй като техните стилове се прилагат индивидуално (заслужава да се отбележи, че това се компенсира от логиката на браузъра, като кеширане на референтни файлове и рециклиране на стилове от идентични елементи – например, когато стилизирате идентични братя и сестри )
Премахнете неизползваните правила, тъй като браузърът в крайна сметка трябва да оцени тяхната приложимост за всеки изобразен елемент. Достатъчно - най-бързото правило е това, което го няма :)
Те ще доведат до количествено измерими (но, в зависимост от страницата, не непременно осезаеми) подобрения от гледна точка на производителността на машината за изобразяване, но винаги има допълнителни фактори, като натоварване на трафика и анализ на DOM и др.
След това ефективността на свойствата на CSS3:
CSS3 ни донесе (наред с други неща) заоблени ъгли, градиенти на фона и вариации на падащи сенки - и с тях, камион с проблеми. Помислете за това, по дефиниция предварително изобразеното изображение се представя по-добре от набор от CSS3 правила, които първо трябва да бъдат изобразени. От webkit wiki:
Градиенти, сенки и други декорации в CSS трябва да се използват само когато е необходимо (напр. когато формата е динамична въз основа на съдържанието) - в противен случай статичните изображения винаги са по-бързи.
Ако това не е достатъчно лошо, градиентите и т.н. може да се наложи да се преизчисляват при всяко събитие на пребоядисване/преформатиране (повече подробности по-долу). Имайте предвид това, докато по-голямата част от потребителите не могат да разглеждат страница с много css3 като тази без забележки закъснение.
След това изпълнение на spriting:
Избягвайте високи и широки спрайтове, дори ако техният отпечатък от трафика е относително малък. Обикновено се забравя, че машината за изобразяване не може да работи с gif/jpg/png и по време на изпълнение всички графични активи се оперират като некомпресирани растерни изображения. Поне е лесно да се изчисли: ширината на този спрайт по височина по четири байта на пиксел (RGBA) е 238*1073*4≅1MB
. Използвайте го върху няколко елемента в различни едновременно отворени раздели и той бързо добавя значителна стойност.
Доста екстремен случай на това е открит в mozilla webdev, но това изобщо не е неочаквано, когато съмнителни практики като диагонални спрайтове се използват.
Алтернатива, която да разгледате, е индивидуални кодирани с base64 изображения, вградени директно в CSS.
След това преформатиране и пребоядисване:
Погрешно схващане е, че reflow може да се задейства само с JS DOM манипулация - всъщност всяко приложение на стил, засягащ оформлението, би го задействало, засягайки целевия елемент, неговите деца и елементите, които го следват и т.н. Единственият начин да предотвратите ненужни повторения от него е да опитате и избягвайте изобразяване на зависимости. Ясен пример за това би бил изобразяване на таблици:
Таблиците често изискват множество преминавания, преди оформлението да бъде напълно установено, защото те са един от редките случаи, в които елементи могат да повлияят на показването на други елементи, които са били преди тях в DOM. Представете си клетка в края на таблицата с много широко съдържание, което кара колоната да бъде напълно преоразмерена. Ето защо таблиците не се визуализират постепенно във всички браузъри.
Ще правя редакции, ако си спомня нещо важно, което е пропуснато. Някои връзки, с които да завършите:
http://perfectionkills.com/profiling-css-for-fun-and-profit-optimization-notes/
http://jacwright.com/476/runtime-performance-with-css3-vs-images/
https://developers.google.com/speed/docs/best-practices/payload
https://trac.webkit.org/wiki/QtWebKitGraphics
https://blog.mozilla.org/webdev/2009/06/22/use-sprites-wisely/
http://dev.opera.com/articles/view/efficient-javascript/
person
Oleg
schedule
15.09.2012
fixed
CSS позиция. - person Michał Górny   schedule 05.09.2012position: fixed
е пример, когато CSS просто не трябва да се използва повторно. Не че препоръчвам да се направи нещо подобно. - person Michał Górny   schedule 05.09.2012body
и нищо друго, който и да е селектор, който хвърлите към нея, не би трябвало да причини неизправност или дори замръзване на браузъра. - person BoltClock   schedule 05.09.2012