生 CSS 嵌套(Native CSS nesting)已經被所有現代桌面瀏覽器所支持!,但是請注意,移動端瀏覽器支持的還很有限。
原生 CSS 嵌套可以像 SASS、LESS 預處理器一樣,將相關的選擇器組合在一起,從而減少需要編寫的規則數量,它可以節省打字時間,并使語法更易于閱讀和維護。您可以將選擇器嵌套到任意深度,但要小心不要超過兩層或三層。嵌套深度沒有技術限制,但它會使代碼更難以閱讀,并且生成的 CSS 可能會變得不必要的冗長。
.button {
background-color: red;
&.warning {
background-color: blue;
}
& .icon {
width: 1rem;
height: 1rem;
}
}
雖然原生 CSS 嵌套語法在過去幾年中不斷發展,使大多數 Web 開發人員感到滿意,但不要指望所有 SCSS 代碼都能像您期望的那樣直接工作。
您可以將任何選擇器嵌套在另一個選擇器中,但它必須以符號開頭,例如 &, .(類選擇器)、#(ID選擇器)、@(對于媒體查詢)、:、::、+、 ~、 > 或 [。換句話說,它不能是對 HTML 元素的直接引用。下面的代碼是無效的,不會對 input 元素選擇器進行解析:
.parent {
color: red;
input {
margin: 1em;
}
}
/* Invalid, because "input" is an identifier. */
解決此問題的最簡單方法是使用與號 ( &),它以與 Sass 相同的方式引用當前選擇器。
.parent {
color: red;
& input {
margin: 1em;
}
/* use pseudo-elements and pseudo-classes */
&::after {}
&:hover {}
&:target {}
}
/* valid, no longer starts with an identifier */
或者,您可以使用其中之一:
它們都可以在這個簡單的示例中工作,但是稍后您可能會遇到更復雜的樣式表的特異性問題。
它還&允許您在父選擇器上定位偽元素和偽類。例如:
p.my-element {
&::after {}
&:hover {}
&:target {}
}
請注意,& 可以在選擇器中的任何位置使用。例如:
.child1 {
.parent3 & {
color: red;
}
}
這將轉換為以下非嵌套語法:
.parent3 .child1 { color: red; }
您甚至可以在選擇器中使用多個 & 符號:
ul {
& li & {
color: blue;
}
}
這將以嵌套 <ul> 元素 ( ul li ul) 為目標,但如果您想保持理智,我建議不要使用它!
嵌套媒體查詢示例:
p {
color: cyan;
@media (min-width: 800px) {
color: purple;
}
}
原生 CSS 嵌套將父選擇器包裝在 :is() 中,這可能會導致與 Sass 輸出的差異,比如以下嵌套代碼:
.parent1, #parent2 {
.child1 {
}
}
當它在瀏覽器中解析時,它實際上變成以下內容:
:is(.parent1, #parent2) .child1 {
}
Sass 將相同的代碼編譯為:
.parent1 .child1,
#parent2 .child1 {
}
您可能還會遇到一個更微妙的問題。考慮一下:
.parent .child {
.grandparent & {}
}
原生 CSS 等效項是:
.grandparent :is(.parent .child) {}
這與以下錯誤排序的 HTML 元素匹配:
<div class="parent">
<div class="grandparent">
<div class="child">MATCH</div>
</div>
</div>
MATCH變得有樣式是因為 CSS 解析器執行以下操作:
它會查找所有元素,其所屬類的child祖先也parent為DOM 層次結構中的任何點。
找到包含MATCH的元素后,解析器會grandparent在 DOM 層次結構中的任何位置再次檢查它是否具有 — 的祖先。它找到一個并相應地設置該元素的樣式。
Sass 中的情況并非如此,它編譯為:
.grandparent .parent .child {} 上面的 HTML 沒有樣式化,因為元素類不遵循嚴格的grandparent、parent、 和child順序。
Sass 使用字符串替換,因此如下所示的聲明是有效的,并且與類的任何元素相匹配 .btn-primary:
.btn {
&-primary {
color: blue;
}
}
但是原生 CSS 嵌套會忽略&-space選擇器。
從短期來看,現有的 CSS 預處理器仍然至關重要。Sass 開發團隊宣布,他們將支持 .css 文件中的原生 CSS 嵌套,并按原樣輸出代碼。他們將一如既往地編譯嵌套 SCSS 代碼,以避免破壞現有代碼庫,但當全球瀏覽器支持率達到 98% 時,他們將開始輸出 :is() 選擇器。
我猜想,PostCSS 插件等預處理器目前會擴展嵌套代碼,但隨著瀏覽器支持的普及,就會取消這一功能。當然,使用預處理器還有其他很好的理由,比如將部分代碼捆綁到一個文件中,以及對代碼進行精簡。但如果嵌套是你唯一需要的功能,你當然可以考慮在較小的項目中使用原生 CSS。
CSS 嵌套是最有用、最實用的預處理器功能之一。瀏覽器供應商努力創造了一個與 CSS 非常相似的原生 CSS 版本,以滿足網絡開發人員的需求。雖然兩者之間存在細微差別,而且在使用(過于)復雜的選擇器時可能會遇到不尋常的特殊性問題,但很少有代碼庫需要進行徹底修改。
原生嵌套可能會讓你重新考慮是否需要 CSS 預處理器,但它們仍能提供其他好處。Sass 和類似工具仍然是大多數開發者工具包的重要組成部分。
們經常在檢測網站加載速度的過程中,遇到了以下問題:從樣式表中刪除無效規則,并延遲不用于首屏內容的CSS加載,以減少網絡活動消耗的不必要字節。
盡管看起來CSS文件的大小只有幾KB甚至沒有1 MB,但不要僅僅因為文件大小而感到困惑。所有這些事情加起來可能會使您的網站變慢,因此建議從樣式表中刪除未使用的CSS和無效規則,使樣式表文件更精簡,最小化并完善它,以便在速度較慢的連接上更快地加載。速度更快的網站更有可能獲得更高的排名,因此,您應該非常非常認真地考慮網站的加載時間。
未使用的CSS或“無效規則”不過是未在您的網頁上使用的CSS代碼。如果刪除此代碼,它將使CSS文件更精簡,更輕便,并在某種程度上幫助縮短頁面的加載時間。
讓我們舉一個例子來理解這一點。
假設您的樣式表中包含以下CSS代碼
.red_highlight_box {
padding: 10px;
background-color: black;
color: white;
cursor: pointer;
max-width: 85%;
margin: 0 auto;
border-bottom: 2px solid white;
//border-radius: 10px;
font-family: 'Secular One', Arial, Helvetica, sans-serif;
}
上面的代碼用于類名“ red_highlight_box”。您可能不會在網站的主題中使用此類,并且網站上任何現有的頁面也不會使用該類。
在這種情況下,上面的代碼是未使用的CSS或無效規則或“膨脹代碼”。它什么也沒做,只是減慢了網站速度,您絕對應該考慮一勞永逸地將其從樣式表文件中刪除。
注釋掉未使用的CSS與完全刪除它是不同的。當您注釋掉未使用的CSS代碼時,該代碼仍然存在,并增加了文件大小。未使用的css清理的目標是減小CSS文件的文件大小,以便更快地加載,呈現在用戶瀏覽器中。因此,不建議注釋掉不必要的CSS代碼,您應該從CSS文件中永久刪除多余的代碼。
想象一下,如果您從網站的每個頁面調用了5個樣式表,并且這些樣式表中的每一個都充滿了無效規則和代碼,而這些規則和代碼根本沒有在您網站的HTML中使用。如果您使用廉價的模板網站,這是很正常的,因為CSS包含主題“可能”需要的所有內容。HTML模板的開發人員已經考慮了所有可能性,小部件,部分,字體,樣式,背景色,因此編寫了滿足所有可能性的代碼。
但實際上,您不會使用所有可能性。實踐表明,在CSS文件中使用的所有可能性中,您將使用的可能性不到30%,因此,樣式表中會有很多未使用的CSS規則,這將不必要地增加網站頁面的加載時間。
有許多工具可用于合并CSS文件,最小化它們或從樣式表中刪除無效規則。但我強烈建議您使用Unused-Css.Com。實際上,它是我們刪除多余CSS代碼的唯一工具,而且至今還沒有任何差錯。我們已經在多個網站上對其進行了測試,并且得到的輸出CSS文件從未出錯過。
我們也嘗試過Purify CSS,但是對于包含許多CSS代碼的較大站點,輸出的CSS文件是不正確的。一些CSS代碼會從輸出文件中刪除,這些代碼正在其他頁面上使用。
進行此過程的最佳方法是不要從網站的樣式表文件中手動刪除未使用的CSS。因為,當您手動進行操作時,總是存在人為錯誤的可能性。手動檢查每個類并查找在哪個頁面或場景中使用它們也是非常費力。因此,我們就不要考慮手動刪除多余的CSS代碼了。
您需要一個在線工具,該工具將對整個網站進行爬網,考慮所有頁面并僅提取每個頁面中使用的CSS。一旦在整個站點的每個頁面上提取了可用的CSS,它將對其進行組合,并為您提供最終的輸出文件,即干凈的CSS-避免腫的代碼或無效規則。
這是您的操作方式。
當然,您不必使用付費工具即可完成此操作。您可以使用Chrome開發人員工具并手動完成操作,也可以推遲未使用的CSS。
是的,如果您使用免費的模板,則必須一次又一次地執行此操作。這是因為當您的主題收到新的更新時,它將覆蓋您的style.css文件中的代碼。
這樣,當主題有新更新時,它將不會覆蓋沒有膨脹代碼的優化CSS文件。
我們的建議是不要使用免費的模板。推薦您使用定制網站,這樣您就知道所有內容如何適合以及從哪個部分調用了哪些文件。
題描述:
web應用中,經常需要在圖片上添加相應的鏈接,而且相對于傳統的文字鏈接的方式,不僅美觀,而且有更大的可點擊區域。例如,京東網圖書頁面的一個簡單布局:
這種情況是幾乎沒有任何問題的,但是,如果在img標簽之外,a標簽之內再添加一層元素(如div或者p標簽),在IE6,7下雖然能夠正常顯示鏈接,但是卻無法點擊。即使你給a標簽的樣式加上
cursor:pointer;設置相應的高度和寬度,設置為display:block,依然是無法點擊的。如下所示的布局:
對應的樣式為:
在IE6 ,7下,右鍵點擊可以顯示“在新標簽中打開鏈接”等選項,證明不是a鏈接無效。而且在兩圖片的margin的空白區域,是可以點擊的,只有圖片的區域卻無法點擊(也就是圖片區域的連接失效了)
這是由于,在IE6,7中,由于觸發了img標簽的父元素的hasLayout屬性,從而使得父元素(這里是div元素)自己的布局掩蓋了a標簽的鏈接。這一點,我們可以通過禁用img父元素的樣式來證明:
這種布局下:圖片的區域是可以點擊的。
具有hasLayout屬性的標簽(默認haslayout值為true):
<html> <body> <table> <tr> <td> <td> <img> <hr> <input> <button> <select> <textarea> <fieldset> <legend><iframe> <embed> <object> <applet> <marquee>
能夠觸發hasLayout的css屬性(樣式有):
display:inline-block;
float:left|right;
width(height):除了auto之外的值。
position:absolute;
zoom:1 顯式開啟hasLayout。
Ie7下觸發hasLayout的樣式屬性還有:
min-width,min-height等。
關于haslayout的更多細節,也可以參考這篇文章:
http://www.jb51.net/web/77542.html
知道了原因,針對以上的問題,解決的方案有:
1.去掉img標簽的元div元素,將父元素的樣式遷移到img標簽上,布局如下:
2.保留div元素,但是去掉觸發haslayout的width和height屬性(實際上這樣只是保留了空架子)。如下
完整的測試代碼如下:
請在IE6,7下測試。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。