web前端入門到實戰(zhàn):CSS 層疊上下文(Stacking Context)

在網(wǎng)頁制作的過程中仪芒,元素與元素之間的位置關(guān)系炫贤,在坐標(biāo)軸上一般可體現(xiàn)為 X 軸、Y 軸和 Z 軸有缆。對于 X 軸和 Y 軸的定位大多數(shù)開發(fā)都能比較直觀的搞清楚,而 Z 軸 則相對較為模糊温亲,或者說不能全面的理解Z軸的顯示邏輯棚壁。大多數(shù)人都知道可以使用 position 屬性配合 z-index 屬性解決元素的 Z 軸顯示問題,對于更深層次的原理卻不太了解栈虚。本文主要介紹了層疊上下文袖外、層疊等級、層疊順序等概念魂务。目的就是為了理清元素的 Z 軸顯示順序的內(nèi)部邏輯曼验。
一、現(xiàn)象

Z 軸上的顯示順序

// 穿透父級容器的 z-index
  <!-- 100 * 100 的深藍(lán)色 Block -->
  <div class="block blue" style="position: relative; z-index: auto;">
    <!-- 50 * 50 的紅色 Block -->
    <div class="small red" style="position: relative; z-index: -1;"></div>
  </div>
web前端開發(fā)學(xué)習(xí)Q-q-u-n: 731771211粘姜,分享學(xué)習(xí)的方法和需要注意的小細(xì)節(jié)鬓照,不停更新最新的教程和學(xué)習(xí)方法(詳細(xì)的前端項目實戰(zhàn)教學(xué)視頻,PDF)

// 不能穿透父級容器的 z-index
 <!-- 100 * 100 的深藍(lán)色 Block -->
  <div class="block blue" style="position: relative; z-index: 0;">
    <!-- 50 * 50 的紅色 Block -->
    <div class="small red" style="position: relative; z-index: -1;"></div>
  </div>

兩段代碼基本一樣孤紧,只有在深藍(lán)色盒子處有個 z-index 不同豺裆。當(dāng)父級容器的 z-indexauto 的時候,紅色盒子穿過了父級容器出現(xiàn)在了父級容器的背后(被父級容器遮擋缀畔浴)臭猜。當(dāng)父級容器的 z-index0 的時候,紅色盒子無法穿過父級容器押蚤。

元素 Z 軸對比

// 元素 Z 軸對比
  <!-- 100 * 100 的深藍(lán)色盒子 -->
  <div class="block blue">
    <div style="position:relative;z-index:auto;">
      <!-- 50 * 50 的紅色盒子 -->
      <div class="small red" style="position:absolute; z-index:2;"></div>
    </div>
    <div style="position:relative;z-index:auto;">
      <!-- 50 * 50 的灰色盒子 -->
      <div class="small yellow" style="position:absolute; z-index:1; top: 10px;"></div>
    </div></div>

// 元素 Z 軸對比
  <!-- 100 * 100 的深藍(lán)色盒子 -->
  <div class="block blue">
    <div style="position:relative;z-index:0;">
      <!-- 50 * 50 的紅色盒子 -->
      <div class="small red" style="position:absolute; z-index:2;"></div>
    </div>
    <div style="position:relative;z-index:0;">
      <!-- 50 * 50 的灰色盒子 -->
      <div class="small yellow" style="position:absolute; z-index:1; top: 10px;"></div>
    </div>
  </div>
web前端開發(fā)學(xué)習(xí)Q-q-u-n: 731771211蔑歌,分享學(xué)習(xí)的方法和需要注意的小細(xì)節(jié),不停更新最新的教程和學(xué)習(xí)方法(詳細(xì)的前端項目實戰(zhàn)教學(xué)視頻活喊,PDF)

同樣的丐膝,以上兩段代碼基本一樣量愧,都是有 3 層的 DIV 盒子。最外層是一個深藍(lán)色盒子帅矗,中間一層容器盒子偎肃,最下面一層紅色及灰色盒子。不同之處在于中間這層容器盒子的 z-indexauto 變成了 0浑此。最底下的紅色及灰色盒子的 Z 軸層級比較的結(jié)果就截然不同累颂。**由以上兩個例子我們可以發(fā)現(xiàn),當(dāng) ****z-index 為數(shù)值并且生效的時候凛俱,容器會發(fā)生一種變化紊馏,會使得容器內(nèi)的子組件無法穿過容器本身,并且子組件的層級由父組件決定蒲犬。

這種變化后的容器元素我們稱之為層疊上下文朱监。

二、特性

層疊上下文有幾個特性層疊上下文可以嵌套原叮,內(nèi)部層疊上下文及其所有子元素均受制于外部的層疊上下文赫编。

這個好理解,可以參考例子 2 奋隶。當(dāng)?shù)诙拥娜萜骱凶由墳閷盈B上下文時擂送,紅色盒子及灰色盒子的 Z 軸層級受制于第二層的容器盒子。

每個層疊上下文和兄弟元素獨(dú)立唯欣,也就是當(dāng)進(jìn)行層疊變化或渲染的時候嘹吨,只需要考慮后代元素。

這一條在性能優(yōu)化上可以用的上境氢。在更新 DOM 元素的時候考慮上層疊上下文可以使得站點性能表現(xiàn)更加優(yōu)異蟀拷。

層疊上下文未指定 z-index 時,其層疊等級與 z-index``: 0 相同产还, 要比普通元素高匹厘。指定 z-index 時按照層疊規(guī)則來嘀趟。

這條專門指的由 CSS3 屬性創(chuàng)建出來的層疊上下文脐区,其本身未指定 z-index。其層疊等級應(yīng)該是 z-index: 0她按。

三牛隅、創(chuàng)建

層疊上下文大體上可分為三種創(chuàng)建方式1. 頁面根元素,稱為根層疊上下文 2. z-index 值為數(shù)值的定位元素的傳統(tǒng)層疊上下文3. 其他 CSS3 屬性(詳情可動手實驗了解)

  • z-index值不為autoflex 項(父元素display:flex | inline-flex )
  • 元素的 opacity 值不是 1
  • 元素的 transform 值不是 none
  • 元素的 filter 值不是 none

注意:1酌泰、z-index: auto 和 z-index: 0 在層疊等級上屬于同一級媒佣。但是 z-index: 0 就是符合這一條“z-index 為數(shù)值”會使得元素升級為層疊上下文。2陵刹、 IE6默伍,7 有個不合常理的地方,就是當(dāng)元素的 z-index 為 auto 的時候,該元素也升級為創(chuàng)建層疊上下文也糊。這就是為什么在過去 IE6/IE7 的 z-index 一直是個老大難的原因炼蹦。

四、兩個概念:層疊順序狸剃、層疊等級

在說層疊規(guī)則之前兩個概念需要大家了解一下掐隐,這有利于我們在日常交流中探討相關(guān)的問題。

  • 層疊順序( Stacking Order )钞馁,這個其實就是很字面的意思虑省,它表示元素發(fā)生層疊時按照特定的順序規(guī)則在 Z 軸上垂直顯示順序。
  • 層疊等級( Stacking Level )僧凰,這個很好理解了探颈。層疊等級就是個描述元素層疊順序的一個名詞,它決定了同一個層疊上下文中元素在 Z 軸上的顯示順序训措。舉個例子:A 元素與 B 元素重疊之后膝擂,A 元素在 B 元素上面。那么我們就可以直接說 A 元素的層疊等級大于 B 元素的層疊等級隙弛。

五架馋、層疊規(guī)則當(dāng)元素互相層疊的時候,顯示規(guī)則如下全闷。

  • 當(dāng)互相層疊的元素都是層疊上下文元素叉寂,即明確的有 z-index 值的時候(沒有明確的z-index 值的層疊上下文也就是 CSS3 創(chuàng)建的層疊上下文 z-index 值為 0 )直接比較 z-index 的值,值大的處在值小的元素的上方总珠。
  • 當(dāng)元素處于同一層疊上下文內(nèi)時可按照如下規(guī)則進(jìn)行層疊判斷屏鳍。
  • 當(dāng)元素的層疊等級一致、層疊順序也相同的時候局服,在 DOM 流中處于后面的元素會覆蓋前面的元素钓瞭。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市淫奔,隨后出現(xiàn)的幾起案子山涡,更是在濱河造成了極大的恐慌,老刑警劉巖唆迁,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸭丛,死亡現(xiàn)場離奇詭異,居然都是意外死亡唐责,警方通過查閱死者的電腦和手機(jī)鳞溉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鼠哥,“玉大人熟菲,你說我怎么就攤上這事看政。” “怎么了抄罕?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵帽衙,是天一觀的道長。 經(jīng)常有香客問我贞绵,道長厉萝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任榨崩,我火速辦了婚禮谴垫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘母蛛。我一直安慰自己翩剪,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布彩郊。 她就那樣靜靜地躺著前弯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秫逝。 梳的紋絲不亂的頭發(fā)上恕出,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音违帆,去河邊找鬼浙巫。 笑死,一個胖子當(dāng)著我的面吹牛刷后,可吹牛的內(nèi)容都是我干的的畴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼尝胆,長吁一口氣:“原來是場噩夢啊……” “哼丧裁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起含衔,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤煎娇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抱慌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逊桦,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡眨猎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年抑进,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睡陪。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡寺渗,死狀恐怖匿情,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情信殊,我是刑警寧澤炬称,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站涡拘,受9級特大地震影響玲躯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鳄乏,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一跷车、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧橱野,春花似錦朽缴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜗元,卻和暖如春或渤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奕扣。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工劳坑, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人成畦。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓距芬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親循帐。 傳聞我的和親對象是個殘疾皇子框仔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

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