通过案例理解position:relative和position:absolute

w3school过了HTML的知识之后,觉得要自己单纯地去啃知识点有点枯燥,然后自己也很容易忘记,所以便找具体的网站练手便补上不懂的知识点。position:relative和postion:absolute困扰了我快一个星期之久,网上找到的资料鱼龙混杂,刚确定“这样”的理解之后,看另一份资料,发现“这样”理解是错了,就这样不断更正,并记录下来,最终整理出这份,以备参阅。

若有错误,请指正。

下面的结果都是基于firefox38版本来测试的。

position:relative相对定位

1. 如何定位?
每个元素在页面的普通流中会“占有”一个位置,这个位置可以理解为默认值,而相对定位就是将元素偏离元素的默认位置,但普通流中依然保持着原有的默认位置。(在父级节点的content-box区定位,父级节点有文字的话,元素的默认位置则是紧随文字)
2. 不会改变行内元素的display属性。
3. 并没有脱离普通流,只是视觉上发生的偏移。
代码——

<body style=‘margin:0;padding:0;background:#BDD7EE;color:white;‘>
<div class=‘contain‘ style=‘margin:10px;border:10px solid white;width:300px;background:#F8CBAD;padding:10px 0 0 10px;font-size:20px;font-weight:bold;‘>
  <div class=‘one‘ style=‘width:50px;height:50px;background-color:#FFE699;top:-10px;left:0px;‘></div>
  <div class=‘two‘ style=‘height:50px;color:#fff;background-color:#C5E0B4;‘>position:relative定位测试</div>
</div>
</body>

显示——

给子元素one的style加上position:relative;后显示——

给父级元素contain的style加上文字后显示——

将one由div节点改为span节点,并加入文字“你好”之后显示——

<body style=‘margin:0;padding:0;background:#BDD7EE;color:white;‘>
<div class=‘contain‘ style=‘margin:10px;border:10px solid white;width:300px;background:#F8CBAD;padding:10px 0 0 10px;font-size:20px;font-weight:bold;‘>如果父级节点有文字的话...
  <span class=‘one‘ style=‘width:50px;height:50px;background-color:#FFE699;position:relative;top:-10px;left:0px;‘>你好</span>
  <div class=‘two‘ style=‘height:50px;color:#fff;background-color:#C5E0B4;‘>position:relative定位测试</div>
</div>
</body>

position:absolute绝对定位

1. 如何定位浮动?

  • 设置了TRBL
    相对最近的设定了position:relative/absolute的父(祖先)节点的padding-box的区进行定位(忽略文字),找不到符合条件的父(祖先)节点,则相对浏览器窗口进行定位。
  • 没有设置了TRBL
    则默认浮动,默认浮动在父级节点的content-box区。

2. 不管是块级元素还是行内元素,应用了position:absolute之后,display为block:

  • 可以设置width和height
  • 没有设置的话,width默认为auto

3. 脱离文档流,容器(父)元素将得不到脱离普通流的子元素高度

代码——

<body style=‘margin:10px;width:300px;color:white;background-color:#BDD7EE;‘>
<div style=‘background-color:#F8CBAD;padding-top:10px;‘>祖先元素
  <div style=‘background-color:#FFE699;border:10px solid white;padding-top:10px;‘>父级元素
    <div style=‘background-color:#C5E0B4;‘>子元素</div>
  </div>
</div>
</body>

显示----

给子元素的style加上position:absolute;top:0px;left:0px;后显示——

给子元素的style加上position:absolute;top:0px;后显示——

注释:应用了position:absolute之后之设置了top,所以子元素的top紧贴浏览器窗口的top(距离为0px),因为没有设置left,所以子元素左边就默认父级元素content-box区的左侧进行定位(没应用position:absolute之前左侧该在哪个位置就在那个位置)
给子元素的style加上position:absolute;后显示——

案例:理解应用了position:absolute的元素没有设置TRBL的话,则默认浮动在父级节点的content-box区

用一句通俗易懂的话来说就是,它该在哪个位置就在哪个位置,只不过不占位而已。
先理解下上面示例代码的显示图,以及给自己元素加上position:absolute后的显示图。

给子元素的样式加上:display:inline;我们看看如果子元素是内联元素的话会如何显示。

假如有两个同级块级元素,看看第一个子元素和第二个子元素分别应用position:absolute后的效果如何。

<div style=‘background-color:#F8CBAD;padding-top:10px;‘>祖先元素
  <div style=‘background-color:#FFE699;border:10px solid white;padding-top:10px;‘>父级元素
      <div style=‘background-color:#62C292;‘>子元素(上)</div>
      <div style=‘background-color:#C5E0B4;‘>子元素(下)</div>
  </div>
</div>

如果这两个同级块级元素都应用了position:absolute;这两个元素会进行重叠,子元素(下)显示在前面,那是因为默认代码靠后的元素的z-index比较大。

上面的案例中,将第二个子级元素换为内联元素,子元素(下)的起点位置并没有改变。

试试给代码中的第一个元素的style加上display:inline;看看上面的子元素是内联元素的话会如何显示。

<div style=‘background-color:#F8CBAD;padding-top:10px;‘>祖先元素
  <div style=‘background-color:#FFE699;border:10px solid white;padding-top:10px;‘>父级元素
      <div style=‘background-color:#62C292;display:inline;‘>子元素(上)</div>
      <div style=‘background-color:#C5E0B4;‘>子元素(下)</div>
  </div>
</div>

现在调换下应用position:absolute的位置

代码:

<div style=‘background-color:#F8CBAD;padding-top:10px;‘>祖先元素
  <div style=‘background-color:#FFE699;border:10px solid white;padding-top:10px;‘>父级元素
      <div style=‘background-color:#C5E0B4;‘>子元素(上)</div>
      <div style=‘background-color:#62C292;‘>子元素(下)</div>
  </div>
</div>

第一个子元素是内联元素的话——

<div style=‘background-color:#F8CBAD;padding-top:10px;‘>祖先元素
  <div style=‘background-color:#FFE699;border:10px solid white;padding-top:10px;‘>父级元素
      <div style=‘background-color:#C5E0B4;display:inline;‘>子元素(上)</div>
      <div style=‘background-color:#62C292;‘>子元素(下)</div>
  </div>
</div>

综上:不管是块级元素还是内联元素应用position:absolute并且不设置TRBL,它都会默认在父级元素的content-box区浮动。原来的起点位置也是应用绝对定位后的起点位置,只不过如果应用了position:absolute的内联元素左边也有内联元素的话,它的起点位置会变得更靠前,直到紧挨左边内联元素的边界。

综合案例:看看position:relative和position:absolute的综合效果

沿用position:absolute的案例代码——

<body style=‘margin:10px;width:300px;color:white;background-color:#BDD7EE;‘>
<div style=‘background-color:#F8CBAD;padding-top:10px;‘>祖先元素
  <div style=‘background-color:#FFE699;border:10px solid white;padding-top:10px;‘>父级元素
    <div style=‘background-color:#C5E0B4;‘>子元素</div>
  </div>
</div>
</body>

在上面代码的基础上分别应用以下的定位后看看效果,并理解。

案例诊断:

    • 给祖先div加上"position:relative;"以及给子元素加上
      "position:absolute;top:0px;left:0px;"

给父级div加上"position:relative;"以及给子元素加上
"position:absolute;top:0px;left:0px;"

给祖先和父级div加上"position:relative;"以及给子元素加上
"position:absolute;top:0px;left:0px;"

给祖先div加上"position:absolute;"以及给子元素加上

"position:absolute;top:0px;left:0px;"

给父级div加上"position:absolute;"以及给子元素加上
"position:absolute;top:0px;left:0px;"

给祖先和父级div加上"position:absolute;"以及给子元素加上
"position:absolute;top:0px;left:0px;"

我们看到,确实是消除了环绕浮动元素环绕的影响,position:absolute的优先级高,所以float元素被遮住了,并不是消失了。另外看到contain元素的高度不受子元素的影响了,因为它们都脱离文档流了。

参考颜色

应用:消除环绕浮动元素的影响

父级,position:relative(不设TRBL)
子级,第一个div的float:left;第二个div的position:absolute(不设TRBL)
因为第二个子级div元素默认会在父级元素的content-box区浮动,它可以消除上一个同级子级div元素的环绕浮动影响。
案例代码——

<div class=‘contain‘ style=‘margin:10px;width:300px;background:#F8CBAD;padding:10px 0 10px;color:white;‘>
  <div class=‘one‘ style=‘width:30px;height:30px;background-color:#FFE699;float:left;‘></div>
  <div class=‘two‘ style=‘color:#fff;background-color:#C5E0B4;‘>position:absolute消除浮动环绕的影响测试</div>
</div>

显示--

给父级元素加上position:relative,给第二个子级元素加上position:absolute后,显示——

转载自:https://segmentfault.com/a/1190000006924181

原文地址:https://www.cnblogs.com/fangsmile/p/7717273.html

时间: 2024-10-10 02:40:38

通过案例理解position:relative和position:absolute的相关文章

position:relative/static/fixed/absolute定位的区别以及使用场景

absolute是相对于自己最近的父元素来定位的,relative是相对于自己来定位的 relative 不脱离文档流,absolute 脱离文档流.也就是说:relative 的元素尽管表面上看到它偏离了原来的位置,但它实际上在文档流中还是没变.absolute的元素不仅位置改变了,同时也脱离了文档流.所以absolute会把非定位盒子覆盖掉. position:relative日常应用的时候一般是设置给position:absolute;的父层的,父层position:relative; 子

css里面position:relative与position:absolute的区别

position:absolute这个是绝对定位:是相对于浏览器的定位.比如:position:absolute:left:20px;top:80px; 这个容器始终位于距离浏览器左20px,距离浏览器上80px的这个位置. position:relative是相对定位,是相对于前面的容器定位的.这个时候不能用top left在定位.应该用margin. 比如:<div class="1"></div><div class="2">

css中position:relative的真正理解

其实话说一直以来也没真正去理解好position:relative的用法的真实意义. 我想很多人实实在在用的多都是position:relative和position:absolute结合起来一起用的. position属性是用四种定位.默认的是static. position:absolute(绝对定位) --是脱离文档流,相对于父级元素(包含这个position:relative)定位,当然如果没有,那就是相对于body定位的. position:relative(相对定位) --单独使用,

转载,最容易理解的CSS的position教程——十步图解CSS的position

CSS的positon,我想做为一个Web制作者来说都有碰到过,但至于对其是否真正的了解呢?那我就不也说了,至少我自己并不非常的了解其内核的运行.今天在Learn CSS Positioning in Ten Steps一文中分十步介绍了CSS的"position"中的"static.relative.absolute.float"使用,觉得蛮有意思的.整理了一下贴上来与大家一起分享.希望大家能喜欢. 在图解这十个过程之前,我将实例的代码放上来,好让大家一个实体参考

css position: relative,absolute详解

关于CSS中 position在布局中非常重要,查了很多资料都说的很难理解,下面说说个人的理解: 语法: position: relative | absolute relative: 对象遵循常规流,并且参照自身在常规流中的位置通过top,right,bottom,left属性进行偏移时不影响常规流中的任何元素. absolute: 对象脱离常规流,使用top,right,bottom,left等属性进行绝对定位,盒子的偏移位置不影响常规流中的任何元素,其margin不与其他任何margin折

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

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

CSS position relative absolute fixed

position属性absolute与relative 详解 最近一直在研究javascript脚本,熟悉DOM中CSS样式的各种定位属性,以前对这个属性不太了解,从网上找到两篇文章感觉讲得很透彻,收藏下来,唯恐忘记. 一.解读absolute与relative 很多朋友问过我absolute与relative怎么区分,怎么用?我们都知道absolute是绝对定位,relative是相对定位,但是这个绝对与相对是什么意思呢?绝对是什么地方的绝对,相对又是相对于什么地方而言的呢?那他们又有什么样的

css position: relative | absolute | static | fixed详解

static(静态):没有特别的设定,遵循基本的定位规定,不能通过z-index进行层次分级. fixed(固定定位) 这里所固定的参照对象是可视窗口而并非是body或是父级元素.可通过z-index进行层次分级. CSS2.0 HandBook上的解释: 设置此属性值为 absolute 会将对象拖离出正常的文档流绝对定位而不考虑它周围内容的布局.假如其他具有不同 z-index 属性的对象已经占据了给定的位置,他们之间不会相互影响,而会在同一位置层叠.此时对象不具有外边距( margin )

浅析position:relative position:absolute

定位一直是WEB标准应用中的难点,如果理不清楚定位那么可能应实现的效果实现不了,实现了的效果可能会走样.如果理清了定位的原理,那定位会让网页实现的更加完美. 定位的定义:在CSS中关于定位的内容是:      position:relative | absolute | static | fixed static(静态) 没有特别的设定,遵循基本的定位规定,不能通过z-index进行层次分级. relative(相对定位) 对象不可层叠.不脱离文档流,参考自身静态位置通过 top,bottom,