1. 程式人生 > >CSS深入理解之z-index

CSS深入理解之z-index

大於 fixed anim 普通 htm fire tex 層疊 部分

(http://www.imooc.com/learn/643)

一、z-index基礎知識

1.z-index的含義

 z-index屬性指定了元素及其子元素的【z順序】,而【z順序】可以決定當元素發生覆蓋的時候,哪個元素在上面。通常一個較大的z-index值的元素會覆蓋較低的那一個。

2.屬性值

 z-index:auto; 默認值

 z-index:<integer>;整數值

z-index:inherit; 繼承

3.基本特性

  1>支持負值;

  2>支持CSS3 animation動畫;(並沒什麽實用應用場景)

  3>在CSS2.1時代,需要和定位元素配合使用

    如果不考慮CSS3,只有定位元素(position:relative/absolute/fixed/sticky)的z-index才有作用!在CSS3中有例外

二、z-index與定位元素

  z-index只對定位元素有作用。要設置非static的定位屬性,z-index才會生效。

  如果定位元素z-index沒有發生嵌套(並列的):

    1>後來者居上的準則;

    技術分享圖片技術分享圖片

    2>哪個大哪個上

      技術分享圖片

  如果定位元素z-index發生嵌套:

    1>祖先優先原則

    前提:z-index是數值,不是auto

    技術分享圖片

              祖先後來者居上

    技術分享圖片

   CSS2.1:(z-index:auto)當前層疊上下文生成盒子層疊水平是0。盒子(除非是根元素)不會創建一個新的層疊上下文。

三、層疊上下文和層疊水平

  1.層疊上下文(stacking context)

  層疊上下文是HTML元素中的一個三維概念,表示元素在z軸上有了“可以高人一等”。

  栗子: 皇帝(你) 當官(層疊上下文) 家族(嵌套)

  · 層疊上下文表示普通老百姓HTML元素當官了,離皇帝更近了。

  · 頁面根元素天生具有層疊上下文,稱之為“根層疊上下文” -(皇親國戚)

  · z-index值為數值的定位元素也具有層疊上下文。 -(科考入選)

  · 其他屬性...... -其他當官途徑(見第六部分)

  2.層疊水平(stacking level)

  層疊上下文中的每個元素都有一個層疊水平,決定了同一個層疊上下文中元素在z軸上的顯示順序。

  遵循“後來居上”和“誰大誰上”的層疊準則

  層疊水平和z-index不是一個東西。普通元素也有層疊水平。z-index只在定位元素上起作用。

  3.層疊上下文的幾個特性:

  1>層疊上下文可以嵌套,組合成一個分層次的層疊上下文。

  2>每個層疊上下文和兄弟元素獨立:當進行層疊變化或渲染的時候,只需要考慮後代元素。

  3>每個層疊上下文是自稱體系的:當元素的內容被層疊後,整個元素被認為是在父層的層疊順序中。

四、元素的層疊順序 stacking order

  層疊順序:元素發生層疊時候有著特定的垂直顯示順序

  意義:規範元素重疊時候的呈現規則。

  著名的7階層疊水平(stacking level)

  這樣的層疊順序更符合頁面加載的功能和視覺呈現的。內容是頁面最重要是實體,因此層疊水平要高。

  技術分享圖片

技術分享圖片

文字是內聯水平display:inline.

上圖中的層疊順序:1>inline-block大於block

         2> 文字和inline-block方塊的層疊水平一樣。如果元素的層疊水平一樣,沒有別的因素幹擾,則遵循後來者居上原則。

五、z-index與層疊上下文

  1.行為要點:

  1>定位元素默認z-index:auto可以看成是z-index:0(層級理解上);

   定位元素會覆蓋普通元素。因為:z-index只對定位元素起作用,z-index:auto的層疊順序大於圖片這個內聯元素。

  2>z-index不為auto的定位元素會創建層疊上下文

   z-index負值的層疊順序在層疊上下文元素背景色之上(如圖3)

  技術分享圖片技術分享圖片技術分享圖片

    從層疊順序上講,z-index:auto 可以看成z-index:0;

    但是從層疊上下文來講,兩者卻有著本質差異。

    但是在IE7之下有bug,z-index:auto 也會創建層疊上下文。

  3>z-index層疊順序的比較止步於父級層疊上下文

   技術分享圖片

六、其他CSS屬性與層疊上下文(不只是z-index)

  技術分享圖片

    1.z-index值不為auto的flex項:

    技術分享圖片圖片的層疊上下文是.box

    .box之所以成為層疊上下文元素,是因為他的子元素的z-index不是auto,這兩個要配合使用

    2.opacity != 0

    技術分享圖片 技術分享圖片

  3.transform(旋轉)的值不是none

  技術分享圖片

  4.mix-blend-node(混合模式)不是normal:

  技術分享圖片

  5.filter != none

  技術分享圖片

  6.isolation:isolate與層疊上下文(與混合模式應運而生)

  7.position:fixed(Firefox與IE瀏覽器不會)

  技術分享圖片

七、z-index與其他CSS屬性層疊上下文——非定位元素層疊上下文和z-index的關系

  1.不支持z-index的層疊上下文元素的層疊順序均是z-index:auto級別

  技術分享圖片

    舉個例子:

    技術分享圖片

  2.依賴z-index的層疊上下文元素的層疊順序取決於z-index值

    依賴z-index值創建層疊上下文的情況:

    1>position值為relative/absolute或fixed(部分瀏覽器)

    2>display:flex | inline-flex 容器的子flex項

     技術分享圖片技術分享圖片這裏不明白,感覺跟上面講display:flex的時候不一樣。。

八、z-index相關實踐

  1.最小化影響原則

    目的:避免z-index嵌套層級關系混亂

    原因:1>元素的層疊水平主要由所在的層疊上下文決定;

       2>IE7 z-index:auto也會新建層疊上下文;

    做法:1>避免使用定位屬性

       2>定位屬性從大容器平級分離為私有小容器;

  2.不犯二準則

    目的:避免z-index混亂,一山比一山高的樣式問題

    原因:多人協作以及後期維護;

    做法:對於非浮層元素,避免設置z-index值,z-index值沒有任何道理需要超過2——不犯二準則;

  3.組件層級計數器

    目的:避免浮層組件因z-index被覆蓋的問題

    原因:1>總會遇到意想不到的高層級元素;

       2.組件的覆蓋規則具有動態性;

    做法:通過JS獲得body下子元素的最大z-index值

CSS深入理解之z-index