两列布局,读《css那些事儿》

两列布局:

1、两列定宽:

要点:float、width固定、 :after清除浮动。

前提:两列的盒模型宽度相加不能大于父元素的宽度,否则会出现错位现象。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <!--  要点:float、width固定、 :after清除浮动。
          前提:两列的盒模型宽度相加不能大于父元素的宽度,否则会出现错位现象。--
    <style type="text/css">
        *{padding:0;margin:0;}
        .container{width:960px; }
        .mainbox{width:600px;float:left;background:green;}
        .sidebox{width:360px;float:right;background:red;}
        .footer{background:yellow;width:960px;}
        .container:after {
            display:block;
            visibility:hidden;
            font-size:0;
            line-height:0;
            clear:both;
            content:"";
        }
    </style>
</head>
<body>
<div class="container">
    <div class="sidebox" id="sidebox">
        <h1> sidebox</h1>
        <p>春眠不觉晓</p>
        <p>处处闻啼鸟</p>
        <p>夜来风雨声</p>
        <p>花落知多少</p>
    </div>
    <div class="mainbox" id="mainbox">
        <h1> mainox</h1>
        <p>春眠不觉晓</p>
        <p>处处闻啼鸟</p>
    </div>
</div>
<div class="footer">
    <h1>footer</h1>
</div>

</body>
</html>

两列定宽 

2、两列宽度自适应 

要点:float、width百分比、 :after清除浮动。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <!--  要点:float、width百分比、 :after清除浮动。-->
    <style type="text/css">
        *{padding:0;margin:0;}
        .container {
            width: 100%;
            background-color: black;
            margin: 0 auto;
        }
        .mainbox {
            width: 60%;
            background-color: deepskyblue;
            float: left;
        }

        .sidebox {
            width: 40%;
            background-color: palevioletred;
            float: right;
        }
        .footer {
            background-color: green;
        }
        /*使用伪类的方法清除浮动对footer造成的影响*/
        .container:after{
            content:"";
            font-size:0;
            line-height:0;
            display:block;
            visibility:hidden;
            clear:both;
        }
    </style>
</head>
<body>
<div class="container">
    <div class="mainbox">
       <h1> mainbox</h1>
        <p>春眠不觉晓</p>
        <p>处处闻啼鸟</p>
        <p>夜来风雨声</p>
        <p>花落知多少</p></div>
    <div class="sidebox"><h1>sidebar</h1>
        <p>春眠不觉晓</p>
        <p>处处闻啼鸟</p>
        <p>夜来风雨声</p>
        <p>花落知多少</p></div>
</div>
<div class="footer"><h1>footer</h1></div>
</body>
</html>

两列自适应

3、左侧定宽,右侧自适应

  要点:浮动、定位、负边距效果 :after清除浮动:

 问题:当sideBox的内容很多时,使用绝对定位导致无法撑开父元素的高度,而且会覆盖其他元素的内容。解决方案是使用javascript重新判断父元素的高度来解决-->

    <!-- 左侧定宽,右侧自适应,
    1、左侧设置固定宽度,右侧设置宽度为100%(宽度不能设置为auto,必须设置为100%),
    2、左右侧分别设置浮动。
    3、设置包裹块为相对定位position:relative,左侧为绝对定位position:absolute,定位位置为left:0;top:0 (注意是定宽的列设置定位)
    4、右侧设置margin-right为负值,值等于左侧固定宽度值
    -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <!-- 要点:浮动、定位、负边距效果 :after清除浮动:
    问题:当sideBox的内容很多时,使用绝对定位导致无法撑开父元素的高度,而且会覆盖其他元素的内容。解决方案是使用javascript重新判断父元素的高度来解决-->

    <!-- 左侧定宽,右侧自适应,
    1、左侧设置固定宽度,右侧设置宽度为100%(宽度不能设置为auto,必须设置为100%),
    2、左右侧分别设置浮动。
    3、设置包裹块为相对定位position:relative,左侧为绝对定位position:absolute,定位位置为left:0;top:0 (注意是定宽的列设置定位)
    4、右侧设置margin-right为负值,值等于左侧固定宽度值
    -->
    <style type="text/css">

        *{padding:0;margin:0;}
        .container{position:relative;}
        .sidebox{width:200px;background:red;position:absolute;left:0;top:0;}
        .mainbox{width:100%;float:right;margin-right:-200px;background:green;}
        .footer{background:yellow;}
        .container:after {
            display:block;
            visibility:hidden;
            font-size:0;
            line-height:0;
            clear:both;
            content:"";
        }
    </style>
</head>
<body>
<div class="container">
    <div class="sidebox" id="sidebox">
        <h1> sidebox</h1>
        <p>春眠不觉晓</p>
        <p>处处闻啼鸟</p>
        <p>夜来风雨声</p>
        <p>花落知多少</p>
    </div>
    <div class="mainbox" id="mainbox">
        <h1> mainox</h1>
        <p>春眠不觉晓</p>
        <p>处处闻啼鸟</p>
 </div>

</div>
<div class="footer">
    <h1>footer</h1>
</div>

<!--增加js代码实现两列等高-->
<script type="text/javascript">
    var mh = document.getElementById('mainbox');
    var sh = document.getElementById('sidebox');
    if (mh.clientHeight < sh.clientHeight)
    {
        mh.style.height = sh.clientHeight + "px";
    } else {
        sh.style.height = mh.clientHeight + "px";
    }
</script>
</body>
</html>

左侧定宽,右侧自适应

4、左侧自适应,右侧定宽

要点:浮动、定位、负边距效果 :after清除浮动:

问题:当sideBox的内容很多时,使用绝对定位导致无法撑开父元素的高度,而且会覆盖其他元素的内容。解决方案是使用javascript重新判断父元素的高度来解决

    <!--
    左侧自适应,右侧定宽.
    1、右侧设置固定宽度,左侧设置宽度为100%(宽度不能设置为auto,必须设置为100%),
    2、左右侧分别设置浮动。
    3、设置包裹块为相对定位position:relative,右侧为绝对定位position:absolute,定位位置为left:0;top:0 (注意是定宽的列设置定位)
    4、左侧设置margin-right:200px,距离右侧留有200px空白; 右侧设置margin-left:-200px,设置负边距使sidebox向左侧浮动缩进; -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <!--要点:浮动、定位、负边距效果 :after清除浮动:
    问题:当sideBox的内容很多时,使用绝对定位导致无法撑开父元素的高度,而且会覆盖其他元素的内容。解决方案是使用javascript重新判断父元素的高度来解决-->
    <!--
    左侧自适应,右侧定宽.
    1、右侧设置固定宽度,左侧设置宽度为100%(宽度不能设置为auto,必须设置为100%),
    2、左右侧分别设置浮动。
    3、设置包裹块为相对定位position:relative,右侧为绝对定位position:absolute,定位位置为left:0;top:0 (注意是定宽的列设置定位)
    4、左侧设置margin-right:200px,距离右侧留有200px空白; 右侧设置margin-left:-200px,设置负边距使sidebox向左侧浮动缩进; -->
    <style type="text/css">
        *{padding:0;margin:0;}
        .container{position:relative;}
        .mainbox{width:100%;float:left;background:green;margin-right:200px;}
        .sidebox{width:200px;background:red;margin-left:-200px;position:absolute;right:0;top:0;}
        .footer{background:yellow;}
        .container:after {
               display:block;
               visibility:hidden;
               font-size:0;
               line-height:0;
               clear:both;
               content:"";
           }
    </style>
</head>
<body>
<div class="container">
    <div class="sidebox" id="sidebox">
        <h1> sidebox</h1>
        <p>春眠不觉晓</p>
        <p>处处闻啼鸟</p>
        <p>夜来风雨声</p>
        <p>花落知多少</p>
    </div>
    <div class="mainbox" id="mainbox">
        <h1> mainox</h1>
        <p>春眠不觉晓</p>
        <p>处处闻啼鸟</p>
</div>

</div>
<div class="footer">
    <h1>footer</h1>
</div>
<!--增加js代码实现两列等高-->
<script type="text/javascript">
    var mh = document.getElementById('mainbox');
    var sh = document.getElementById('sidebox');
    if (mh.clientHeight < sh.clientHeight)
    {
        mh.style.height = sh.clientHeight + "px";
    } else {
        sh.style.height = mh.clientHeight + "px";
    }
</script>
</body>
</html> 

左侧自适应,右侧定宽

 

 

5、两列优化-一列定宽,一列自适应

要点:浮动、负边距效果、mainbox增加内容div并设置margin、:after清除浮动、js实现等高

原理:是mainbox的浮动并将其宽度设置为100%,将其中的.content设置默认宽度值(auto),margin右所留的空白等于sidebox宽度,再利用负边距原理将侧边栏“引”到主要内容的两边。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <!--
      要点:浮动、负边距效果、mainbox增加内容div并设置margin、:after清除浮动、js实现等高
      原理:是mainbox的浮动并将其宽度设置为100%,将其中的.content设置默认宽度值(auto),margin右所留的空白等于sidebox宽度,再利用负边距原理将侧边栏“引”到主要内容的两边。-->
    <style type="text/css">
        *{padding:0;margin:0;}
        .mainbox{background:#ccc;width:100%;float:left;}
        .mainbox .content{margin:0 210px 0 0;background:red}
        .sidebox{width: 200px;float:left;background:green;margin-left:-200px;}
        .footer{background:yellow}
        .container:after {
            display:block;
            visibility:hidden;
            font-size:0;
            line-height:0;
            clear:both;
            content:"";
        }
    </style>
</head>
<body>
<div class="container" >
    <div class="mainbox" id="mainbox">
        <div class="content">
            <h1> mainbox</h1>
            <p>春眠不觉晓</p>
            <p>处处闻啼鸟</p>
            <p>夜来风雨声</p>
            <p>花落知多少</p>
        </div>
    </div>
    <div class="sidebox" id="sidebox">
        <h1> sidebox</h1>
        <p>春眠不觉晓</p>
        <p>处处闻啼鸟</p>
 </div>
</div>
<div class="footer"><h1>footer底部</h1></div>

<!--增加js代码实现两列等高-->
<script type="text/javascript">
    var mh = document.getElementById('mainbox');
    var sh = document.getElementById('sidebox');
    if (mh.clientHeight < sh.clientHeight)
    {
        mh.style.height = sh.clientHeight + "px";
    } else {
        sh.style.height = mh.clientHeight + "px";
    }
</script>
</body>
</html>

两列优化-一列定宽,一列自适应

6、两列等高:

方法1:负边距

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <!--要点:两容器设置margin-bottom:-9999px; padding-bottom:9999px,父元素设置overflow:hidden;
       问题:如果页面使用<a>做页面跳转,将会隐藏部分文字信息。如果将背景图片放到mainBox或者sideBox底部,将看不到背景图片。
            左侧(非定位)内容高度不能大于右侧(已定位)的内容高度,否则将无法撑开容器的高度
    -->
    <style type="text/css">

        *{padding:0;margin:0;}
        .container{overflow:hidden;position:relative; }
        .mainbox{width:100%;float:left;background:green;margin-right:200px;}
        .sidebox{width:200px;background:red;margin-left:-200px;position:absolute;top:0;right:0; }
        .footer{background:yellow;}

        /*实现左右两侧等高,但要注意的是,左侧(非定位)内容高度不能大于右侧(已定位)的内容高度,否则将无法撑开容器的高度*/
        .mainbox,.sidebox{margin-bottom:-9999px;padding-bottom:9999px;}
    </style>

</head>
<body>
<div class="container">
    <div class="sidebox" id="sidebox">
        <h1> sidebox</h1>
        <p>春眠不觉晓</p>
        <p>处处闻啼鸟</p>
    </div>
    <div class="mainbox" id="mainbox">
        <h1> mainox</h1>
        <p>春眠不觉晓</p>
        <p>处处闻啼鸟</p>
        <p>夜来风雨声</p>
        <p>花落知多少</p>
    </div>

</div>
<div class="footer">
    <h1>footer</h1>
</div>

</body>
</html>


方法2:js实现:
要点:在页面底部增加js代码实现两列等高
<script type="text/javascript">
    var mh = document.getElementById('mainbox');
    var sh = document.getElementById('sidebox');
    if (mh.clientHeight < sh.clientHeight)
    {
        mh.style.height = sh.clientHeight + "px";
    } else {
        sh.style.height = mh.clientHeight + "px";
    }
</script>

 

 
 
 
posted @ 2015-11-11 10:55  昵称你好  阅读(295)  评论(2编辑  收藏  举报