三栏布局

三栏布局在一些电商等类型的网站中很是常见,左右两边固定宽度的导航,而中间则是随浏览器大小改变宽度的内容区域,常见的如京东的页面,今天就来详细阐述几种三栏布局的方法.

一、

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>三栏布局的实现方案</title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
            div{
                height: 400px;
            }
            .left{
                float: left;
                width: 200px;
                background-color: red;
            }
            .right{
                float: right;
                width: 300px;
                background-color: green;
            }
            .main{
                margin: 0 320px 0 220px;
                background-color: yellow;
            }
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="left"></div>
            <div class="right"></div>
            <div class="main"></div>
        </div>
    </body>
</html>

这种方案,是左右两边浮动,然后给中间内容区域设置margin,不过要注意的是,要先让左右两边浮动,再将中间内容区域放进去。缺点是主要内容无法最先加载,当内容较多时,会影响用户使用。

补充:这种方案,当浏览器宽度小于左右导航宽度之和时,就会发生错乱。

二、

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>三栏布局的实现方案</title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
            div{
                height: 400px;
            }
            .left{
                float: left;
                width: 200px;
                background-color: red;
                margin-right: 20px;
            }
            .right{
                float: right;
                width: 300px;
                margin-left: 20px;
                background-color: green;
            }
            .main{
                background-color: yellow;
                overflow: hidden;
            }
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="left"></div>
            <div class="right"></div>
            <div class="main"></div>
        </div>
    </body>
</html>

这种方案和上面那种方案类似,不过是利用BFC 规则(即BFC 区域,不会与浮动元素重叠),缺点和方案一一样。

补充:当浏览器宽度小于两边导航宽度加上margin值之和时,会发生错乱。

三、

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>三栏布局的实现方案</title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
            div{
                height: 400px;
            }
            .box{
                float: left;
                width: 100%;
            }
            .main{
                margin: 0 320px 0 220px;
                background-color: yellow;
            }
            .main::after{
                display: block;
                content: "";
                font-size: 0;
                height: 0;
                clear: both;
                zoom: 1;
            }
            .left{
                width: 200px;
                background-color: red;
                float: left;
                margin-left: -100%;
            }
            .right{
                width: 300px;
                background-color: green;
                float: right;
                margin-left: -300px;
            }
            
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="box">
                <div class="main"></div>
            </div>
            <div class="left"></div>
            <div class="right"></div>
        </div>
    </body>
</html>

这里利用的是浮动元素margin为负值的应用(这里不做细讲),优点是主题内容先加载,不过html结构稍稍复杂了一点。

四、

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>三栏布局的实现方案</title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
            div{
                height: 400px;
            }
            .wrap{
                margin: 0 320px 0 220px;
            }
            .main{
                float: left;
                width: 100%;
                background-color: yellow;
            }
            .left{
                width: 200px;
                background-color: red;
                float: left;
                margin-left: -100%;
                position: relative;
                left: -220px;
            }
            .right{
                width: 300px;
                background-color: green;
                float: left;
                margin-left: -300px;
                position: relative;
                right: -320px;
            }
            
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="main"></div>
            <div class="left"></div>
            <div class="right"></div>
        </div>
    </body>
</html>

这种方案和方案三类似,也是有限加载内容主体,但是其有一个致命问题,就是当浏览器缩放到一定程度,布局会乱掉。

五、

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>三栏布局的实现方案</title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
            div{
                height: 400px;
            }
            .wrap{
                display: flex;
            }
            .main{
                flex-grow: 1;
                background-color: yellow;
            }
            .left{
                order: -1;
                flex: 0 1 300px;
                margin-right: 20px;
                background-color: red;
            }
            .right{
                flex: 0 1 200px;
                background-color: green;
                margin-left: 20px;
            }
            
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="main"></div>
            <div class="left"></div>
            <div class="right"></div>
        </div>
    </body>
</html>

弹性布局,未来的发展发现,但是其中也有一些问题,不仅仅是兼容性的问题,....

六、

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>三栏布局的实现方案</title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
            div{
                height: 400px;
            }
            .wrap{
                display: table;
                width: 100%;
            }
            .main,.right,.left{
                display: table-cell;
            }
            .left{
                background-color: red;
                width: 200px;
            }
            .main{
                background-color: yellow;
            }
            .right{
                background-color: green;
                width: 300px;
            }
            
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="left"></div>
            <div class="main"></div>
            <div class="right"></div>
        </div>
    </body>
</html>

table布局,缺点是无法设置间距,但可以通过其他结构进行改造,给它们设置内填充来解决间距问题。

七、

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>三栏布局的实现方案</title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
            div{
                height: 400px;
            }
            .wrap{
                position: relative;
            }
            .main{
                background-color: yellow;
                margin: 0 320px 0 220px;
            }
            .left{
                position: absolute;
                left: 0;
                top: 0;
                background-color: red;
                width: 200px;
            }
            .right{
                position: absolute;
                right: 0;
                top: 0;
                background-color: green;
                width: 300px;
            }
            
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="main"></div>
            <div class="left"></div>
            <div class="right"></div>
        </div>
    </body>
</html>

利用定位来布局,简单粗暴,但是很有效果。

以上,就是我所总结的七种方案.......

posted @ 2017-02-05 09:42  上山打松鼠  阅读(258)  评论(0编辑  收藏  举报