关于定位position:relative & absolute

定位

父元素和子元素分别取不同的 position 值。思考 position 属性各种取值的真正含义,尤其是 absolute 究竟是相对谁而言的

position:static 默认值,无特殊定位,元素遵循HTML定位规则;

position:absolute 表示绝对定位,元素以块元素(block element)的形式脱离所处的文档流,相对于position属性非static值的最近父级元素进行偏移,body为父元素则定位于浏览器左上角(top:0;left:0)。可通过top、left、bottom、right等属性相对于其最近的具有定位设置的父元素进行绝对定位。

postion:relative 表示相对定位,不脱离文档流,保留原占位。可以使用left、right、top、bottom等属性在在文档流中的偏移位置,但元素不可重叠;

偏移默认是以父级元素左上角(top:0 ; left:0)进行偏移

一下为几种组合情况

    <!-- html代码 -->
    <div id="container">
        <div class="main">
            
        </div>
    </div>
        /* CSS代码 */
        body {
            margin: 0;
            padding: 0;
        }
        #container {
            width: 500px;
            height: 500px;
            border: 1px solid #000;
            margin: 0 auto;
            position: static;   /* 父元素 */
        }

        .main {
            width: 50px;
            height: 50px;
            border: 1px solid red;
            position: relative;     /* 子元素 */
            top: 50px;
            left: 50px;
        }

示例图

组合类型(没有讨论fixed 固定定位情况):

  1. static & relative
  2. static & absolute

父元素:static
子元素:relative
子元素相对于父元素:以父元素(div id="container")左上角(top:0; left:0;)为坐标原点, 偏移top:50px; left:50px

父元素:static
子元素:absolute
子元素相对于父元素:注意子元素绝对对位,由于父元素(div id="container")定位属性为默认值static,子元素将脱离父元素的文档流。距离最近父级元素(body 元素)进行偏移,偏移top:50px; left:50px


  1. absolute & relative
  2. absolute & absolute

父元素:absolute
子元素:relative
子元素相对于父元素:由于父元素(div id="container")定位属性为absolute,此时父元素将脱离body元素的文档流,离最近的父级元素(body 元素)进行偏移,默认为(top:0; left:0);对于子元素,其定位属性值为relative,子元素相对于position属性非static值的最近父级元素进行偏移。也就是相对于父元素(div id="container")偏移。偏移top:50px; left:50px

父元素:absolute
子元素:absolute
子元素相对于父元素:由于父元素(div id="container")定位属性为absolute,此时父元素将脱离body元素的文档流,离最近的父级元素(body 元素)进行偏移,默认为(top:0; left:0);对于子元素,其定位属性值为absolute,子元素将脱离文档流相对于position属性非static值的最近父级元素进行偏移。也就是相对于父元素(div id="container")偏移。偏移top:50px; left:50px。


  1. relative & absolute
  2. relative & relative

父元素:relative
子元素:absolute
子元素相对于父元素:由于父元素(div id="container")定位属性为relative;对于子元素,其定位属性值为absolute,子元素将脱离文档流相对于position属性非static值的最近父级元素进行偏移。也就是相对于父元素(div id="container")偏移。偏移top:50px; left:50px

父元素:relative
子元素:relative
子元素相对于父元素:由于父元素(div id="container")定位属性为relative;对于子元素,其定位属性值为relative,子元素相对于position属性非static值的最近父级元素进行偏移。也就是相对于父元素(div id="container")偏移。偏移top:50px; left:50px

归纳

  1. absolute绝对定位会脱离原先的文档流,相对于position属性非static值的最近父级元素进行偏移;
  2. relative相对定位不会脱离文档流,二是占据原有的位置,相对于position属性非static值的最近父级元素进行偏移。

疑问

在尝试把#container这个父元素浏览器居中显示时发现,如果设定position:relative; 
top属性值以百分号(percentage)为单位时,会失效。此时元素会贴在浏览器;
而left以百分号为单位却能正常显示
如果设定position:absolute;百分号为单位可以正常显示。

示例图二

思路:

  1. 在父级元素(div id="container")定位属性为 position:relative 的前提下;top单位换为px,可以正常显示;

假设一:是不是最外层的父级元素会这样?

我尝试在body设置position,但是没有变化,再加上width 和 height 值,还是没有效果;
于是我把div( id="container")元素嵌套在div(class="wrap")元素下,并设定width和height值。发现此时的top (单位%)有效了,如果去掉width 和 height 值,无效。

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>定位</title>
    <style type="text/css">

        body {
            margin: 0;
            padding: 0;
        }
            
        /*  
        .wrap {
            width: 700px;
            height: 700px;
            border: 1px solid #abc;
        }
        */
        #container {
            width: 500px;
            height: 500px;
            border: 1px solid #000;
            position: relative; /* 父元素 */
            top: 20%;            /* 无效 */
            left: 20%;
        }

        .main {
            width: 400px;
            height: 400px;
            border: 1px solid red;
            position: relative;     /* 子元素 */
            top: 50%;
            left: 50%;
        }

        .inner {
            width: 100px;
            height: 100px;
            border: 1px solid #bbb;
            position: relative;
            top: 10%;
            left: 10%;
        }
    </style>
</head>
<body>
<div class="wrap">
    <div id="container">
        <div class="main">
            <div class="inner"></div>
        </div>
    </div>
</div>
</body>
</html>

这是什么原因呢?
后期再回来解答。

转载于:https://www.cnblogs.com/leoorpio/p/5326572.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值