`
oceanG_Y
  • 浏览: 51477 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

深入理解css中的position定位和z-index属性

    博客分类:
  • PHP
阅读更多

引自:http://kuangbaoxu.iteye.com/blog/194437

 关键字: 深入理解css中的position定位和z-index属性

注:本文仅供交流使用,如有不当之处欢迎批评指正,但请注明详由,谢谢!

由于平时不太用到,所以过去写css的时候对于position属性的absolute、relative值理解比较模糊,对于z-index的层叠更是摸不着头脑,除了理解的因素外,各个浏览器的不同解析结果也是一个大问题。今天仔细阅读了一下css文档,总算是对盒模型的浮动、定位有了比较深刻的理解。

我们在实践中很有可能遇到这样的问题:
1、做一个横向导航,然后鼠标经过之后出现下拉菜单,那么这个下拉菜单的位置控制就是一个关键;
2、我们想在一个正常的页面布局中放入几个浮在页面上的气泡提示,这时既不想让气泡提示破坏正常的文档布局,又不想气泡提示的定位在不同的浏览器中到处乱飘。
3、当我们在一句正常的文本中插入一个小图标的话,一般会使用<img />标签,而这时它的垂直居中问题又是让人困惑,无论你使用html属性absmiddle、或是使用css属性vertical-align、抑或是使用父对象的heigh + line-height,在不同的浏览器中总会看起来不同。

嗯,上面几个问题你是否也遇到过呢?如果你至今还没有一个很好的解决办法,不妨继续阅读此文,或许能对你有所帮助:)

我们先看一下position属性的几个取值定义:
position: static、absolute、relative

static : 默认值。如果没有指定position属性,支持position属性的html对象都是默认为static,可以这么理解:把html页面看作一个文档流,源代码中各个标签的先后位置就是它们所对应的对象的呈现次序,所有取值为static的对象都按照你所编写的html标签的顺序依次呈现。
如下图所示,这是一个常见的指定了float:left;的横向导航:


relative: 相对定位。这个属性值保持对象所在文档流中的位置,也就是说它具有和static相同的呈现方式,它同样占有在文档流中的固定位置,后面的对象不会侵占或覆盖;与static属性值不同的是,设置了relative的对象,可以通过top, left, right, bottom属性设定自己的新显示位置,这4个属性的取值是相对于文档流的前一个对象的,你可以自由设置这4个属性偏移到新的位置而不对文档流中的其他对象产生任何影响,原来的页面呈现仍然会我行我素:


absolute: 绝对定位。和relative不同的是,这个属性值会将当前对象拖出文档流,后面的对象会占有原来的位置,也就是说,当前对象的呈现是独立显示的,但是它的位置在指定top, left, right, bottom任一属性之前仍是有继承性的,这时的4个属性的取值是相对于浏览器的,和文档流无关了。如果把示例中的B区域设定为absolute而不指定4个位置属性,通过设定margin来改变它的相对位置,用这个方法可以解决前面提到的问题2。


提示a: 苏昱的css2.0手册中提到relative和absolute定位的滚动条区别不是绝对的,至少在firefox、opera和safari中滚动条该出现还是会出现。

提示b: 属性值为absolute对象的z-index属性可以设置层叠显示的次序,它是直接有效的;
而属性值为relative对象的z-index属性在设置时要小心,把当前对象的z-index设置为-1是不行的,在firefox中它会无法显示(注意,不是说浏览器有误,而是指如果父对象是根元素body,那么z-index是无效的,任何z-index设置都不会显示在根元素之后,除了IE的解析bug,感谢#19提示),必须设置为0以上,我们如果想让别的对象挡住它,只有将其他对象也设置position为relative,并将z-index属性取一个比它大的值即可。

上面的表述不知道也许不是很清晰,具体的理解还是要自己亲自动手操作一下。

这样看来,前面的问题就有解了,问题3我们可以根据设计的要求将其设置为相对或绝对定位;
问题1的解决方法也有很多,个人推荐使用有语义的dl, dt, dd来实现,而且这个方法在不同浏览器中的表现基本相同(已在ie, firefox, opera, safari中测试),仅在top的属性上有几像素的差异,由于时间关系我只能给出自己测试时的代码以供参考:

Java代码 复制代码
  1. body {   
  2. color:#fff;   
  3. font-size:12px;   
  4. }   
  5. ul li {   
  6. float:left;   
  7. height:30px;   
  8. background-color:#99CC99;   
  9. margin:0 10px;   
  10. padding:0;   
  11. border:1px solid #c30;   
  12. width:100px;   
  13. }   
  14. ul li div {   
  15. border:1px solid #f00;   
  16. background-color:#996666;   
  17. width:100px;   
  18. height:100px;   
  19. position:absolute;   
  20. margin-top:15px;   
  21. margin-left:-1px;   
  22. *margin-left:-79px;   
  23. }   
  24. ul li dl,   
  25. ul li dl dt,   
  26. ul li dl dd {   
  27. margin:0;   
  28. padding:0;   
  29. }   
  30. ul li dl dd {   
  31. border:1px solid #f00;   
  32. background-color:#996666;   
  33. width:100px;   
  34. height:100px;   
  35. position:absolute;   
  36. margin-top:11px;   
  37. *margin-top:10px;   
  38. margin-left:-1px;   
  39. }   
  40. <ul>   
  41. <li>  
body {
color:#fff;
font-size:12px;
}
ul li {
float:left;
height:30px;
background-color:#99CC99;
margin:0 10px;
padding:0;
border:1px solid #c30;
width:100px;
}
ul li div {
border:1px solid #f00;
background-color:#996666;
width:100px;
height:100px;
position:absolute;
margin-top:15px;
margin-left:-1px;
*margin-left:-79px;
}
ul li dl,
ul li dl dt,
ul li dl dd {
margin:0;
padding:0;
}
ul li dl dd {
border:1px solid #f00;
background-color:#996666;
width:100px;
height:100px;
position:absolute;
margin-top:11px;
*margin-top:10px;
margin-left:-1px;
}
<ul>
<li>
标题 - #text
<div>
下拉菜单 - div
Java代码 复制代码
  1. </div>   
  2. </li>   
  3. <li style="position:relative;">列表b</li>   
  4. <li>列表c</li>   
  5. <li>   
  6. <dl>   
  7. <dt>标题 - dt</dt>   
  8. <dd>下拉菜单 - dd</dd>   
  9. </dl>   
  10. </li>   
  11. </ul>  
</div>
</li>
<li style="position:relative;">列表b</li>
<li>列表c</li>
<li>
<dl>
<dt>标题 - dt</dt>
<dd>下拉菜单 - dd</dd>
</dl>
</li>
</ul>


补充一个例子,请在IE和非IE浏览器中对比观看:
Java代码 复制代码
  1. <style>   
  2. .main {   
  3. width:500px;   
  4. height:500px;   
  5. background-color:#9cf;   
  6. }   
  7. .layer_a,   
  8. .layer_b,   
  9. .layer_c,   
  10. .layer_d {   
  11. position:absolute;   
  12. width:100px;   
  13. height:60px;   
  14. }   
  15. .layer_a {   
  16. background-color:#69c;   
  17. }   
  18. .layer_b {   
  19. background-color:#369;   
  20. }   
  21. .layer_c {   
  22. background-color:#eee;   
  23. }   
  24. .layer_d {   
  25. background-color:#696;   
  26. }   
  27. .brd {   
  28. border:1px solid #c30;   
  29. margin:1em;   
  30. }   
  31. .block {   
  32. display:block;   
  33. }   
  34. </style>   
  35. <div class="main">   
  36. <div class="brd">一段文本一段文本一段文本一段文本一段文本一段文本一段文本<div class="layer_a"></div></div>   
  37.   
  38. <div class="brd">另一段文本另一段文本另一段文本<div class="layer_b"></div></div>   
  39. <p class="brd">第三段不同的文本第三段不同的文本<div class="layer_c"></div></p>   
  40. <p class="brd block">第四段指定了block的文本<div class="layer_d"></div></p>   
  41. <a href="" class="brd">第四段指定了block的文本<div class="layer_c"></div></a>   
  42. <map class="brd block">第四段指定了block的文本<div class="layer_d"></div></map>   
  43. <dd class="brd">第四段指定了block的文本<div class="layer_a"></div></dd>   
  44. <li class="brd">第四段指定了block的文本<div class="layer_b"></div></li>   
  45.   
  46. </div>  
<style>
.main {
width:500px;
height:500px;
background-color:#9cf;
}
.layer_a,
.layer_b,
.layer_c,
.layer_d {
position:absolute;
width:100px;
height:60px;
}
.layer_a {
background-color:#69c;
}
.layer_b {
background-color:#369;
}
.layer_c {
background-color:#eee;
}
.layer_d {
background-color:#696;
}
.brd {
border:1px solid #c30;
margin:1em;
}
.block {
display:block;
}
</style>
<div class="main">
<div class="brd">一段文本一段文本一段文本一段文本一段文本一段文本一段文本<div class="layer_a"></div></div>

<div class="brd">另一段文本另一段文本另一段文本<div class="layer_b"></div></div>
<p class="brd">第三段不同的文本第三段不同的文本<div class="layer_c"></div></p>
<p class="brd block">第四段指定了block的文本<div class="layer_d"></div></p>
<a href="" class="brd">第四段指定了block的文本<div class="layer_c"></div></a>
<map class="brd block">第四段指定了block的文本<div class="layer_d"></div></map>
<dd class="brd">第四段指定了block的文本<div class="layer_a"></div></dd>
<li class="brd">第四段指定了block的文本<div class="layer_b"></div></li>

</div>


从这个例子可以看出,IE将一个块元素绝对定位时,如果父元素是一个块级元素,那么拖出文档流之后它仍会继承原来所在位置的坐标;
而非IE浏览器的做法是:拖出文档流之后,直接定位到父元素所在的坐标。

z-index 属性简介

z-index : auto | number
auto: 默认值。
number: 无单位的整数值,可为负数 。

z-index 值较大的元素将叠加在 z-index 值较小的元素之上。对于未指定此属性的定位对象,z-index 值为正数的对象会在其之上,而 z-index 值为负数的对象在其之下。

注意:这个属性不会作用于窗口控件,如 select 对象。在IE5.5+中, iframe 对象开始支持此属性。而在之前的浏览器版本中, iframe 对象是窗口控件,会忽略此属性。

z-index 属性适用于定位元素(position 属性值为 relative 或 absolute 或 fixed的对象),用来确定定位元素在垂直于显示屏方向(称为Z 轴)上的层叠顺序(stack order)。

每一个定位元素都归属于一个stacking context。根元素形成 root stacking context,而其他的 stacking context 则由定位元素产生(此定位元素的 z-index 被定义一个非 auto 的 z-index 值),定位子元素会以这个 local stacking context 为参考,用相同的规则来决定层叠顺序。并且 stacking context 和 containing block 之间并没有必然联系。

当 stacking context 一样的时候,就用 z-index 的值来决定怎样显示,如果 z-index 也相同(即 stack level 相同),则按照档中后来者居上的原则(back-to-front )的顺序来层叠。

当任何一个元素层叠另一个包含在不同 stacking context 元素时,则会以 stacking context 的层叠级别(stack level)来决定显示的先后情况。也就是说,在相同的 stacking context 下才会用 z-index 来决定先后,不同时则由 stacking context 的 z-index 来决定。例如:

定位元素 A(z-index:100)里面有定位元素 A1(z-index:300),而定位元素 B 和元素 A 兄弟关系(z-index:200)。你会发现无论 A1 的 z-index 是多大,也会被 z-index 是 200 的 B 所覆盖,因为 A 的 z-index 只有 100。
分享到:
评论

相关推荐

    深入理解css中position属性及z-index属性(推荐)

    CSS中的position属性用于指定元素在文档流中的定位方式,它决定了元素在页面上的布局和交互方式。position属性包含四个可能的值:static、fixed、relative、absolute,下面逐一详细说明。 1. static定位:这是...

    深入理解css中position属性及z-index属性1

    在实际应用中,正确理解和使用`position`和`z-index`可以实现复杂而精确的网页布局,如创建弹出框、浮动导航栏等效果。然而,过度依赖定位可能会导致布局变得难以维护,因此在设计时应适度使用,并结合其他布局技术...

    z-index为负值的元素无法点击到的解决方法

    在网页布局和设计中,CSS属性z-index常用于控制元素的堆叠顺序。如果一个元素的z-index设置为负值,它将位于所有正常流元素之下,可能导致点击事件无法触发。本文主要讲解在给元素设定负值的z-index后,如何解决该...

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

    在CSS布局中,元素重叠和`position`定位的`z-index`顺序是常见的问题,尤其是在复杂的网页设计中。本文将深入探讨这个问题,以便更好地理解和解决问题。 首先,我们需要理解元素的默认行为。在HTML文档中,元素按照...

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

    在CSS布局中,元素的位置和重叠是一个关键概念,尤其涉及到`position`定位和`z-index`属性时,这些问题往往会让开发者感到困扰。本文将深入探讨元素重叠的背景知识,以及`position`定位下的`z-index`顺序。 首先,...

    CSS教程:网页布局定位及z-index解释

    本文将深入探讨CSS中的两个关键概念——网页布局定位与`z-index`属性,帮助你理解如何有效地控制元素在页面上的位置以及它们的前后层次关系。 首先,我们来讨论网页布局定位。在CSS中,有多种定位方式,包括静态...

    css中z-index属性实例分析

    ### CSS中的Z-Index属性详解 #### 一、引言 在网页布局设计中,元素之间的堆叠顺序是非常重要的一个方面。特别是在复杂的页面结构中,如何控制...希望本文的实例分析能帮助大家更深入地理解和掌握`z-index`的用法。

    css里的z-index的使用

    本文将深入探讨CSS中的z-index属性,解析其工作原理,以及如何在实际项目中正确使用它,同时也会提及一些在不同浏览器环境下的兼容性问题。 #### z-index的基本概念 z-index是CSS中用于控制元素堆叠顺序的属性。在...

    妙用z-index让一个div显示在最前面

    当页面上的元素通过CSS定位属性(如position: relative; position: absolute; position: fixed; position: sticky;)被设定为相对定位、绝对定位、固定定位或粘性定位时,这些元素便可以重叠。如果没有指定z-index值...

    CSS--z-index详解1

    `z-index`属性在CSS中扮演着至关重要的角色,它定义了元素在页面上的堆叠顺序。简单来说,`z-index`越高,元素越会在其他元素之上显示。但这个规则并非总是如此,理解其工作原理对于创建具有复杂层次的网页布局至关...

    div层调整z-index属性无效原因分析及解决方法

    在CSS中,z-index属性只能作用于定位元素,即那些position属性为relative、absolute或fixed的元素。当元素被设置为static时(也是position属性的默认值),其z-index属性将不会生效。这是因为在静态定位的元素上,...

    margin 负值引起的层级(z-index)问题

    在现代网页设计中,CSS属性z-index用于控制页面元素的堆叠顺序,即层叠上下文。一个元素的z-index值决定了它在页面上的“高度”,或者说是显示层级,拥有更高z-index值的元素会覆盖那些具有较低z-index值的元素。...

    举例详解CSS的z-index属性的使用

    CSS的z-index属性是控制页面上元素堆叠顺序的重要工具,它允许开发者定义元素在页面的垂直层叠中的位置。在没有z-index属性的情况下,元素默认会按照HTML代码中出现的顺序进行堆叠,但在复杂布局中,这种默认的堆叠...

    学习CSS网页制作:z-index在IE中的迷惑.pdf

    在CSS布局中,`z-index`是一个至关重要的属性,它决定了网页上元素的堆叠顺序。在三维空间中,Z轴是垂直于屏幕的方向,`z-index`就是用来控制元素在这个轴上的位置,从而影响元素在页面上的覆盖关系。本文将深入探讨...

    ie6中解决z-index

    在IE6浏览器中,`z-index` ...总的来说,IE6中的`z-index`问题可以通过理解其特性和使用像`bgiframe`这样的工具来解决。然而,随着技术的发展,我们应逐渐淘汰这些针对过时浏览器的解决方案,转向更现代化的前端实践。

    CSS z-index 层级关系优先级的概念

    CSS 中的 z-index 属性用于设置节点的堆叠顺序, 拥有更高堆叠顺序的节点将显示在堆叠顺序较低的节点前面, 这是我们对 z-index 属性普遍的认识. 与此同时, 我们总是对堆叠顺序捉摸不透, 将 z-index 的值设得很大也...

    css3的transform造成z-index无效解决方案

    总的来说,理解和掌握CSS中的堆叠上下文以及`z-index`的工作原理对于解决这类问题至关重要。在进行复杂的CSS布局设计时,应尽量减少对`transform`的依赖,或者在使用时充分考虑它对堆叠顺序的影响,从而避免类似的...

Global site tag (gtag.js) - Google Analytics