CSS定位--绝对定位是根据谁定位的?

CSS绝对定位的元素根据开启定位的祖先元素或初始包含块定位。若无定位祖先,则相对于初始包含块,即浏览器视口。通过实例展示了当不指定left和top时,元素保持原位;当left和top设为0时,元素位于视口左上角,证明了初始包含块的存在。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CSS的绝对定位,你真的明白吗?

  • 绝对定位是相对于谁确定位置的?有一句口诀:子绝父相,子绝父绝。意思就是,开启了绝对定位的子元素根据它的开启了相对定位或者绝对定位的父元素而确定位置。
  • 事实上,绝对定位的元素是根据包含块确定位置的,包含块就是离他最近的开启了定位的祖先元素。
  • 但是,如果祖先元素没有开启过定位,那就相对于初始包含块定位

什么是初始包含块?上代码!

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        
        html {
            width: 500px;
            height: 500px;
            border: 1px solid red;
            margin: 100px 0 0 100px;
        }

        body {
            width: 300px;
            height: 300px;
            border: 1px solid #000;
            margin: 100px 0 0 100px;
        }

        div {
            width: 100px;
            height: 100px;
            position: absolute;
            background-color: #bfa;
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

上图,红边框的盒子是html,黑边框的盒子是body,因为div设置了绝对定位但是并未给其left、top、right、bottom赋值,它们的默认值是auto,所以div在原地不动

当给div的left 和 top赋值为0时

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        
        html {
            width: 500px;
            height: 500px;
            border: 1px solid red;
            margin: 100px 0 0 100px;
        }

        body {
            width: 300px;
            height: 300px;
            border: 1px solid #000;
            margin: 100px 0 0 100px;
        }

        div {
            width: 100px;
            height: 100px;
            background-color: #bfa;
            position: absolute;
            left: 0;
            top: 0;
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

可见,div定位在了页面的左上角,也就是(0,0)点的位置,那么怎么证明初始包含块的存在呢?

这次我们移除html的mrgin,将html的height设置为100%,加上背景色之后再看

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        
        html {
            width: 500px;
            height: 100%;
            border: 1px solid red;
            background: yellow;
        }

        body {
            width: 300px;
            height: 300px;
            border: 1px solid #000;
            margin: 100px 0 0 100px;
        }

        div {
            width: 100px;
            height: 100px;
            background-color: #bfa;
            position: absolute;
            left: 0;
            top: 0;
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

可见浏览器的视口全部为黄色,且因为html有上下边框的原因,比初始包含块多了2px,浏览器才出现了垂直方向上的滚动条,经测试,去掉html的上下边框,滚动条消失,事实上初始包含块是浏览器视口的第一屏

由此可知,初始包含块是一个和视口等高等宽的透明矩形

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值