2019-07-07 第四周周報

CSS 中的層疊概念

在css的世界中代态,每個元素都有一套自己的樣式規(guī)則寺惫,同時在網(wǎng)頁中,也遵循著一套默認(rèn)的排版規(guī)則蹦疑,從上到下西雀,從左到右進(jìn)行排列,可是對于復(fù)雜的業(yè)務(wù)需求歉摧,默認(rèn)的排版規(guī)則已經(jīng)不能滿足開發(fā)需求艇肴,所以我們需要去自定義元素的排列順序,達(dá)到我們的要求叁温,常用的屬性包括position, float, display, z-index等等,同時膝但,CSS3的到來,給網(wǎng)頁布局帶來了更多的可能性莺奸。這其中涉及到了幾個重要的概念丑孩,層疊上下文嚎杨、層疊水平以及層疊順序枫浙。

1古拴、什么是層疊上下文憨募?

層疊上下文(stacking context)是HTML元素的三維概念见秽,這些HTML元素在一條假想的相對于面向(電腦屏幕的)視窗或者網(wǎng)頁的用戶的z軸上延伸桅打,HTML元素依據(jù)其自身屬性按照優(yōu)先級順序占用層疊上下文的空間《焯拢可以理解為,具有層疊上下文的元素丽柿,在z軸上面比普通元素更高級魂挂,離用戶更近。

文檔中的層疊上下文由滿足以下任意一個條件的元素形成:

  • 根元素 (HTML),
  • z-index 值不為 "auto"的 絕對/相對定位坠非,
  • 一個 z-index 值不為 "auto"的flex 項目 (flex item)果正,即:父元素 display: flex|inline-flex,
  • opacity 屬性值小于 1 的元素(參考 the specification for opacity)辅肾,
  • transform 屬性值不為 "none"的元素轮锥,
  • mix-blend-mode 屬性值不為 "normal"的元素舍杜,
  • filter值不為“none”的元素,
  • perspective值不為“none”的元素既绩,
  • isolation 屬性被設(shè)置為 "isolate"的元素,
  • position: fixed
  • will-change 中指定了任意 CSS屬性私杜,即便你沒有直接指定這些屬性的值(參考 這篇文章
  • -webkit-overflow-scrolling 屬性被設(shè)置 “touch”的元素

簡而言之衰粹,層疊上下文分下面幾類:

  1. 頁面根元素天生具有層疊上下文,稱之為“根層疊上下文”铝耻,也就是HTML根元素蹬刷。
  2. z-index值為數(shù)值的定位元素的傳統(tǒng)層疊上下文。
  3. 其他CSS3屬性泡态。

2兽赁、什么是層疊水平?

層疊水平(stacking level)決定了同一個層疊上下文中元素在z軸上的顯示順序刀崖,決定了層疊上下文的層疊順序拍摇,也就是說層疊水平的討論僅僅限于層疊上下文中充活,對于普通元素并無意義。層疊水平高級的要覆蓋低級的混卵,那如何確定層疊水平的高低呢?由層疊順序決定蚁滋。

3辕录、什么是層疊順序?

層疊順序(stacking order)表示元素發(fā)生層疊時候有著特定的垂直顯示順序副女,注意蚣旱,這里跟上面兩個不一樣,上面的層疊上下文和層疊水平是概念沟涨,而這里的層疊順序是規(guī)則位隶。層疊順序基本可從下圖所示中獲知:


image.png

其中要注意以下幾點(diǎn):

  1. 位于最低水平的是層疊上下文的背景和邊框。每一個層疊順序適用于一個完整的層疊上下文篮昧,如果子元素也是一個層疊上下文笋妥,那么子元素也有一套完整自己的層疊順序規(guī)則春宣。
  2. 子元素的層疊上下文無法超過父元素的層疊上下文。
  3. 注意z-index: auto和z-index: 0的區(qū)別月帝,盡管二者都表示z-index: 0的層疊水平,但是僅限于層疊水平嚷辅,在層疊上下文的領(lǐng)域有很大差異

同時簸搞,層疊順序遵循一下排列規(guī)則:

  1. 同一個層疊上下文領(lǐng)域,層疊水平大的覆蓋層疊水平小的元素趁俊。
  2. 當(dāng)層疊水平一致的情況下寺擂,在DOM流下面的元素覆蓋上面的元素泼掠。

4般卑、傳統(tǒng)層疊上下文的創(chuàng)建

傳統(tǒng)層疊上下文通過position屬性爽雄,并配合z-index屬性創(chuàng)建。其中z-index屬性不能為默認(rèn)的auto值叹谁,如果值為auto乘盖,則該元素為普通元素,其和其子元素均屬于父級的層疊上下文(上圖中所示第3層)析苫,現(xiàn)在我們先看這樣的代碼:

image.png
image.png

這是一個很普通的html布局衩侥,效果圖如下:
image.png

可以看到紅色背景的div中包含了石原里美的照片矛物,現(xiàn)在讓我們稍微添加一下布局屬性
image.png

很容易想到履羞,石原里美的照片被紅色背景蓋住了


image.png

那如何在不改變照片樣式的情況下忆首,讓石原里美重回大家的視線呢糙及?我們可以嘗試修改父元素的樣式:


image.png

但是我們發(fā)現(xiàn),這并沒有生效妒潭,那么我們把z-index改成1試試


image.png

image.png

image.png

發(fā)現(xiàn)z-index值小的石原里美居然又回來啦■ㄔ郑現(xiàn)在我們讓情況變得復(fù)雜一些冯凹,我們把父元素的樣式清除,添加另一張圖片匈庭,這時我們發(fā)現(xiàn),圖片被牢牢的壓在下面阱持,那么我們試著改變一下父元素的樣式,將兩個div的z-index都改成相同的樣式值(如第二張圖)鸽扁。


image.png

image.png

我們發(fā)現(xiàn)z-index值更小的新垣結(jié)衣桶现,壓在了石原里美的身上骡和,不是應(yīng)該z-index值更大的在上面嗎相寇?
image.png

image.png

現(xiàn)在說明一下东囚,以上兩種情況的發(fā)生原因页藻,首先是第一種情況植兰,當(dāng)我們賦予石原里美position:absolute;z-index=-1時,由于她的父元素是一個普通元素废境,并沒有創(chuàng)建一個層疊上下文噩凹,因此毡咏,石原里美屬于上一級的層疊上下文呕缭,也就是根元素html修己,那么她的父元素和她自己屬于同一個層疊上下文領(lǐng)域(html)迎罗,按照層疊順序纹安,z-index為負(fù)的在普通元素下面,因此紅色背景覆蓋在了石原里美的身上啥刻。同樣的咪笑,改變父元素的z-index值為auto時窗怒,并沒有使父元素含有層疊上下文蓄拣。而當(dāng)父元素的z-index變成具體的值1時球恤,這個時候辜昵,就創(chuàng)建了一個層疊上下文,那么就相當(dāng)于把石原里美從html的手中”解救“了出來咽斧,她屬于父元創(chuàng)建的全新的層疊上下文中堪置,按照層疊順序,她會覆蓋在父元素的background之上张惹,重回我們面前舀锨。對于第二種情況,兩張照片的父元素只有positioned屬性時宛逗,均為普通元素坎匿,那么兩張照片同屬于根元素層疊上下文,遵循誰大誰上的原則雷激,石原里美壓在了新垣結(jié)衣的上面替蔬,當(dāng)我們給父元素一個不為auto的z-index的時候,都形成了一個層疊上下文屎暇,由于兩個z-index值相等承桥,那么遵循后來居上的原則, 新垣結(jié)衣所在的div覆蓋在最上面恭垦,同時,層疊上下文具有自成體系的特性,兩位姑娘的比較變成了優(yōu)先比較父元素的層疊順序贴铜,因此,兩位姑娘上面的z-index此時就不生效了轩褐。

需要額外注意的是,當(dāng)元素具有position:fixed屬性時拗踢,不管有沒有z-index屬性,自動創(chuàng)建層疊上下文君纫。

5、CSS3其他類型層疊上下文的創(chuàng)建

其他類型的層疊上下文包括:

  1. 父元素為display:flex或者inline-flex的情況

現(xiàn)在我們先給新垣結(jié)衣放個假,我們對代碼做出以下調(diào)整:


image.png

注意我們給圖片一個負(fù)的z-index,當(dāng)我們知道境输,單獨(dú)給元素一個z-index是不起作用的,可實(shí)際上,石原里美被紅色背景牢牢遮住了强缘,這是為什么呢,因為要滿足兩個條件才能形成層疊上下文:條件1是父級需要是display:flex或者display:inline-flex水平栅哀,條件2是子元素的z-index不是auto痴柔,必須是數(shù)值。此時,這個子元素為層疊上下文元素糯耍,沒錯扭粱,注意了,是子元素,不是flex父級元素。


image.png

也就是說以清,圖片創(chuàng)建了一個層疊上下文,按照層疊順序凛虽,z-index為負(fù)值的被蓋在了普通元素紅色div的下面。

  1. Opacity 與層疊上下文

直接上代碼:


image.png

效果圖:


image.png

我們發(fā)現(xiàn)z-index=-1的圖片并沒有被覆蓋戳杀,因為當(dāng)我們賦予div opacity:0.5時题造,便創(chuàng)建了一個層疊上下文牵触,圖片屬于父元素的層疊上下文領(lǐng)域羹令,按照層疊順序福侈,圖片會覆蓋在背景之上
  1. transform屬性

代碼:


image.png

效果圖:


image.png

同樣的,transform屬性也會創(chuàng)建一個層疊上下文矮固。
  1. filter屬性


    image.png

    image.png

    filter屬性也會創(chuàng)建一個層疊上下文档址。

其余屬性尼摹,也會創(chuàng)建層疊上下文和二,大家如果感興趣可以嘗試一下

6、層疊上下文的層疊順序

討論了一些層疊上下文內(nèi)部元素的層疊順序和一些層疊上下文的創(chuàng)建方法,那么半醉,一個層疊上下文本身處于層疊順序中的那個層級呢梁钾?

用代碼驗證:


image.png

我們在兩張圖片中間插入一個寬度600px的綠色inline-block元素,驗證他們之間的層疊順序逊抡,效果圖如下:


image.png

可以看到姆泻,本來位于第5層的inline-block元素被兩個層疊上下文壓在了下面。其實(shí)層疊上下文的層疊順序被自動提升了冒嫡,規(guī)則是:
  1. 一旦成為定位元素拇勃,則自動賦予z-index屬性,默認(rèn)值為auto孝凌,層疊等級與z-index:0相同方咆。
  2. 而不是定位元素,則不支持z-index屬性的其他層疊上下文蟀架,存在天然的z-index:auto級別瓣赂,也就是說層疊等級與z-index:0的元素相同。

如果定位元素有z-index不為auto的值片拍,那么根據(jù)誰大誰上的原則煌集,按照z-index值進(jìn)行排列。

上圖中捌省,由于新垣結(jié)衣的dom順序在下面牙勘,因此覆蓋住了石原里美,但是二者在層疊順序表中所禀,又比綠色背景的inline-block等級高,綠色元素被覆蓋在最下面放钦。當(dāng)我們調(diào)換二者的順序色徘,就可證明:


image.png

image.png

以上就是關(guān)于層疊上下文和層疊等級的一些概念和使用。這樣在今后頁面布局的應(yīng)用中操禀,可以避免我們盲目使用z-index和定位褂策,來達(dá)到我們想要的頁面效果。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市斤寂,隨后出現(xiàn)的幾起案子耿焊,更是在濱河造成了極大的恐慌,老刑警劉巖遍搞,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罗侯,死亡現(xiàn)場離奇詭異,居然都是意外死亡溪猿,警方通過查閱死者的電腦和手機(jī)钩杰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诊县,“玉大人讲弄,你說我怎么就攤上這事∫廊” “怎么了避除?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胸嘁。 經(jīng)常有香客問我瓶摆,道長,這世上最難降的妖魔是什么缴渊? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任赏壹,我火速辦了婚禮,結(jié)果婚禮上衔沼,老公的妹妹穿的比我還像新娘蝌借。我一直安慰自己,他們只是感情好指蚁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布菩佑。 她就那樣靜靜地躺著,像睡著了一般凝化。 火紅的嫁衣襯著肌膚如雪稍坯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天搓劫,我揣著相機(jī)與錄音瞧哟,去河邊找鬼。 笑死枪向,一個胖子當(dāng)著我的面吹牛勤揩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秘蛔,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼陨亡,長吁一口氣:“原來是場噩夢啊……” “哼傍衡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起负蠕,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蛙埂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后遮糖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绣的,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年止吁,在試婚紗的時候發(fā)現(xiàn)自己被綠了被辑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡敬惦,死狀恐怖盼理,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俄删,我是刑警寧澤宏怔,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站畴椰,受9級特大地震影響臊诊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斜脂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一抓艳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帚戳,春花似錦玷或、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至对供,卻和暖如春位他,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背产场。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工鹅髓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人京景。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓迈勋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親醋粟。 傳聞我的和親對象是個殘疾皇子靡菇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容