消除子元素浮动造成父元素高度折叠的影响 & 三列布局的实现原理( 绝对定位实现, 浮动定位实现)--2019年9月4号20:00

2019年09月06日 16:59:09阅读数:335博客 / 缘的博客 / 前端学习记录

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的自动挤压实现。


批改状态:合格

老师批语:浮动, 绝对定位是布局最重要的工作

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • 博主信息
    缘的博客
    博文
    15
    粉丝
    0
    评论
    0
    访问量
    6847
    积分:0
    P豆:34