supce's blog

CSS学习笔记之两列页面布局(一)

今天比较忙,但还是挤时间把今天的博客写出来了,下面就赶紧进入正题了 ヾ(=^▽^=)ノ

一、两列定宽的页面布局


两列的页面布局是我们经常看见的一种页面结构,(蛤?我的博客首页!)这种布局方式在内容体现上可分为主要内容区域和侧边栏。首先让我们先把HTML的骨架搭好。

<div id="header">这里是头</div>
<div id="container">
    <div class="mainBox">这里是主要内容区域</div>
    <div class="sideBox">这里是侧边栏</div>
</div>
<div id="footer">这里是脚(ps:没脚气,不臭)</div>

好了,骨架已经搭好了,下面开始用我们的CSS给骨架上贴肉了。就从最简单的两列定宽开始吧。在这里两列定宽主要是指将mainBox和sideBox这两个div的宽度值固定。再将它们分别放在内容区域的两侧。我们将container的宽度值设置为950px,高度为250px,上下外边距为10px。mainBox的宽度值设置为680px,高度为250px。sideBox的宽度值设置为270px,高度也为250px。

<style type="text/css">    
    *{
        padding: 0;
        margin: 0;
    }
    #header, #footer{
        width: 950px;
        height: 30px;
        background-color: #E8E8E8;
    }
    #container{
        width: 950px;
        height: 250px;
        margin: 10px 0;
    }
    .mainBox{
        float: left;
        width: 680px;
        height: 250px;
        color: #FFFFFF;
        background-color: #333333;
    }
    .sideBox{
        float: right;
        width: 270px;
        height: 30px;
        color: #FFFFFF;
        background-color: #999999;
    }
</style>

效果如下图:
两列定宽
通过float,一个最简单的两列定宽布局就这么实现了,但是我们在mainBox中添加更多的行呢?
多行两列
结果,内容超出了容器范围,我们可以用overflow将多余的内容隐藏,但是,我们更想实现高度自适应,高度随着内容而改变。可以把CSS修改成这样:

<style type="text/css">
    ……
    #container{
            width: 950px;
            /*height: 250px;*/
            margin: 10px 0px;
        }
        .mainBox{
            float: left;
            width: 680px;
            /*height: 250px;*/
            color: #FFFFFF;
            background-color: #333333;
        }
        .sideBox{
            float: right;
            width: 270px;
            /*height: 250px;*/
            color: #FFFFFF;
            background-color: #999999;
        }
        #footer{
            clear: both;
        }
    ……
</style>

由于float将div从文档流中脱离,我们给footer添加了清除浮动的效果,使用float脱离文档流时,其他盒子会无视这个元素,但其他盒子内的文本依然会为这个元素让出位置,环绕在周围。而对于使用absolute,positioning脱离文档流的元素,其他盒子与其他盒子内的文本都会无视它。更多关于清除浮动的问题会在后面写一篇文章专门介绍。

未添加清除浮动的效果如下图,可以看出,footer这个盒子虽然无视了浮动的元素,但是盒子中的文本还是为浮动的元素让出了位置。

添加清除浮动的效果如下图:

但是我们发现底部的外边距却没有了,这是由于container中元素浮动导致container的高度为0,并没有自适应,如下图:

我们对container清除浮动

<style type="text/css">
    ……
    /*
        #footer{
                clear: both;
            }
    */
    #container:after{
        display: block;
        visibility: hidden;
        font-size: 0;
        line-height: 0;
        clear: both;
        content: "";
    }
</style>

更多关于清除浮动的问题会在后面写一篇文章专门介绍。

此时的效果如下图:

这个时候两列好像是没什么问题了,但是,两列不是等高啊。如果我们将mainBox的宽度增加,会发现出现错位现象:

由此可见,两列定宽的布局方式一个前提要求是,两列的盒模型宽度相加不能超过父级元素的宽度,否则会导致页面发生错位。
如果我们将外边距设置成负值,可以修复这个问题

<style type="text/css">
    ……
    .sideBox{
        float: right;
        width: 270px;
        color: #FFFFFF;
        background-color: #999999;
        margin-left: -100px;
    }
    ……
</style>

如下图所示:

侧边栏回到了原来的位置,(是不是很神奇 O(∩_∩)O)但覆盖了主要内容区域,这并不是我们想要的效果,于是我们利用两列自适应结构来满足我们的要求。

二、两列自适应结构


两列自适应的页面布局方式其实将宽度属性以百分比的形式计算,但该宽度并不是盒模型的总宽度,而是盒模型的内容区域的宽度。

<style type="text/css">
        *{
            padding: 0;
            margin: 0;
        }
        #header, #footer{
            width: 100%;
            height: 30px;
            background-color: #E8E8E8;
        }
        #container{
            margin: 10px 0px;
        }
        .mainBox{
            float: left;
            width: 70%;
            color: #FFFFFF;
            background-color: #333333;
        }
        .sideBox{
            float: right;
            width: 30%;
            color: #FFFFFF;
            background-color: #999999;
            margin-left: -100px;
        }
        #container:after{
            display: block;
            visibility: hidden;
            font-size: 0;
            line-height: 0;
            clear: both;
            content: "";
        }
    </style>

这样就得到我们想要的结果了,具体效果如下:

两页布局就先介绍到这里,今天实在是没时间,就把文章分成两部分,明天填第二部分的坑。先这样吧 ↖(^ω^)↗
ps:昨晚网络出了点问题,今天上午才传上来