日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
CSS中層疊概念的示例分析-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)CSS 中層疊概念的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),東昌府企業(yè)網(wǎng)站建設(shè),東昌府品牌網(wǎng)站建設(shè),網(wǎng)站定制,東昌府網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,東昌府網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

屏幕是一個二維平面,然而HTML元素卻是排列在三維坐標(biāo)系中,x為水平位置,y為垂直位置,z為屏幕由內(nèi)向外方向的位置,我們在看屏幕的時候是沿著z軸方向從外向內(nèi)的;由此,元素在用戶視角就形成了層疊的關(guān)系,某個元素可能覆蓋了其他元素也可能被其他元素覆蓋;

CSS 中層疊概念的示例分析

那么這里有幾個重要的概念:層疊上下文 (堆疊上下文, Stacking Context)、層疊等級 (層疊水平, Stacking Level)、層疊順序 (層疊次序, 堆疊順序, Stacking Order)、z-index

聲明:

  • 以下定位元素指的是 position:absolute|fixed|relative|sticky

  • 以下非定位元素指的是 position:initial|static

  • 關(guān)于層疊上下文還有一個類似的概念:塊級格式化上下文 (BFC, Block Formatting Context),可以參考一下 CSS 中重要的BFC,其中還介紹了一些文檔流的內(nèi)容;

  • 本文蠻長的,但是如果你有勇氣看完,那應(yīng)該對層疊有關(guān)概念就基本掌握了 (~o ̄▽ ̄)~

1. 層疊上下文 (Stacking Context)

層疊上下文(堆疊上下文, Stacking Context),是HTML中一個三維的概念。在CSS2.1規(guī)范中,每個元素的位置是三維的,當(dāng)元素發(fā)生層疊,這時它可能覆蓋了其他元素或者被其他元素覆蓋;排在z軸越靠上的位置,距離屏幕觀察者越近

文章<關(guān)于z-index 那些你不知道的事>有一個很好的比喻,這里引用一下;

可以想象一張桌子,上面有一堆物品,這張桌子就代表著一個層疊上下文。如果在第一張桌子旁還有第二張桌子,那第二張桌子就代表著另一個層疊上下文。

現(xiàn)在想象在第一張桌子上有四個小方塊,他們都直接放在桌子上。在這四個小方塊之上有一片玻璃,而在玻璃片上有一盤水果。這些方塊、玻璃片、水果盤,各自都代表著層疊上下文中一個不同的層疊層,而這個層疊上下文就是桌子。

每一個網(wǎng)頁都有一個默認(rèn)的層疊上下文。這個層疊上下文(桌子)的根源就是 。html標(biāo)簽中的一切都被置于這個默認(rèn)的層疊上下文的一個層疊層上(物品放在桌子上)。

當(dāng)你給一個定位元素賦予了除auto 外的 z-index 值時,你就創(chuàng)建了一個新的層疊上下文,其中有著獨立于頁面上其他層疊上下文和層疊層的層疊層, 這就相當(dāng)于你把另一張桌子帶到了房間里。

CSS 中層疊概念的示例分析

層疊上下文1 (Stacking Context 1)是由文檔根元素形成的, 層疊上下文2和3 (Stacking Context 2, 3) 都是層疊上下文1 (Stacking Context 1) 上的層疊層。他們各自也都形成了新的層疊上下文,其中包含著新的層疊層。

在層疊上下文中,其子元素按照上面解釋的規(guī)則進行層疊。形成層疊上下文的方法有:

  • 根元素 

  • position 值為 absolute|relative ,且 z-index 值不為 auto

  • position 值為 fixed|sticky

  • z-index 值不為 auto 的flex元素,即:父元素 display:flex|inline-flex

  • opacity 屬性值小于 1 的元素

  • transform 屬性值不為 none 的元素

  • mix-blend-mode 屬性值不為 normal 的元素

  • filter 、 perspective 、 clip-path 、 mask 、 mask-image 、 mask-border 、 motion-path 值不為none 的元素

  • perspective 值不為 none 的元素

  • isolation 屬性被設(shè)置為 isolate 的元素

  • will-change 中指定了任意 CSS 屬性,即便你沒有直接指定這些屬性的值

  • -webkit-overflow-scrolling 屬性被設(shè)置 touch 的元素

總結(jié):

層疊上下文可以包含在其他層疊上下文中,并且一起組建了一個有層級的層疊上下文

每個層疊上下文完全獨立于它的兄弟元素,當(dāng)處理層疊時只考慮子元素,這里類似于BFC

每個層疊上下文是自包含的:當(dāng)元素的內(nèi)容發(fā)生層疊后,整個該元素將會在父級疊上下文 中按順序進行層疊

2. 層疊等級 (Stacking Level)

層疊等級(層疊水平, Stacking Level) 決定了同一個層疊上下文中元素在z軸上的顯示順序的概念 ;

  • 普通元素的層疊等級優(yōu)先由其所在的層疊上下文決定

  • 層疊等級的比較只有在同一個層疊上下文元素中才有意義

  • 在同一個層疊上下文中,層疊等級描述定義的是該層疊上下文中的元素在Z軸上的上下順序

注意,層疊等級并不一定由 z-index 決定,只有定位元素的層疊等級才由 z-index 決定,其他類型元素的層疊等級由層疊順序、他們在HTML中出現(xiàn)的順序、他們的父級以上元素的層疊等級一同決定,詳細(xì)的規(guī)則見下面層疊順序的介紹。

3. z-index

在 CSS 2.1 中, 所有的盒模型元素都處于三維坐標(biāo)系中。除了我們常用的橫坐標(biāo)和縱坐標(biāo), 盒模型元素還可以沿著"z 軸"層疊擺放, 當(dāng)他們相互覆蓋時, z 軸順序就變得十分重要。

-- CSS 2.1 Section 9.9.1 - Layered presentation

z-index 只適用于定位的元素,對非定位元素?zé)o效,它可以被設(shè)置為正整數(shù)、負(fù)整數(shù)、0、auto,如果一個定位元素沒有設(shè)置 z-index,那么默認(rèn)為auto;

元素的 z-index 值只在同一個層疊上下文中有意義。如果父級層疊上下文的層疊等級低于另一個層疊上下文的,那么它 z-index 設(shè)的再高也沒用。所以如果你遇到 z-index 值設(shè)了很大,但是不起作用的話,就去看看它的父級層疊上下文是否被其他層疊上下文蓋住了。

4. 層疊順序 (Stacking Order)

層疊順序(層疊次序, 堆疊順序, Stacking Order) 描述的是元素在同一個層疊上下文中的順序規(guī)則 ,從層疊的底部開始,共有七種層疊順序:

  • 背景和邊框:形成層疊上下文的元素的背景和邊框。

  • 負(fù)z-index值:層疊上下文內(nèi)有著負(fù)z-index值的定位子元素,負(fù)的越大層疊等級越低;

  • 塊級盒:文檔流中塊級、非定位子元素;

  • 浮動盒:非定位浮動元素;

  • 行內(nèi)盒:文檔流中行內(nèi)、非定位子元素;

  • z-index: 0:z-index為0或auto的定位元素, 這些元素形成了新的層疊上下文;

  • 正z-index值:z-index 為正的定位元素,正的越大層疊等級越高;

同一個層疊順序的元素按照在HTML里出現(xiàn)的順序?qū)盈B;第7級順序的元素會顯示在之前順序元素的上方,也就是看起來覆蓋了更低級的元素:

CSS 中層疊概念的示例分析

5. 實戰(zhàn)

5.1 普通情況

三個relative 定位的div 塊中各有absolute 的不同顏色的span.red 、span.green 、span.blue ,它們都設(shè)置了position:absolute ;

參見Codepen - 普通情況

那么當(dāng)沒有元素包含z-index屬性時,這個例子中的元素按照如下順序?qū)盈B(從底到頂順序):

  • 根元素的背景和邊界

  • 塊級非定位元素按HTML中的出現(xiàn)順序?qū)盈B

  • 行內(nèi)非定位元素按HTML中的出現(xiàn)順序?qū)盈B

  • 定位元素按HTML中的出現(xiàn)順序?qū)盈B

紅綠藍(lán)都屬于 z-index 為auto的定位元素,因此按照7層層疊順序規(guī)則來說同屬于層疊順序第6級,所以按HTML中的出現(xiàn)順序?qū)盈B:紅->綠->藍(lán)

5.2 在相同層疊上下文的父元素內(nèi)的情況

紅綠位于一個div.first-box 下,藍(lán)位于div.second-box 下,紅綠藍(lán)都設(shè)置了position:absolute ,first-boxsecond-box 都設(shè)置了position:relative ;

參見Codepen - 父元素不同但都位于根元素下

這個例子中,紅藍(lán)綠元素的父元素first-boxsecond-box 都沒有生成新的層疊上下文,都屬于根層疊上下文中的元素,且都是層疊順序第6級,所以按HTML中的出現(xiàn)順序?qū)盈B:紅->綠->藍(lán)

5.3 給子元素增加 z-index

紅綠位于一個div.first-box 下,藍(lán)黃位于div.second-box 下,紅綠藍(lán)都設(shè)置了position:absolute ,如果這時給綠加一個屬性z-index:1 ,那么此時.green 位于最上面;

如果再在.second-box.green 后加一個絕對定位的span.gold ,設(shè)置z-index:-1 ,那么它將位于紅綠藍(lán)的下面;

參見Codepen - 設(shè)置了z-index

這個例子中,紅藍(lán)綠黃元素的父元素中都沒有生成新的層疊上下文,都屬于根層疊上下文中的元素

紅藍(lán)都沒有設(shè)置 z-index,同屬于層疊順序中的第6級,按HTML中的出現(xiàn)順序?qū)盈B;

  1. 綠設(shè)置了正的 z-index,屬于第7級;

  2. 黃設(shè)置了負(fù)的 z-index,屬于第2級;

所以這個例子中的從底到高顯示的順序就是:黃->紅->藍(lán)->綠

5.4 在不同層疊上下文的父元素內(nèi)的情況

紅綠位于一個div.first-box 下,藍(lán)位于div.second-box 下,紅綠藍(lán)都設(shè)置了position:absolute ,如果first-box 的z-index設(shè)置的比second-box 的大,那么此時無論藍(lán)的 z-index 設(shè)置的多大z-index:999 ,藍(lán)都位于紅綠的下面;如果我們只更改紅綠的z-index值,由于這兩個元素都在父元素first-box 產(chǎn)生的層疊上下文中,此時誰的z-index值大,誰在上面;

參見Codepen - 不同層疊上下文的父元素

這個例子中,紅綠藍(lán)都屬于設(shè)置了z-index的定位元素,不過他們的父元素創(chuàng)建了新的層疊上下文;

  1. 紅綠的父元素 first-box 是設(shè)置了正z-index的定位元素,因此創(chuàng)建了一個層疊上下文,屬于層疊順序中的第7級;

  2. 藍(lán)的父元素 second-box 也同樣創(chuàng)建了一個層疊上下文,屬于層疊順序中的第6級;

  3. 按照層疊順序, first-box 中所有元素都排在 second-box 上;

  4. 紅綠都屬于層疊上下文 first-box 中且設(shè)置了不同的正 z-index,都屬于層疊順序中第7級;

  5. 藍(lán)屬于層疊上下文 second-box ,且設(shè)置了一個很大的正 z-index,屬于層疊元素中第7級;

  6. 雖然藍(lán)的 z-index 很大,但是因為 second-box 的層疊等級比 first-box 小,因此位于紅綠之下;

所以這個例子中從低到到顯示的順序:藍(lán)->紅->綠

(我遇到的的情況就屬于這個例子類似情形)

5.5 給子元素設(shè)置 opacity

紅綠位于div.first-box 下,藍(lán)位于div.second-box 下,紅綠藍(lán)都設(shè)置了position:absolute ,綠設(shè)置了z-index:1 ,那么此時綠位于紅藍(lán)的最上面;

如果此時給first-box 設(shè)置opacity:.99 ,這時無論紅綠的 z-index 設(shè)置的多大z-index:999 ,藍(lán)都位于紅綠的上面;

如果再在.second-box.green 后加一個span.gold ,設(shè)置z-index:-1 ,那么它將位于紅綠藍(lán)的下面;

參見Codepen - opacity的影響

之前已經(jīng)介紹了,設(shè)置opacity 也可以形成層疊上下文,因此:

  1. first-box 設(shè)置了 opacity , first-box 成為了一個新的層疊上下文;

  2. second-box 沒有形成新的層疊上下文,因此其中的元素都屬于根層疊上下文;

  3. 黃屬于層疊順序中第2級,紅綠屬于第7級, first-box 屬于第6級,藍(lán)屬于層疊順序中第6級且按HTML出現(xiàn)順序位于 first-box 之上;

所以這個例子中從低到到顯示的順序:黃->紅->綠->藍(lán)

關(guān)于“CSS 中層疊概念的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。


當(dāng)前標(biāo)題:CSS中層疊概念的示例分析-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://www.dlmjj.cn/article/ceposj.html