三种方式实现圣杯布局

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

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

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

HTML内容:

<div class="header">这里是头部</div>
<div class="container">
    <div class="middle">中间部分</div>
    <div class="left">左边</div>
    <div class="right">右边</div>
</div>
<div class="footer">这里是底部</div>

浮动:

1.填充三栏

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

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

.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;
}

2.移动左侧区域

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

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

.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;
}

3.移动右边

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

.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弹性盒子实现:

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

.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;
}

css grid网格

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

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

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

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

 

原文地址:https://www.cnblogs.com/jayfeng/p/12108567.html

时间: 2024-10-08 15:01:03

三种方式实现圣杯布局的相关文章

css 圣杯布局三种方式

所谓的圣杯布局就是左右两边大小固定不变,中间宽度自适应.我们可以用浮动.定位以及flex这三种方式来实现 一般这种布局方式适用于各种移动端顶部搜索部分,这是最常见的,如京东手机版主页面顶部搜索: 可以看到左边有个菜单按钮,中间是搜索框,右边是登录两个文字,左右大小是固定的,而中间部分则是随着手机屏幕尺寸的大小而自适应.   第一种方法 float实现: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 &

android中填充界面布局的三种方式

改变原来界面布局的三种方式: 1.第一种方式: LayoutInflater li = LayoutInflater.from(this); 具体代码: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activ

获得 LayoutInflater 实例的三种方式

在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化:而findViewById()是找xml布局文件下的具体widget控件(如Button.TextView等). 具体作用: 1.对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入: 2.对于一个已经载入的界面,就可以使用Activiyt.

解析Xml文件的三种方式及其特点

解析Xml文件的三种方式 1.Sax解析(simple api  for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用回调函数来实现. 1 class MyDefaultHander extends DefaultHandler{ 2 private List<Student> list; 3 private Student student; 4 5 @Override 6 public void startDo

[转]Asp.net Mvc2中重构View的三种方式

本文转自:http://www.cnblogs.com/zhuqil/archive/2010/07/14/asp-net-mvc2-view-refactoring.html 我们在Asp.net mvc的view开发过程中,如果不注意可能会写大量的重复的代码.这篇文章介绍3种方式重构View的代码,来减少View中的重复代码.    1.母板页 在Asp.net mvc中保留了母板页的使用,我们可以使用母板页对我们的站点进行布局.看下面母板页的代码: <%@ Master Language=

github项目解析(八)--&gt;Activity启动过程中获取组件宽高的三种方式

转载请标明出处:一片枫叶的专栏 上一个github小项目中我们介绍了防止按钮重复点击的小框架,其实现的核心逻辑是重写OnClickListener的onClick方法,添加防止重复点击的逻辑,即为第二次点击与第一次点击的时间间隔添加阙值,若第二次点击的时间间隔与第一次点击的时间间隔小于阙值,则此次点击无效,再次基础上我们又封装了点击组件验证网络Listener,点击组件验证是否登录Listener等,具体可参考:github项目解析(七)–>防止按钮重复点击 本文中我将介绍一下android中A

获得 LayoutInflater 实例的三种方式(转)

原文地址:http://www.cnblogs.com/androidez/archive/2013/07/01/3164729.html 在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化:而findViewById()是找xml布局文件下的具体widget控件(如Button.TextView等). 具体作用: 1.对于一个没有被载入或者想要

实现自定义View的三种方式

一.组合控件 组合控件,顾名思义,就是将系统原有的控件进行组合,构成一个新的控件.这种方式下,不需要开发者自己去绘制图上显示的内容,也不需要开发者重写onMeasure,onLayout,onDraw方法来实现测量.布局以及draw流程.所以,在实现自定义view的三种方式中,这一种相对比较简单. 实际开发中,标题栏就是一个比较常见的例子.因为在一个app的各个界面中,标题栏基本上是大同小异,复用率很高.所以经常会将标题栏单独做成一个自定义view,在不同的界面直接引入即可,而不用每次都把标题栏

AngularJs学习——实现数据绑定的三种方式

三种方式: 方式一:<h5>{{msg}}</h5>  此方式在页面刷新的时候会闪现{{}} 方式二:<h5 ng-bind="msg"></h5> 方式三:<h5 ng-clock class="ng-clock">{{msg}}</h5> 示例代码: <!DOCTYPE html> <html lang="en" ng-app="myapp&q