圣杯布局的三种实现

圣杯布局是一种很常见的css布局。他要求:

  • 上部和下部各自占领屏幕所有宽度。
  • 上下部之间的部分是一个三栏布局。
  • 三栏布局两侧宽度不变,中间部分自动填充整个区域。
  • 中间部分的高度是三栏中最高的区域的高度。

本文会用三种方法来实现圣杯布局,分别是浮动,flexbox以及css grid。

浮动实现

实现原理

  • 外层框架
<div class="header">这里是头部</div>
<div class="container"></div>
<div class="footer">这里是底部</div>.header,.footer{height:200px;width:100%;background:red;
}
.container{padding-left:200px;padding-right:300px;
}
  • 填充三栏

这一步骤,首先给底部区域清除浮动,防止跟随上边的区域一起浮动。
另外:把中,左,右三个区域设置成度浮动。给左右两块区域固定的宽度,中间部分的宽度设置成100%。

这样实现下来,因为浮动的关系,[middle]会占据[container]的所有部分,而左右两块区域都会被挤到下面,但是,由于第一步设置了内边距的关系,[container]的左右各剩余了一块区域,且宽度与左右区域相同。

<div class="header">这里是头部</div>
<div class="container"><div class="middle">中间部分</div><div class="left">左边</div><div class="right">右边</div>
</div>
<div class="footer">这里是底部</div>.header,.footer{height:40px;width:100%;background:red;
}
.footer{clear:both;
}
.container{padding-left:200px;padding-right:300px;
}
.container div{float:left;
}
.middle{width:100%;background:yellow;
}
.left{width:200px;background:pink;
}
.right{width:300px;background:aqua;
}
  • 移动左侧区域

接下来要做的就是把左右两块区域挪到空出来的内边距空间里去。

先移动左边,新加一个样式 margin-left:-100%。这样一来,因为浮动关系,就把左边块上移到了[middle]左侧,与其交织在一起,而右侧栏就自动往左移动。然后再给左侧栏一个偏移量,偏移量恰好是其宽度,这一步要给[container]的position设成relative

<div class="header">这里是头部</div>
<div class="container"><div class="middle">中间部分</div><div class="left">左边</div><div class="right">右边</div>
</div>
<div class="footer">这里是底部</div>.header,.footer{height:40px;width:100%;background:red;
}
.footer{clear:both;
}
.container{padding-left:200px;padding-right:300px;
}
.container div{postion:relative;float:left;
}
.middle{width:100%;background:yellow;
}
.left{width:200px;background:pink;margin-left:-100%;right:200px;
}
.right{width:300px;background:aqua;
}
  • 移动右边

同上一步的原理一样,把右侧区域也给弄上去,设置负外边距和本身宽度相同就行了。

<div class="header">这里是头部</div>
<div class="container"><div class="middle">中间部分</div><div class="left">左边</div><div class="right">右边</div>
</div>
<div class="footer">这里是底部</div>.header,.footer{height:40px;width:100%;background:red;
}
.footer{clear:both;
}
.container{padding-left:200px;padding-right:300px;
}
.container div{postion:relative;float:left;
}
.middle{width:100%;background:yellow;
}
.left{width:200px;background:pink;margin-left:-100%;right:200px;
}
.right{width:300px;background:aqua;margin-right:-300px;
}

特别完美~

flexbox弹性盒子实现

弹性盒子用来实现圣杯布局特别简单。只需要把中间的部分用flex布局即可。

<div class="header">这里是头部</div>
<div class="container"><div class="left">左边</div><div class="middle">中间部分</div><div class="right">右边</div>
</div>
<div class="footer">这里是底部</div>.header,.footer{height:40px;width:100%;background:red;
}
.container{display: flex;
}
.middle{flex: 1;background:yellow;
}
.left{width:200px;background:pink;
}
.right{background: aqua;width:300px;
}

很简单,在写html的时候,因为不再涉及到浮动,只需要按照左中右的顺序来写就可以了。左右两块区域的宽度写死,把中间的区域的flex属性设置成1就可以了。

css grid网格

grid是一种新的布局方式,截止2018年初,绝大多数浏览器都已经支持css grid。
其原理就是把页面的区域划分成一个一个的网格,就和围棋的棋盘一样。

用网格来解决圣杯问题,可以摆脱弹性盒子时需要格外加一个[container]的问题,也就是左中右三款区域不需要在他们外边包装一个额外的div。

先看一下代码:

<div id="header">header</div>
<div id="left">left</div>
<div id="middle">middle</div>
<div id="right">right</div>
<div id="footer">footer</footer></div>body{display: grid;
}
#header{background: red;grid-row:1;grid-column:1/5;
}#left{grid-row:2;grid-column:1/2;background: orange;
}
#right{grid-row:2;grid-column:4/5;background: cadetblue;
}
#middle{grid-row:2;grid-column:2/4;background: rebeccapurple
}
#footer{background: gold;grid-row:3;grid-column:1/5;
}

简单说一下代码的实现。回头会专门看一下css grid的细节。

首先给最外层的body设成display:grid。当然,是外层父级元素即可,不一定是body。

grid-row就是说由上到下,#header占据第1格,#left,#middle,#right占据第2格,#footer占据第3格。

而grid-column表示,在横向从左向右,分成了五格。其中#header和#footer占据全部。#left占据第1格,#middle占据第2到第4格,#right占据第5格。

不管是实现起来还是理解起来都很方便。
关于css grid,下次继续总结。

小结

总的来说,我认为使用弹性盒子布局实现圣杯模式是最方便最快速且不用担心移动端的适配问题。而css grid网格,并不是所有浏览器都支持,所以,暂时不太建议大规模使用。至于,第一种方法,面试的时候准备准备还是很有好处的。

三种方式实现圣杯布局相关推荐

  1. 两种方式实现圣杯布局

    圣杯布局又被称为双飞布局,比较简单,今天我给大家分享一下,如何用两种方式来实现双飞布局.那什么是双飞布局呢,其实就是两侧宽度固定,中间宽度自适应的三栏布局. 1.第一种相对来说比较容易想到,就是利用定 ...

  2. 三种方式实现双飞翼布局

    flex实现双飞翼布局 1.给中部父盒子设置宽度100%设置display:flex;, 2.给左侧和右侧盒子设置固定的宽度,高度固定值 3.中间的盒子设置flex-grow: 1;,宽度不设置,高度 ...

  3. 实现双飞翼布局的三种方式

    实现双飞翼布局的三种方式 使用定位来实现 实现流程: 1.父盒子相对定位,左右 padding 为子盒子宽度,左右子盒子绝对定位,宽度写死: 2.左边子盒子 left top 给 0,右边子盒子 ri ...

  4. css table设置边框_(代码示例)css实现等高布局的三种方式

    本篇文章给大家带来的内容是关于css实现等高布局的三种方式(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 本文讲的等高布局是在不手动设置元素高度的情况下,使用纯css实现 ...

  5. html布局结构瀑布流,三种方式实现瀑布流布局

    分别使用javascript,jquery,css实现瀑布流布局: 第一种方式:使用JavaScript: 瀑布流布局 *{padding:0;margin:0;} .clearfix:after, ...

  6. QT读写Sqlite数据库三种方式

    QT对一些基本的数据库的访问封装,可谓是极大的方便的我们开发人员,现在我们就来说下QT对Sqlite这个数据库的读写,Sqlite是一个比较小型的本地数据库,对于保存一些软件配置参数或量不是很大的数据 ...

  7. centos7.4安装mysql5.7_centos7.4三种方式安装mysql5.7

    三种方式安装 mysql 二进制 rpm 安装 mysql5.7.21 下载 yum repository [root@apenglinux-002 yum.repos.d]# yum -y inst ...

  8. v html如何添加样式,详解三种方式解决vue中v-html元素中标签样式

    Vue为v-html中标签添加CSS样式 {{news.title}} {{news.datetime}} 返回列表 当我们使用v-html渲染页面,使用下面这种方式去修改样式并没有效果, .con{ ...

  9. QT读写Sqlite数据库的三种方式

    QT对一些基本的数据库的访问封装,可谓是极大的方便的我们开发人员,现在我们就来说下QT对Sqlite这个数据库的读写,Sqlite是一个比较小型的本地数据库,对于保存一些软件配置参数或量不是很大的数据 ...

最新文章

  1. 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(二)寻找物体的凸包
  2. 160个Crackme033
  3. dbus 和 policykit 实例篇(python)
  4. poj-2029 Get Many Persimmon Trees
  5. php 面向对象进阶,PHP面向对象进阶设计模式:解释器模式使用实例
  6. one hot 编码的实现
  7. 在NHibernate的单表继承模式下通过父类Repository查询子类
  8. linux 使用ssr客户端_React从CSR到SSR:第一篇
  9. 商易淘宝全屏海报代码生成工具 使用说明
  10. 8位模型计算机设计与仿真
  11. 客快物流大数据项目(一):物流项目介绍和内容大纲
  12. matlab抛物柱面画图,抛物柱面 - calculus的日志 - 网易博客
  13. STM32F1xx_StdPeriph_Driver——I2C
  14. QQ游戏基本通信机制(QQ游戏外挂编写)
  15. 从零开始编写minecraft光影包(7)基础水面绘制
  16. [软件设计] 控制反转(Inversion of Control)随想
  17. 分组、分类(分组汇总)
  18. Linux 文档编辑 : ex 命令详解
  19. 张五常先生谈读书和思考的方法
  20. AndroidWear官方文档总结05 - 手持设备与穿戴设备的通知同步

热门文章

  1. kafka partition分配_kafka的分区分配策略
  2. graphic头文件函数_graphics.h头文件详解
  3. mac怎么用python3.0_怎么在mac中使用python
  4. java怎么将前端的数据存到关联的表中_MySQL数据库性能优化
  5. oracle exp导出分区表,【实验】【PARTITION】exp导出分区表数据
  6. java opengl书_GitHub - cy-cyx/OpenGlDome: OpenGl的使用练习(安卓 Java opengl3.0)
  7. SpringBoot整合WebSocket
  8. 如何利用PN结来测量温度?
  9. 从冲撞避让到碾压,竞争模式发生了改变
  10. 节能无线信标灯的几点补充测实验