三栏布局(双飞翼布局和圣杯布局)

原文

  简书原文:https://www.jianshu.com/p/925b9d0ebc33

大纲

  1、三栏布局的引入
  2、基本思路及不同实现方式的区别
  3、布局实例
    3.1、圣杯布局
    3.2、双飞翼布局

1、三栏布局的引入

  关于三栏式布局,常规情况下,可以使用float实现,也可以使用relative来实现。
  但是,如果要求左右两层定宽,中间层的宽度随浏览器窗口宽度变化而变化,这种情况下,就适合使用圣杯和双飞翼布局。通过对圣杯及双飞翼布局学习之后,我认为两种布局的主旨是在html结构中,使中间的主体层位于左右两层的前面。
  圣杯:指的是一种常用的网页布局,他可以由现有的技术(无一没有缺点)来实现。所以找到一种最优的实现方法就好像寻找难以捉摸的圣杯一样。
  双飞翼布局:是一种灵活的布局,始于淘宝UED。如果把三栏布局比作一只大鸟,可以把main看成是鸟的身体,sub和extra则是鸟的翅膀。这个布局的实现思路是,先把最重要的身体部分放好,然后再将翅膀移动到适当的地方。是对圣杯布局的一种改良。
  其实,圣杯布局和双飞翼布局都是很早就出现了,只是国外大学生/淘宝UED将其归纳起来,系统化了。
  任务效果图:

2、基本思路及不同实现方式的区别

  2.1、两种布局的基本构思为:首先让中间层100%宽度占满同一高度的空间,在左右两层被挤出中间层所在区域时, 使用margin-left的负值将左右两个层拉回与中间层同一高度的空间,接下来调整左右两层到指定位置, 最后使用中间层的margin或padding属性使中间层的内容躲出左右两层占住的显示区。

  2.2、两种布局的主要区别在于:圣杯布局采用一个父层包含中间、左右三个子层,设置父层的padding值腾出左右两层的显示区, 并对左右两层使用relative和left、right值调整位置;双飞翼采用中间、左右三层并列,再在中间层里设置一个子层, 设置中间层子层的margin值腾出左右两层的显示区,对左右两层使用margin值即可调整位置;

 3、布局实例

3.1、圣杯布局

<html>
<head>
    <title>圣杯布局</title>
    <meta charset="utf-8">
    <style>
        header{
            width: 100%;
            height: 40px;
            background-color: darkseagreen;
        }
        #container{
            height:200px;
            padding: 0px 120px 0 140px;/*腾出宽度,即让main中的内容不会被左右的部分覆盖*/
            background:green;
        }

        #main{
            height:200px;
            width: 100%;
            position: relative;
            background:orange;
            float:left;
        }
        #left{
            height:200px;
            width: 140px;
            margin-left: -100%;/*将left层拉回main层所在高度区域*/
            left: -140px;/*调整位置*/
            position: relative;
            background:blue;
            float:left;
        }
        #right{
            height:200px;
            width: 120px;
            margin-left: -120px;/*将right层拉回main层所在高度区域*/
            right: -120px;/*调整位置*/
            position: relative;
            background:yellow;
            float:left;
        }
        footer{
            width: 100%; 
            height: 30px;
            background-color: darkslategray;
        }
    </style>
</head>
<body>
<header>header</header>
<div id="container">
    <div id="main">main</div>
    <div id="left">left</div>
    <div id="right">right</div>
</div>
<footer>footer</footer>
</body>
</html>

3.2、双飞翼布局

<html>
<head>
    <title>三栏布局</title>
    <meta charset="utf-8">
    <style>
        header{
            width: 100%;
            height: 40px;
            background-color: darkseagreen;
        }
        #main{
            width: 100%;
            height:200px;
            position: relative;
            float:left;
        }
        #main-inner{
            margin:0 120px 0 140px;/*让main的内容不被左右的内容覆盖*/
            background:red;
            height:100%;
        }
        #left{
            width: 140px;
            height:200px;
            margin-left: -100%;/*将left层拉回main层所在高度区域*/
            background:blue;
            float:left;
        }
        #right{
            width: 120px;
            height:200px;
            margin-left: -120px;/*将right层拉回main层所在高度区域*/
            background:yellow;
            float:left;
        }
        footer{
            width: 100%; 
            height: 30px;
            background-color: darkslategray;
            clear:both;/*避免因前面的元素浮动而上浮*/
        }
    </style>
</head>
<body>
<header>header</header>

<div id="main">
    <div id="main-inner">min-inner</div>
</div>
<div id="left">left</div>
<div id="right">right</div>

<footer>footer</footer>
</body>
</html>

参考网址

 http://ife.baidu.com/note/detail/id/1025

 

posted @ 2018-07-18 23:40  前端路上的小兵  阅读(594)  评论(0编辑  收藏  举报