美文网首页我爱编程
实现两边定宽,中间自适应

实现两边定宽,中间自适应

作者: lvyweb | 来源:发表于2018-06-21 10:17 被阅读47次

    标签(空格分隔): css


    圣杯布局和双飞翼布局、flex布局

    定义

    圣杯布局(双飞翼布局):两边定宽,中间宽度自适应;且优先渲染中间主题内容部分

    区别:圣杯布局和双飞翼布局基本上是一致的,都是两边固定宽度,中间自适应的三栏布局,其中,中间栏放到文档流前面,保证先行渲染。解决方案大体相同,都是三栏全部float:left浮动,区别在于解决中间栏div的内容不被遮挡上,圣杯布局是中间栏在添加相对定位,并配合left和right属性,效果上表现为三栏是单独分开的(如果可以看到空隙的话),而双飞翼布局是在中间栏的div中嵌套一个div,内容写在嵌套的div里,然后对嵌套的div设置margin-left和margin-right,效果上表现为左右两栏在中间栏的上面,中间栏还是100%宽度,只不过中间栏的内容通过margin的值显示在中间。

    1、圣杯布局

    DOM结构:
    由于需要优先渲染主题内容部分,因此在DOM结构中需要将其写在左右侧边栏之前。

     <body>
        <div id="hd">header</div>
        <div id="bd">
          <div id="middle">middle</div>
          <div id="left">left</div>
          <div id="right">right</div>
        </div>
        <div id="footer">footer</div>
    </body>
        
    

    CSS:

    <style>
    #hd{
        height:50px;
        background: #666;
        text-align: center;
    }
    #bd{
        /*左右栏通过添加负的margin放到正确的位置了,此段代码是为了摆正中间栏的位置*/
        padding:0 200px 0 180px;
        height:100px;
    }
    #middle{
        float:left;
        width:100%;/*左栏上去到第一行*/
        height:100px;
        background:blue;
    }
    #left{
        float:left;
        width:180px;
        height:100px;
        margin-left:-100%;
        background:#0c9;
        /*中间栏的位置摆正之后,左栏的位置也相应右移,通过相对定位的left恢复到正确位置*/
        position:relative;
        left:-180px;
    }
    #right{
        float:left;
        width:200px;
        height:100px;
        margin-left:-200px;
        background:#0c9;
        /*中间栏的位置摆正之后,右栏的位置也相应左移,通过相对定位的right恢复到正确位置*/
        position:relative;
        right:-200px;
    }
    #footer{
        height:50px;
        background: #666;
        text-align: center;
    }
    </style>    
    

    全部代码:

    <!DOCTYPE html>
    <meta charset=utf-8>
    <html>
    <head>
        <title>圣杯布局</title>
        <style type="text/css">
            #hd{
                height:50px;
                background: #666;
                text-align: center;
            }
            #bd{
                /*左右栏通过添加负的margin放到正确的位置了,此段代码是为了摆正中间栏的位置*/
                padding:0 200px 0 180px;
                height:100px;
            }
            #middle{
                float:left;
                width:100%;/*左栏上去到第一行*/
                height:100px;
                background:blue;
            }
            #left{
                float:left;
                width:180px;
                height:100px;
                margin-left:-100%;
                background:#0c9;
                /*中间栏的位置摆正之后,左栏的位置也相应右移,通过相对定位的left恢复到正确位置*/
                position:relative;
                left:-180px;
            }
            #right{
                float:left;
                width:200px;
                height:100px;
                margin-left:-200px;
                background:#0c9;
                /*中间栏的位置摆正之后,右栏的位置也相应左移,通过相对定位的right恢复到正确位置*/
                position:relative;
                right:-200px;
            }
            #footer{
                height:50px;
                background: #666;
                text-align: center;
            }
                </style>
    </head>
    <body>
    
       <div id="bd">
            <div id="middle">middle</div>
            <div id="left">left</div>
            <div id="right">right</div>
        </div>
    
    </body>
    </html>
    

    2、双飞翼布局

    DOM结构

    <body>
    <div id="hd">header</div> 
      <div id="middle">
        <div id="inside">middle</div>
      </div>
      <div id="left">left</div>
      <div id="right">right</div>
      <div id="footer">footer</div>
    </body>
    

    双飞翼布局是在middle的div里又插入一个div,通过调整内部div的margin值,实现中间栏自适应,内容写到内部div中。

    CSS

    <style>
    #hd{
        height:50px;
        background: #666;
        text-align: center;
    }
    #middle{
        float:left;
        width:100%;/*左栏上去到第一行*/     
        height:100px;
        background:blue;
    }
    #left{
        float:left;
        width:180px;
        height:100px;
        margin-left:-100%;
        background:#0c9;
    }
    #right{
        float:left;
        width:200px;
        height:100px;
        margin-left:-200px;
        background:#0c9;
    }
    
    /*给内部div添加margin,把内容放到中间栏,其实整个背景还是100%*/ 
    #inside{
        margin:0 200px 0 180px;
        height:100px;
    }
    #footer{  
       clear:both; /*记得清楚浮动*/  
       height:50px;     
       background: #666;    
       text-align: center; 
    } 
    </style>
    

    全部代码

    <!DOCTYPE html>
    <meta charset=utf-8>
    <html>
    <head>
        <title>双飞翼</title>
        <style>
    #hd{
        height:50px;
        background: #666;
        text-align: center;
    }
    #middle{
        float:left;
        width:100%;/*左栏上去到第一行*/     
        height:100px;
        background:blue;
    }
    #left{
        float:left;
        width:180px;
        height:100px;
        margin-left:-100%;
        background:#0c9;
    }
    #right{
        float:left;
        width:200px;
        height:100px;
        margin-left:-200px;
        background:#0c9;
    }
    
    /*给内部div添加margin,把内容放到中间栏,其实整个背景还是100%*/ 
    #inside{
        margin:0 200px 0 180px;
        height:100px;
    }
    #footer{  
       clear:both; /*记得清楚浮动*/  
       height:50px;     
       background: #666;    
       text-align: center; 
    } 
    </style>
    </head>
    <body>
    <div id="hd">header</div> 
      <div id="middle">
        <div id="inside">middle</div>
      </div>
      <div id="left">left</div>
      <div id="right">right</div>
      <div id="footer">footer</div>
    </body>
    </html>
    

    3、弹性盒模型法

    整个页面布局由两个弹性盒模型构成:

    1. body作为盒子,header、main、footer按垂直方向排列,上下设置定高之后中间设置flex=1自动填满剩余高度。
    2. main作为盒子,left、middle、right按水平方向排列(默认),左右设置定宽后中间设置flex=1自动填满剩余宽度。
    3. 设置order=-1将左侧边栏拉到主体内容之前。
    <!DOCTYPE html>
    <meta charset=utf-8>
    <html>
    <head>
        <title>弹性盒模型法</title>
        <style type="text/css">
            body {
                display: flex;
                min-height: 100vh;
                flex-direction: column;
            }
            main {
                display: flex;
                flex: 1;
            }
            .middle {
                flex: 1;
                background-color: skyblue;
            }
            .left,
            .right {
                flex-basis: 200px;
                background-color: pink;
            }
            .left {
                order: -1;
            }
    
        </style>
    </head>
    <body>
    
        <main>
            <div class="middle">middle</div>
            <aside class="left">left</aside>
            <aside class="right">right</aside>
        </main>
    
    </body>
    </html>
    

    相关文章

      网友评论

        本文标题:实现两边定宽,中间自适应

        本文链接:https://www.haomeiwen.com/subject/umcqyftx.html