三栏式布局(所谓的圣杯和双飞翼)

×

目录

[1]float [2]absolute [3]flex[4]总结

前面的话

  常常听说圣杯布局和双飞翼布局,以为是两个很高级的语汇。但实际上,他们只是三栏式布局的两种布局方法而已。本文将介绍三栏式布局的3种思路

思路一: float

【1】圣杯布局

  圣杯布局使用float、负margin和relative,不需要添加额外标签。.main元素设置padding,为两侧定宽元素留出位置。内容元素设置100%宽度,占据中间位置。而两侧定宽元素通过设置负margin和relative的偏移属性配合,到达相应位置

  缺点: 并没有实现等高布局;使用了相对定位,扩展性不好

<style>
body,p{margin: 0;}
.top,.bottom{
    height: 30px;
}
.middle{
    padding: 0 120px;
    overflow: hidden;
}
.main{
    width: 100%;
    float: left;
}
.left,.right{
    float: left;
    width: 100px;
    position: relative;
}
.left{
    margin-left: -100%;
    left: -120px;
}
.right{
    margin-left: -100px;
    right: -120px;
}
</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="main" style="background-color: lightcoral;">
            <p>main</p>
            <p>main</p>
        </div>
        <div class="left" style="background-color: orange;">
            <p>left</p>
        </div>
        <div class="right" style="background-color: lightsalmon;">
               <p>right</p>
        </div>
    </div>
    <div class="bottom" style="background-color: lightgreen;">
        <p>bottom</p>
    </div>
</div>

【2】双飞翼布局

  双飞翼布局在圣杯布局的基础上,通过为.main元素外添加一层div结构,不使用相对定位。在.main元素上设置margin。两侧的定宽列通过负margin来占据.main元素的margin区域

  缺点: 并没有实现等高布局,增加了html结构

<style>
body,p{margin: 0;}
.top,.bottom{height: 30px;}
.middle{overflow: hidden;}
.mainWrap{
    width: 100%;
    float: left;
}
.main{margin: 0 120px;}
.left,.right{
    float: left;
    width: 100px;
}
.left{margin-left: -100%;}
.right{margin-left: -100px;}
</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="mainWrap">
            <div class="main" style="background-color: lightcoral;">
                <p>main</p>
                <p>main</p>
            </div>
        </div>
        <div class="left" style="background-color: orange;">
            <p>left</p>
        </div>
        <div class="right" style="background-color: lightsalmon;">
               <p>right</p>
        </div>
    </div>
    <div class="bottom" style="background-color: lightgreen;">
        <p>bottom</p>
    </div>
</div>

【3】float + box-sizing + background-clip

  .main元素的border区域为两侧定宽列的所在区域,实现伪等高效果;设置.main的padding和background-clip来实现元素间隔。两侧元素通过负margin调整到.main元素的border区域

  缺点: 兼容性不好

<style>
body,p{margin: 0;}
.top,.bottom{height: 30px;}
.middle{overflow: hidden;}
.main{
    float: left;
    width: 100%;
    border-left: 100px solid lightgrey;
    border-right: 100px solid lightgrey;
    padding: 0 20px;
    background-clip: content-box;
    box-sizing: border-box;
}
.left,.right{
    float: left;
    width: 100px;
}
.left{margin-left: -100%;}
.right{margin-left: -100px;}
</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="main" style="background-color: lightcoral;">
            <p>main</p>
            <p>main</p>
        </div>
        <div class="left" >
            <p>left</p>
        </div>
        <div class="right" >
               <p>right</p>
        </div>
    </div>
    <div class="bottom" style="background-color: lightgreen;">
        <p>bottom</p>
    </div>
</div>

思路二: absolute

  设置子元素的top:0;bottom:0;使得所有子元素的高度都和父元素的高度相同,实现等高效果

  缺点: 需要为.middle元素设置高度,扩展性较差

<style>
body,p{margin: 0;}
.top,.bottom{height: 30px;}
.middle{
    position: relative;
    height: 40px;
}
.left,.right,.main{
    position: absolute;
    top: 0;
    bottom: 0;
}
.left{width: 100px;}
.right{
    width: 100px;
    right: 0;
}
.main{
    left: 120px;
    right: 120px;
}
</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="main" style="background-color: lightcoral;">
            <p>main</p>
            <p>main</p>
        </div>
        <div class="left" style="background-color: lightseagreen;" >
            <p>left</p>
        </div>
        <div class="right" style="background-color: lightcyan;" >
               <p>right</p>
        </div>
    </div>
    <div class="bottom" style="background-color: lightgreen;">
        <p>bottom</p>
    </div>
</div>

思路三: flex

  flex中的伸缩项目默认都拉伸为父元素的高度,可实现等高效果。通过改变伸缩项目的order,可以实现元素顺序调换的效果

  缺点: 兼容性不高

<style>
body,p{margin: 0;}
.top,.bottom{height: 30px;}
.middle{display: flex;}
.left,.right{width: 100px;}
.right{order: 2;}
.main{
    order: 1;
    flex: 1;
    margin: 0 20px;
}
</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="main" style="background-color: lightcoral;">
            <p>main</p>
            <p>main</p>
        </div>
        <div class="left" style="background-color: lightseagreen;" >
            <p>left</p>
        </div>
        <div class="right" style="background-color: lightcyan;" >
               <p>right</p>
        </div>
    </div>
    <div class="bottom" style="background-color: lightgreen;">
        <p>bottom</p>
    </div>
</div>

总结

  由于限定了主要内容元素在html结构中位于前面,通过css样式改变将其位置调换到中间的前提,所以思路并不是很多。float浮动流的元素可以通过负margin调换位置;absolute绝对定位流的元素可以通过偏移属性调换位置;flex弹性盒模型可以通过order属性调换位置。而处于正常流中的元素除了使用relative外,使用负margin是无法调换位置的,所以table、inline-block等布局方式在此前提下不是很实用。

时间: 2024-08-02 06:57:49

三栏式布局(所谓的圣杯和双飞翼)的相关文章

三栏式布局的实现&amp;&amp; position的应用&amp;&amp;清除移动的含义

网页中各个元素的布局,一般是根据文档流自上而下进行布置.如果想要实现一些独特的布局,则需要进行相应的CSS设置.(position , margin , padding ,float ) 网络上流传的布局方案,一般都涉及 清除浮动 . 所以这又是什么含义,怎么实现呢? |--Position--| position: static | relative | absolute | sticky | fixed |position主要有这些选项.除了static 之外,其余的选项 都需要 附加相关属

三栏式布局

本文来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com 地址:http://www.zhangxinxu.com/wordpress/?p=370 我熟知的三种三栏网页宽度自适应布局方法 一.前言 在如今各个分辨率显示器N足鼎立的时期,页面采用流动性布局(亦可称自适应布局)不失为一个好选择.当然,具体实现不是那么容易,需要一定的css功力和实践经验.本文不讲细节,只讲外部的自适应架构,这也是实现整个页面自适应的前提.目前为止,我所熟知的左中右三栏宽度自适应于浏览器的方

css的经典三栏式布局

今天上百度前端技术学院的做任务巩固基础,之前做了两个比较复杂的页面,总觉得自己有时好有时差,于是决定从基础任务开始从新做一遍查缺补漏. 第一个任务是实现一个三栏布局,外部的两栏固定宽度,中间自适应,以下是效果图: 我自己采用了两种布局方式: 首先是:浮动float css代码: .team-inf{  //左边栏的宽为固定宽200px float: left; width: 200px; } .logo-group{   //右边栏的宽为固定宽120px float: right; paddin

三种方法实现三栏式布局

布局说明: 实现左右栏固定宽度,中间栏自适应的宽度. 如下图1所示: 方式一:圣杯布局 圣杯布局结构如下: <div> <article class="main"></article> <aside class="left"></aside> <aside class="right"></aside> </div> 圣杯布局样式如下: 1.主体div和

(5)经典三栏式布局

html部分: <body> <div id='main'><div id='middle'></div></div> <div id='left'></div> <div id='right'></div> </body> css部分: <style type='text/css'> html,body{ margin:0; height:100%; } #main{ he

宽度自适应三栏的布局方式

1.绝对定位法(最易理解)左右两栏采用绝对定位,分别固定于页面的左右两侧,中间的主体栏用左右margin值撑开距离.于是实现了三栏自适应布局. 1 html,body{margin:0; height:100%;} 2 #left,#right{position:absolute; top:0; width:200px; height:100%;} 3 #left{left:0; background:#a0b3d6;} 4 #right{right:0; background:#a0b3d6;

用CSS制作三栏液态布局

下面是CSS代码: body {     margin: 0px;     padding: 0px;}div#header {     clear: both;     height: 50px;     background-color: aqua;     padding: 1px;}div#left {     float: left;     width: 150px;     background-color: red;}div#right {     float: right;  

三栏自适应布局

常用的有三种方式: 1.绝对定位法(最易理解) 左右两栏采用绝对定位,分别固定于页面的左右两侧,中间的主体栏用左右margin值撑开距离.于是实现了三栏自适应布局. 1 <html> 2 3 <head> 4 5 <title>三栏自适应布局</title> 6 7 <style type="text/css"> 8 9 html,body{ 10 11 margin:0; 12 13 height:100%; 14 15 }

两栏三栏自适应布局

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> html,body{width:100%;height:100%;overflow:hidden;} html{_height:auto;_padd