前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >圣杯布局与双飞翼布局

圣杯布局与双飞翼布局

原创
作者头像
前端林子
修改2018-10-07 11:51:22
3.4K3
修改2018-10-07 11:51:22
举报
文章被收录于专栏:前端技术总结前端技术总结

上一篇文章介绍了三种方法实现CSS三栏布局,本文则在此基础上,进一步介绍常用的圣杯布局与双飞翼布局。

一.圣杯布局

圣杯布局的要求:

1. header和footer占屏幕全部高度,高度固定

2. 中间的contaier部分是一个三栏布局

3. left和right宽度固定,middle自适应填满整个区域;高度为三栏中最大的高度;

实现的方法:

1.header和footer设width为100%

2.中间的三栏布局,可参考三种方法实现CSS三栏布局,这里采用margin负值法来实现

先直接实现下三栏布局:

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<title>圣杯布局</title>
<style type="text/css">
    body {
        margin: 0;
        padding: 0;
   }
    header,
    footer {
        height: 100px;
        width: 100%;
        background-color: #BBBBBB;
    }

    .container {
        height: 300px;
    }

    .container div {
        float: left;
    }

    .left {
        width: 200px;
        height: 300px;
        background-color: #DC698A;

        margin-left:-100%;
    }
    .middle {
        width: 100%;
        height: 300px;
        background-color: #3EACDD;
    }
    .right {
        width: 300px;
        height: 300px;
        background-color: #8CB08B;

        margin-left:-300px;
    }

</style>
</head>

<body>
<header>头部</header>
<div class="container">
<div class="middle">中间栏</div>
<div class="left">左栏</div>
<div class="right">右栏</div>
</div>
<footer>底部</footer>
</body>

</html>

实现效果如下:

看上去好像已经达到圣杯布局的要求了,但是可以看到中间栏蓝色块并没有显示出“中间栏”,感觉应该是被左栏覆盖了。为了验证,这里将左右两栏设置透明度,中间栏多增加些内容,可以看到:

可以看出中间栏确实被左右两栏各覆盖了一部分内容。

要想左右两栏不遮盖中间栏,就需要中间栏给左右两栏腾些位置处理,可以想到用padding属性或者margin属性来腾位置。圣杯布局是用padding属性来腾位置,而双飞翼布局则是用margin属性,同时要修改下html的布局结构。

圣杯布局的实现,需要给左栏、中间栏、右边栏加上padding属性,腾些位置:

(1)第一步,给container设置padding-left和padding-right属性,值分别为左栏、右栏的宽度:

代码语言:javascript
复制
.container {
    ...
    padding-left: 200px;
    padding-right: 300px; 
}

效果如下:

(2)第二步,将左右两栏设置为相对定位,同时左栏的left值设为-左栏宽度,右栏的right设为-右栏宽度。

代码语言:javascript
复制
.container div{
    ...
    position: relative;
}
.left{
    ...
    left:-200px;
}
.right{
   ...
    right:-300px;
}

这里附上完整的代码:

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>圣杯布局</title>
    <style type="text/css">
        body {
            margin: 0;
            padding: 0;
        }

        header,
        footer {
            height: 100px;
            width: 100%;
            background-color: #bbbbbb;
        }

        .container {
            height: 300px;

            padding-left: 200px;
            padding-right: 300px; 
        }

        .container div{
            float: left;
            
            /* 圣杯布局 */
            position:relative;
        }

        .left {
            width: 200px;
            height: 300px;
            background-color: #DC698A;

            margin-left: -100%;
            /* 圣杯布局 */
            left:-200px;
        }

        .middle {
            width: 100%;
            height: 300px;
            background-color: #3EACDD;

        }

        .right {
            width: 300px;
            height: 300px;
            background-color: #8CB08B;
    

            margin-left: -300px;
            /* 圣杯布局 */
            right:-300px;
        }
    </style>
</head>

<body>
    <header>头部</header>
    <div class="container">
        <div class="middle">中间栏</div>
        <div class="left">左栏</div>
        <div class="right">右栏</div>
    </div>
    <footer>底部</footer>
</body>

</html>

实现的效果如下:

圣杯布局
圣杯布局

二.双飞翼布局

前面介绍过,双飞翼布局和圣杯布局的区别,就在于如何处理中间栏被遮挡的问题。双飞翼布局要稍微修改下html。

具体实现:

在中间栏中在放一个div来显示内容,并设置其margin。margin-left为左边栏的宽度,margin-right为右边栏的宽度

代码语言:javascript
复制
/* 双飞翼布局 */
.main{
    margin-left:200px;
    margin-right:300px;
}

之所以要修改html的布局,在中间栏中又增加的div,是因为原来中间栏的div设置了width:100%,如果再设置margin的话,就会超过窗口的宽度。因此,这里增加了个div,将要显示的内容放到这个div里面,给这个div来设置margin。

这里附上完整的代码:

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>双飞翼布局</title>
    <style type="text/css">
        body {
            margin: 0;
            padding: 0;
        }

        header,
        footer {
            height: 100px;
            width: 100%;
            background-color: #bbbbbb;
        }

        .container {
            height: 300px;
        }

        .container div {
            float: left;
        }

        .left {
            width: 200px;
            height: 300px;
            background-color: #DC698A;

            margin-left: -100%;
           
        }

        .middle {
            width: 100%;
            height: 300px;
            background-color: #3EACDD;

        }

        .right {
            width: 300px;
            height: 300px;
            background-color: #8CB08B;


            margin-left: -300px;
           
        }

        /* 双飞翼布局 */
        .main{
            margin-left:200px;
            margin-right:300px;
        }
    </style>
</head>

<body>
    <header>头部</header>
    <div class="container">
        <div class="middle">
            <div class="main">中间栏</div>
        </div>
        <div class="left">左栏</div>
        <div class="right">右边栏</div>
    </div>
    <footer>footer</footer>
</body>

</html>

实现的效果如下:

双飞翼布局
双飞翼布局

三.小结

本文主要介绍了如何一步步地实现圣杯布局和双飞翼布局。圣杯布局相较于双飞翼布局,样式设置稍有些复杂。双飞翼布局样式设置比较简单,但需要修改html布局结构。建议在阅读本文前,可以先阅读下三种方法实现CSS三栏布局,便于加深理解。如有问题,欢迎指正。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.圣杯布局
  • 二.双飞翼布局
  • 三.小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档