圣杯布局和双飞翼布局解析

圣杯布局和双飞翼布局解决的问题是一样的,就是两边固定宽,中间自适应的三栏布局,中间栏要在放在文档流前面以优先渲染。

  1. 圣杯布局和双飞翼布局解决问题的方案在前一半是相同的,也就是三栏全部float浮动,但左右两栏加上负margin让其跟中间栏div并排,以形成三栏布局。

  2. 不同在于解决”中间栏div内容不被遮挡“问题的思路不一样:见代码后的解析

双飞翼布局还有个好处,让Main变成BFC元素了,屏幕宽度缩小Main也不会被挤下去,圣杯布局就会被挤下去。

圣杯布局的实现过程

双飞翼布局和圣杯布局的对比

CSS布局奇淫巧计之-强大的负边距

圣杯布局和双飞翼布局解析

代码

圣杯布局:

<div class="header">Header</div>
<div class="bd">
    <div class="main">Main</div>
    <div class="left">Left</div>
    <div class="right">Right
    </div>
</div>
<div class="footer">Footer</div>


<style>
    body{padding:0;margin:0}
    .header,.footer{width:100%; background: #666; height:30px; clear:both;}

    .bd{
      /*关键2 为了不被左右挡住 但是加了之后左右栏也缩进来了*/
        padding-left:150px;
        padding-right:190px; 
    }
    .left{
        background: #E79F6D;
        width:150px;
        float:left;
        margin-left:-100%; /*关键1 挪上去 */
        position: relative;
        left:-150px;
       /*关键3  各自相对于自己把自己挪出去,得到最终结果*/

    }
    .main{
        background: #D6D6D6;
        /*中间部分需要根据浏览器宽度的变化而变化,所以要用100%*/
        width:100%;
        float:left;

    }
    .right{
        background: #77BBDD;
        width:190px;
        float:left;
        margin-left:-190px;/*关键1 挪上去*/
        position:relative;
        right:-190px;
        /*关键3 各自相对于自己把自己挪出去,得到最终结果 */
    }
</style>

解析:
1. left 和 right 分别设置 margin-left:-100%和 margin-left:-190px使左右挪上去;
2. 为了不被left 和 right 挡住 ,给.bd加上padding-left:150px;padding-right:190px;
3. 但是左右栏也缩进来了,于是采用相对定位方法,各自相对于自己把自己挪出去

双飞翼布局:

<div class="header">Header</div>
<div class="bd">
    <div class="main">
     /*关键1 加了一层div*/
        <div class="inner">
            Main
        </div>
    </div>
    <div class="left">Left</div>
    <div class="right">Right
    </div>
</div>
<div class="footer">Footer</div>
<style>
        body{padding:0;margin:0}
        .header,.footer{width:100%;  background: #666;height:30px;clear:both;}
        .bd{
             /*关键2 去掉*/
            /*padding-left:150px;*/
            /*padding-right:190px;*/
        }
        .left{
            background: #E79F6D;
            width:150px;
            float:left;
            margin-left:-100%;
            /*关键2 去掉*/
            /*position: relative;*/
            /*left:-150px;*/
        }
        .main{
            background: #D6D6D6;
            width:100%;
            float:left;
        }
        .right{
            background: #77BBDD;
            width:190px;
            float:left;
            margin-left:-190px;
            /*关键2 去掉*/
            /*position:relative;*/
            /*right:-190px;*/
        }
        .inner{
        /*关键3*/
            margin-left:150px;
            margin-right:190px;
        }
    </style>

解析:
1.main内层增加了一个div
2.去掉了左右栏的相对定位,去掉包裹层padding
3.以中间栏新增div的margin代替

<think>好的,我现在需要回答用户关于CSS圣杯布局双飞翼布局的实现方式及区别的问题。首先,我得回忆一下这两种布局的基本概念它们解决的问题。根据用户提供的引用内容,圣杯布局双飞翼布局都是为了实现三栏布局,中间自适应,两侧固定宽度,并且中间栏优先渲染。接下来,我需要整理它们的实现步骤。根据引用[3],圣杯布局双飞翼布局的前半部分相同,都是三栏浮动,利用负边距让左右两栏与中间栏并排。但解决中间内容被遮挡的方法不同。圣杯布局通过父容器的padding相对定位调整左右栏的位置,而双飞翼布局则在中间栏内添加子div,通过margin来腾出空间。然后,我需要对比两者的差异。根据引用[5],圣杯布局使用相对定位负边距,可能会影响有特殊定位需求的左右栏,而双飞翼布局去除了相对定位,改用额外的divmargin,提高了灵活性。此外,代码结构上,双飞翼多了一个div,但减少了CSS属性使用。我还需要检查用户提供的引用内容,确保准确引用。例如,引用[3]提到圣杯布局用了6个CSS属性,而双飞翼用了2个,减少了4个。引用[4]说明圣杯布局对父容器设置padding,而双飞翼在子div中使用margin。最后,考虑用户可能的疑问点,比如为什么中间栏要优先渲染,负边距的作用,以及两种布局的优缺点。需要用清晰的结构代码示例来展示实现方式,并总结差异,帮助用户理解。</think>### CSS圣杯布局双飞翼布局的实现及差异 #### 一、核心目标 两种布局均用于实现**三栏布局**,要求: 1. 中间栏宽度自适应,优先加载(HTML结构在前) 2. 左右侧栏固定宽度(如200px) 3. 避免中间栏内容被左右栏遮挡 --- #### 二、圣杯布局实现步骤 1. **HTML结构** ```html <div class="container"> <div class="middle">中间栏</div> <div class="left">左侧栏</div> <div class="right">右侧栏</div> </div> ``` 2. **CSS关键代码** ```css .container { padding: 0 200px; /* 为左右栏预留空间 */ } .middle { width: 100%; float: left; } .left, .right { width: 200px; float: left; position: relative; /* 相对定位调整位置 */ } .left { margin-left: -100%; /* 移动到中间栏左侧 */ left: -200px; } .right { margin-left: -200px; /* 移动到中间栏右侧 */ right: -200px; } ``` **特点**:通过父容器padding + 相对定位解决遮挡问题[^3][^4]。 --- #### 三、双飞翼布局实现步骤 1. **HTML结构** ```html <div class="container"> <div class="middle"> <div class="content">中间栏内容</div> <!-- 新增包裹层 --> </div> <div class="left">左侧栏</div> <div class="right">右侧栏</div> </div> ``` 2. **CSS关键代码** ```css .middle { width: 100%; float: left; } .content { margin: 0 200px; /* 为左右栏腾出空间 */ } .left, .right { width: 200px; float: left; } .left { margin-left: -100%; /* 移动到中间栏左侧 */ } .right { margin-left: -200px; /* 移动到中间栏右侧 */ } ``` **特点**:通过中间栏内部子div的margin避免内容遮挡[^3][^5]。 --- #### 四、核心差异对比 | **特性** | 圣杯布局 | 双飞翼布局 | |----------------|-----------------------------------|-------------------------------------| | HTML结构 | 无额外div | 中间栏多1层包裹div | | 定位方式 | 使用`position: relative` | 无定位属性 | | 空间调整 | 父容器`padding` | 子div的`margin` | | CSS属性数量 | 多4个(定位+padding) | 更简洁 | | 兼容性 | 需处理父容器溢出问题 | 更稳定(避免父容器样式冲突)[^5] | --- #### 五、选择建议 - **圣杯布局**:适合对HTML结构简洁性要求高的场景 - **双飞翼布局**:优先考虑代码可维护性灵活性时使用[^3][^5] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值