博客列表 >常用布局技巧分析(清除浮动的五种方式和双飞翼布局示例)--2019年4月29日

常用布局技巧分析(清除浮动的五种方式和双飞翼布局示例)--2019年4月29日

ChenPJ的博客
ChenPJ的博客原创
2019年04月30日 14:08:47667浏览

一、网站布局之双飞翼布局练习

双飞翼布局的实现,目的是左右两栏固定宽度,中间部分自适应。这个布局的实现思路是,把三栏布局比作一只大鸟,先把最重要的身体部分放好,然后再将左右翅膀移动到适当的地方。

1.html代码中,将wrap、left、right包含在container中,wrap要放最前边,然后是left、right
2.将wrap、left、right都float:left
3.将wrap继承container的宽度,也就是width:100%
4.因为wrap占满了宽度,所以要把left拉到最左边,使用margin-left:-100%;同理right使用margin-left:-200px
5.wrap被覆盖,内层的main使用padding-left:200px;padding-right:200px。还可以考虑使用margin,margin:0 200px。

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>双飞翼布局</title>
    <style type="text/css">
        .header .content {
            /* 头部内容区居中显示,设置好宽度 */
            width: 1000px;
            height: 60px;
            background-color: black;
            /* 上下外边距为0,左右自动居中 */
            margin: 0 auto;
        }
        /*头部内容区中的导航*/
        .header .content .nav {
            /* 清空UL元素的默认样式 */
            margin-top: 0;
            margin-bottom: 0;
            padding-left: 0;
        }

        /*清除列表项样式*/
        .header .content .nav .item {
            list-style-type: none;
        }

        .header .content .nav .item a {
            /* 将浮动设置到标签<a>上面,否则无法实现导航区的点击与高亮 */
            float: left;
            /* 设置最小宽度与最小高宽,以适应导航文本的变化 */
            min-width: 80px;
            min-height: 60px;
            /* 导航文本垂直居中显示 */
            line-height: 60px;
            color: white;
            /* 设置导航文本的左右内边距 */
            padding: 0 15px;
            /* 去掉下划线 */
            text-decoration-line: none;
            /* 文本居中显示 */
            text-align: center;
        }

        .header .content .nav .item a:hover {
            /* 当鼠标移到导航链接上时改变背景色与文本前景色,实现当前导航高亮功能 */
            background-color: red;
            /* 文本设置为系统根字体大小的1.1倍 */
            font-size: 1.1rem;
        }

       /*主体容器设置总宽度,并水平居中 */
        .container {
            width: 1000px;
            margin: 5px auto;
           /*包住浮动的子元素*/
            overflow: hidden;
        }

        /* 中间区块宽度设置在它的容器wrap中*/
        .wrap {
            /* 继承父级区块container宽度 width:1000px; */
            width: inherit;
           /*没有内容,所以设置一个最小高度*/
            min-height: 800px;
            background-color: cyan;
        }

        /* 左边栏样式 */
        .left {
            width: 200px;
            min-height: 800px;
            background-color: lightcoral;
        }
        /* 右边栏样式 */
        .right {
            width: 200px;
            min-height: 800px;
            background-color: lightseagreen
        }
        .wrap, .left, .right {
            float: left;
        }
        /* 通过设置区块的负外边距的方式,实现向反方向移动区块 */
        .left {
            /* 将左区块拉回到中间的起点处*/
            margin-left: -100%;
        }
        .right {
            /* 将右区块上移到中间区块右侧显示 */
            margin-left: -200px;
        }

        .main {
            /*除padding外,也可使用margin */
            /*padding-left: 200px;*/
            /*padding-right: 200px;*/
            margin:0 200px
        }

        .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: none;
            color: lightgrey;
        }

        /* 鼠标移入时显示下划线并加深字体前景色 */
        .footer .content  a:hover {
            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>
            </ul>
        </div>
    </div>

<!-- 中间主体 -->
    <div class="container">
    <!-- 先创建中间主体区块,确保它优先被渲染出来 -->
    <!-- 中间内容区需要创建一个父级容器进行包裹 -->
    <div class="wrap">
        <!-- 最终要展示的内容写在main区块中 -->
        <div class="main">主体内容区</div>
    </div>

    <!-- 左侧边栏区块 -->
    <div class="left">左侧</div>

    <!-- 右侧边栏区块 -->
    <div class="right">右侧</div>

</div>

<!-- 底部 -->
<div class="footer">
    <div class="content">
        <p>
            <a href="">© AAAAAAAAA</a>
            <a href="">3333-66666666</a>
            <a href="">CN-ICP2019042901-1</a>
        </p>

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

运行实例 »

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

批注 2019-04-30 140355.png


二、清除浮动

为何要清除浮动?
在前端布局的过程中肯定会用到float(浮动)属性。浮动框脱离了文档流,当元素浮动之后,当包含框的高度小于浮动框的时候,此时就会出现“高度塌陷”,即为何我们需要清楚浮动。下面的例子即展示何为塌陷。

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>清除浮动方法</title>
    <style type="text/css">
        .box1{
            width:200px;
            border:5px solid red;
        }
        .box2{
            width:200px;
            height:200px;
            background-color: lawngreen;
            float: right;
        }
    </style>
</head>
<body>
    <div class="box1">
        <div class="box2"></div>
    </div>
</body>
</html>

运行实例 »

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

批注 2019-04-30 115209.png

可以看到外层的边框已经处于塌陷状态


清除浮动的五种方式:

方式一:父元素设置与子元素一样的高度,以此来消除子元素浮动后带来的高度塌陷。一般情况下不使用该方法,当子元素高度变化时,需要手动修改父元素高度。

方式二:父元素跟着子元素一起浮动,该方法同样不建议使用,如果嵌套的父元素过多,需要一个个添加float。

方式三:使用额外标签法,在父级盒子内再放一个标签,在这个标签中使用clear:both,会将这个浮动盒子的父盒子高度重新撑开,来清除浮动对页面的影响.
一般情况下也不建议使用这一种方式来清除浮动。因为这种清除浮动的方式会增加页面的标签,造成结构的混乱.

方法四:在父级使用伪元素来清除浮动。
    .box1:after {
      content:"";//设置内容为空
      height:0;//高度为0
      display:table;//转为块级元素
      clear:both//清除浮动
     }
方式五:给父级元素添加overflow属性来清除浮动。
        .box1 {
      overflow:hidden或者auto
  }

五种方式各有利弊,一、二两种方法最直接,简单、粗暴,但是缺点同样粗暴。第三种方式会增加许多不必要的标签。一般推荐使用方法四、五,方法五最为方便。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议