css详解position五种属性用法及其含义

position(定位)

position --- 作为css属性三巨头(position、display、float)之一,它的作用是用来决定元素在文档中的定位方式。其属性值有五种,分别是 --- static(正常定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)、sticky(粘性定位)。

static(正常定位)

static(正常定位) 是元素position属性的默认值,包含此属性的元素遵循常规文档流

正常定位呈现常规流的示例html代码:

html 复制代码
<!DOCTYPE html>
<html>
    <head>
        <meta name="charset" content="utf-8"/>
        <title>正常定位呈现常规流的示例</title>
        <style type="text/css">
            * {
                margin: 12px;
                background-color: white;
            }
            .block {
                background-color: #f00;
            }
            .inline {
                display: inline;
                background-color: #ff0;
            }
        </style>
    </head>
    <body>
        <div class="block">Fatman</div>
        <div class="block">Fatman</div>
        <div class="inline">Fatman</div>
        <div class="inline">Fatman</div>
        <div class="inline">Fatman</div>
        <div class="inline">Fatman</div>
    </body>

</html>

正常定位呈现常规流的示例效果图:

当元素的position属性值为static 时,元素的top、right、bottom、left、z-index属性都不会生效。

元素正常定位未添加top、right、bottom、left属性的示例html代码:

html 复制代码
<!DOCTYPE html>
<html>
    <head>
        <meta name="charset" content="utf-8"/>
        <title>元素正常定位未添加top、right、bottom、left属性的示例</title>
        <style type="text/css">
            body {
                border: 1px solid black;
                padding: 12px;
            }
            div {
                width: 100px;
                height: 100px;
                background-color: #f00;
            }
        </style>
    </head>
    <body>
        <div></div>
    </body>
</html>

元素正常定位未添加top、right、bottom、left属性的示例效果图:

元素正常定位且添加top、right、bottom、left属性的示例html代码:

html 复制代码
<!DOCTYPE html>
<html>
    <head>
        <meta name="charset" content="utf-8"/>
        <title>元素正常定位且添加top、right、bottom、left属性的示例</title>
        <style type="text/css">
            body {
                border: 1px solid black;
                padding: 12px;
            }
            div {
                top: 120px;
                right: 120px;
                bottom: 120px;
                left: 120px;
                width: 100px;
                height: 100px;
                background-color: #f00;
            }
        </style>
    </head>
    <body>
        <div></div>
    </body>
</html>

元素正常定位且添加top、right、bottom、left属性的示例效果图:

结论:元素正常定位下,无论有无添加top、right、bottom、left属性,红色背景的div元素相对于body元素的边框都没有任何的位置变化,由此可以说明当元素的position属性值为static时,元素的top、right、bottom、left属性值不会生效。

正常定位的元素与相对定位的元素重叠的示例html代码:

html 复制代码
<!DOCTYPE html>
<html>
    <head>
        <meta name="charset" content="utf-8"/>
        <title>正常定位的元素与相对定位的元素重叠的示例</title>
        <style type="text/css">
            body {
                border: 1px solid black;
                padding: 12px;
            }
            div {
                width: 100px;
                height: 100px;
            }
            #static {
                position: static;
                background-color: #f00;
                z-index: 999;
            }
            #relative {
                position: relative;
                top: -100px;
                left: 0;
                background-color: #ff0;
                z-index: 1;
            }
        </style>
    </head>
    <body>
        <div id="static"></div>
        <div id="relative"></div>
    </body>

</html>

正常定位的元素与相对定位的元素重叠的示例效果图:

ID为static的元素的z-index属性值明显高于ID为relative的元素。同理,在z轴,ID为static的元素应该比ID为relative的元素更靠近用户,事实上却是ID为relative的元素更靠近用户。

正常定位的元素与相对定位的元素重叠,但相对定位的元素的z-index值小于0时的示例html代码:

html 复制代码
<!DOCTYPE html>
<html>
    <head>
        <meta name="charset" content="utf-8"/>
        <title>正常定位的元素与相对定位的元素重叠的示例</title>
        <style type="text/css">
            body {
                border: 1px solid black;
                padding: 12px;
            }
            div {
                width: 100px;
                height: 100px;
            }
            #static {
                position: static;
                background-color: #f00;
                z-index: 999;
            }
            #relative {
                position: relative;
                top: -100px;
                left: 0;
                background-color: #ff0;
                z-index: -1;
            }
        </style>
    </head>
    <body>
        <div id="static"></div>
        <div id="relative"></div>
    </body>

</html>

正常定位的元素与相对定位的元素重叠,但相对定位的元素的z-index值小于0时的示例效果图:

将ID为relative的元素的z-index属性值修改负数后,在z轴ID为static的元素比ID为relative的元素更靠近用户,结合ID为relative的元素的z-index属性值为正数的情况,得出position属性值为static时,元素的z-index是不会受到设置值影响的。

relative(相对定位)

postion属性值为relative(相对定位) 的元素在不设置top、right、bottom、left 这些属性时,其自身在文档中的定位效果与static并无区别,但加上top、right、bottom、left 这些属性后,便会相对于自身在常规流中的位置进行定位

在上文中介绍static时用到的ID为relative的元素用的就是相对定位,从对应的效果图可以看出,我们给元素设置了-100px的top属性,将元素显示的位置相对于自身在常规流中的位置往上移动了100像素,如果不这样设置,它会按照常规文档流正常的排布。

ID为relative的元素在常规流中的位置仍然保留的示例效果图:

相对定位的代码示例:

html 复制代码
<!DOCTYPE html>
<html>
    <head>
        <meta name="charset" content="utf-8"/>
        <title>相对定位的示例</title>
        <style type="text/css">
            body {
                border: 1px solid black;
                padding: 12px;
            }
            div {
                width: 100px;
                height: 100px;
                position: relative;
            }
            #div1 {
                background-color: red;
            }
            #div2 {
                background-color: black;
                top: 100px;
                left: 100px;
            }
            #div3 {
                background-color: gray;
            }
        </style>
    </head>
    <body>
        <div id="div1"></div>
        <div id="div2"></div>
        <div id="div3"></div>
    </body>
</html>

相对定位的示例效果图:

这里三个元素盒子都是用的相对定位:红色盒子因为没有设置top、right、bottom、left属性,其定位在自身在常规流中的位置;黑色盒子因为包含值均为100px的top和left两属性,所以其定位在相对于自身在常规流先靠下100像素,再靠右100像素的位置上;灰色盒子和红色盒子一样,没有设置top、right、bottom、left属性,但因黑色盒子在常规流中的位置仍然保留,所以灰色盒子所占位置并没有紧靠在红色盒子的下方,而是出现在距离红色盒子底部100像素的位置上。

absolute(绝对定位)

absolute(绝对定位)与relative(相对定位)之间的区别是:relative(相对定位)并没有脱离文档流,而absolute(绝对定位)脱离了文档流;relative(相对定位)相对于自身在常规流中的位置进行偏移定位,而absolute(绝对定位)相对于离自身最近的定位祖先元素的位置进行偏移定位。

绝对定位脱离常规流的示例html代码:

html 复制代码
<!DOCTYPE html>
<html>
    <head>
        <meta name="charset" content="utf-8"/>
        <title>绝对定位脱离常规流的示例</title>
        <style type="text/css">
            * {
                margin: 12px;
                background-color: white;
            }
            .block {
                background-color: #f00;
            }
            .inline {
                display: inline;
                background-color: #ff0;
            }
        </style>
    </head>
    <body>
        <div class="block">Fatman</div>
        <div class="block" style="position: absolute;">Fatman</div>
        <div class="inline">Fatman</div>
        <div class="inline" style="position: absolute;">Fatman</div>
        <div class="inline">Fatman</div>
        <div class="inline">Fatman</div>
    </body>
</html>

绝对定位脱离常规流的示例效果图:

从效果图中可以看出,添加了position属性值为absolute的块级元素并没有按预期独占一行,且同样添加了position属性值为absolute的行内元素也并没有按预期在每行中按从左至右的顺序依次排放元素。并且因为没有给两个使用绝对定位的元素设置top、right、bottom、left属性,所以布局有种说不上来的诡异。

再说何为定位祖先元素:比如相对定位的元素中是相对于在常规流中的位置进行偏移定位,top、right、bottom、left属性的参考系是元素在常规流中的位置,而在绝对定位的元素中的参考系就是定位祖先元素。拥有相对定位属性值的祖先元素可以充当拥有绝对定位属性值的子孙元素的定位祖先元素。如果子孙元素没有定位祖先元素,会一直回溯到body元素,使用body元素充当自己的定位祖先元素。

相对定位元素充当绝对定位元素的定位祖先元素实现垂直水平居中的示例html代码:

html 复制代码
<html>
    <head>
        <meta name="charset" content="utf-8"/>
        <title>相对定位元素充当绝对定位元素实现垂直水平居中的示例</title>
        <style type="text/css">
            body {
                border: 1px solid black;
                padding: 12px;
            }
            .parent {
                position: relative;
                width: 300px;
                height: 300px;
                background-color: #ff0;
            }
            .son {
                position: absolute;
                width: 100px;
                height: 100px;
                background-color: #f00;
                top: 50%;
                left: 50%;
                transform: translate(-50%, -50%);
            }
        </style>
    </head>
    <body>
        <div class="parent">
            <div class="son"></div>
        </div>
    </body>
</html>

相对定位元素充当绝对定位元素的定位祖先元素实现垂直水平居中的示例效果图:

红色盒子(绝对定位元素)在其定位祖先元素黄色盒子(相对定位元素)中垂直水平居中。

body充当绝对定位元素的定位祖先元素实现垂直水平居中的示例html:

html 复制代码
<html>
    <head>
        <meta name="charset" content="utf-8"/>
        <title>body充当绝对定位元素实现垂直水平居中的示例</title>
        <style type="text/css">
            body {
                border: 1px solid black;
                padding: 12px;
            }
            .center {
                position: absolute;
                width: 100px;
                height: 100px;
                background-color: #f00;
                top: 50%;
                left: 50%;
                transform: translate(-50%, -50%);
            }

        </style>
    </head>
    <body>
        <div class="center"></div>
    </body>
</html>

body充当绝对定位元素的定位祖先元素实现垂直水平居中的示例效果图:

红色盒子(绝对定位元素)在其定位祖先元素body中垂直水平居中。

相关推荐
黎金安11 小时前
前端第二次作业
前端·css·css3
阳光开朗大男孩 = ̄ω ̄=12 小时前
CSS——选择器、PxCook软件、盒子模型
前端·javascript·css
小马哥编程14 小时前
【前端基础】CSS基础
前端·css
Justinc.15 小时前
CSS3新增边框属性(五)
前端·css·css3
fruge15 小时前
纯css制作声波扩散动画、js+css3波纹催眠动画特效、【css3动画】圆波扩散效果、雷达光波效果完整代码
javascript·css·css3
As977_15 小时前
前端学习Day12 CSS盒子的定位(相对定位篇“附练习”)
前端·css·学习
susu108301891115 小时前
vue3 css的样式如果background没有,如何覆盖有background的样式
前端·css
我要洋人死18 小时前
导航栏及下拉菜单的实现
前端·css·css3
小白白一枚1111 天前
css实现div被图片撑开
前端·css
@蒙面大虾1 天前
CSS综合练习——懒羊羊网页设计
前端·css