Blogger Information
Blog 6
fans 0
comment 0
visits 4652
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
常用布局技巧分析——2019年5月29日22:00
刘春山的博客
Original
614 people have browsed it

1、清除浮动

目标:当有嵌套关系的元素时, 父元素的高度应该由子元素撑开;元素浮动后, 脱离了文档流,如果有父级区块,则父元素无法再包裹住。

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>清除浮动</title>
    <style>
        .box1{
            width: 300px;
            border: 5px dashed red;
        }
        .box2{
            width: inherit;
            height: 300px;
            background-color: lightblue;
        }
        /*浮动后脱离文档流, 父区块无法再包裹住*/
        .box2{
            float: left;
        }

        /***** 解决方案1: 父元素设置与子元一样的高度 *****/
        .box1{
            /*height: 300px;*/
        }
        /*该方案非常Low,如果子元素高度变化,则必须同步修改父元素高度*/

        /***** 解决方案2: 父元素跟着子元素一起浮动 *****/
        .box1{
            /*float: left;*/
        }
        /*这个方案也是有问题的, 如果box1还有父元素, 那么也要添加float,一级一级往上走*/

        /***** 解决方案3: 添加一个块元素,专用来清浮动 *****/
        .clear{
            /*clear:both;*/
        }
        /*这个方案简单粗暴,但会多增加一个dom元素, 在服务器端渲染页面时, 会遇到些麻烦*/

        /***** 解决方案4: 父元素添加一个伪元素,专用来清浮动 *****/

        /*受前一方案提醒,既然不想添加一个多余的真实元素, 那就添加一个伪元素*/
        .box1::after{
            /*content:"";*/
            /*display: table;*/
            /*clear:both;*/
        }

        /***** 解决方案5: 父元素添加overflower,专用来清浮动 *****/
        .box1{
            overflow: hidden;
        }
        /*显然第五种方案最简单,  工作中首选第五种*/
        /*第五种方案: 涉及BFC块知识(块级格式化上下文), 已超出教学范围, 大家感兴趣,可查阅相关资料*/

    </style>
</head>
<body>
<!--为什么要清浮动?-->
<!--当有嵌套关系的元素时, 父元素的高度应该由子元素撑开-->
<!--元素浮动后, 脱离了文档流,如果有父级区块,则父元素无法再包裹住-->
<!--<div style="border: 5px solid black">-->
<div class="box1">
    <div class="box2"></div>
    <div class="clear"></div>
    <!--        <p>这是一个测试</p>-->
</div>
<!--</div>-->

</body>
</html>

运行实例 »

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

QQ截图20190508005714.png

2、布局常识

2.1 绝对定位:三列布局

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>绝对定位:三列布局</title>
    <style>
        .container{
            width: 1000px;
            margin: 0 auto;
            background-color: red;
        }
        /*头部与底部共用样式*/
        .header, .footer {
            height: 60px;
            background-color: lightgrey;
        }
        .main{
            /*min-height: 600px;*/
            margin: 5px auto;
            background-color: black;
        }

        /*左侧*/
        .left{
            width: 200px;
            min-height: 600px;
            background-color: lightgreen;
        }
        /*中间*/
        .content{
            min-height: 600px;
            background-color: lightskyblue;
        }
        /*右侧*/
        .right{
            width: 200px;
            min-height: 600px;
            background-color: lightpink;
        }

        /*方案1: 绝对定位*/

        /*定位父级*/
        .main{
            position: relative;
        }
        .left{
            position: absolute;
            left: 0;
            top: 0;
        }
        .right{
            position: absolute;
            top:0;
            right:0;
        }
        /*用外边距margin,挤出中间内容区*/
        .content{
            margin-left: 210px;
            margin-right: 210px;
        }
    </style>
</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>

运行实例 »

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

QQ截图20190508005946.png

2.2 浮动:三列布局

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>浮动:三列布局</title>
    <style>
        .container{
            width: 1000px;
            margin: 0 auto;
            background-color: red;
        }
        /*头部与底部共用样式*/
        .header, .footer {
            height: 60px;
            background-color: lightgrey;
        }
        .main{
            /*min-height: 600px;*/
            margin: 5px auto;
            background-color: black;
        }

        /*左侧*/
        .left{
            width: 200px;
            min-height: 600px;
            background-color: lightgreen;
        }
        /*中间*/
        .content{
            min-height: 600px;
            background-color: lightskyblue;
        }
        /*右侧*/
        .right{
            width: 200px;
            min-height: 600px;
            background-color: lightpink;
        }

        /*方案2: 浮动*/

        .left{
            float: left;
        }
        .right{
            float: right;
        }
        /*用外边距margin,挤出中间内容区*/
        .content{
            float: left;
            width: 580px;
            margin-left: 10px;
        }
        .main{
            overflow: hidden;/*清除浮动*/
        }
    </style>
</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>

运行实例 »

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

3、通用布局之[双飞翼](Flying Swing Layout)

目的是左右两栏固定宽度,中间部分自适应;且中间部分优先渲染

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>通用布局之[双飞翼](Flying Swing Layout)</title>
    <style>
        *{/*清除头部空隙*/
            margin: 0;
            padding: 0;
        }
        /******************* 头部样式开始 ******************/
        .header{
            /*参考色块*/
            background-color: black;
        }
        .header .content{
            width: 1000px;
            height: 60px;
            background-color: black;
            margin: 0 auto;
        }
        .header .content .nav{
            /* 清空导航UL元素的默认样式 */
            margin-top: 0;
            margin-bottom: 0;
            padding-left: 0;

        }
        .header .content .nav .item{
            list-style: none;
        }
        /*头部导航中的链接样式: 重点*/
        .header .content .nav .item a{
            float: left;
            min-width: 80px;
            min-height: 60px;
            line-height: 60px;
            color: white;

            /* 去掉链接标签默认的下划线 */
            text-decoration-line: none;
            padding: 0 15px;
            text-align: center;
        }
        .header .content .nav .item a:hover{
            background-color: red;
            /* 将导航文本设置为系统根字体大小的1.2倍 */
            font-size: 1.2rem;
        }
        /******************* 头部样式结束 ******************/
        /******************* 主体样式开始 ******************/
        /*双飞翼由大名鼎鼎的玉但提出, 淘宝网率先使用*/
        /* 使用双飞翼布局实现主体部分 */

        /***** 第一步: 主体容器设置总宽度,并水平居中 *****/
        .container {
            width: 1000px;
            height: 650px;
            margin: 5px auto;
            background-color: lightgray;
        }


        /***** 第二步: 左,右二侧固定宽度,中间区块自适应 *****/
        .wrap{
            /* 继承父级区块container宽度 width:1000px; */
            width: inherit;
            min-height: 600px;
            background-color: lightcyan;
        }
        .left, .right{
            width: 200px;
            min-height: 600px;
        }
        .left{
            background-color: lightcoral;
        }
        .right{
            background-color: lightseagreen;
        }
        /***** 第三步:将中间,左,右区块全部左浮动 *****/
        /* 因中间区块宽度100%,所以左右会被挤压到下面 */
        .wrap, .left, .right{
            float: left;
        }
        /***** 第四步: 将left和right拉回到他们正确的位置上(重点) *****/
        .left{
            /* -100%等价于-1000px,将左区块拉回到中间的起点处*/
            margin-left: -100%;
        }
        .right{
            /* -200px就正好将右区块上移到中间区块右侧显示 */
            margin-left: -200px;
        }
        /* 现在还有最后一个问题,中间内容区块main没有显示出来 */

        /***** 第五步: 将中间的内容区块 main 显示出来 *****/
        .main{
            padding-left: 200px;
            padding-right: 200px;
        }

        /******************* 主体样式结束 ******************/

        /******************* 底部样式开始 ******************/

        /* 底部与头部的基本样式类似 */
        .footer {
            background-color: lightgray;
        }
        .footer .content{
            width: 1000px;
            height: 60px;
            background-color: #444;
            margin: 0 auto;
        }
        .footer .content p{
            text-align: center;
            line-height: 60px;
        }
        .footer .content a{
            text-decoration-line: none;
            color:lightgrey;
        }
        .footer .content a:hover{
            text-decoration-line: none;
            color:white;
        }
    </style>
</head>
<body>
<!-- 头部 -->
<div class="header">
    <div class="content">
        <ul class="nav">
            <li class="item"><a href="">首页</a></li>
            <li class="item"><a href="">公司新闻</a></li>
            <li class="item"><a href="">公司产品</a></li>
            <li class="item"><a href="">关于我们</a></li>
            <li class="item"><a href="">联系我们</a></li>
        </ul>
    </div>
</div>

<!-- 中间主体用一个区块模拟代替 -->
<div class="container">
    <!-- 思路:必须先创建中间主体区块,确保它优先被渲染出来, 现创建左右二列 -->

    <!-- 创建双飞翼使用的DOM结构 -->
    <div class="wrap">
        <div class="main">主体内容区</div>
    </div>

    <!--    左侧-->
    <div class="left">
        左侧
    </div>
    <!--    右侧-->
    <div class="right">
        右侧
    </div>
</div>

<!-- 底部 -->
<div class="footer">
    <div class="content">
        <p>
            <a href="">© PHP中文网版权所有</a>  | 
            <a href="">0551-66881234</a>  | 
            <a href="">皖ICP2019008811-1</a>
        </p>

    </div>
</div>
</body>
</html>

运行实例 »

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

2019-05-08_010521.png

4、通用布局之[圣杯]
目的是左右两栏固定宽度,中间部分自适应;且中间部分优先渲染

跟双飞翼的区别是 中间部分只用了一个类;

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>通用布局之[圣杯]</title>
    <style>
        *{/*清除头部、尾部空隙*/
            margin: 0;
            padding: 0;
        }
        /******************* 头部样式开始 ******************/
        .header{
            /*参考色块*/
            background-color: black;
        }
        .header .content{
            width: 1000px;
            height: 60px;
            background-color: black;
            margin: 0 auto;
        }
        .header .content .nav{
            /* 清空导航UL元素的默认样式 */
            margin-top: 0;
            margin-bottom: 0;
            padding-left: 0;

        }
        .header .content .nav .item{
            list-style: none;
        }
        /*头部导航中的链接样式: 重点*/
        .header .content .nav .item a{
            float: left;
            min-width: 80px;
            min-height: 60px;
            line-height: 60px;
            color: white;

            /* 去掉链接标签默认的下划线 */
            text-decoration-line: none;
            padding: 0 15px;
            text-align: center;
        }
        .header .content .nav .item a:hover{
            background-color: red;
            /* 将导航文本设置为系统根字体大小的1.2倍 */
            font-size: 1.2rem;
        }
        /******************* 头部样式结束 ******************/
        /******************* 主体样式开始 ******************/
        /* 使用圣杯布局实现主体部分 */

        /***** 第一步: 主体容器设置的宽度与中间区块相同,并水平居中 *****/
        .container {
            /*width: 1000px;*/
            width: 600px;/*此处需要注意*/
            height: 650px;
            margin: 5px auto;
            background-color: lightgray;

            overflow: hidden;/*清除浮动*/
        }


        /***** 第二步: 左,右二侧固定宽度,中间区块继承父级container宽度 *****/
        .main{
            width: inherit;
            min-height: 800px;
            background-color: lightcyan;
        }

        .left, .right{
            width: 200px;
            min-height: 600px;
        }
        .left{
            background-color: lightcoral;
        }
        .right{
            background-color: lightseagreen;
        }
        /***** 第三步:将中间,左,右区块全部左浮动 *****/
        /* 因中间区块宽度100%,所以左右会被挤压到下面 */
        .main, .left, .right{
            float: left;
        }
        /***** 第四步: 将left和right拉回到他们正确的位置上(重点) *****/
        .left{
            /* -100%等价于-1000px,将左区块拉回到中间的起点处*/
            margin-left: -100%;
        }
        .right{
            /* -200px就正好将右区块上移到中间区块右侧显示 */
            margin-left: -200px;
        }
        /* 现在还有最后一个问题,中间内容区块main没有显示出来 */

        /***** 第五步: 将中间的内容区块 main 显示出来 *****/
        .container {
            padding-left: 200px;
            padding-right: 200px;
        }
        .left{
            position: relative;
            left: -200px;
        }
        .right{
            position: relative;
            left: 200px;
        }

        /******************* 主体样式结束 ******************/

        /******************* 底部样式开始 ******************/

        /* 底部与头部的基本样式类似 */
        .footer {
            background-color: lightgray;
        }
        .footer .content{
            width: 1000px;
            height: 60px;
            background-color: #444;
            margin: 0 auto;
        }
        .footer .content p{
            text-align: center;
            line-height: 60px;
        }
        .footer .content a{
            text-decoration-line: none;
            color:lightgrey;
        }
        .footer .content a:hover{
            text-decoration-line: none;
            color:white;
        }
    </style>
</head>
<body>
<!-- 头部 -->
<div class="header">
    <div class="content">
        <ul class="nav">
            <li class="item"><a href="">首页</a></li>
            <li class="item"><a href="">公司新闻</a></li>
            <li class="item"><a href="">公司产品</a></li>
            <li class="item"><a href="">关于我们</a></li>
            <li class="item"><a href="">联系我们</a></li>
        </ul>
    </div>
</div>

<!-- 中间主体用一个区块模拟代替 -->
<div class="container">
    <!-- 思路:必须先创建中间主体区块,确保它优先被渲染出来, 现创建左右二列 -->
    <!-- 与双飞翼相比, DOM结构更简洁, 不需要为main创建父级容器 -->
    <!-- 中间内容main区块中 -->

    <div class="main">主体内容区</div>

    <!--    左侧-->
    <div class="left">
        左侧
    </div>
    <!--    右侧-->
    <div class="right">
        右侧
    </div>
</div>

<!-- 底部 -->
<div class="footer">
    <div class="content">
        <p>
            <a href="">© PHP中文网版权所有</a>  | 
            <a href="">0551-66881234</a>  | 
            <a href="">皖ICP2019008811-1</a>
        </p>

    </div>
</div>
</body>
</html>

运行实例 »

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


Correction status:Uncorrected

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
Author's latest blog post