CSS布局 - 三栏布局
CSS布局技术可谓是前端技术中最基础的技术,就是因为基础,所以我认为要更加熟练,深入的去掌握,去梳理。
一、 传统 ---> 浮动实现的三栏布局
采用浮动实现的三栏布局有以下特点及注意事项:
· 注意DOM结构的排列顺序。
因为左右两侧的DOM都是浮动布局,而中间的DOM则是普通的文档流,所以为了规避浏览器正常的页面渲染,即先解析左侧DOM(浮动),再解析中间的DOM(普通文档流,宽度100%)而导致解析最后的右侧DOM(浮动)时因为宽度的问题,而掉到下一行的情况。
· 因为DOM结构顺序实际内容反而最后渲染出来。
· 左右两栏高度无法做到100%,除非设置body, html高度为100%。
具体代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
* {
margin: 0;
padding: 0;
} html,
body {
width: 100%;
height: 100%;
min-width: 320px;
} .left {
float: left;
width: 150px;
height: 100%;
background: #aaa;
} .right {
float: right;
width: 150px;
height: 100%;
background: #aaa;
} .main {
background: #eee;
} </style>
</head>
<body>
<div class="left">This is Left</div>
<div class="right">This is Right</div>
<div class="main">
This is Main
</div> </body>
</html>
二、传统 ---> 定位实现的三栏布局
通过定位实现的三栏布局,其实现方式与浮动相类似,与浮动相比,它具有以下特点:
· 无需手动更改DOM结构的顺序
· 左右两栏可以实现100%高度,无需手动定高,但只支持IE7+
定位方式也有它的缺点,比如当给中间DOM定义了最小宽度时,左右两栏会盖在中间的DOM上。
具体代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
* {
margin: 0;
padding: 0;
} .left {
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 150px;
background: #eee;
} .right {
position: absolute;
right: 0;
top: 0;
bottom: 0;
width: 150px;
background: #eee;
} .main {
background: #aaa;
padding: 0 150px;
min-width: 300px; } </style>
</head>
<body>
<div class="left">This is Left</div>
<div class="main">
This is Main
</div>
<div class="right">This is Right</div>
</body> </html>
三、 传说 ---> 圣杯布局
圣杯布局【Holy Grail of Layouts】是Kevin Cornell在2006年提出的一种布局模型概念,在国内最早是由淘宝UED的工程师传播开来。
圣杯布局的特点是:
1、三列布局,中间宽度自适应,两边定宽;
2、中间栏要在浏览器中优先展示渲染;
3、允许任意列的高度最高;
4、要求只用一个额外的DIV标签;
5、要求用最简单的CSS、最少的HACK语句;
实现圣杯布局的核心技术就是浮动与定位相结合使用。
从最简单的圣杯布局开始着手:
3.1 两栏-左侧定宽
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<style>
* {
margin: 0px;
padding: 0px;
} .wrap {
padding-left:150px;
overflow: hidden;
} .main {
float: left;
width: 100%;
height: 500px;
background: #eee;
} .left {
float: left;
position: relative;
width: 150px;
height: 500px;
margin-left: -100%;
left: -150px;
_left: 150px;/* 解决IE6下的兼容性问题 */
background: #aaa;
} </style>
</head> <body>
<div class="wrap">
<div class="main"></div>
<div class="left"></div>
</div>
</body> </html>
仔细看代码,我可以得出一个结论,圣杯布局的HTML结构就是一个包裹层(.wrap),然后里面是我们所要放的结构:左侧栏(.left) 和 主栏(.main) 。为了能让主栏优先解析渲染,所以将其HTML结构放在最前面。
在CSS上,结构相关的HTML标记都要进行浮动,使他们进行一行并排开来,但由于主栏的宽度已经是最外包裹层最大的宽度(去除padding),所以左侧栏会掉到第二行,因此需要为其设置:
margin-left:-100%
position:relative;
left:-150px;
通过margin负值浏览器会将侧栏从第二行拉向第一行,而这里的-100%,指的就是侧栏所在父容器的宽度,所以最终侧栏会被拉向父容器第一行的最左侧。接着再进行相对定位(不会脱离文档流),最后通过左侧偏移值(left)将其拉回到浏览器的最左边。
3.2 两栏-右侧定宽
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<style>
* {
margin: 0px;
padding: 0px;
} .wrap {
padding-right: 150px;
overflow: hidden;
} .main {
float: left;
width: 100%;
height: 500px;
background: #eee;
} .right {
float: right;
position: relative;
width: 150px;
height: 500px;
margin-right: -150px;
_left: -150px;/* 解决IE6下的兼容性问题 */
background: #aaa;
} </style>
</head> <body>
<div class="wrap">
<div class="main"></div>
<div class="right"></div>
</div>
</body> </html>
左侧定宽与右侧定宽最大的不同就是右侧栏可以有浮动,然后设置margin-right:-150px便可以实现。
为什么可以这么做呢?其实很简单因为我们的包裹成(.wrap)设置了右间距,而当我们的右侧栏向右偏移了150px时,便已经脱离了.wrap包裹层。相当于脱离了BFC的环境,此时右侧栏由于浮动便会自动上浮。
3.3 圣杯布局 - 侧边栏都在左边
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<style>
* {
margin: 0px;
padding: 0px;
} .wrap {
padding-left: 300px;
overflow: hidden;
} .main {
float: left;
width: 100%;
height: 500px;
background: #eee;
} .left {
float: left;
position: relative;
width: 150px;
height: 500px;
margin-left: -100%;
left: -300px;
_left: 0px; /* 解决IE6下的兼容性问题 */
background: red;
} .right {
float: left;
position: relative;
width: 150px;
height: 500px;
margin-left: -100%;
left: -150px;
_left: 150px;/* 解决IE6下的兼容性问题 */
background: green;
} </style>
</head> <body>
<div class="wrap">
<div class="main"></div>
<div class="left"></div>
<div class="right"></div>
</div>
</body> </html>
3.4 圣杯布局-侧边栏都在右边
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<style>
* {
margin: 0px;
padding: 0px;
} .wrap {
padding-right: 300px;
overflow: hidden;
} .main {
float: left;
width: 100%;
height: 500px;
background: #eee;
} .left {
float: left;
position: relative;
width: 150px;
height: 500px;
margin-left: -150px;
right: -150px;
/* 解决IE6下的兼容性问题 */
background: red;
} .right {
float: left;
position: relative;
width: 150px;
height: 500px;
margin-left: -150px;
right: -300px;
background: green;
} </style>
</head> <body>
<div class="wrap">
<div class="main"></div>
<div class="left"></div>
<div class="right"></div>
</div>
</body> </html>
3.5 圣杯布局-两侧定宽
由以上的基础认识后,我们就可以很容易的写出两栏定宽,共计3栏的“圣杯布局”。
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<style>
* {
padding: 0;
margin: 0
} .wrap {
padding: 0 150px;
overflow: hidden
} .main {
float: left;
width: 100%;
height: 500px;
background: #eee;
} .left {
float: left;
position: relative;
width: 150px;
height: 500px;
background: #aaa;
margin-left: -100%;
left: -150px;
} .right {
float: right;
width: 150px;
height: 500px;
background: #aaa;
margin-right: -150px;
} </style>
</head> <body>
<div class="wrap">
<div class="main"></div>
<div class="left"></div>
<div class="right"></div>
</div>
</body> </html>
四、传说 --> 双飞翼布局
双飞翼布局实际上是对圣杯布局的改进版,相比于圣杯布局,它减少了相对定位,控制偏移值等CSS控制,而相应的双飞翼布局也则增加了html结构。
双飞翼的核心思路就是为主栏增加一个包裹成,然后让这个包裹成与左右两个侧栏同时进行浮动,最后通过设置与圣杯布局相似的负边距值(margin),便可以实现三栏布局,从而实现不需要定位进行辅助。
详细代码:
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<style>
* {
margin: 0px;
padding: 0
} .wrap {
overflow: hidden;
} .box {
float: left;
width: 100%;
background: #eee;
} .main {
height: 500px;
margin: 0 160px;
} .left {
float: left;
height: 500px;
background: #aaa;
width: 160px;
margin-left: -100%
} .right {
float: left;
height: 500px;
width: 160px;
background: #bbb;
margin-left: -160px;
} </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>
五、 新时代 ---> Flex布局
Flex 布局是CSS3推出的一种可塑布局方案,其功能强大且灵活。
flex盒子默认情况下会将其内部的子元素按照HTML结构的顺序并排一行来排列展示。如果所有子元素的宽度之和大于当前的flex盒子的宽度时,flex盒子会自动调整每个子盒子的宽度。
也是利用这个特性,我们可以很方便的实现通过Flex进行的三列布局。
PS:Flex 再PC端上只有IE10+ Chrome21+ Firefox 22+ 才被支持,但是在手机端上目前基本已经可以被全部支持
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<style>
* {
margin: 0px;
padding: 0
} .wrap {
display: flex;
} .main {
width:100%;
height: 400px;
background: #eee;
order:2;
} .left {
width: 150px;
height: 400px;
background: #aaa;
order:1;
} .right {
width: 150px;
height: 400px;
background: #ddd;
order:3;
} </style>
</head> <body>
<div class="wrap">
<div class="main"></div>
<div class="left"></div>
<div class="right"></div>
</div>
</body> </html>
说明:order 是CSS3的一个新属性,其值为整数值,用于设置flex子元素的排列顺序,值越小的子元素越排在前面。
CSS布局 - 三栏布局的更多相关文章
- CSS布局——三栏布局
说到三栏布局,很多都会提到圣杯布局和双飞翼布局这两个经典的三栏布局方式.于是,我在网上搜了一些相关资料,阅读并跟着代码敲了一遍,发现在处理三栏布局上,他们采用的都是两边栏固定,中间栏自适应的策略.在处 ...
- CSS实现三栏布局(5种)
常见的布局方式: float布局.Position定位.table布局.弹性(flex)布局.网格(grid)布局 那么我们就是用以上5种方式完成三栏布局,不过前提是左右宽度(假如左右宽度为300px ...
- 前端经典面试题之CSS实现三栏布局,左右宽度固定,中间宽度自适应
前端常问的面试题,题目:假设高度一定,请写出三栏布局,左右宽度300px,中间自适应. 看到这里我希望你能停下来思考几分钟, 1分钟~2分钟~3分钟~4分钟~5分钟! 好了,那么你想出了几种答案呢? ...
- css 实现三栏布局的四种方式
三栏布局就是左中右,左右两边固定,中间自适应. 1. 绝对定位 <div class="left">左边</div> <div class=" ...
- css篇-页面布局-三栏布局
页面布局 题目:假设高度已知,请写出三栏布局,其中左栏.右栏宽度各为300px,中间自适应. 1)浮动 2)绝对定位 3)Flexbox 4)表格布局 5)网格布局(CSS3的Grid布局) 代码: ...
- 【CSS】三栏布局的经典实现
要求:自适应宽度,左右两栏固定宽度,中间栏优先加载: <!DOCTYPE html> <html> <head> <title>layout</t ...
- css实现三栏布局,两边定宽,中间自适应
1.利用定位实现 css代码如下: .box{overflow: hidden;height: 100px;margin: 10px 0;} .box>div{height: 100%;} #b ...
- 三种方法实现CSS三栏布局
本文由云+社区发表 作者:前端林子 本文会分别介绍三种CSS实现三栏布局的方法,可在浏览器中打开查看效果 1.方法一:自身浮动的方法 实现方法:需要左栏向左浮动,右栏向右浮动,中间设左右margin来 ...
- css三栏布局方案整理
日常开发中,经常会用到css三栏布局,现将工作中常用的css 三栏布局整理如下: 什么是三栏布局: 三栏布局,顾名思义就是两边固定,中间自适应. 一. float布局 <!DOCTYPE htm ...
随机推荐
- pt-pmp
pt-pmp有两方面的作用:一是获取进程的堆栈信息,二是对这些堆栈信息进行汇总. 进程的堆栈信息是利用gdb获取的,所以在获取的过程中,会对mysql服务端的性能有一定的影响. 用官方的话说: Thi ...
- php报错 ----> Call to undefined function imagecreatetruecolor()
刚才在写验证码的时候,发现报错,然后排查分析了一下,原来是所用的php版本(PHP/5.3.13)没有开启此扩展功能. 进入php.ini 找到extension=php_gd2.dll ,将其前面的 ...
- javascript设计模式:策略模式
前言 策略模式有效利用组合.委托.多态等技术和思想,可以有效避免多重条件选择语句. 策略模式对开放-封闭原则提供了很好的支持,将算法封装在strategy中,使得他们易于切换.理解.扩展. 策略模式中 ...
- Nested Loops join时显示no join predicate原因分析以及解决办法
本文出处:http://www.cnblogs.com/wy123/p/6238844.html 最近遇到一个存储过程在某些特殊的情况下,效率极其低效, 至于底下到什么程度我现在都没有一个确切的数据, ...
- JDBC简介
jdbc连接数据库的四个对象 DriverManager 驱动类 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 ...
- iOS之判断手机号码、邮箱格式是否正确
//判断手机号码格式是否正确 + (BOOL)valiMobile:(NSString *)mobile{ mobile = [mobile stringByReplacingOccurren ...
- 敏捷转型历程 - Sprint3 回顾会
我: Tech Leader 团队:团队成员分布在两个城市,我所在的城市包括我有4个成员,另外一个城市包括SM有7个成员.另外由于我们的BA离职了,我暂代IT 的PO 职位.PM和我在一个城市,但他不 ...
- Linux基础介绍【第一篇】
Linux简介 什么是操作系统? 操作系统,英文名称Operating System,简称OS,是计算机系统中必不可少的基础系统软件,它是应用程序运行以及用户操作必备的基础环境支撑,是计算机系统的核心 ...
- 【腾讯Bugly经验分享】程序员的成长离不开哪些软技能?
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ce8068d4d44a246f72baf2 Dev Club 是一个交流移动 ...
- AngularJs2与AMD加载器(dojo requirejs)集成
现在是西太平洋时间凌晨,这个问题我鼓捣了一天,都没时间学英语了,英语太差,相信第二天我也看不懂了,直接看结果就行. 核心原理就是require在AngularJs2编译过程中是关键字,而在浏览器里面运 ...