CSS布局-圣杯布局

圣杯布局

圣杯布局很完美(兼容所有浏览器,包括IE6),但是使用了相对定位,布局有局限性,宽度控制要改的地方也多。

第一种方法公用部分:

.lgyz, .lzrg, .lrzcg, .lcgrz, .lzcrg {margin:10px 0; min-width:400px;text-align: center;color:#ffffff; }
    .left {background-color: #4DBCB0; padding:20px 0;}
    .aside, .center, .right {background-color: #E35881;padding:20px 0; }

第二方法都不考虑兼容IE8及以下。

左侧栏固定宽度,右侧自适应 :

第一种写法:

<div class="lgyz">
        <div class="left">主内容栏自适应宽度</div>
        <div class="aside">侧边栏固定宽度</div>
    </div>
.lgyz{zoom:1;overflow:hidden;padding-left:210px;}
.lgyz .aside{float:left;width:200px;margin-left:-100%;position:relative;left:-210px;_left:0;}
.lgyz .left{float:left;width:100%;}

第二种写法:

<div class="layout">
    <aside class="layout__aside">侧边栏宽度固定</aside>
    <div class="layout__main">主内容栏宽度自适应</div>
</div>
.layout:after {clear: both;content: " "; display: table;}
.layout__aside, .layout__main {float: left;}
.layout {padding-left: 210px;}
.layout__main {width: 100%;}
.layout__aside {width: 200px;margin-left: -210px;}

右侧栏固定宽度,左侧自适应 :

第一种写法:

<div class="lzrg">
  <div class="left">主内容栏自适应宽度</div>
   <div class="aside">侧边栏固定宽度</div>
</div>
.lzrg{zoom:1;overflow:hidden;padding-right:210px;}
.lzrg .aside{float:left;width:200px;margin-left:-200px;position:relative;right:-210px;}
.lzrg .left{float:left;width:100%;}

第二种写法:

<div class="layout">
    <div class="layout__main">主内容栏宽度自适应</div>
    <aside class="layout__aside">侧边栏宽度固定</aside>
</div>
.layout:after{clear:both;content:" ";display:table;}
.layout{padding-right:210px;}
.layout__main{width:100%;float:left;}
.layout__aside{float:right;width:200px;margin-right:-210px;}

 左右固定   中间自适应 

第一种:

<div class="lrzcg">
        <div class="left">主内容栏自适应宽度</div>
        <div class="center">侧边栏1固定宽度</div>
        <div class="right">侧边栏2固定宽度</div>
    </div>
.lrzcg{zoom:1;overflow:hidden;padding-left:210px;padding-right:210px;}
 .lrzcg .left{float:left;width:100%;}
 .lrzcg .center{float:left;width:200px;margin-left:-100%;position:relative;left:-210px;_left:210px;}
 .lrzcg .right{float:left;width:200px;margin-left:-200px;position:relative;right:-210px;}

第二种:

<div class="layout">
    <aside class="layout__aside layout__aside--left">左侧边栏宽度固定</aside>
    <div class="layout__main">主内容栏宽度自适应</div>
    <aside class="layout__aside layout__aside--right">右侧边栏宽度固定</aside>
</div>
.layout:after{clear:both;content:" ";display:table;}
.layout__aside,.layout__main{float:left;}
.layout{padding:0 210px;}
.layout__main{width:100%;}
.layout__aside{width:200px;}
.layout__aside--left{margin-left:-210px;}
.layout__aside--right{margin-right:-210px;float:right;}

第三种:

<div class="layout__main-wrapper">
    <div class="layout__main">主内容栏宽度自适应</div>
</div>
<aside class="layout__aside layout__aside--left">左侧边栏宽度固定</aside>
<aside class="layout__aside layout__aside--right">右侧边栏宽度固定</aside>
<footer class="clear">底部</footer>
.clear{clear:both;}
.layout__main-wrapper,.layout__aside{float:left;}
.layout__main-wrapper{width:100%;}
.layout__main{margin:0 210px;}
.layout__aside{width:200px;}
.layout__aside--left{margin-left:-100%;}
.layout__aside--right{margin-left:-200px;}

 

都在左边,右侧自适应 

第一种:

<div class="lcgrz">
        <div class="left">主内容栏自适应宽度</div>
        <div class="center">侧边栏1固定宽度</div>
        <div class="right">侧边栏2固定宽度</div>
    </div>
.lcgrz{zoom:1;overflow:hidden;padding-left:420px;}
   .lcgrz .left{float:left;width:100%;}
   .lcgrz .center{float:left;width:200px;margin-left:-100%;position:relative;left:-420px;_left:0px;}
   .lcgrz .right{float:left;width:200px;margin-left:-100%;position:relative;left:-210px;_left:210px;}

第二种:

<div class="layout">
    <aside class="layout__aside layout__aside--first">第1个侧边栏宽度固定</aside>
    <aside class="layout__aside layout__aside--second">第2个侧边栏宽度固定</aside>
    <div class="layout__main">主内容栏宽度自适应</div>
</div>
.layout:after{clear:both;content:" ";display:table;}
.layout__aside,.layout__main{float:left;}
.layout{padding-left:420px;}
.layout__main{width:100%;}
.layout__aside{width:200px;}
.layout__aside--first{margin-left:-420px;}
.layout__aside--second{margin-left:-210px;}

 都在右边,左侧自适应

 

第一种:

<div class="lzcrg">
        <div class="left">主内容栏自适应宽度</div>
        <div class="center">侧边栏1固定宽度</div>
        <div class="right">侧边栏2固定宽度</div>
    </div>
.lzcrg{zoom:1;overflow:hidden;padding-right:420px;}
   .lzcrg .left{float:left;width:100%;}
   .lzcrg .center{float:left;width:200px;margin-left:-200px;position:relative;right:-210px;}
   .lzcrg .right{float:left;width:200px;margin-left:-200px;position:relative;right:-420px;}

第二种:

<div class="layout">
    <div class="layout__main">主内容栏宽度自适应</div>
    <aside class="layout__aside layout__aside--first">第1个侧边栏宽度固定</aside>
    <aside class="layout__aside layout__aside--second">第2个侧边栏宽度固定</aside>
</div>
.layout:after{clear:both;content:" ";display:table;}
.layout{padding-right:420px;}
.layout__main{width:100%;float:left;}
.layout__aside{width:200px;float:right;}
.layout__aside--first{margin-right:-210px;}
.layout__aside--second{margin-right:-420px;}

 

使用flex方法圣杯布局,每种布局做法的结果同上面一模一样,但是代码减少了很多,而且适用的场景更多

<div class="layout">
    <aside class="layout__aside">侧边栏宽度固定</aside>
    <div class="layout__main">主内容栏宽度自适应</div>
</div>
<div class="layout">
    <div class="layout__main">主内容栏宽度自适应</div>
    <aside class="layout__aside">侧边栏宽度固定</aside>
</div>
<div class="layout">
    <aside class="layout__aside">左侧边栏宽度固定</aside>
    <div class="layout__main">主内容栏宽度自适应</div>
    <aside class="layout__aside">右侧边栏宽度固定</aside>
</div>
<div class="layout">
    <aside class="layout__aside">第1个侧边栏宽度固定</aside>
    <aside class="layout__aside">第2个侧边栏宽度固定</aside>
    <div class="layout__main">主内容栏宽度自适应</div>
</div>
<div class="layout">
    <div class="layout__main">主内容栏宽度自适应</div>
    <aside class="layout__aside">第1个侧边栏宽度固定</aside>
    <aside class="layout__aside">第2个侧边栏宽度固定</aside>
</div>
.layout {margin:10px 0; min-width:400px;text-align: center;color:#ffffff; }
 .layout__main {background-color: #4DBCB0; padding:20px 0;}
    .layout__aside {background-color: #E35881;padding:20px 0; }

    .layout { display: flex;}
    .layout__main { flex: 1;}
    .layout__aside {width: 200px; }
    .layout > .layout__aside:not(:first-child),
    .layout > .layout__main:not(:first-child){ margin-left: 10px;}

 

posted @ 2016-12-23 20:16  Koidt  阅读(393)  评论(0编辑  收藏  举报