关于position:absolute的困惑

  今天在学习《精通css》时碰到一个问题,第六章“对列表应用样式和创建导航条”中的“Suckerfish下拉菜单”中,为了创建导航条的下拉菜单,文中提到的方法是:先设置下拉菜单的position:absolute(注意:此时父级并没有设置position),然后用left:-999em将下拉菜单隐藏到屏幕左边,然后在父列表项中添加鼠标悬停伪选择器,ul li:hover ul{left:auto},这样,当鼠标移动到父列表项时,就会在合适的位置出现下拉菜单。

  html:

 1 <ul class="nav">
 2         <li><a href="#">111</a></li>
 3         <li><a href="#">222</a>
 4             <ul>
 5                 <li><a href="#">21</a></li>
 6                 <li><a href="#">22</a></li>
 7             </ul>
 8         </li>
 9         <li><a href="#">333</a></li>
10         <li><a href="#">444</a></li>
11 </ul>

  css:

  

 1        *{
 2             margin:0;
 3             padding: 0;
 4         }
 5         .nav,.nav ul{
 6             list-style-type: none;
 7             float: left;
 8             background-color: #8BD400;
 9             border:1px solid #486B02;
10             text-align: center;
11         }
12         .nav{
13             margin:1em;
14             /* padding: 1em; */
15         }
16         .nav li{
17             float: left;
18             width: 8em;
19         }
20         .nav li ul{
21             width: 8em;
22             position: absolute;
23             left: -999em;
24         }
25         .nav li:hover ul{
26             left: auto;
27         }

  至此,一个用css做的下拉菜单算是大功告成了,那么,真相是怎样的呢?

  上面例子中,下拉菜单的position为absolute,但是他的上级并没有设置position,而且他只设置了left:-999em,那么,他是怎么显示的呢?为什么当鼠标移动到父列表项时,将left改为auto后,他能在正确的位置出现呢?如果给他或父级设置padding和margin又会怎么样呢?给他本身设置padding和margin呢?

  在知乎找到一篇相关的文章:http://www.zhihu.com/question/20109535有如下的答案:  

  "1.如果position: absolute 元素未赋予 left、top实际值,那么其值为auto
  2.“auto”与“0”在父级元素没有padding值的情况下,表现一样"

  "这个div嵌套在body里面,如果不给img设置left和top等值的话,它就相当于没有宽度的浮动元素。如果设置了top和left等值的话,那么它就会去找position为非static得元素做为containing box.这里是body。"

  如果下拉菜单的li只给left,top,right,bottom中的其中一个值又会有怎样的效果呢,正如上例中的一样,只给了left值,可以自己试验一下。

  另外还有张鑫旭的一篇文章http://www.zhangxinxu.com/wordpress/2010/01/absolute%E7%BB%9D%E5%AF%B9%E5%AE%9A%E4%BD%8D%E7%9A%84%E9%9D%9E%E7%BB%9D%E5%AF%B9%E5%AE%9A%E4%BD%8D%E7%94%A8%E6%B3%95/

  他总结的一句话挺好的“例如一个div中有个absolute属性元素,其没有left或是top值,其会像个普通的inline-block属性元素一样静静地呆在这个div 里面,但是一旦设置了left:0;top:0;对不起,这个absolute元素立马变身,直接从DOM tree里面脱离,独立于文档流,结果相对于最近的relative属性的祖先标签定位(如果没有,就body定位)。”。

  欢迎各位指教,不胜感激!

时间: 2024-10-25 14:40:20

关于position:absolute的困惑的相关文章

巧用 position:absolute

1.跟随性 下面这种方法更加简便以及更方便维护, 例如"西部世界",由于不用将父元素设为position:relative,position:absolute的位置也就不用根据文字多少而重新进行top.left等位置的计算. <div class="item1">西部世界<i></i></div> <div class="item2"> <i></i> <i

CSS position:absolute浅析

一.绝对定位的特征 绝对定位有着与浮动一样的特性,即包裹性和破坏性. 就破坏性而言,浮动仅仅破坏了元素的高度,保留了元素的宽度:而绝对定位的元素高度和宽度都没有了. 请看下面代码: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>绝对定位的特征</title> 6 <style> 7 .box1,.box2,.b

css position: absolute、relative详解

CSS2.0 HandBook上的解释: 设置此属性值为 absolute 会将对象拖离出正常的文档流绝对定位而不考虑它周围内容的布局.假如其他具有不同 z-index 属性的对象已经占据了给定的位置,他们之间不会相互影响,而会在同一位置层叠.此时对象不具有外补丁( margin ),但仍有内补丁( padding )和边框( border ). 要激活对象的绝对(absolute)定位,必须指定 left , right , top , bottom 属性中的至少一个,并且设置此属性值为 ab

css position:absolute 如何居中对齐

要写死宽度,就好弄了 position: absolute; left: 50%; width: 980px; margin-left: -490px; text-algin:center

层模型--绝对定位(position:absolute)

如果想为元素设置层模型中的绝对定位,需要设置position:absolute(表示绝对定位),这条语句的作用将元素从文档流中拖出来,然后使用left.right.top.bottom属性相对于其最接近的一个具有定位属性的父包含块进行绝对定位.如果不存在这样的包含块,则相对于body元素,即相对于浏览器窗口. 如下面代码可以实现div元素相对于浏览器窗口向右移动100px,向下移动50px. div{ width:200px; height:200px; border:2px red solid

我所整理的float, inline-block还有position:absolute

这篇主要写了一下几个知识点: 浮动和inline-block的概念和选择 浮动和position:absolute对于脱离文档流的区别 这篇文章参考了一下几个链接: https://www.zhihu.com/question/24529373/answer/29135021 http://www.w3cplus.com/css/inline-blocks.html 感谢你们的无私分享以及钻研的精神. 浮动最早是用来实现文字环绕图片用的,而不是像现在很多地方用来砌砖头用. inline-bloc

绝对定位 position:absolute,相对定位 position:relative

<1> 当我们要使用绝对定位的时候,必须要有两个条件 1>必须给父元素加定位属性,一般建议使用 position:relative(即:给父元素设为相对定位); 2>给子元素,加绝对定位position:absolute(给子元素设置为绝对定位); 同时加方向属性(top ,left,rigth,bottom) 绝对定位是以父元素为基准点,进行定位(如果他没有父元素,或者它的父元素没有设置position:relative属性)它就会以<body>为基准点进行定位.绝对

position:absolute/relative/fixed小结

1.绝对定位:position:absolute; 当一个div块的位置被定义为绝对定位absolute时,也就意味着它失去了文档流的位置,后面的文档流会紧跟着补上来接替它的位置.如果上下左右的绝对偏移量都是0,那么它将漂浮在原来的位置上,否则,会根据相对该元素外的第一个非static属性的元素进行定位,如果没有非static属性的父元素,则相对于body定位.当偏移后超出浏览器视线的向下或向右的内容不会被隐藏,而是会出现滚动条,但是向左或向上的内容超出后会被隐藏. 2.相对定位:positio

【webQD】☆★之详解position: absolute、relative属性

[webQD]☆★之详解position: absolute.relative 首先我们来看一下W3C对position的解释: 我们再看,W3C对position属性值的解释: ok,我们需要了解的是: 其中absolute和relative是最常用的,fixed用得也比较多(其中IE6并不支持fixed). 1.absolute(绝对定位) absolute是生成觉对定位的元素,脱离了文本流(即在文档中已经不占据位置),参照浏览器的左上角通过top,right,bottom,left(简称T