zoukankan      html  css  js  c++  java
  • CSS全屏布局的6种方式

    前面的话

      全屏布局在实际工作中是很常用的,比如管理系统、监控平台等。本文将介绍关于全屏布局的6种思路

    float

    【1】float + calc

      通过calc()函数计算出.middle元素的高度,并设置子元素高度为100%

    <style>
    body,p{margin: 0;}
    body,html,.parent{height: 100%;}
    .middle{
        overflow: hidden;
        height: calc(100% - 100px);
    }
    .left{
        float: left;
        width: 100px;
        margin-right: 20px;
        height: 100%;
    }
    .right{
        overflow: auto;
        height: 100%;
    }
    .right-in{
        height: 1000px;
    }
    .top,.bottom{height:50px;}
    </style>
    <div class="parent" id="parent" style="background-color: lightgrey;">
        <div class="top" style="background-color: lightblue;">
            <p>top</p>
        </div>  
        <div class="middle" style="background-color: pink;">
            <div class="left" style="background-color: orange;">
                <p>left</p>
            </div>
            <div class="right" style="background-color: lightsalmon;">
                <div class="right-in">
                    <p>right</p>
                </div>
            </div>
        </div>          
        <div class="bottom" style="background-color: lightgreen;">
            <p>bottom</p>
        </div>        
    </div>

    【2】float + absolute + (fix)

      通过增加结构来提高兼容性,.middle元素设置100%的高度,.top和.bottom设置absolute覆盖在.middle上

    <style>
    body,p{margin: 0;}
    body,html,.parent{height: 100%;}
    .top,.bottom{
        position: absolute;
        height:50px;
        left: 0;
        right: 0;
    }
    .top{top: 0;}
    .bottom{bottom: 0;}
    .middleWrap{
        height: 100%;
        overflow: hidden;
    }
    .middle{
        overflow: hidden;
        height: 100%;
        margin: 50px 0;
    }
    .left{
        float: left;
        width: 100px;
        margin-right: 20px;
        height: 100%;
    }
    .right{
        overflow: auto;
        height: 100%;
    }
    .right-in{
        height: 1000px;
    }
    </style>
    <div class="parent" id="parent" style="background-color: lightgrey;">
        <div class="top" style="background-color: lightblue;">
            <p>top</p>
        </div>  
        <div class="middleWrap">
            <div class="middle" style="background-color: pink;">
                <div class="left" style="background-color: orange;">
                    <p>left</p>
                </div>
                <div class="right" style="background-color: lightsalmon;">
                    <div class="right-in">
                        <p>right</p>
                    </div>
                </div>
            </div>        
        </div> 
        <div class="bottom" style="background-color: lightgreen;">
            <p>bottom</p>
        </div>        
    </div>

    inline-block

    【1】inline-block + calc

    <style>
    body,p{margin: 0;}
    body,html,.parent{height: 100%;}
    .middle{
        height: calc(100% - 100px);
        font-size: 0;
    }
    .left,.right{
        display: inline-block;
        vertical-align: top;
        font-size: 16px;
    }
    .left{
        width: 100px;
        margin-right: 20px;
        height: 100%;
    }
    .right{
        width: calc(100% - 120px);
        height: 100%;
        overflow: auto;
    }
    .right-in{
        height: 1000px;
    }
    .top,.bottom{height: 50px;}
    </style>
    <div class="parent" id="parent" style="background-color: lightgrey;">
        <div class="top" style="background-color: lightblue;">
            <p>top</p>
        </div>  
        <div class="middle" style="background-color: pink;">
            <div class="left" style="background-color: orange;">
                <p>left</p>
            </div>
            <div class="right" style="background-color: lightsalmon;">
                <div class="right-in">
                    <p>right</p>
                </div>
            </div>
        </div>        
        <div class="bottom" style="background-color: lightgreen;">
            <p>bottom</p>
        </div>        
    </div>

    【2】inline-block + absolute + (fix)

    <style>
    body,p{margin: 0;}
    body,html,.parent{height: 100%;}
    .top,.bottom{
        position: absolute;
        left: 0;
        right: 0;
        height: 50px;
    }
    .top{top: 0;}
    .bottom{bottom: 0;}
    .middleWrap{
        height: 100%;
        font-size: 0;
        overflow: hidden;
    }
    .middle{
        position: relative;
        height: 100%;
        margin: 50px 0;
        overflow: hidden;
    }
    .left,.rightWrap{
        display: inline-block;
        vertical-align: top;
        font-size: 16px;
    }
    .left{
        position: absolute;
        width: 100px;
        margin-right: 20px;
        height: 100%;
    }
    .rightWrap{
        width: 100%;
        height: 100%;
    }
    .right{
        height: 100%;
        margin-left: 120px;
        overflow: auto;
    }
    .right-in{
        height: 1000px;
    }
    </style>
    <div class="parent" id="parent" style="background-color: lightgrey;">
        <div class="top" style="background-color: lightblue;">
            <p>top</p>
        </div>  
        <div class="middleWrap">
            <div class="middle" style="background-color: pink;">
                <div class="left" style="background-color: orange;">
                    <p>left</p>
                </div>
                <div class="rightWrap">
                    <div class="right" style="background-color: lightsalmon;">
                        <div class="right-in">
                            <p>right</p>
                        </div>
                    </div>                
                </div>
            </div>         
        </div>
        <div class="bottom" style="background-color: lightgreen;">
            <p>bottom</p>
        </div>        
    </div>

    table

      水平方向子元素的间距可以用border实现。所有浏览器都不支持给table-cell元素设置overflow属性。firefox和IE11浏览器不支持给table-cell元素的设置100%高度的子元素设置overflow属性

    <style>
    body,p{margin: 0;}
    body,html,.parent{height: 100%;}
    .top,.bottom{
        position: absolute;
        width: 100%;
        height: 50px;
    }
    .bottom{bottom: 0;}
    .middleWrap{
        height: 100%;
        overflow: hidden;
    }
    .middle{
        width: 100%;
        height: 100%;
        display: table;    
        margin: 50px 0;
        table-layout: fixed;
    }
    .left{
        display: table-cell;
        width: 120px;
        border-right: 20px solid lightgray;
    }
    .rightWrap{
        display: table-cell;
        height: 100%;
    }
    .right{
        height: 100%;
        overflow: auto;
    }
    .right-in{
        height: 1000px;
    }
    </style>
    <div class="parent" id="parent" style="background-color: lightgrey;">
        <div class="top" style="background-color: lightblue;">
            <p>top</p>
        </div> 
        <div class="middleWrap">
            <div class="middle" style="background-color: pink;">
                <div class="left" style="background-color: orange;">
                    <p>left</p>
                </div>     
                <div class="rightWrap">
                    <div class="right" style="background-color: lightsalmon;">
                        <div class="right-in">
                            <p>right</p>
                        </div>            
                    </div>                    
                </div>   
            </div>         
        </div>    
        <div class="bottom" style="background-color: lightgreen;">
            <p>bottom</p>
        </div>        
    </div>

    absolute

    <style>
    body,p{margin: 0;}
    body,html,.parent{height: 100%;}
    .top,.middle,.bottom{
        position: absolute;
        left: 0;
        right: 0;
    }
    .top{
        top: 0;
        height: 50px;
    }
    .bottom{
        bottom: 0;
        height: 50px;
    }
    .middle{
        top: 50px;
        bottom: 50px;
    }
    .left,.right{
        position: absolute;
        top: 0;
        bottom: 0;
    }
    .left{
        width:100px;
    }
    .right{
        left: 120px;
        right: 0;
        overflow: auto;
    }
    .right-in{
        height: 1000px;
    }
    </style>
    <div class="parent" id="parent" style="background-color: lightgrey;">
        <div class="top" style="background-color: lightblue;">
            <p>top</p>
        </div> 
        <div class="middle" style="background-color: pink;">
            <div class="left" style="background-color: orange;">
                <p>left</p>
            </div>     
            <div class="right" style="background-color: lightsalmon;">
                <div class="right-in">
                    <p>right</p>
                </div>            
            </div>                    
        </div>              
        <div class="bottom" style="background-color: lightgreen;">
            <p>bottom</p>
        </div>        
    </div>

    flex

      flex常用于小范围的布局,使用全屏布局时会因为性能问题,出现卡顿现象。如果要使用全屏自适应布局,则只有flex才能达到效果

    <style>
    body,p{margin: 0;}
    body,html,.parent{height: 100%;}
    .parent{
        display: flex;
        flex-direction: column;
    }
    .top,.bottom{
        height: 50px;
    }
    .middle{
        display: flex;
        flex: 1;
    }
    .left{
        width: 100px;
        margin-right: 20px;
    }
    .right{
        flex: 1;
        overflow: auto;
    }
    .right-in{
        height: 1000px;
    }
    </style>
    <div class="parent" id="parent" style="background-color: lightgrey;">
        <div class="top" style="background-color: lightblue;">
            <p>top</p>
        </div> 
        <div class="middle" style="background-color: pink;">
            <div class="left" style="background-color: orange;">
                <p>left</p>
            </div>     
            <div class="right" style="background-color: lightsalmon;">
                <div class="right-in">
                    <p>right</p>
                </div>            
            </div>                    
        </div>              
        <div class="bottom" style="background-color: lightgreen;">
            <p>bottom</p>
        </div>        
    </div>

    grid

    <style>
    body,p{margin: 0;}
    body,html,.parent{height: 100%;}
    .parent{
        display: grid;
        grid-template-rows:50px auto 50px;
    }
    .middle{
        overflow:hidden;
        display:grid;
        grid-template-columns: 100px 1fr;
        grid-gap:20px;
    }
    .right{
        overflow:auto;
    }
    .right-in{
        height: 1000px;
    }
    </style>
    <div class="parent" id="parent" style="background-color: lightgrey;">
        <div class="top" style="background-color: lightblue;">
            <p>top</p>
        </div> 
        <div class="middle" style="background-color: pink;">
            <div class="left" style="background-color: orange;">
                <p>left</p>
            </div>     
            <div class="right" style="background-color: lightsalmon;">
                <div class="right-in">
                    <p>right</p>
                </div>            
            </div>                    
        </div>              
        <div class="bottom" style="background-color: lightgreen;">
            <p>bottom</p>
        </div>        
    </div>

    总结

      全屏布局实际上就是两列三列自适应布局的扩展形式。由于实现的是全屏效果,高度实际上是固定的,所以思路并没有等高布局局限。水平方向元素之间的间距根据实际情况使用margin、padding、border都可以实现

  • 相关阅读:
    关于mui的主页面、子页面、页面跳转
    设计图片反复闪,点击后停止(设计定时器)
    购物车+支付宝
    登陆判读,并跳转到指定页面(window.location.href='http://localhost/index.html')
    template.js遍历对象的写法
    jqurey的跨域使用getjson(http://www.jb51.net/Special/894.htm)
    安装sass并ruby更改淘宝镜像
    Y君面试记
    MapReduce 阅读笔记
    安全感
  • 原文地址:https://www.cnblogs.com/xiaohuochai/p/5458068.html
Copyright © 2011-2022 走看看