css布局之圣杯布局

三列布局中,左右两列定宽,中间一列自适应是比较常用的一种布局方式。代表性的布局方式有圣杯布局和双飞翼布局。

圣杯布局

下面这些布局都是通过浮动来实现 的,但常常只将三列布局中,左右两列定宽,中间一列自使用看成是圣杯布局。我认为这种观点其实有点狭隘。

单从圣杯布局这个名字来讲,也不是单指三列布局,圣杯并不是三列布局的形象表示,在西方圣杯是指渴求之物。在网页展现时我们渴求之物当然是主内容区域的信息。

圣杯布局就是:将主内容区域首先加载,其次再加载侧边的内容。

先来理解理解一下圣杯布局是如何实现的:

完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>圣杯布局的几种实现方式</title>
    <style>
        *{
            margin:0;
            padding:0;
        }

        body{
            min-width: 600px;
            color:#fff;
        }

        .header,
        .footer{
            text-align: center;
            background-color: #ab96c5;
        }

        .layout1,
        .layout2,
        .layout3,
        .layout4,
        .layout5{
            margin:5px;
            overflow: hidden;
        }

        .content,
        .aside{
            min-height: 40px;
            text-align:center;
        }

        .content{
            /*position: relative;*/
            background-color: #793d56;
            width: 100%;

        }

        .aside{
            position: relative;
            background-color: #bb1c33;
            width:200px;
        }

        .layout1{
            padding-left: 200px;
        }

        #aside1,
        #content1{
            float: left;
        }

        #aside1{
            margin-left: -100%;
            left: -200px;

        }

        #content2,
        #aside2{
            float:left;
        }

        .layout2{
            padding-right: 200px;
        }

        #aside2{
            margin-left: -200px;
            right: -200px;
        }

        .layout3{
            padding-left: 200px;
            padding-right: 200px;
        }

        #content3,
        #aside3-left,
        #aside3-right{
            float:left;
        }

        #aside3-left{
            margin-left: -100%;
            left: -200px;
        }

        #aside3-right{
            margin-left: -200px;
            right: -200px;
        }

        .layout4{
            padding-left: 400px;

        }

        #content4,
        #aside4-left1,
        #aside4-left2{
            float: left;
        }

        #aside4-left1{
            margin-left: -100%;
            left: -400px;
        }

        #aside4-left2{
            margin-left:-100%;
            left: -200px;
        }

        .layout5{
            padding-right: 400px;

        }

        #content5,
        #aside5-right1,
        #aside5-right2{
            float: left;
        }

        #aside5-right1{
            margin-left: -200px;
            right: -200px;
        }

        #aside5-right2{
            margin-left:-200px;
            right: -400px;
        }

    </style>
</head>
<body>
    <div class="header">头部</div>
    <div class="layout1">
        <div class="content" id="content1">内容区域自适应</div>
        <div class="aside" id="aside1">左侧边栏固定</div>
    </div>
    <div class="layout2">
        <div class="content" id="content2">内容区域自适应</div>
        <div class="aside" id="aside2">右侧边栏固定</div>
    </div>
    <div class="layout3">
        <div class="content" id="content3">内容区域自适应</div>
        <div class="aside" id="aside3-left">左侧边栏固定</div>
        <div class="aside" id="aside3-right">右侧边栏固定</div>
    </div>
    <div class="layout4">
        <div class="content" id="content4">内容区域自适应</div>
        <div class="aside" id="aside4-left1">左侧边栏1固定</div>
        <div class="aside" id="aside4-left2">左侧边栏2固定</div>
    </div>
    <div class="layout5">
        <div class="content" id="content5">内容区域自适应</div>
        <div class="aside" id="aside5-right1">右侧边栏1固定</div>
        <div class="aside" id="aside5-right2">右侧边栏2固定</div>
    </div>
    <div class="footer">尾部</div>

</body>
</html>

下面分析一下具体每种情况是怎么实现的:

1. 左侧边栏固定,右侧内容区域自适应

实现代码:

        .content,
        .aside{
            min-height: 40px;
            text-align:center;
        }

        .layout1{
            margin:5px;
        }

        .content{
            background-color: #793d56;
            width: 100%;

        }

        .aside{
            position: relative;
            background-color: #bb1c33;
            width:200px;
        }

        .layout1{
            color:#fff;
            padding-left: 200px;
        }

        #aside1,
        #content1{
            float: left;
        }

        #aside1{
            margin-left: -100%;
            left: -200px;
        }

代码分析:

 a.设置 aside和content的最小高度,min-height: 40px;

 b.设置 aside和content的背景,将文本颜色设置为白色,方便观察;

 c.设置给aside设置一个固定的宽度,width:200px;为了让剩下的被content充满,将它的width设置为:width: 100%;

d.让内容和侧边栏都发生左浮动(似乎什么也没有发生);

e.设置aside1完全相等于内容区域的左外负边距,margin-left: -100%;

当设置

        #aside1{
            margin-left: -100%;
        }

时,aside1的右负边距正好为content的width即:100%;

3D效果:

这时,左侧边栏被移到想放置的位置了,但是发现content区域的文字被侧边栏遮挡住了,需要通过设置父元素的padding-left把内容区域拉出来:

f. 设置layout的padding-left: 200px;

这时,发现左侧边栏又跟着被拉出来了。需要将侧边栏移动到本来的位置:最左边。

g. 设置aside的left: -200px;

通过设置aside1的left:-200px;相当于将aisde1相对于当前位置像右移动-200px;其实就是向左移动200px;但是发现什么也没有发生。

这是因为,aisde1不知道相对于什么位置来定位自己,需要设置定位方式:aside的position属性为position: relative;

这下左侧边栏回到了应该在的位置。

h.将文本居中:

3D效果:

发现这下显示正常了。

——————————————————————————————————————————————————————————————————————————————————————————————————————

2. 右侧边栏固定,左侧内容区域自适应

这其实和上面的左侧边栏固定,右侧内容区域自适应是一个道理,只是有些设置不一样。

        .content,
        .aside{
            min-height: 40px;
            text-align:center;
        }

        .layout2{
            margin:5px;
        }

        .content{
            background-color: #793d56;
            width: 100%;

        }

        .aside{
            position: relative;
            background-color: #bb1c33;
            width:200px;
        }

        .layout2{
            padding-right: 200px;
            color: #fff;
        }

        #content2,
        #aside2{
            float:left;
        }

        #aside2{
            margin-left: -200px;
            right: -200px;

        }

3. 两侧边栏固定,中间栏自适应。

        .content,
        .aside{
            min-height: 40px;
            text-align:center;
        }

        .content{
            background-color: #793d56;
            width: 100%;

        }

        .aside{
            position: relative;
            background-color: #bb1c33;
            width:200px;
        }
        .layout3{
            padding-left: 200px;
            padding-right: 200px;
            color: #fff;
        }

        #content3,
        #aside3-left,
        #aside3-right{
            float:left;
        }

        #aside3-left{
            margin-left: -100%;
            left: -200px;
        }

        #aside3-right{
            margin-left: -200px;
            right: -200px;
        }

看一下具体的实现:

a. 首先让左右侧栏和中栏内容栏即三个div都左浮动:

b. 先把左侧边栏拉上去

向上面设置1时一样,设置#aside3-left的margin-left: -100%;

3D效果:

这时,发现内容左侧的文本被遮挡,通过设置父元素layout3的padding-left可以将content内容拉出来:

c. 设置layout3的padding-left:200px;

但是左侧边栏也跟着跑过来了,需要将左侧边栏向左移动。

d.设置#aside3-left的left:-200px;即相对于当前位置向左移动200px;

缺少相对定位,没有效果。

e. 设置#aside3-left的position:relative;

左侧边栏设置成功。接下啦拉动右侧边栏。

f.将右侧边栏拉拉上来:

设置右侧边栏#aside3-right的margin-left: -200px;

此时内容区域有一部分被右侧边栏遮盖住了:(点击内容区域,发现右侧边栏也会被选定)

g.但同时跟左侧边栏一样,应该把content区域从左侧边栏拉出来:

h.设置右侧边栏为相对定位,将右侧边栏向右移动,放回原位。

得到最终想要的结果。

后面的两种布局方式是一样的原理,这里就不再赘述了。

————————————————————————————————————————————————————————————————————————————————————————————————————————

总结:

圣杯布局:用到浮动、负边距、相对定位,不添加额外标签。

首先让布局元素都浮动起来,然后将自适应区域设置为100%,再通过设置自适应元素的父元素左右内边距,将自适应区域左右压缩到合适的宽度,通过设置左右侧边栏的外负边距移动它们的位置,最后进行相对定位,并调整相对位置。

时间: 2024-11-07 13:37:53

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中的圣杯布局,以及圣杯布局与双飞翼布局的区别

为了解决中间宽度自适应,左右列固定宽度,最早出现的是圣杯布局,双飞翼布局是对圣杯布局的改良,同样这种 布局的优势在于在中间列中的文档可以优先渲染. 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布局(五) 圣杯布局

本文翻译修改自https://alistapart.com/article/holygrail 圣杯布局 在页面上的显示效果就是左右两边是个固定的宽度,中间的容器自适应:即根据页面大小的变化而变化. 如何实现 战略很简单.容器div的侧面有自适应中心和固定宽度的衬垫.然后诀窍是让左列与左侧填充对齐,右侧列与右侧填充对齐,留下中心列以填充容器的自适应宽度. 1.基本结构 <div id='header'></div> <div id='container'> <di

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,让三个盒子都向左浮动,向右浮动可能会出现问题,所以都