div层的叠加法则(转载)

本文详细阐述了CSS层叠上下文中的五条重要法则,包括同辈元素与非同辈元素在不同定位方式及z-index设置下的显示层级规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先明确几点在文中所需要用到的概念

  1. 静态定位:position:static(为position属性的默认值)。
  2. 动态定位:position:relative或position:absolute或position:fixed。
  3. 祖元素:任意包含该元素的元素。
  4. 父元素:直接包含该元素的祖元素。
  5. 同辈元素:拥有共同的父元素的元素。

注:这些概念为作者自定义,仅用于本文。

引用:

关于同辈元素是个非常关键的词,这里还需要详细解释一下。

<div>
    <div></div>
    <div id="a"></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
</div>
<div id="f">
    <div></div>
    <div id="b"></div>
    <div id="c"></div>
    <div></div>
    <div></div>
    <div></div>
</div>

在这个例子中,div#a与div#b并不是“同辈元素”,只有像div#b和div#c这样拥有同样父体div#f的的元素才能叫“同辈元素”。

引用结束

接下来看看这五条法则

法则一:同辈元素定位方式相同,且无z-index设置时,html靠后者居上。


  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <meta name="author" content="Chomo" />
  6. <link rel="start" href="http://www.14px.com" title="Home" />
  7. <title>法则一:同辈元素定位方式相同,且无z-index设置时,html靠后者居上。</title>
  8. </head>
  9. <style type="text/css">
  10. div { font:12px/1.5 arial;}
  11. div strong { color:#fff; background:#036; display:inline-block;}
  12. h3 strong { color:#f00;}
  13. /*--- 定义方块外形 ---*/
  14. .div1,
  15. .div2 {
  16. height:70px;
  17. width:150px;
  18. background:#cff;
  19. border:1px solid #036;
  20. }
  21. .grandDiv1,
  22. .grandDiv2 {
  23. padding:10px;
  24. border:1px solid #060;
  25. width:174px;
  26. background:#cf9;
  27. }
  28. .parentDiv1,
  29. .parentDiv2 {
  30. padding:10px;
  31. border:1px solid #f06;
  32. width:152px;
  33. background:#fcf;
  34. }
  35. /*--- 定义方块偏移位置、文字位置 ---*/
  36. .grandDiv2 {
  37. margin-top:-50px;
  38. margin-left:95px;
  39. }
  40. .parentDiv2 {
  41. margin-top:-40px;
  42. margin-left:85px;
  43. }
  44. .div2 {
  45. margin-top:-20px;
  46. margin-left:75px;
  47. padding-top:30px;
  48. height:40px;
  49. }
  50. .grandDiv2 .parentDiv2,
  51. .grandDiv2 .div2,
  52. .parentDiv2 .div2 { margin:0;}
  53. </style>
  54. <body>
  55. <h3>法则一:同辈元素定位方式相同,且无z-index设置时,html靠后者居上。</h3>
  56. <div class="div1">.div1{position:static}</div>
  57. <div class="div2">.div2{position.static}</div>
  58. <div class="div1" style="position:relative;">.div1{position.relative}</div>
  59. <div class="div2" style="position:absolute;">.div2{position.absolute}</div>
  60. </body>
  61. </html>


法则二:同辈元素同为动态定位时,且有z-index设置时,z-index值大者居上。


  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <meta name="author" content="Chomo" />
  6. <link rel="start" href="http://www.14px.com" title="Home" />
  7. <title>法则二:同辈元素同为动态定位时,且有z-index设置时,z-index值大者居上。</title>
  8. </head>
  9. <style type="text/css">
  10. div { font:12px/1.5 arial;}
  11. div strong { color:#fff; background:#036; display:inline-block;}
  12. h3 strong { color:#f00;}
  13. /*--- 定义方块外形 ---*/
  14. .div1,
  15. .div2 {
  16. height:70px;
  17. width:150px;
  18. background:#cff;
  19. border:1px solid #036;
  20. }
  21. .grandDiv1,
  22. .grandDiv2 {
  23. padding:10px;
  24. border:1px solid #060;
  25. width:174px;
  26. background:#cf9;
  27. }
  28. .parentDiv1,
  29. .parentDiv2 {
  30. padding:10px;
  31. border:1px solid #f06;
  32. width:152px;
  33. background:#fcf;
  34. }
  35. /*--- 定义方块偏移位置、文字位置 ---*/
  36. .grandDiv2 {
  37. margin-top:-50px;
  38. margin-left:95px;
  39. }
  40. .parentDiv2 {
  41. margin-top:-40px;
  42. margin-left:85px;
  43. }
  44. .div2 {
  45. margin-top:-20px;
  46. margin-left:75px;
  47. padding-top:30px;
  48. height:40px;
  49. }
  50. .grandDiv2 .parentDiv2,
  51. .grandDiv2 .div2,
  52. .parentDiv2 .div2 { margin:0;}
  53. </style>
  54. <body>
  55. <h3>法则二:同辈元素同为动态定位时,且有z-index设置时,z-index值大者居上。</h3>
  56. <div class="div1" style="position:relative; z-index:2;">.div1{position.relative;z-index:2}</div>
  57. <div class="div2" style="position:relative; z-index:1;">.div2{position.relative;z-index:1}</div>
  58. </body>
  59. </html>


法则三:同辈元素定位方式不同时,动态定位居上。

 


  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <meta name="author" content="Chomo" />
  6. <link rel="start" href="http://www.14px.com" title="Home" />
  7. <title>法则三:同辈元素定位方式不同时,动态定位居上。</title>
  8. </head>
  9. <style type="text/css">
  10. div { font:12px/1.5 arial;}
  11. div strong { color:#fff; background:#036; display:inline-block;}
  12. h3 strong { color:#f00;}
  13. /*--- 定义方块外形 ---*/
  14. .div1,
  15. .div2 {
  16. height:70px;
  17. width:150px;
  18. background:#cff;
  19. border:1px solid #036;
  20. }
  21. .grandDiv1,
  22. .grandDiv2 {
  23. padding:10px;
  24. border:1px solid #060;
  25. width:174px;
  26. background:#cf9;
  27. }
  28. .parentDiv1,
  29. .parentDiv2 {
  30. padding:10px;
  31. border:1px solid #f06;
  32. width:152px;
  33. background:#fcf;
  34. }
  35. /*--- 定义方块偏移位置、文字位置 ---*/
  36. .grandDiv2 {
  37. margin-top:-50px;
  38. margin-left:95px;
  39. }
  40. .parentDiv2 {
  41. margin-top:-40px;
  42. margin-left:85px;
  43. }
  44. .div2 {
  45. margin-top:-20px;
  46. margin-left:75px;
  47. padding-top:30px;
  48. height:40px;
  49. }
  50. .grandDiv2 .parentDiv2,
  51. .grandDiv2 .div2,
  52. .parentDiv2 .div2 { margin:0;}
  53. </style>
  54. <body>
  55. <h3>法则三:同辈元素定位方式不同时,动态定位居上。</h3>
  56. <div class="div1" style="position:relative;">.div1{position.relative}</div>
  57. <div class="div2">.div2{position.static}</div>
  58. <div class="div1">.div1{position.static}</div>
  59. <div class="div2" style="position:absolute;">.div2{position:absolute}</div>
  60. </body>
  61. </html>


法则四:非同辈元素,任意一者及其祖元素不具备动态布局时,html靠后者居上。


  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <meta name="author" content="Chomo" />
  6. <link rel="start" href="http://www.14px.com" title="Home" />
  7. <title>法则四:非同辈元素,任意一者及其祖元素不具备动态布局时,html靠后者居上。</title>
  8. </head>
  9. <style type="text/css">
  10. div { font:12px/1.5 arial;}
  11. div strong { color:#fff; background:#036; display:inline-block;}
  12. h3 strong { color:#f00;}
  13. /*--- 定义方块外形 ---*/
  14. .div1,
  15. .div2 {
  16. height:70px;
  17. width:150px;
  18. background:#cff;
  19. border:1px solid #036;
  20. }
  21. .grandDiv1,
  22. .grandDiv2 {
  23. padding:10px;
  24. border:1px solid #060;
  25. width:174px;
  26. background:#cf9;
  27. }
  28. .parentDiv1,
  29. .parentDiv2 {
  30. padding:10px;
  31. border:1px solid #f06;
  32. width:152px;
  33. background:#fcf;
  34. }
  35. /*--- 定义方块偏移位置、文字位置 ---*/
  36. .grandDiv2 {
  37. margin-top:-50px;
  38. margin-left:95px;
  39. }
  40. .parentDiv2 {
  41. margin-top:-40px;
  42. margin-left:85px;
  43. }
  44. .div2 {
  45. margin-top:-20px;
  46. margin-left:75px;
  47. padding-top:30px;
  48. height:40px;
  49. }
  50. .grandDiv2 .parentDiv2,
  51. .grandDiv2 .div2,
  52. .parentDiv2 .div2 { margin:0;}
  53. </style>
  54. <body>
  55. <h3>法则四:非同辈元素,任意一者及其祖元素不具备动态布局时,html靠后者居上。</h3>
  56. <div class="parentDiv1">
  57. .parentDiv1{position:staitc}
  58. <div class="div1">.div1{position:staitc}</div>
  59. </div>
  60. <div class="parentDiv2">
  61. <div class="div2">.div2{position:staitc}</div>
  62. .parentDiv2{position:staitc}
  63. </div>
  64. <div class="grandDiv1">
  65. .grandDiv1{position:staitc}
  66. <div class="parentDiv1">
  67. .parentDiv1{position:staitc}
  68. <div class="div1">.div1{position:staitc}</div>
  69. </div>
  70. </div>
  71. <div class="grandDiv2">
  72. <div class="parentDiv2">
  73. <div class="div2">.div2{position:staitc}</div>
  74. .parentDiv2{position:staitc;}
  75. </div>
  76. .grandDiv2{position:static;}
  77. </div>
  78. </body>
  79. </html>


法则五:【重要】非同辈元素,任意一者或其祖元素拥有动态定位时,同时各自向上寻找动态定位的祖元素,并分别从中拿出具备最高级别的祖元素(或其本身)进行比较。

情况1:子元素的z-index无论多大,父元素大者居上。

情况2:父元素居下,子元素也可以居上。

情况1、情况2结合扩展比较。


  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <meta name="author" content="Chomo" />
  6. <link rel="start" href="http://www.14px.com" title="Home" />
  7. <title>法则五:非同辈元素,任意一者或其祖元素拥有动态定位时,同时各自向上寻找动态定位的祖元素,并分别从中拿出具备最高级别的祖元素(或其本身)进行比较。</title>
  8. </head>
  9. <style type="text/css">
  10. div { font:12px/1.5 arial;}
  11. div strong { color:#fff; background:#036; display:inline-block;}
  12. h3 strong { color:#f00;}
  13. /*--- 定义方块外形 ---*/
  14. .div1,
  15. .div2 {
  16. height:70px;
  17. width:150px;
  18. background:#cff;
  19. border:1px solid #036;
  20. }
  21. .grandDiv1,
  22. .grandDiv2 {
  23. padding:10px;
  24. border:1px solid #060;
  25. width:174px;
  26. background:#cf9;
  27. }
  28. .parentDiv1,
  29. .parentDiv2 {
  30. padding:10px;
  31. border:1px solid #f06;
  32. width:152px;
  33. background:#fcf;
  34. }
  35. /*--- 定义方块偏移位置、文字位置 ---*/
  36. .grandDiv2 {
  37. margin-top:-50px;
  38. margin-left:95px;
  39. }
  40. .parentDiv2 {
  41. margin-top:-40px;
  42. margin-left:85px;
  43. }
  44. .div2 {
  45. margin-top:-20px;
  46. margin-left:75px;
  47. padding-top:30px;
  48. height:40px;
  49. }
  50. .grandDiv2 .parentDiv2,
  51. .grandDiv2 .div2,
  52. .parentDiv2 .div2 { margin:0;}
  53. </style>
  54. <body>
  55. <h3>法则五<strong>(重要)</strong>:非同辈元素,任意一者或其祖元素拥有动态定位时,同时各自向上寻找动态定位的祖元素至共有的祖元素的下一级为止,并分别从中拿出具备最高级别的祖元素(或其本身)进行比较。</h3>
  56. <p>情况1:子元素的z-index无论多大,父元素大者居上。<p>
  57. <div class="parentDiv1" style="position:relative; z-index:2;">
  58. .parentDiv1{position:relative;<strong>z-index:2</strong>}
  59. <div class="div1">.div1{position:static}</div>
  60. </div>
  61. <div class="parentDiv2" style="position:relative; z-index:1;">
  62. <div class="div2" style="position:relative; z-index:10000;">.div2{position:relative;<strong>z-index:10000</strong>}</div>
  63. .parentDiv2{position:relative;<strong>z-index:1</strong>}
  64. </div>
  65. <p>情况2:父元素居下,子元素也可以居上。<p>
  66. <div class="parentDiv1">
  67. .parentDiv1{position:staitc}
  68. <div class="div1" style="position:relative;">.div1{position:relative}</div>
  69. </div>
  70. <div class="parentDiv2">
  71. <div class="div2">.div2{position:staitc}</div>
  72. .parentDiv2{position:staitc}
  73. </div>
  74. <p>情况1、情况2结合扩展比较。<p>
  75. <div class="grandDiv1" style="position:relative; z-index:3;">
  76. .grandDiv1{position:relative;<strong>z-index:3</strong>}
  77. <div class="parentDiv1">
  78. .parentDiv1{position:staitc}
  79. <div class="div1" style="position:relative; z-index:10000;">.div1{position:relative;<strong>z-index:10000</strong>}</div>
  80. </div>
  81. </div>
  82. <div class="grandDiv2">
  83. <div class="parentDiv2" style="position:relative; z-index:4;">
  84. <div class="div2">.div2{position:staitc}</div>
  85. .parentDiv2{position:relative;<strong>z-index:4</strong>}
  86. </div>
  87. .grandDiv2{position:static;}
  88. </div>
  89. </body>
  90. </html>


引用:

其实前四点都是基础,只有第五点比较难于理解,这里详细解释一下:

<div id="ab" style="position:absolute;">
    <div id="a" style="position:relative; z-index:100;">
        <div id="a_inner1">
            <div id="a_inner2">
                <div id="a_inner3" style="position:relative; z-index:98;">
                    <div id="a_inner4">
                        <div id="a_inner5">
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div id="b">
        <div id="b_inner1">
            <div id="b_inner2">
                <div id="b_inner3" style="position:relative; z-index:99;">
                    <div id="b_inner4">
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

在这个例子中,我们来比较div#a_inner5和div#b_inner4的层叠关系。
到它们所共同拥有的祖元素div#ab的下一级为止,div#a_inner5的祖元素包括:div#a,div#a_inner1,div#a_inner2,div#a_inner3,div#a_inner4;div#b_inner4的祖元素包括:div#b,div#b_inner1,div#b_inner2,div#b_inner3。
然后分析它们的祖元素中具有动态定位的:div#a_inner5的祖元素中含有动态定位的元素有:div#a,div#a_inner3;div#b_inner4的祖元素中含有动态定位的元素有:div#b_inner3。
然后再拿出最高级进行比较:div#a > #div#b_inner3。

父元素居下,子元素也可以居上的情况,则是利用非同辈元素在祖元素具备动态布局时,其比较已经与position:static无关,而其祖元素却可以通过html的位置来进行比较。

引用结束

当然,有时候还存在特例,比如flash、比如ie6中的select无法遮住,这些都属于异常情况,大家可以自己搜索一下相关文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值