前言


三列布局相信大家都见过,像上面淘宝、豆瓣等很多平台界面都有使用。他们用到的是圣杯布局双飞翼布局圣杯布局和双飞翼布局是一些大厂可能问的问题,圣杯布局与双飞翼布局针对的都是三列左右栏固定中间栏边框自适应的网页布局(想象一下圣杯是主体是加上两个耳朵;鸟儿是身体加上一对翅膀),圣杯布局是Kevin Cornell在2006年提出的一个布局模型概念,在国内最早是由淘宝UED的工程师(传说是玉伯)改进并传播开来,在中国也有叫法是双飞翼布局。在讲这两种布局之前,我们还可以思考一下还有什么方法能做到三列布局吗?

float浮动实现三列布局

首先,我们肯定要要先定义3个div,分别放left、middle、right。

  <div id="left">left</div><div id="right">right</div><div id="middle">middle</div>

然后用float让left、right脱离文档流,并且是一个向左浮动,一个向右浮动,为了方便观察给3个盒子都定义一个背景色,并且给left和right定义高度和宽度。

#left,#right{width: 200px;height: 200px;background: red;
}
#middle{height: 200px;background: green;
}
#left{float: left;
}
#right{float: right;
}

这时你会发现right会掉下来

为什么会这样呢?
因为我们没给middle宽度,默认占据整行宽度,所以上面已经满了,right浮不上去。那我们应该怎么办呢?我们只要简单的变动一下html就能解决了。

<div id="left">left</div><div id="right">right</div><div id="middle">middle</div>


虽然float实现了三列布局但是他有很大的缺点:

  • 我们要知道float的本质是去解决文字环绕图片,所以我们在body里面写一些文字,会将未浮动的middle挤下去。问题就很明显了。
  • 所以不建议用这种方法

position定位实现三列布局

跟float布局差不多,只不过用定位实现

  • 左右两列绝对定位并且固定宽度;
  • 中间元素自适应,且左右margin设置为左右元素的宽度;
*{margin: 0;padding: 0;
}
body{width: 100%;height: 500px;
}#left,#right{width: 200px;height: 100%;background: pink;
}
#left{position: absolute;left: 0;top: 0;
}
#right{position: absolute;right: 0;top: 0;
}
#middle{margin: 0 200px;
}

  • 定位的缺点:当出现滚动条时,内容区在滚动条后边显示,而且内容区仍旧被压缩(不推荐使用)

圣杯布局

圣杯布局:随着页面宽度的变化,三栏布局中的中间盒子自动适应,两边盒子宽度固定不变。

 <div class="wrap"><div id="header">header</div><div id="content"><div id="middle"><p>middle</p><p>middle</p><p>middle</p></div><div id="left">left</div><div id="right">right</div></div><div id="footer">footer</div></div>

先定义好header和footer的样式,使之横向撑满。

.wrap{min-width: 600px;
}
#header,#footer{height: 50px;width: 100%;background: grey;
}

给中间三栏都定义float,浮动让三者在一行,出现高度塌陷,content清浮动;
content清浮动用 overflow: hidden;它会变成一个BFC(Block Format Context)区域使之达到效果(想要了解的小伙伴可以自行去了解哦,当然你不这样做那可以设置content的高度就行了)给三栏设置一些样式以便我们观察。

#content{overflow: hidden;
}
#left,#right{width: 200px;height: 200px;background: plum;
}
#middle{background: greenyellow;/* width: 100%; */height: 200px;}


因为我们中间的middle要自己适应,所以给middle宽度设为100%占满;,并且给content设置一个padding: 0 200px;这时我们会发现left和right掉下来了

其实left和right是紧贴着middle的,left的实际位置是在红色边框这里,由于padding和middle的with:100%占据了整个位置,所以它们就掉下来了。

现在我们就是把left移到middle的左边和right移到middle的右边,那怎么做呢?
我们先来弄left,用margin-left: -100%;它就到了middle的最左边,再用position: relative;相对定位。left: -200px;这样我们就完成了left部分。

其实现在right也是在红色方框位置,我们先用margin-left: -200px;把它移出来,再用相同方法移回去就行啦。看看最终效果

完整的css代码:

*{margin: 0;padding: 0;
}
.wrap{min-width: 600px;
}
#header,#footer{height: 50px;width: 100%;background: grey;
}
#middle,#left,#right{float: left;}
#content{overflow: hidden;padding: 0 200px;
}
#left,#right{width: 200px;height: 200px;background: plum;
}
#left{margin-left: -100%;position: relative;left: -200px;
}
#middle{background: greenyellow;width: 100%;height: 200px;}
#right{margin-left: -200px;position: relative;right: -200px;
}

双飞翼布局

话不多说,先上html

  <div class="wrap"><div id="header">header</div><div id="content"><div id="middle"><div class="middle-inner">middle</div></div><div id="left">left</div><div id="right">right</div></div><div id="footer">footer</div></div>

细心的小伙伴可能发现了不同,middle用了两个盒子,到时候我们自有妙用。

  • 步骤
  • middle部分要放在content的最前部分,然后是left,reight;
  • 浮动让三者在一行,出现高度塌陷,content清浮动;
  • middle宽度设为100%,占满;
  • left上去,拉到最左边:margin-left: -100%; right同理:margin-left:-200px;
    这些步骤跟圣杯布局一样。 要注意哦,移动left和right时,不需要用到定位。

当你做好这些时你会发现middle不见了,这是因为它被left覆盖了

这时我们上面讲的妙用就来了,我们只要给middle-inner设置一个padding: 0 200px;就巧妙解决了
最终效果

完整的css代码

*{margin: 0;padding: 0;
}
.wrap{min-width: 600px;
}
#header,#footer{height: 50px;width: 100%;background: grey;
}#left,#right{width: 200px;height: 200px;background: green;
}#middle{width: 100%;background: blueviolet;height: 200px;float: left;
}
#content{overflow: hidden;
}
#left{float: left;margin-left: -100%;
}
#right{float: left;margin-left: -200px;
}
.middle-inner{padding: 0 200px;
}

总结

  • 圣杯布局(少html 多css)
    先把left、middle、right三元素放进一个大容器中(三元素同级),把这三元素都变为浮动元素,给大容器一个padding来给left、right留位置。只移动left和right元素来达到目的(要用到relative定位)
  • 双飞翼布局(少css 多html)
    先把left、middle、right三元素放进一个大容器中(三元素同级),middle里面在套一个盒子。把left、right边城浮动并移动(不要用到relative定位),给middle元素一个padding来给left、right留位置。
  • 其实双飞翼布局跟圣杯布局相差不大,区别在于双飞翼给中间块套了一个容器,通过设置该容器内部的中间块margin属性从而使中间块两侧的内容不被左右块遮挡。

如有任何错误,烦请指正。欢迎大佬们在评论区留言,互相学习。

你不知道的三列布局之圣杯布局和双飞翼布局(超详细)相关推荐

  1. 三分钟学会用SpringMVC搭建最小系统(超详细)_转载

    前言 做 Java Web 开发的你,一定听说过SpringMVC的大名,作为现在运用最广泛的Java框架,它到目前为止依然保持着强大的活力和广泛的用户群. 本文介绍如何用eclipse一步一步搭建S ...

  2. CSS三栏布局的7种方式代码详解 | 圣杯布局 | 双飞翼布局 | 弹性盒子

    CSS三栏布局代码详解 写在前面:博主最近在转头复习最前面学的CSS,整理一下CSS三栏布局的笔记,正好也捋顺自己的逻辑思路.解析我尽量按照思路详细的写了,代码均可正确运行,留给需要的小伙伴进行参考, ...

  3. [css] 圣杯布局 双飞翼布局

    文章目录 三栏式布局 圣杯布局 方法1:使用float布局框架 , 用margin为负值 , position: relative定位 分析: 代码: 缺点 方法2:calc 方法3: flex布局 ...

  4. 基本布局,圣杯布局,双飞翼布局

    1.圣杯布局 圣杯布局就是两边固定宽度,中间自适应的三栏布局,其中,中间栏放到文档流前面,保证可以优先渲染. 2.双飞翼布局 双飞翼布局和圣杯布局基本是一致的,都是两边固定,中间自适应的三栏布局,主要 ...

  5. 双飞翼HTML圣杯布局,Web前端:CSS中的圣杯布局与双飞翼布局

    层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.CSS不仅可以静态 ...

  6. 双飞翼布局与圣杯布局再理解

    CSS系列之圣杯布局与双飞翼布局 文章目录 CSS系列之圣杯布局与双飞翼布局 前言 一.为什么提出圣杯布局? 二.圣杯布局 1.html代码 2.样式设置 三.双飞翼布局 html代码 css样式 前 ...

  7. CSS中经典的双飞翼布局(

    笔者在一些博客和论坛中经常看到经典的双飞翼布局,淘宝的首页也运用了这种兼容性很好的双飞翼布局 1.何谓双飞翼布局? 简单来说,双飞翼布局是将一个网页分为左列,中列和右列三部分,并且我们要得到的效果是: ...

  8. 对淘宝双飞翼布局的的一点理解

    最近回头又看了一看CSS布局方面的东西,重新温习了一下三栏布局,即两边定宽,中间自适应的网页结构.最著名的三栏布局当然是圣杯布局和基于圣杯布局改进后的淘宝双飞翼布局.几年前第一次看这个布局的时候刚开始 ...

  9. CSS圣杯布局常用吗,CSS 经典三列布局之圣杯布局

    圣杯布局 圣杯布局是典型的 CSS 布局问题,有着众多的解决方案. 圣杯布局是一种非常经典和常用的布局方式,其所指的是三列布局,中间宽度自适应,两边定宽:或者两列布局,主体宽度自适应,左边或右边定宽. ...

最新文章

  1. Spring Boot 最最最常用的注解梳理
  2. android混淆多个a b c,混淆A,B,C网络类
  3. 【Android FFMPEG 开发】Android Studio 中配置 FFMPEG 库注意事项 ( 静态库 链接 libz.so 库 | 导入 FFMPEG 函数库顺序 )
  4. 【工具】git笔记(一)
  5. 爬虫笔记11Scrapyyield具体使用
  6. 数组concat_js 标准二维数组变一维数组的方法
  7. 【Python成长之路】python并发学习:多进程与多线程的用法及场景介绍
  8. python3.5安装步骤-pycharm安装步骤
  9. 下面不是android四大组件之一的是,Android四大组件之一 Service
  10. 弹幕库 Danmuku依赖
  11. Android开源项目分类汇总
  12. js json转excel并下载
  13. 地图分幅组件的实现(七)——非标准制图过程的自动化
  14. [单片机]KeilC51简单流水灯制作与原理
  15. Codeforces Round #393 (Div. 2) B. Frodo and pillows
  16. elementui进度条如何设置_Progress 进度条
  17. Unity接入穿山甲广告SDK教程
  18. 正版Xshell免费使用
  19. 计算机硬件简笔画,电脑的鼠标上色简笔画图片教程步骤
  20. WIN10系统下运行地下管线数据处理系统

热门文章

  1. html js utf8编码转换器,用Javascript实现UTF8编码转换成gb2312编码
  2. 搭建LNMP,步骤最详细,附源码,学不会打我
  3. SuperMap iDesktopX 擦除边界外瓦片
  4. javaweb食物营养查询和分析系统
  5. 二阶随机优化算法小结
  6. 【JavaSE基础】03-常用类API(一)
  7. 【数字电子技术基础】逻辑代数基本运算公式证明
  8. 信息学奥赛一本通 1262:【例9.6】挖地雷
  9. rocketmq 消息出现 NOT_CONSUME_YET
  10. 变速器matlab仿真,基于MATLAB/simulink的无级变速器控制策略的建模与仿真