如下总结一下CSS中常见的布局方式。本人才疏学浅,若有错误,请留言指出。css
如需转载,请注明出处:CSS常见布局方式html
目录:sass
以上5种方式均可以实现两栏或三栏布局ide
若是对BFC(块级格式化上下文)概念不熟悉的朋友,能够先看看这篇文章。BFC深刻理解布局
在对须要自适应的元素BFC化,能够实现两栏或三栏布局flex
两栏布局 <aside class="aside1"></aside> <article class="main"></article> // 左边固定宽度,右边自适应 .aside1 { float: left; margin-right: 10px; width: 100px; height: 100vh; background-color: lightsalmon; } .main { overflow: hidden; height: 100vh; background-color: lightpink; }
若是要让两栏之间有空隙,能够给浮动元素设置margin-right
值,也能够给自适应的主内容设置margin-left
值。但设置margin-left
时,须要考虑到aside的宽度。实现三栏布局也是如此,给浮动元素设置margin
值会方便一些。code
三栏布局 // 这里要注意DOM的书写顺序问题。 <aside class="aside1"></aside> <aside class="aside2"></aside> <article class="main"></article> // 固定宽度 .aside1 { float: left; margin-right: 10px; width: 100px; height: 100vh; background-color: lightsalmon; } // 固定宽度 .aside2 { float: right; margin-left: 10px; width: 100px; height: 100vh; background-color: lightsalmon; } // BFC化自适应宽度 .main { overflow: hidden; height: 100vh; background-color: lightpink; }
使用BFC实现三栏布局时须要注意的是DOM的书写顺序问题。若是将aside2与article交换位置,那么aside2元素会被挤到article元素之下,没法实现三栏自适应布局。缺点:宽度小于aside宽度时,因为宽度不足的缘由,三栏布局时会使元素出现掉下去的现象。htm
在自适应宽度的元素上设置margin值,margin的值大于或等于固定宽度的值便可。实现思路与使用BFC隐藏属性差很少。缺点:宽度小于aside宽度时,因为宽度不足的缘由,三栏布局时会使元素出现掉下去的现象。blog
两栏布局 <aside class="aside1"></aside> <article class="main"></article> .aside1 { float: left; width: 100px; height: 100vh; background-color: lightsalmon; } .main { margin-left: 110px; height: 100vh; background-color: lightpink; } 三栏布局 // 注意,DOM顺序不可改变 <aside class="aside1"></aside> <aside class="aside2"></aside> <article class="main"></article> .aside1 { float: left; width: 100px; height: 100vh; background-color: lightsalmon; } .main { margin-left: 110px; margin-right: 110px; height: 100vh; background-color: lightpink; } .aside2 { float: right; width: 100px; height: 100vh; background-color: lightsalmon; }
// 使用position: absolute时,DOM元素顺序并不重要。给左右两栏定宽,主内容自适应宽度。缺点:侧边栏元素脱离文档流。优势:article元素可先加载。 <article class="main"></article> <aside class="aside1"></aside> <aside class="aside2"></aside> .aside1 { position: absolute; left: 0; top: 0; width: 100px; height: 100vh; background-color: lightsalmon; } .aside2 { position: absolute; right: 0; top: 0; width: 100px; height: 100vh; background-color: lightsalmon; } .main { margin: 0 110px; height: 100vh; background-color: lightpink; }
使用absolute + margin实现两栏布局时,只须要删除对应的栏目便可。教程
圣杯布局,为何叫圣杯布局...其实我以为很奇怪,倒不如叫float + 负margin + relative更贴切一下。实现思路以下
// 与其余布局不一样,此布局须要父元素 <div class="parent"> <article class="main"></article> <aside class="aside1"></aside> <aside class="aside2"></aside> </div> .parent { padding: 0 100px; // 左右边栏的宽度,可适当缩小以增长每栏之间的距离 } .main { float: left; width: 100%; height: 100vh; background-color: lightpink; } .aside1 { float: left; position: relative; left: -100px; margin-left: -100%; width: 100px; height: 100vh; background-color: lightseagreen; } .aside2 { float: left; margin-left: -100px; position: relative; right: -100px; width: 100px; height: 100vh; background-color: lightsalmon; }
固然了,缺点也是有的。就是在宽度小于两栏宽度时,元素会由于宽度不足而掉下去。
双飞翼布局与圣杯布局类似。只不过少了relative与left, right的步骤和共同父元素,主内容元素多了层父元素。实现思路以下:
<div class="main-wrap"> <article class="main"></article> </div> <aside class="aside1"></aside> <aside class="aside2"></aside> // 如下包含部分sass语法 .main { margin: 0 100px; height: 100vh; background-color: lightpink; &-wrap { float: left; width: 100%; } } .aside1 { float: left; width: 100px; margin-left: -100%; height: 100vh; background-color: lightseagreen; } .aside2 { float: left; width: 100px; margin-left: -100px; height: 100vh; background-color: lightsalmon; }
flex布局新出现的概念较多,有兴趣的朋友能够到如下博客看更为详细的教程。使用flex来实现布局,我我的认为是最简单的方式。在移动端上,Android 4.4+以上、IOS 7.0+以上都支持flex布局。而在PC端上,使用flex布局时仍是须要考虑一下的,由于到目前为止,IE11仍然只有部分属性支持。