1. 程式人生 > >css為何不支援父元素選擇器

css為何不支援父元素選擇器

為何CSS不支援父選擇器?

這個問題的答案和“為何CSS相鄰兄弟選擇器只支援後面的元素,而不支援前面的兄弟元素?”是一樣的。

瀏覽器解析HTML文件,是從前往後,由外及裡的。所以,我們時常會看到頁面先出現頭部然後主體內容再出現的載入情況。

但是,如果CSS支援了父選擇器,那就必須要頁面所有子元素載入完畢才能渲染HTML文件,因為所謂“父選擇器”,就是後代元素影響祖先元素,如果後代元素還沒載入處理,如何影響祖先元素的樣式?於是,網頁渲染呈現速度就會大大減慢,瀏覽器會出現長時間的白板。載入多少HTML就可以渲染多少HTML,在網速不是很快的時候,就顯得尤為的必要。比方說你現在看的這篇文章,只要文章內容加載出來就可以了,就算後面的廣告指令碼阻塞了後續HTML文件的載入,我們也是可以閱讀和體驗。但是,如果支援父選擇器,則整個文件不能有阻塞,頁面的可訪問性則要大大降低。

有人可能會說,要不採取載入到哪裡就渲染到哪裡的策略?這樣子問題更大,因為會出現載入到子元素的時候,父元素本來渲染的樣式突然變成了另外一個樣式的情況,體驗非常不好。

“相鄰選擇器只能選擇後面的元素”也是一樣的道理,不可能說後面的HTML載入好了,還會影響前面HTML的樣式。

所以,從這一點來講,CSS支援“父選擇器”或者“前兄弟選擇器”的可能性要比其他炫酷的CSS特性要低,倒不是技術層面,而是CSS和HTML本身的渲染機制決定的。當然,以後的事情誰都說不準,說不定以後網速都是每秒幾個G的,網頁載入速度完全就忽略不計,說不定就會支援了。

如何在CSS中實現父選擇器效果?

雖然說至今尚無瀏覽器支援原生的父選擇器效果,但是,我們是可以通過其他手段來實現父選擇器效果的,雖說不是100%完全,但是,一般的專案需求都是可以滿足的,如何實現呢?如果用一句話解釋原理就是“把兄弟元素作為祖先元素使用”。

本文介紹的“父選擇器”技術,涉及多個技術tips,但是,幸運的是,這些特性從IE7瀏覽器開始都是支援的,因此,本文的模擬父選擇器效果相容IE7+瀏覽器。

類似這樣的技術tips學習,你唾沫橫飛說得天花亂墜也不如一個活蹦亂跳的例項效果好。

.container {
    min-height: 120px;
    /* z-index用來建立新的層疊上下文,這樣子元素的z-index:-1不會超出容器 
       具體可參見:http://www.zhangxinxu.com/wordpress/?p=5115
    */
    position: relative; z-index: 1;
}
.list
{ /* 已經輸入的姓名列表 */ display: inline-block; background-color: #f0f3f9; } .list:after { content: '×'; } .input { /* 去掉輸入框預設UI */ width: 80px; border: 0; background: none; } .border { /* 尺寸永遠和容器一樣大,假裝是容器 */ position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: -1; border: 1px solid #bbb; } .input:focus + .border { /* 模擬父選擇器效果精髓所在 */ border-color: #1271E0; } HTML程式碼: <div class="container"> <span class="list">李易峰</span> <span class="list">趙麗穎</span> <span class="list">楊紫</span><input id="input" class="input"> <label class="border" for="input"></label> </div>

這裡寫圖片描述