Blogger Information
Blog 15
fans 0
comment 0
visits 12008
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
消除子元素浮动造成父元素高度折叠的影响 & 三列布局的实现原理( 绝对定位实现, 浮动定位实现)--2019年9月4号20:00
缘的博客
Original
784 people have browsed it

0x01    浮动

    首先,了解一下两种布局:   

  1. 流动布局(文档流):元素排列顺序与元素在html文档中的编写顺序是一致的(从左往右,从上到下)。

  2. 浮动布局:在垂直方向上仍然在文档流中,但在水平方向上可以向左右两边自由浮动。注意:浮动只能在水平上,只能向左或向右,没有居中。

    

    然后我们了解一下浮动元素的特性:

    1. 浮动元素脱离文档流(浏览器将布局的权限交给用户)指的是水平方向上不再受标准流的影响。而在水平方向上,浮动元素对它前面的元素没有影响,只会影响浮动元素后面的元素。

    2. 对于浮动元素后面的元素:块元素或内联元素的表现形式是不同的,排列方式也是不同的;但是,当一个元素(不论是内联元素还是本来就是块元素)浮动起来之后,它就变成了一个块元素。因为浮动后,该元素就不再受到文档的控制了,要想让其可见,必须设置宽和高。


    最后了解脱离文档流的手段:

    1. 浮动(严格意义上并不是完全脱离文档流,只是在水平方向上脱离文档流,可以自由移动,在垂直方向上仍在文档流中)

    2. 绝对定位


    以下是相关示例:

        1.    同级元素浮动及清除影响:

            html文档:

实例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="static/css/demo1.css">
    <title>浮动</title>
</head>

<body>
    <h1>新的一天</h1>
    <div class="box1">box1</div>
    <div class="box2">box2</div>
    <div class="box3">box3</div>
    <div class="box4">box4</div>
</body>

</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

    对应的css样式表(demo1.css):

实例

.box1 {
    width: 100px;
    height: 100px;
    background-color: lightblue;
}

.box2 {
    width: 200px;
    height: 200px;
    background: lightgreen;
}


/* 当元素浮动之后相当于创建了一个新的区域存在
所有浮动的元素会在沿着元素的上边沿排队
由于它们脱离的文档流,它们后面的元素就会往上跑,占据浮动元素原来的位置 */

.box1 {
    float: left;
}

.box2 {
    float: right;
}

.box3 {
    width: 250px;
    height: 250px;
    border: 2px solid red;
}

.box3 {
    float: right;
}

.box4 {
    width: 100%;
    height: 60px;
    ;
    background-color: #888;
}


/* 同级元素清除浮动的影响 */

.box4 {
    /* clear: left;
    clear: right; */
    clear: both;
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

0.PNG


    2.    嵌套元素浮动及清除影响:

        html文档:

实例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="static/css/demo2.css">
    <title>嵌套元素浮动相关</title>
</head>

<body>
    <div class="box1">
        <div class="box2">
            子元素
        </div>
        <!-- <div class="clear"></div> -->
    </div>
</body>

</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

        对应的css样式表(demo2.css):

实例

.box1 {
    width: 200px;
    /* height: 100px; */
    border: 2px dashed red;
}

.box2 {
    /* 让子元素继承父元素的宽度,自适应变化 */
    width: inherit;
    height: 300px;
    background-color: lightblue;
}


/* 当子元素浮动后,(如果父元素本身没有设置高度,在实际情况中,父元素常常不设置高度,靠子元素的内容撑起)
父元素会失去高度,发生塌陷。
这是因为子元素浮动后,在水平方向上脱离了文档流,导致父元素无法包裹造成的。  */

.box2 {
    float: left;
}


/* 解决方法:
    1.  给父元素设置与子元素一样的高度。但通常不会使用这种方法,因为无法自适应高度。 */


/* .box1 {
    height: 300px;
} */


/* 2.  父元素与子元素一起浮动。这种方案一般是不用的,因为假如父元素还有父元素,那父元素的父元素也要浮动,那最终会到达body */


/* .box1 {
    float: left;
} */


/* 3.  添加一个与子元素同级的元素块,专门用于清除浮动;这个方案没有兼容性问题,但会增加一个冗余的元素块,代码可读性变差 */


/* .clear {
    clear: both;
} */


/* 4.  给父元素添加一个overflow(溢出隐藏),将其样式设置为hidden,专门清除浮动;这是最常用的方法 */

.box1 {
    overflow: hidden;
}

运行实例 »

点击 "运行实例" 按钮查看在线实例


1.PNG


0x02    定位

    定位:将元素在页面重新排列。有四种方式:

    1.    静态定位:这是默认的定位方式,也就是我们常说的文档流/流动布局。它的值为:static。

    2.    相对定位:元素仍在文档流中,只是相对于它原来的位置发生偏移。它的值为:relative。

    3.    绝对定位:元素脱离的文档流,相对于离它最近的且具有定位属性的父元素进行定位。如果它所有的父元素都没有定位属性,那它就相对于body进行定位,这种情况就是固定定位。它的值为:absolute。

    4.    固定定位:始终相对于浏览器窗口进行定位。根据浏览器的区别分为body/html,不过没有太大的区别。它的值为:fixed。

    

    以下是相对定位和绝对定位的示例:

        html文档:

实例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="static/css/demo3.css">
    <title>相对定位 & 绝对定位</title>
</head>

<body>
    <!-- 相对定位 -->
    <div class="box1"></div>
    <div class="box2"></div>

    <!-- 绝对定位 -->
    <div class="box4"></div>
    <div class="box3"></div>
</body>

</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

    对应的css样式表(demo3.css):

实例

* {
    margin: 0;
    padding: 0;
}

.box1 {
    width: 100px;
    height: 100px;
    background-color: black;
    position: relative;
    left: 50px;
    top: 50px;
}

.box2 {
    width: 100px;
    height: 100px;
    background-color: red;
}

.box3 {
    width: 100px;
    height: 100px;
    background-color: coral;
    position: absolute;
    left: 100px;
    top: 100px;
}

.box4 {
    width: 100px;
    height: 100px;
    background-color: green;
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

2.PNG

    由上图可以看出:

    1.    黑色盒子和红色盒子是演示相对定位的:我给黑色盒子设置了相对定位,使其往右往下移动了50px,但红色盒子并没有往上走占据黑色盒子原来的位置,这说明了设置相对定位后,该元素并没有脱离文档流。

    2.    珊瑚色盒子和绿色盒子是演示绝对定位的:我给珊瑚色设置了绝对定位,由于它没有父元素有定位属性,所以它是相对于浏览器窗口进行定位的。我让它往右往下移动了100px,然后它遮盖了黑色盒子的部分,且绿色盒子占据了它原来的位子,说明它脱离了文档流。


    定位小案例之十字架:

        html文档:

实例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="static/css/demo4.css">
    <title>Document</title>
</head>

<body>
    <div class="parent">
        <div class="box1">1</div>
        <div class="box2">2</div>
        <div class="box3">3</div>
        <div class="box4">4</div>
        <div class="box5">5</div>
    </div>
</body>

</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

        对应的css样式表(demo4.css):

实例

.box1 {
    width: 150px;
    height: 150px;
    background-color: lightblue;
}

.box2 {
    width: 150px;
    height: 150px;
    background-color: lightgreen;
}

.box3 {
    width: 150px;
    height: 150px;
    background-color: lightgray;
}

.box4 {
    width: 150px;
    height: 150px;
    background-color: lightcoral;
}

.box5 {
    width: 150px;
    height: 150px;
    background-color: lightseagreen;
}


/* 相对定位 */


/* .box1 {
    position: relative;
    left: 150px;
}

.box3 {
    position: relative;
    left: 150px;
    bottom: 150px;
}

.box4 {
    position: relative;
    left: 300px;
    bottom: 300px;
}

.box5 {
    position: relative;
    left: 150px;
    bottom: 300px;
} */


/* 绝对定位 */


/* 在使用绝对定位时,父元素一般设置为相对定位 */

.parent {
    position: relative;
    border: 1px dashed red;
    width: 450px;
    height: 450px;
}

.box1 {
    position: absolute;
    left: 150px;
}

.box2 {
    position: absolute;
    top: 150px;
}

.box3 {
    position: absolute;
    left: 150px;
    top: 150px;
}

.box4 {
    position: absolute;
    left: 300px;
    top: 150px;
}

.box5 {
    position: absolute;
    left: 150px;
    top: 300px;
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

3.PNG


0x03    三列布局的实现

    以下是三列布局的相互示例:

        html文档:

实例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="static/css/demo7.css">
    <title>三列布局</title>
</head>

<body>
    <div class="container">
        <div class="header">头部</div>

        <div class="main">
            <div class="left">左侧</div>
            <div class="content">内容区</div>
            <div class="right">右侧</div>
        </div>

        <div class="footer">底部</div>
    </div>
</body>

</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

        对应的css样式表(demo7.css):

实例

.container {
    width: 1000px;
    margin: 0 auto;
}

.header,
.footer {
    height: 60px;
    background-color: #888;
}

.main {
    /* min-height: 600px; */
    /* 高度靠内容撑开 */
    background-color: lightblue;
    margin: 5px auto;
}

.left {
    width: 200px;
    min-height: 600px;
    background-color: lightgreen;
}

.content {
    /* 宽度靠margin的自动挤压实现 */
    min-height: 600px;
    background-color: lightseagreen
}

.right {
    width: 200px;
    min-height: 600px;
    background-color: lightcoral;
}


/* 绝对定位实现 */


/* .main {
    position: relative;
}

.left {
    position: absolute;
    left: 0;
    top: 0;
}

.right {
    position: absolute;
    right: 0;
    top: 0;
}

.content {
    margin-left: 200px;
    margin-right: 200px;
    margin: 0 200px;
}  */


/* 浮动实现 */

.left {
    float: left;
}

.right {
    float: right;
}

.content {
    float: left;
    /* 注意:浮动时要记得给元素添加宽度,否则会出错 */
    width: 600px;
}

.main {
    overflow: hidden;
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

4.PNG


0x04    总结

     1.    子元素浮动造成父元素高度折叠的原因是:当子元素浮动后,(如果父元素本身没有设置高度,在实际情况中,父元素常常不设置高度,靠子元素的内容撑起)父元素会失去高度,发生塌陷。这是因为子元素浮动后,在水平方向上脱离了文档流,导致父元素无法包裹造成的。为了消除其产生的影响,有四种方法:

        (1)给父元素设置与子元素一样的高度。但通常不会使用这种方法,因为无法自适应高度。

        (2)父元素与子元素一起浮动。这种方案一般是不用的,因为假如父元素还有父元素,那父元素的父元素也要浮动,那最终会到达body。

        (3)添加一个与子元素同级的元素块,专门用于清除浮动;这个方案没有兼容性问题,但会增加一个冗余的元素块,代码可读性变差。

        (4)给父元素添加一个overflow(溢出隐藏),将其样式设置为hidden,专门清除浮动;这是最常用的方法。

    2.    对于三列布局,通常有两种实现方式:绝对定位和浮动。有几个值得注意的地方:

        (1)对于主体部分,不需要设置高和宽。它的宽由body宽度决定,100%自适应。它的高由内容撑开。

        (2)对于主体内容块,只需要提供一个最小高度即可。这是为了防止内容区的内容不够撑起内容区高度导致内容区塌陷。

        (3)使用浮动实现时,要记得给主体内容区元素添加宽度,否则会出错。使用定位实现时,主体内容区的宽度靠margin的自动挤压实现。


Correction status:qualified

Teacher's comments:浮动, 绝对定位是布局最重要的工作
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments