• 两列布局,读《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{960px; }
            .mainbox{600px;float:left;background:green;}
            .sidebox{360px;float:right;background:red;}
            .footer{background:yellow;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>
    
    
    
     
     
     
  • 相关阅读:
    【Vue】详解Vue生命周期
    千万不要用window自带文本编辑器编辑配置文件或者代码
    [其它]iOS 13 正式版发布 iPhone 6s或更新型号均可升级
    [转]解决ubuntu16.04 ‘E: 无法获得锁 /var/lib/dpkg/lock-frontend
    [golang]使用gomail发邮件(在Go中发送电子邮件的最佳方式)
    [golang]按图片中心旋转后的新图左顶点和原图左顶点的偏移量计算
    分布式CAP定理,为什么不能同时满足三个特性?
    Java如何运行一个class文件的main方法
    数据库的四大特性以及四个隔离级别和引发的问题
    Redis为什么可以支持那么大的并发访问量?为什么redis没有单点并发瓶颈?
  • 原文地址:https://www.cnblogs.com/shenfangfang/p/4955463.html
Copyright © 2020-2023  润新知