CSS 经典三列布局之圣杯布局

圣杯布局

圣杯布局是典型的 CSS 布局问题,有着众多的解决方案。

圣杯布局是一种非常经典和常用的布局方式,其所指的是三列布局,中间宽度自适应,两边定宽;或者两列布局,主体宽度自适应,左边或右边定宽。

  • 边栏应流动居中,定宽。
  • 中间一栏 (主要内容) 在 HTML 源码中应该首先元素出现。
  • 所有栏同高,忽略实际高度。
  • 使用的 HTML 标记尽量少。
  • 当页面内容不够充满页面时,页脚应“粘”在底部。

过程

<header>header</header>
<div class="container clearfix">
    <div class="main">main</div>  // main放在前面先渲染
    <div class="left">left</div>
    <div class="right">right</div>
</div>
<footer>footer<footer>
  • 设置中间三个div向左浮动,使其排列在一行
  • 设置footer元素清除浮动,阻止与上面的main部分重叠。
  • 设置中间三个div的宽度,左右定宽,中间宽度自适应。
.container > div {
    height: 10vh;
    float: left;
}

.main {
    width: 100%;
    background-color: #5AEBF0;
}

.left {
    width: 200px;
    background-color: #F668E0;
}

.right {
    width: 200px;
    background-color: #F668A4;
}
1494083623x2890174022.png
  • 主内容栏宽度变小,设置container的padding。
  • left盒子上去,设置left的margin-left为-100%,。
 .container {
    padding-left: 200px;
}
.left {
    width: 200px;
    background-color: #F668E0;
  margin-left: -100%;
}
1494084112x2890174022.png

由于 container 设置了内边距,因此中间栏看起来就处在了网页的中间,但左右两栏由于排在中间栏的后面,且因为空间不够被挤到了中间栏的下面

  • left盒子移动到左边,使用相对定位,设置left属性为盒子宽度等量的负值。
.container > div {
    height: 10vh;
    float: left;
    position: relative;
}

.left {
    width: 200px;
    background-color: #F668E0;
    margin-left: -100%;
    left: -200px;             /*  或者使用 right: 200px;*/
}
1494084481x2890174022.png
  • 最后,我们需要把右侧栏放上去,此时只需利用上面的原理把他放到 container 的右外边距的位置即可,我们需要再一次设置一个负外边距的值,它等于右侧栏的宽度
1494085959x2890174022.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,831评论 1 92
  • 在前端布局中,事实上,圣杯布局其实和双飞翼布局是一回事。它们实现的都是三栏布局,两边的盒子宽度固定,中间盒子自适应...
    风铭阅读 1,499评论 1 6
  • 前言 温馨提示:本文较长,图片较多,本来是想写一篇 CSS 布局方式的,但是奈何 CSS 布局方式种类太多并且实现...
    sunshine小小倩阅读 3,193评论 0 59
  • 前言 因为要在团队内作一次技术分享,想了几个题目,最后还是决定系统总结一下我在CSS布局这方面的知识。一是这个题目...
    Samhanx阅读 652评论 0 6
  • 稍微了解前端的人都知道,圣杯布局和双飞翼布局是前端面试时必问的问题,因为它既能体现你懂HTML结构又能体现出你对D...
    森西悠然阅读 77,559评论 46 173