1

文档流

默认文档流,指的是就是元素排版布局过程中,元素会自动从左往右,从上往下地遵守这种流式排列方式,其中每一个块元素都独占一行,行内元素则在一行之内从左到右排列,直到在当前行遇到了边界后,换到下一行的起点起点继续排列。

脱离文档流,即将元素从普通的布局排版(普通文档流)中脱离出来,其他盒子在定位的时候,会当做没看到它,两者位置重叠都是可以的,但是依然在DOM树中存在。

定位的实现

我们可以通过设置css中position属性的值来设定元素的定位类型。position的值分为以下几种:

  • static          默认(非定位元素)
  • inherit        从父元素继承 position 属性的值
  • relative       相对(定位元素)
  • absolute     绝对(定位元素)
  • fixed           固定(定位元素)
  • sticky          粘滞(定位元素)

定位元素的特点: 可以使用定位规则。通过top、right、bottom、left来设置偏移量。绝对定位和固定定位的块元素和行内元素会自动转化为行内块元素


1.相对布局 position: relative;

  • 不脱离文档流。
  • 相对于它原来的位置移动。

案例:想要达到下图的偏移效果,该如何实现呢?

从代码看出,只要在紫色div的样式属性设置了 position:relative; 之后,就可以使用left和 top设置与原来文档布局位置的偏移量。


实现代码如下:

<!DOCTYPE html>
<html lang="en">
<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>
        .box {
            width: 500px;
            height: 500px;
            border: 2px solid black;
        }
        .box > div {
            width: 200px;
            height: 100px;
        }
        .one {
            background-color: blueviolet;

            position:relative;
            left: 50px;
            top: 50px;
        }
        .two {
            background-color: cyan;
        }
    </style>
</head>
<body>
    <div class="box">
        <div class="one"></div>
        <div class="two"></div>
    </div>
</body>
</html>

2.绝对布局 position: absolute;

  • 脱离文档流。
  • 它以距离它最近的父定位元素为参照,如果它所有的父元素都不是定位元素,则以body为参照。(一般情况下,绝对定位元素都是嵌套在相对定位元素内容来使用)

案例:我们将上述代码中的设置相对定位的代码改成绝对定位看看。

当设置紫色的div为绝对定位之后,发现蓝色的div不见了。
其实,蓝色的div并不是不见了,而是跟紫色的div重叠了。因为当紫色div被设置为绝对定位之后,就会脱离文档流布局,此时它就相当于漂浮了起来,而蓝色div的因为没有了紫色div的挤压,自然就上去与紫色div重叠在一起了。
接下来,让我们为紫色的div设置偏移量。

此时,我们发现紫色的div出现在了父元素外面,页面的左上角。这是因为它的父元素中没有定位元素,所以它的偏移量是相对于body来进行调整的。
接下来,我们将其父元素设置为相对定位,看看会发生什么?

这个时候我们看到紫色的div回到了它父元素中。

3.固定布局 position: fixed;

  • 脱离文档流。
  • 它相对于浏览器窗口进行定位,相当于就是把这个元素钉在了浏览器窗口上了,无论我们怎么操作滚动条都无法改变他的位置。

我们继续使用上面的代码,将紫色div中的绝对布局改成固定布局,并将其父元素的高度变大。

从上述GIF中,我们可以看出无论我们怎么操作滚动条,紫色div都在整个浏览器页面的固定位置。

这种定位方式最适合用于放置广告。

4.粘滞布局 position: sticky;

  • 在没有达到阈值的时候是不脱离文档流(相对),达到阈值脱离文档流(固定),可以通过left、top、right、bottom来设定阈值。

了解了上述几种布局后,我们再来看看什么是粘滞布局。将一个定位元素设置为粘滞布局后,当我们没有到达设定的阈值后,它就像正常的文档流一样,显示在该出现的位置,一旦我们到达它设置的阈值后,他就会一直停留在我们设定好的位置上。效果图如下:

css代码如下:

.two {
        width: 100%;
        height: 100px;
        background-color: lightcoral;
        position: sticky;/* 设置为粘滞定位 */
        top: 0; /* 当该元素到达整个页面距离顶端0px的时候,他会一直停留在此位置 */
    }

定位元素层级 z-index
定位元素是浮动于正常的文档流上面的,我们可以通过z-index属性来设置元素的层级。
在哪些场景里我们会用到z-index这个属性呢?比如说,当我们做一个供用户输入登录信息的弹框时,我们希望当用户点击登录后,弹出的框不会被其他任何元素覆盖时,我们可以通过设置它的z-index属性,将其层级设置为最高即可。

下面这个案例将会帮助我们学习和理解z-index属性。

代码如下:

<!DOCTYPE html>
<html lang="en">
<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>
        .box {
            width: 400px;
            height: 600px;
            margin: 50px auto;
            border: 2px solid black;
            position: relative;
        }
        .box > div {
            width: 100px;
            height: 100px;
            position: absolute;
        }
        .one {
            background-color: red;
            top: 20px;
            left: 20px;
        }
        .two {
            background-color: orange;
            top: 40px;
            left: 40px;
        }
        .three {
            background-color: yellow;
            top: 60px;
            left: 60px;
        }
        .four {
            background-color: green;
            top: 80px;
            left: 80px;
        }
        .five {
            background-color: cyan;
            top: 100px;
            left: 100px;
        }
        .six {
            background-color: blue;
            top: 120px;
            left: 120px;
        }
        .seven {
            background-color: violet;
            top: 140px;
            left: 140px;
        }
    </style>
</head>
<body>
    <div class="box">
        <div class="one"></div>
        <div class="two"></div>
        <div class="three"></div>
        <div class="four"></div>
        <div class="five"></div>
        <div class="six"></div>
        <div class="seven"></div>
    </div>
</body>
</html>

我们可以看到从顶到底依次是:紫、蓝、青、绿、黄、橙、赤。
如果我们想要从顶到底依次是:赤、橙、黄、绿、青、蓝、紫的话,只需要在每个div中设置z-index属性,就可以轻松实现。如下图所示:
图片.png
部分CSS代码如下:

.one {
    background-color: red;
    top: 20px;
    left: 20px;
    z-index: 7;
}
.two {
    background-color: orange;
    top: 40px;
    left: 40px;
    z-index: 6;
}
.three {
    background-color: yellow;
    top: 60px;
    left: 60px;
    z-index: 5;
}
.four {
    background-color: green;
    top: 80px;
    left: 80px;
    z-index: 4;
}
.five {
    background-color: cyan;
    top: 100px;
    left: 100px;
    z-index: 3;
}
.six {
    background-color: blue;
    top: 120px;
    left: 120px;
    z-index: 2;
}
.seven {
    background-color: violet;
    top: 140px;
    left: 140px;
    z-index: 1;
}

课后练习

按照下图所示要求,制作图标。

1.先写两个div。

2.将第一个div设置为相对定位,将第二个div设置为绝对定位。
并且设置偏移量,将第二个div放在第一个div的右上角。

3.通过border-radius属性设置两个div四周的弧度。
将第二个div的弧度设置为其宽度的一半就变成了一个圆。

代码如下:

<!DOCTYPE html>
<html lang="en">
<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>
        .box {
            width: 75px;
            height: 75px;
            background-color: lightgreen;
            margin: 50px auto;
            position: relative;
            border-radius: 5px;
        }
        .box > img {
            height: 50px;
            background-color: white;
        }
        .red-radius {
            width: 25px;
            height: 25px;
            background-color: red;
            line-height: 25px;
            text-align: center;
            position: absolute;
            top: -12.5px;
            right: -12.5px;
            border-radius: 12.5px;
        }
    </style>
</head>
<body>
    <div class="box">
        <img src="../微信.png" alt="">
        <div class="red-radius">
            7
        </div>
    </div>
</body>
</html>

method
4 声望0 粉丝