本文主要讨论左右边栏固定宽度,中间栏填满其他空间的布局。至于其余类型,基本上也就是半斤和八两。每一种布局都会有个Demo,我的依然认为文章里帖代码并无Demo来的直接。因此正文负责解释,源码参见Demo。其中讨论了这么多种(6种)布局,有如下理由:1是每种布局也都有他的毛病,没有十全十美的,每种布局也都有人在用。2是虽然有相对优秀的方案,可是不优秀的方案也有有用的东西在里边,可能会启发其余的思路补充遗漏的知识点。html
左右两栏采用绝对定位抽离文档流,分别固定于页面的左右两侧,中间栏用左右margin值撑开能够容纳左右边栏的距离。这个很简单很少解释。 Demo:absoluteLayoutide
左栏左浮动,右栏右浮动,中间栏左右margin值等于左右栏宽度。html中,中间栏要放在左右边栏的后边。道理上和绝对定位差很少,就是不占文档流了其余元素就填充上了,只要把两边留出空间不致使重合便可。 Demo:twoSidesFloatLayoutDemo布局
标签顺序为<middle></middle> <left></left> <right></right> middle 宽度 100%,sub 左右 margin 为左右栏留出空间,其中 sub 元素不要浮动,不然会包裹里面的内容而不会撑满空间,其余元素所有左浮动。left 的 margin-left 为-100%,right 的margin-left为sub的负的margin-right 。浮动的特色就是紧跟着前一个元素,放不下了就换行,原本middle元素占满了第一行,sub元素的margin留出的空间并不会给其余的浮动元素,左栏被迫换行,处于第二行最左侧,至关于紧跟着第一行后边,100%的负margin-left会让他从紧跟着第一行变成第一行最左边,这时左栏和sub元素的margin-left留出的空间重合,达到目的,此时右栏在原来左栏的位置,再用相似的处理方式,达到最终效果。其中sub的margin能够换为padding,相同的原理和效果。此处若是不须要撑满空间(有内容撑满sub)能够不要父元素(即middle)。Demo:floatLayoutDemo。说的有点乱其实就是这个样子:flex
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style media="screen"> *{margin: 0;padding: 0;height: 100%;} .l,.r,#main{ text-align: center; float:left; } #main{ width: 100%; } .l{ width: 100px; margin-left: -100%; background-color: #aaaaaa; } .c{ text-align: center; margin-left: 100px; margin-right: 200px; background-color: #555555; } .r{ width: 200px; margin-left: -200px; background-color: #aaaaaa; } </style> </head> <body> <div id="main"> <div class="c"> 我中间 </div> </div> <div class="l"> 我左边 </div> <div class="r"> 我右边 </div> </body> </html>
父元素包含左中右栏:(子元素顺序中,左,右)父元素设置padding为左右栏留出空间,而后中栏宽度100%占据除padding外的空间,左右栏利用margin-left等于自身宽的负值使其与中栏右边界重合,再调节left,左栏left为-100%右栏left为右栏宽度。左中右栏所有为子元素,因此margin-left没法占据padding空间,须要左右边栏相对定位后调解left值达到目标状态。其中注意父元素设置font-size: 0; letter-spacing: -4px; 子元素再重置这两个属性。 Demo:inlineBlockLayoutDemo。说的有点乱,其实就是这个样子:ui
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style media="screen"> *{margin: 0;padding: 0;height: 100%;} .l,.c,.r{ display: inline-block; font-size: 16px; letter-spacing: normal; } .l{ width: 100px; margin-left: -100px; position: relative; left: -100%; } .c{ width:100%; background-color: #555555; } .r{ position: relative; width: 200px; margin-left: -200px; left: 200px; } #box{ text-align:center; padding-left: 100px; padding-right: 200px; background-color: #aaaaaa; font-size: 0; letter-spacing: -4px; } </style> </head> <body> <div id="box"> <div class="c"> 我中间 </div> <div class="l"> 我左边 </div> <div class="r"> 我右边 </div> </div> </body> </html>
父元素设置(一样是父元素包含左中右栏): text-align:center; font-size: 0; letter-spacing: -4px; 左中右栏再重置: font-size: 16px; letter-spacing: normal; 左右栏固定宽度, html中元素顺序为:左,中,右 ,假设左右栏宽度和300px;中间拦: width:calc(100% - 300px); 百分比与固定宽度混合布局使用,支持ie9+,注意+-*/号两边留空格 Demo:useCalcLayoutDemospa
flex布局我认为是最早进而方便的布局,很是灵活不过内容也很多,只惋惜兼容ie10+。不在这多废话,推荐阮一峰老师的教程:flex教程。 父元素display:flex; ,左右两栏设置flex-basis 预置宽度,中间栏flex-grow: 1;自动伸展。完活。 Demo:flexLayoutDemocode