摘要:最基本的選擇器是元素選擇器比如選擇器比如還有類選擇器比如。選擇器和類選擇器在速度上的差異基本上沒有關系。現在我們回到討論開始的地方,哪類選擇器是最高效的哪個是會影響選擇器效率的關鍵選擇器寫代碼的時候,關鍵選擇器是能否高效的決定因素。
高效的CSS已經不是一個新的話題了,也不是我一個非得重拾的話題,但它卻是我在工作之時,所感興趣的,關注已久的話題。
有很多人都忘記了,或在簡單的說沒有意識到,CSS在我們手中,既能很高效,也可以變得很低能。這很容易被忘記,尤其是當你意識到你會的太少,CSS代碼效率很低的時候。
下面的規(guī)則只真正被應用到那些速度要求很高,有成百上千的DOM元素被繪制在頁面上的大型網站。但是,實踐出真理,多知道一點總是好的。
CSS 選擇器對我們大多數人來說,CSS選擇器并不陌生。最基本的選擇器是元素選擇器(比如div),ID選擇器(比如#header)還有類選擇器(比如.tweet)。
一些的不常見的選擇器包括偽類選擇器(:hover),很多復雜的CSS3和正則選擇器,比如:first-child,class ^= “grid-”。
CSS選擇器具有高效的繼承性, CSS選擇器效率從高到低的排序如下:
ID選擇器 比如#header
類選擇器 比如.promo
元素選擇器 比如 div
兄弟選擇器 比如 h2 + p
子選擇器 比如 ul > li
后代選擇器 比如 ul a
通用選擇器 比如 *
屬性選擇器 比如 type = “text”
偽類/偽元素選擇器 比如 a:hover
我們不得不提的是,縱使ID選擇器很快、高效,但是它也僅僅如此。從CSS Test我們可以看出ID選擇器和類選擇器在速度上的差異很小很小。
在Windows系統上的Firefox 6上,我測得了一個簡單類選擇器的(reflow figure)重繪速度為10.9ms,而ID選擇器為12.5ms,所以事實上ID比類選擇器重繪要慢一點點。
ID選擇器和類選擇器在速度上的差異基本上沒有關系。
在一個標簽選擇器(a)的測試上顯示,它比類或ID選擇器的速度慢了很多。在一個嵌套很深的后代選擇器的測試上,顯示數據為440左右!從這里我們可以看出ID/類選擇器 和 元素/后代選擇器中間的差異較大,但是相互之間的差異較小。
組合選擇器你可以有一個標準的選擇器比如 #nav,來選擇任何帶有ID為”nav”的元素,或在你可以有一個組合選擇器比如#nav a,來選擇任何在ID為’nav’的元素里面的鏈接元素
此刻,我們讀這些是從左到右的方式。我們是先找到#nav,然后從它的里面找其他元素。但是瀏覽器解析這些不是這樣的:瀏覽器解析選擇器是從右到左的方式。
在我們看來,#nav里面帶了一個a,瀏覽器卻是看到的a在#nav里面。這些細微的差異對選擇器的效率有很大的影響,同時學這些差異也是很有價值的。
瀏覽器從最右邊的元素開始(它想要渲染的元素),然后用它的方式回溯DOM樹比從DOM樹的最高層開始選擇向下尋找。
這些對CSS選擇器的效率有很大的影響。
關鍵選擇器關鍵選擇器,正如前面討論的一樣,是一個復雜的CSS選擇器中最右邊部分。它是瀏覽器最先尋找的。
現在我們回到討論開始的地方,哪類選擇器是最高效的?哪個是會影響選擇器效率的關鍵選擇器;寫CSS代碼的時候,關鍵選擇器是能否高效的決定因素。 一個關鍵CSS選擇器像這樣:
#content .intro {}
是不是高效選擇器比如類選擇器天生就高效?瀏覽器會尋找.intro的實例(可能會很多),然后沿著DOM樹向上查找,確定剛才找到的實例是否在一個帶有ID為”content”的容器里面。
但是,下面的選擇器就表現的不是那么好了:
#content * {}
這個選擇器所做的是選擇所有在頁面上的單個元素(是每個單個的元素),然后去看看它們是否有一個 #content 的父元素。這是一個非常不高效選擇器因為它的關鍵選擇器執(zhí)行開銷太大了。
運用這些知識我們就可以在分類和選擇元素的時候做出更好的選擇。
假設你有一個復雜的頁面,它相當巨大并且在你的一個很大很大的站點上。在那個頁面上有成百上千甚至上萬的 a 標簽。它還有一個小的社交鏈接區(qū)域放在一個ID為#social的Ul里面。我們假設它們是Twitter,Facebook,Dribbble還有 Google+的鏈接吧。在這個頁面上我們有四個社交鏈接和成百上千的其他鏈接。 下面的這個選擇器就自然的不是那么高效和合理了:
#social a {}
這里發(fā)生的情況是瀏覽器會在定位到#social區(qū)域下的四個鏈接之前得到頁面上所有成千上萬的鏈接。我們的關鍵選擇器匹配了太多我們不感興趣的其他元素。
為了補救我們可以給每個在社交鏈接區(qū)域的 a 增加一個更特殊、明確的選擇器 .social-link , 但是這好像有點違背我們的認知:當我們能用組合選擇器的時候就不要放不必要的類標示在元素上。
這就是為什么我對選擇器的性能如此感興趣的原因了:必須在web 標準最佳實踐和速度之間的保持平衡。
通常我們有:
CSS:
#social a {}
我們現在最好有:
加上CSS:
#social .social-link {}
這個新的關鍵選擇器將會匹配更少的元素,這意味著瀏覽器能夠很快的找到它們并渲染特定的樣式,然后專注于下一件事。
另外,事實上我們可以用.social-link{}更清晰的選擇,而不是過分限制它。閱讀下一部分你會知道原因…
簡單的重述一次,你的關鍵選擇器會決定瀏覽器的工作量,因此,我們應該重視一下關鍵選擇器。
過度限制選擇器現在我們知道了什么是關鍵選擇器,還有它工作的原理,但是我們可以更樂觀一點。擁有一個明確的關鍵選擇器最大的好處就是你可以避免使用過度限制選擇器。一個過度限制選擇器可能像:
html body .wrapper #content a {}
這里的寫的太多了,至少3個選擇器是完全不需要的。它可以最多像這個樣子:
#content a {}
這會發(fā)生什么呢? 首先第一個意味著瀏覽器不得不尋找所有的 a 元素,然后檢查他們是否在一個ID為”content”的元素中,然后如此循環(huán)直到HTML標簽。這樣造成了太多的我們不太想要的花費。了解了這個,我們得到一些更現實的例子:
#nav li a {}
變成這個:
#nav a {}
我們知道如果a在li里面,它也必定在#nav里面,所以我們可以馬上把li從選擇器組中拿掉。然后,既然我們知道在頁面中只有一個ID為nav的元素,那么它依附的元素就是完全沒有關系得了,我們也可以拿掉ul。
過度限制選擇器使瀏覽器工作比它實際需要的更繁重,花費的時間更多。我們可以刪掉不必需的限制,來使我們的選擇器更簡單和高效。
這些真的需要嗎?最短的答案是:或許不是。
最長的答案是:它取決于你正在搭建的站點。如果你正在為你的晉升而努力,那么就好好寫出簡單、高效的CSS代碼吧,因為你可能不會感覺到它給你帶來的改變。 如果你正在搭建下一個每個頁面都以毫秒計算的網站,這樣有時速度會很快,但有時可能不是。
瀏覽器將會在解析CSS的速度上變得更好,甚至在手機端。在一個網站上,你不太可能會覺察到一個低效的CSS選擇器,但是….
但是它確實發(fā)生了,瀏覽器還是不得不去做我們討論的所有工作,無論它們變得多快。即使你不需要或者甚至不想實踐任何一個,但是它都是我們值得學習的知識。請記住選擇器可能會讓你付出很大代價,你應該避免盯著一個看。這意味著如果你發(fā)現你自己在寫像這樣的:
div:nth-of-type(3) ul:last-child li:nth-of-type(odd) * { font-weight:bold }
這時,你可能就做錯了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/114602.html
摘要:最基本的選擇器是元素選擇器比如選擇器比如還有類選擇器比如。選擇器和類選擇器在速度上的差異基本上沒有關系。現在我們回到討論開始的地方,哪類選擇器是最高效的哪個是會影響選擇器效率的關鍵選擇器寫代碼的時候,關鍵選擇器是能否高效的決定因素。 高效的CSS已經不是一個新的話題了,也不是我一個非得重拾的話題,但它卻是我在工作之時,所感興趣的,關注已久的話題。 有很多人都忘記了,或在簡單的說沒有意識...
摘要:我們都知道您是國內知名的專家,是什么樣的情結使得您愿意將魔法作為自己的別名大家好,很榮幸接受圖靈的專訪。在這一堆書里,有一套上下冊教程叫作談是由圖靈引進的哦。從偶像那里得來一個名字,很榮幸而且這其中也有圖靈的功勞,也是緣份。 非商業(yè)轉載請注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/article/216538 showImg(https:...
摘要:我們都知道您是國內知名的專家,是什么樣的情結使得您愿意將魔法作為自己的別名大家好,很榮幸接受圖靈的專訪。在這一堆書里,有一套上下冊教程叫作談是由圖靈引進的哦。從偶像那里得來一個名字,很榮幸而且這其中也有圖靈的功勞,也是緣份。 非商業(yè)轉載請注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/article/216538 showImg(https:...
摘要:前言過去零零星星地了解和使用和等偽類偽元素選擇器,最近看書時發(fā)現這方面有所欠缺,于是決定稍微深入學習一下,以下為偽類部分的整理。偽類偽類選擇器實質上是讓設計師可以根據元素特定的狀態(tài),設置不同的視覺效果。也就是符合以下選擇器的元素均支持狀態(tài)。 前言 ?過去零零星星地了解和使用:link、::after和content等偽類、偽元素選擇器,最近看書時發(fā)現這方面有所欠缺,于是決定稍微深入學習...
摘要:前端日報精選知識點小結精讀如何安全地使用從移動端到搖一搖中的變量和作用域視頻中文第期模式匹配提案周刊第期入門指南盒子模型浮動和清除掘金魔術師介紹教程那些事之認識掘金簡介的包執(zhí)行器眾成翻譯折騰記寫一個不大靠譜的組件掘金上車 2017-07-23 前端日報 精選 Vue 2.3、2.4 知識點小結精讀《如何安全地使用 React context》從移動端click到搖一搖ES6中的變量和作...
閱讀 1164·2021-09-10 10:51
閱讀 895·2019-08-30 15:53
閱讀 2723·2019-08-30 12:50
閱讀 976·2019-08-30 11:07
閱讀 1990·2019-08-30 10:50
閱讀 3598·2019-08-29 18:47
閱讀 1308·2019-08-29 18:44
閱讀 1598·2019-08-29 17:01