CSS布局(五) 圣杯布局

本文翻译修改自https://alistapart.com/article/holygrail

圣杯布局

在页面上的显示效果就是左右两边是个固定的宽度,中间的容器自适应;即根据页面大小的变化而变化。

如何实现

战略很简单。容器div的侧面有自适应中心和固定宽度的衬垫。然后诀窍是让左列与左侧填充对齐,右侧列与右侧填充对齐,留下中心列以填充容器的自适应宽度。

1、基本结构

<div id='header'></div>
<div id='container'>
  <div id='center' class='column'> </div>
  <div id='left' class='column'> </div>
  <div id='right' class='column'> </div>
</div>
<div id='footer'></div>

给点基本样式

div{
      text-align: center;
    }
    #header,#footer{
      background-color: #666666;
    }
    #center{
      background-color: #D6D6D6;
    }

    #left{
      background-color: #77BBDD;
    }

    #right{
      background-color: #FF6633;
    }

效果

左右宽度,假设需要右侧 150px 左侧 200px。

#container{
      padding-left: 200px; /* 左侧宽度 */
      padding-right: 150px; /* 右侧宽度 */
    }

效果

2、给左右添加宽度,并在一行显示。

还需要清除页脚,使其保持在浮动列的下方。

#container .column{
      float: left;
    }

    #center {
      background-color: #D6D6D6;
      width: 100%;
    }

    #left {
      background-color: #77BBDD;
      width: 200px;
    }

    #right {
      background-color: #FF6633;
      width: 150px;
    }

    #footer {
      clear: both;
    }

请注意,中心列的100%宽度是指容器div的宽度,不包括填充。当布局结合在一起时,我们会再次看到这个100%的宽度,它仍将引用容器的这个中心宽度。

列现在要按顺序排列,但由于中心列占用了可用空间的100%,因此左右列会换行。

3、左列

唯一剩下的就是让colums与容器上的填充物对齐。中间列准确地从它需要的位置开始。

#left {
      background-color: #77BBDD;
      width: 200px;
      margin-left: -100%;
    }

现在,左列与中心列重叠,共享其左边缘。右列向左浮动并紧靠中心列的右边缘(但仍然包裹),留下以下内容:

使用相对定位,其偏移量恰好是左列的宽度。

#container .column{
      float: left;
      position: relative;
    }
#left {
      background-color: #77BBDD;
      width: 200px;
      margin-left: -100%;
      right: 200px;
    }

右列

将它从容器中拉出并放入容器的填充物中。

#right {
      background-color: #FF6633;
      width: 150px;
      margin-right: -150px;
    }

优化

如果调整浏览器窗口的大小以使中心变得小于左列。

设置body的min-width

body{
      min-width: 550px; /* 左侧的两倍 + 右侧 */
    }

IE6

* html #left{
      left:150px;
    }

简单的添加文字

在基本样式上添加一些padding和一些文字,让页面看起来更美观一点。可以参考https://jadedoo.github.io/ife/layout/grail_1.html

三列等高

#container{
      padding-left: 200px; /* 左侧宽度 */
      padding-right: 190px; /* 右侧宽度 */
      overflow: hidden;
    }
#container .column{
      float: left;
      position: relative;
      padding-bottom: 20010px; /*margin-bottom + padding-bottom*/
      margin-bottom: -20000px;
    }
#footer {
      clear: both;
      position: relative;
    }

可以参考https://jadedoo.github.io/ife/layout/grail_2.html

完整代码

html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>圣杯布局</title>
</head>

<body>
  <div id='header'><h1>This is the header.</h1></div>
  <div id='container'>
    <div id='center' class='column'>
      <h1>This is the main content.</h1>
      <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla.</p>
      <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla.</p>
    </div>
    <div id='left' class='column'>
      <h1>This is the left sidebar.</h1>
      <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla. </p>
    </div>
    <div id='right' class='column'>
      <h1>This is the right content.</h1>
      <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla.</p>
    </div>
  </div>
  <div id="footer-wrapper">
    <div id='footer'><h1>This is the footer.</h1></div>
  </div>
</body>

</html>

css

  <style>
    *{margin: 0;padding: 0;}
    * html body {
      overflow: hidden;
    }
    body{
      min-width: 630px;
    }
    div {
      text-align: center;
    }

    #header,
    #footer {
      background-color: #666666;
      padding: 10px 0;
    }

    #container{
      padding-left: 200px; /* 左侧宽度 */
      padding-right: 190px; /* 右侧宽度 */
      overflow: hidden;
    }

    #container .column{
      float: left;
      position: relative;
      padding-bottom: 20010px; /*margin-bottom + padding-bottom*/
      margin-bottom: -20000px;
    }

    #center {
      background-color: #D6D6D6;
      width: 100%;
      padding: 10px 20px;
    }

    #left {
      background-color: #77BBDD;
      width: 180px;
      margin-left: -100%;
      right: 240px;
      padding: 0 10px;
    }

    #right {
      background-color: #FF6633;
      width: 130px;
      margin-right: -190px;
      padding: 0 10px;
    }

    #footer {
      clear: both;
      position: relative;
    }

    * html #left{
      left:150px;
    }
    * html #footer-wrapper{
      float: left;
      position: relative;
      width: 100%;
      padding-bottom: 10010px;
      margin-bottom: -10000px;
      background-color: #fff;
    }
  </style>

原文地址:https://www.cnblogs.com/jadedoo/p/10203362.html

时间: 2024-10-16 17:41:31

CSS布局(五) 圣杯布局的相关文章

css布局之圣杯布局和双飞翼布局

圣杯布局和双飞翼布局 今天看了很多圣杯布局和双飞翼布局的技术博客,通过自己的理解总结一下吧. 1.二者相同点: 实现的都是三栏布局,两边的盒子宽度固定,中间盒子自适应,也就是我们常说的固比固布局.它们实现的效果是一样的. 2.不同点: 圣杯布局知识点:浮动,负边距,相对定位,不需要添加额外标签. 双飞翼:只用到浮动,负边距,不需要使用相对定位,需要添加一个额外的标签. 注意:html结构中中间部分要写在左右布局之前,为了优先渲染. 下面就先来看一下圣杯布局的实现过程吧: 先写出基本DOM结构:

【CSS】 布局之圣杯布局

在看众多大神的css布局指南时,经常看到一个布局:圣杯布局(也有称为双飞翼布局的).今天我们也来剖析一下. 其实,对于众多css布局,我们只要明确理解了3种技术,那么基本上大多数布局都难不倒我们了: 浮动 float 绝对定位和相对定位 negative margin 负边距 relative position 浮动 浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止. 由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样.(w3c) 上面是

CSS网页布局基础-圣杯布局和双飞翼布局

行布局 多列布局 圣杯布局 双飞翼布局 一.行布局 行布局垂直水平居中 注:这里没有用margin: 0 auto;先让它水平居中,而是使用了绝对定位布局,然后设置top:50%; left:50%;但是光设置这个还不够,因为这并不是水平垂直居中,因为它并没有考虑自身的宽度和高度,所以这里根据盒子本身的高宽又再此基础上设置了margin-left和margin-top.如果只设置了top:50%; left:50%;而没有设置margin-left和margin-top,效果如下: 代码如下:

css布局之圣杯布局

三列布局中,左右两列定宽,中间一列自适应是比较常用的一种布局方式.代表性的布局方式有圣杯布局和双飞翼布局. 圣杯布局 下面这些布局都是通过浮动来实现 的,但常常只将三列布局中,左右两列定宽,中间一列自使用看成是圣杯布局.我认为这种观点其实有点狭隘. 单从圣杯布局这个名字来讲,也不是单指三列布局,圣杯并不是三列布局的形象表示,在西方圣杯是指渴求之物.在网页展现时我们渴求之物当然是主内容区域的信息. 圣杯布局就是:将主内容区域首先加载,其次再加载侧边的内容. 先来理解理解一下圣杯布局是如何实现的:

CSS中的圣杯布局,以及圣杯布局与双飞翼布局的区别

为了解决中间宽度自适应,左右列固定宽度,最早出现的是圣杯布局,双飞翼布局是对圣杯布局的改良,同样这种 布局的优势在于在中间列中的文档可以优先渲染. 1.什么是圣杯布局 其实对于圣杯布局,前面一部分与双飞翼布局完全相同 <style>   .column{ float:left } .container{ width:100% } .column{ height:300px; }   #center_panel{ width:100%;  background-color:red; } #rig

双飞翼布局以及圣杯布局

双飞翼布局和圣杯布局其实结果是一样的,都是实现三栏布局,中间宽度自适应,两端宽度固定,只是实现的方法不一样 圣杯布局 三栏是独立的,利用外层container的padding 以及 两端的margin以及定位left,right值实现 <!-- HTML --> <div class="container"> <div class="middle">我是位于中间</div> <div class="le

css中的圣杯布局和双飞翼布局

圣杯布局 布局要求: 三列布局,中间自适应,两边定宽 中间栏要在浏览器优先渲染 允许任意列的高度最高 用最简单的CSS.最少的HACK语句 解释说明: 1.min-width:700px是为了当页面缩小到指定的700px的时候,页面内容宽度不再随着浏览器缩小.是为了电脑的正常浏览效果 2.注意到container设置的值0 220px  0 200px,上 右 下 左,所以left 设置widh:200px,right设置width:220px 3.设置min-height:300px,是让三列

css两栏布局、圣杯布局、双飞翼布局

最近几个月一直用vue在写手机端的项目,主要写业务逻辑,在js方面投入的时间和精力也比较多.这两天写页面明显感觉css布局方面的知识有不足,所以复习一下布局方法. 两栏布局 1.浮动 .box1 .left { float: left; width: 100px; height: 100px; background-color: red; } .box1 .right { margin-left: 100px; height: 100px; background-color: green; }

CSS中的圣杯布局与双飞翼布局

一,圣杯布局 1,什么是圣杯布局? 所谓圣杯布局就是用于实现一个两侧宽度固定,中间宽度自适应的三栏布局 2,构建圣杯布局的步骤: 2.1,添加一个容器,在这个容器中添加放三个盒子(左.中.右): 2.2,设置两侧盒子(左.右)的宽度 ,使其宽度固定: 2.3,设置中间盒子的宽度为100%,这是中间盒子宽度自适应的关键: 2.4,设置容器的padding-left和padding-right属性,属性值分别为左盒子的宽度和右盒子的宽度: 2.5,让三个盒子都向左浮动,向右浮动可能会出现问题,所以都