详解绝对定位和相对定位

原文地址:详解绝对定位和相对定位

上一篇博文中对元素的居中方式进行了总结,其中很多方法中都用到了相对定位和绝对定位,关于这两种定位方式确实是CSS中的一大难点,如果不能深入了解这两种定位方式,进行页面排版时就容易出现混乱,所以今天我对position的所有属性取值进行一个总结,重点剖析绝对定位和相对定位之间的联系和区别。

position的不同取值

不管是哪种定位,都必须有一个参照物,理清参照物我们就对这些定位方式了解了一半。

  1. static,默认值。位置设置为static的元素,它始终会处于页面流给予的位置(static 元素会忽略任何 top、bottom、left、right和z-index 声明)。
  2. inherit,规定应该从父元素继承 position 属性的值。但是任何的版本的 Internet Explorer (包括 IE8)都不支持属性值 "inherit"。
  3. fixed,生成绝对定位的元素,可定位于相对于浏览器窗口的指定坐标。元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。不论窗口滚动与否,元素都会留在那个位置。
  4. absolute,生成绝对定位的元素,相对于距该元素最近的已定位(position不为static)的祖先元素进行定位。此元素的位置可通过 "left"、"top"、"right" 以及 "bottom" 属性来规定。
  5. relative,生成相对定位的元素,相对于该元素在文档中的初始位置进行定位。通过 "left"、"top"、"right" 以及 "bottom" 属性来设置此元素相对于自身位置的偏移。

相对定位relative

相对定位的参照物是它本身

每一个元素都可以看作一个盒子,文档流就是由这些盒子堆砌而成,而每个盒子都在这个文档流中占据了一个位置,如果我们把这个盒子设置成相对定位,那么就可以拿起这个盒子相对于它原来所占据的位置向别的地方移动,如设置left:50px就是相对于盒子原来位置向右移动了50个像素,我们用具体的例子来说明。
下面是一个所有元素都没有设置过任何定位方式的原始页面布局。

我们把box-2设置成相对定位并向左移动60像素,向下移动120像素。

     .box-2{
        background-color: #00A5FF;
        position: relative;
        left: 60px;
        top:120px;
    }

得到下面的效果

  • 从上图我们可以发现box-2相对于它原来的位置向下且向右移动了,并且原来的位置留下了一片空白,但是其他的元素并没有占据它,说明元素设置相对定位后,可以相对于其在普通流中的位置偏移,原本所占的空间仍保留
  • 同时我们从图上可以看出,box-2移动之后覆盖了其他的元素,这说明当元素被设置相对定位后,将激活z-index属性,其层叠级别高于原本的文档流。此时如果给box-5也设置 position: relative,那么box-5又会覆盖box-2。

绝对定位absolute

绝对定位的参照物是相对于该元素最近的已定位的祖先元素,如果没有一个祖先元素设置定位,那么参照物是body。

绝对定位与相对定位的一大不同之处就是,当我们把一个元素设置成绝对定位,那么这个元素将会脱离文档流,漂浮在文档流上方,并且后面的元素将会填充它原来的位置。绝对定位元素根据它的参照物移动自己的位置,而参照物则需要根据它祖先元素的定位设置来确定。我们就用实例说明绝对定位的特点和需要注意的地方。
下面是一个所有元素都没有设置过任何定位方式的原始页面布局。

  1. 祖先元素都没有设置定位,元素相对于body转移位置。
    给box-2设置成position: absolute;

       .box-2{
         background-color: #00A5FF;
         position: absolute;
     }     
    

得到下面的效果

  • 我们可以看到最后一个box存在的位置空了出来,这是因为box-2脱离文档流漂浮到文档上方,并且后面的元素填补了上去,说明元素设置绝对定位后脱离文档流,后面的元素将填补它的位置
  • 接着你可能就会发现box-3失踪了,其实它没有失踪,它是在box-2下面,就像相对定位一样,当元素被设置绝对定位后,将激活z-index属性,其层叠级别高于原本的文档流
  1. 你可能会问了,不是说祖先元素都没有定位时,元素会相对于body来改变自己的位置吗,为什么它还是飘在原来的位置,而没有飘到body顶头呢,那么请看,我把left和top属性加上会出现什么样的结果。

       .box-2{
             background-color: #00A5FF;
             position: absolute;
             left: 0;
             top:0;
         }   
    

得到下面的效果

  • 现在可以看到它与body顶头了,因为光设置一个元素的相对定位它只会漂浮到原来位置的上空,并不会漂浮到参照物的文档流最前方,而只有设置了left、top、right、bottom这些参数的时候才能激活它相对于参照物移动的效果。
  1. 祖先元素grandpa设置定位,元素相对于grandpa转移位置。

         .grandpa{
             background-color: #55a532;
             height: 500px;
             width: 600px;
             margin: 40px;
             position: relative;
         } 
         .box-2{
             background-color: #00A5FF;
             position: absolute;
             left: 20px;
             top:20px;
         }   
    

得到下面的效果

  1. 祖先元素father设置定位,元素相对于father转移位置。

         .father{
             background-color: #55a532;
             height: 400px;
             width: 500px;
             margin: 50px;
             position: relative;
         } 
         .box-2{
             background-color: #00A5FF;
             position: absolute;
             left: 20px;
             top:20px;
         }   
    

得到下面的效果

  1. 父元素son以及祖先元素father、grandpa都设置定位,元素相对于son转移位置。

         .grandpa,.father,.son{
             position: relative;
         }
         .box-2{
             background-color: #00A5FF;
             position: absolute;
             left: 20px;
             top:20px;
         }   
    

得到下面的效果

  • 当祖先元素不止一个设置了定位的时候,选择最近的一个作为参照物

小结

现在你应该就能明白为什么上一篇博文中那么多居中方式都要设置其父元素的position为relative了吧,其实虽然absolute要求的是祖先元素的定位方式是除static都可以,但是最好还是设置成相对定位,因为你只设置relative而不设置left、top等参数的话对元素自身和其他元素是没有影响的,但如果你设置成fixed,元素就有可能受到浏览器窗口的影响(如果有特殊需要当然可以使用),而你设置成inherit也没有什么意义,况且浏览器对它的支持性也不是很好,显然用来限制absolute的话用relative是最合适的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,709评论 1 92
  • 当在这一个页面上实现布局和定位有几种不同的技术。使用哪种技术,很大程序上取决于内容和目标页面,因为有很多技术比别人...
    lulu_c阅读 1,030评论 0 5
  • 之前介绍过CSS浮动float详解,本篇介绍的绝对定位absolute和浮动float有部分相似性。如果能理解浮动...
    张歆琳阅读 96,559评论 39 192
  • 学习建议 定位、浮动是 CSS 核心知识点,必须熟练掌握。 1.文档流的概念指什么?有哪种方式可以让元素脱离文档流...
    饥人谷_任磊阅读 1,054评论 0 3
  • 每个人都按照自己的生活轨迹活在这世间,而每个人活着的时候都有或大或小或长或短的人生追求,人们认为只有达成既...
    意趣寥寥阅读 540评论 0 2