日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > CSS >内容正文

CSS

浅析CSS——元素重叠及position定位的z-index顺序

發(fā)布時(shí)間:2025/5/22 CSS 160 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅析CSS——元素重叠及position定位的z-index顺序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

多次在項(xiàng)目中遇到html頁面元素的非期待重疊錯(cuò)誤,多數(shù)還是position定位情況下z-index的問題。其實(shí)每次解決類似問題思路大致都是一樣的,說到底還是對(duì)z-index的理解比較模糊,可以解決問題卻不大了解其原因,導(dǎo)致重復(fù)出錯(cuò)......于是決定把重疊問題弄清下,把z-index理順下。

經(jīng)過一番查找對(duì)比實(shí)踐理解,下面就從元素重疊的背景常識(shí)及可能原因說起,淺談下position定位元素的z-index順序。總結(jié)下我目前的理解,希望也能對(duì)遇到過類似問題有同樣疑惑的你有一點(diǎn)幫助或啟發(fā)。

?

元素位置重疊的背景常識(shí)

(x)html文檔中的元素默認(rèn)處于普通流(normal flow)中,也就是說其順序由元素在文檔中的先后位置決定,此時(shí)一般不會(huì)產(chǎn)生重疊(但指定負(fù)邊距可能產(chǎn)生重疊)。當(dāng)我們用css為某個(gè)元素指定float浮動(dòng)或者position定位后,元素的定位將會(huì)依情況發(fā)生如下改變:

1. 指定float值left/right

行內(nèi)元素也會(huì)隱形變成塊元素,元素會(huì)脫離文檔的普通流,向左或右浮動(dòng),直到其外邊緣碰到包含框或另一個(gè)浮動(dòng)框。

2. 指定position值relative

可以相對(duì)于其在普通流中的位置偏移,原本所占的空間仍保留。

3. 指定position值absolute

行內(nèi)元素也會(huì)隱形變成塊元素,元素會(huì)脫離文檔的普通流,相對(duì)于最近的已定位祖先元素偏移,如果元素沒有已定位的祖先元素,那么它的位置相對(duì)于最初的包含塊偏移。

4. 指定position值fixed

元素會(huì)脫離文檔的普通流,相對(duì)于瀏覽器窗口偏移,固定在瀏覽器的某個(gè)位置。

以上四種情況下,文檔中的元素都將可能被浮動(dòng)/定位元素覆蓋產(chǎn)生重疊。

?

元素位置重疊的可能原因

1. 負(fù)邊距/float浮動(dòng)

margin為負(fù)值時(shí)元素會(huì)依參考線向外偏移。margin-left/margin-top的參考線為左邊的元素/上面的元素(如無兄弟元素則為父元素的左內(nèi)側(cè)/上內(nèi)側(cè)),margin-right和margin-bottom的參考線為元素本身的border右側(cè)/border下側(cè)。一般可以利用負(fù)邊距來就行布局,但沒有計(jì)算好的話就可能造成元素重疊。堆疊順序由元素在文檔中的先后位置決定,后出現(xiàn)的會(huì)在上面。

浮動(dòng)元素會(huì)脫離文檔的普通流,有可能覆蓋或遮擋掉文檔中的元素。

2. position的relative/absolute/fixed定位

當(dāng)為元素設(shè)置position值為relative/absolute/fixed后,元素發(fā)生的偏移可能產(chǎn)生重疊,且z-index屬性被激活。z-index值可以控制定位元素在垂直于顯示屏方向(Z 軸)上的堆疊順序(stack order),值大的元素發(fā)生重疊時(shí)會(huì)在值小的元素上面。

3. window窗口元素引發(fā)的重疊

瀏覽器解析頁面時(shí),先判斷元素的類型:窗口元素優(yōu)于非窗口元素顯示(也就是窗口元素會(huì)覆蓋在其它非窗口元素之上),同為非窗口類型才能在激活z-index屬性控制堆疊順序。

Flash元素屬于window窗口元素

所以如果頁面上flash元素和其他元素發(fā)生重疊,需要先將flash嵌入的wmode屬性的window(窗口,默認(rèn)的會(huì)造成上面所說的問題)改為非窗口模式:opaque(非窗口不透明)或者 transparent(非窗口透明)。

ie6下select屬于window類型控件

同理,它也產(chǎn)生窗口元素的遮擋問題。解決方法使用iframe(原理:ie6下普通元素?zé)o法覆蓋select,iframe可以覆蓋select,普通元素可以覆蓋iframe)/用div模擬實(shí)現(xiàn)select的效果。我一般會(huì)為被select遮擋的div在內(nèi)部追加(appendChild)一個(gè)空的子iframe,設(shè)置position:absolute脫離文檔流空間、width:100%;height:100%;覆蓋整個(gè)父div、z-index:-1;確保值要小于父div的z-index值讓父div覆蓋顯示在iframe上面,借助這個(gè)iframe來覆蓋select。

?

淺說position定位及z-index使用

使用前提

z-index只能在position屬性值為relative或absolute或fixed的元素上有效。

基本原理

z-index值可以控制定位元素在垂直于顯示屏方向(Z 軸)上的堆疊順序(stack order),值大的元素發(fā)生重疊時(shí)會(huì)在值小的元素上面。

使用的相對(duì)性

z-index值只決定同一父元素中的同級(jí)子元素的堆疊順序。父元素的z-index值(如果有)為子元素定義了堆疊順序(css版堆疊“拼爹”)。向上追溯找不到含有z-index值的父元素的情況下,則可以視為自由的z-index元素,它可以與父元素的同級(jí)兄弟定位元素或其他自由的定位元素來比較z-index的值,決定其堆疊順序。同級(jí)元素的z-index值如果相同,則堆疊順序由元素在文檔中的先后位置決定,后出現(xiàn)的會(huì)在上面。

所以如果當(dāng)你發(fā)現(xiàn)一個(gè)z-index值較大的元素被值較小的元素遮擋了,請(qǐng)先檢查它們之間的dom結(jié)點(diǎn)關(guān)系,多半是因?yàn)槠涓附Y(jié)點(diǎn)含有激活并設(shè)置了z-index值的position定位元素。

也因?yàn)檫@個(gè)相對(duì)性,還會(huì)引發(fā)瀏覽器表現(xiàn)不一致出現(xiàn)兼容問題。原因是ie6、7下面position值為非static的元素在未設(shè)置z-index值的情況下都會(huì)被隱含添加z-index:0,而Firefox/Chrome等現(xiàn)代瀏覽器會(huì)遵循標(biāo)準(zhǔn)默認(rèn)z-index:auto不會(huì)產(chǎn)生值。

還有一點(diǎn)需要注意,負(fù)值的z-index也依照大小比較的原理,但一般來說負(fù)值的z-index會(huì)被透明的body覆蓋導(dǎo)致點(diǎn)擊等事件響應(yīng)出現(xiàn)問題,請(qǐng)謹(jǐn)慎使用。

百說不如一例,舉個(gè)例子來簡單說明下z-index

html代碼 <div class="pr" id="one">
#one相對(duì)定位
<div class="pa pa1">#one的子元素pa1,相對(duì)#one絕對(duì)定位,#one是它的父元素,與.pa2為同級(jí)兄弟元素</div>
<div class="pa pa2">#one的子元素pa2,相對(duì)#one絕對(duì)定位,#one是它的父元素,與.pa1為同級(jí)兄弟元素</div>
</div>
<div class="pa" id="two">#two絕對(duì)定位,與#one為同級(jí)元素</div>

默認(rèn)

均未加z-index值

css代碼 .pr{position:relative;}
.pa{position:absolute;}
div{width:200px;height:200px;border:1px solid #ccc;color:#fff;font:bold 14px \5fae\8f6f\96c5\9ed1;}
#one{background:#39f;}
#one .pa1{background:#096;top:25px;left:20px;}
#one .pa2{background:#969;top:90px;left:40px;}
#two{background:#669;top:165px;left:70px;}

表現(xiàn)及解析

定位后依照元素在文檔中的先后位置,后出現(xiàn)的會(huì)在上面。

相對(duì)性試驗(yàn)

為#one加上z-index:1;#one .pa1加上z-index:30;#one .pa2加上z-index:20;#two加上z-index:9;

css代碼 .pr{position:relative;}
.pa{position:absolute;}
div{width:200px;height:200px;border:1px solid #ccc;color:#fff;font:bold 14px \5fae\8f6f\96c5\9ed1;}
#one{background:#39f; z-index:1;}
#one .pa1{background:#096;top:25px;left:20px; z-index:30;}
#one .pa2{background:#969;top:90px;left:40px; z-index:20;}
#two{background:#669;top:165px;left:70px; z-index:9;}

表現(xiàn)及解析

因?yàn)楦篙呁?jí)元素的z-index值#one<#two,所以#one決定了其子元素.pa1和.pa2的z-index值不論有多大都會(huì)被#two所覆蓋;作為同級(jí)兄弟元素的.pa1和.pa2則比較其z-index值,較大的.pa1顯示在上面。

ie6、7兼容性試驗(yàn)

為#one .pa1加上z-index:10;#two加上z-index:1;

css代碼 .pr{position:relative;}
.pa{position:absolute;}
div{width:200px;height:200px;border:1px solid #ccc;color:#fff;font:bold 14px \5fae\8f6f\96c5\9ed1;}
#one{background:#39f;}
#one .pa1{background:#096;top:25px;left:20px; z-index:10;}
#one .pa2{background:#969;top:90px;left:40px;}
#two{background:#669;top:165px;left:70px;z-index:1;}

表現(xiàn)及解析

Firefox/Chrome等現(xiàn)代瀏覽器(包括ie8+)下,父元素#one未設(shè)置z-index值,則默認(rèn)為auto,此時(shí)的#one .pa1為自由的定位元素,因此z-index較大的#one .pa1顯示在較小的#two上面。如果把#two的z-index值去掉,情況也會(huì)是一樣的,設(shè)置了較大z-index值的#one .pa1會(huì)顯示在未設(shè)置z-index的元素上面。

ie6/7下,差異在于#one .pa1顯示在了#two的下面。因?yàn)閷?duì)于ie6/7父元素#one未設(shè)置z-index值,會(huì)被隱含設(shè)置了z-index:0;此時(shí)z-index值#one的0要與#two的1比較,而#two比較大,所以#one的子元素?zé)o論z-index如何的大也會(huì)被#two遮擋。如果把#two的z-index值去掉,情況依舊,因?yàn)槲丛O(shè)置z-index值的#one和#two都會(huì)被默認(rèn)加上z-index:0;有了值就可以比較,值相同的情況下堆疊順序由元素在文檔中的先后位置決定,出現(xiàn)在后面的#two會(huì)在上面,結(jié)果#one的子元素?zé)o論z-index如何的大還是會(huì)被#two遮擋。

?

簡單總結(jié)及建議

普通元素的堆疊順序由元素在文檔中的先后位置決定,后出現(xiàn)的會(huì)在上面,請(qǐng)小心計(jì)算好浮動(dòng)和負(fù)邊距布局,注意窗口元素的特殊性;非同級(jí)關(guān)系和非父子關(guān)系定位元素之間的堆疊順序,要向上追溯到其為兄弟關(guān)系的父元素上,先比較其z-index值,只有父輩元素中的z-index值較大的后代子元素才能超過z-index值較小的父輩元素及其子孫元素。

為了在編碼時(shí)就減少z-index值判斷的復(fù)雜性,我建議對(duì)于一般頁面內(nèi)容類定位元素的z-index設(shè)置小于99的值(如非必要不使用負(fù)值),廣告類定位元素的z-index設(shè)置100~500的值,公告提示等彈出類定位元素的z-index設(shè)置大于500的值;對(duì)于比較復(fù)雜定位嵌套頁面,為了避免ie6/7的顯示差異,請(qǐng)為父輩類定位元素顯性加上z-index:0或其他值。

以上是我目前網(wǎng)絡(luò)搜尋書籍參考結(jié)合實(shí)踐后的理解總結(jié),如有錯(cuò)誤,請(qǐng)不吝賜教;如有疑問,歡迎討論;如有幫助,萬分榮幸;如有雷同,握個(gè)手吧~

?

轉(zhuǎn)自:http://www.cnblogs.com/mind/archive/2012/04/01/2198995.html

轉(zhuǎn)載于:https://www.cnblogs.com/xcsn/p/4664404.html

總結(jié)

以上是生活随笔為你收集整理的浅析CSS——元素重叠及position定位的z-index顺序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。