圣杯布局与双飞翼布局

作为一个前端码农,了解到圣杯布局和双飞翼布局的时间有点晚了,最近闲来无事好好了解了下这两个布局的使用场景以及区别,做个笔记。

历史及使用场景

圣杯布局的来历是2006年发在a list part上的这篇文章:In Search of the Holy Grail · An A List Apart Article;
双飞翼布局是玉伯大佬提出来的,始于淘宝UED。
两种布局方式都是为了解决“ 两边固定宽中间自适应的横向排列”布局。

不同

两种的不同只是在于 对中间自适应块的内容不被左右遮挡的处理方式不同

圣杯布局实现


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>圣杯布局title>
    <style>
        .container{
            background: #000;
            overflow: hidden;
            padding: 0 300px;
        }
        .middle{
            width: 100%;
            float: left;
            background: #C63430;
            position: relative;
        }
        .left{
            width: 300px;
            height: 200px;
            float: left;
            background: #89E5BF;
            margin-left: -100%;
            position: relative;
            left: -300px;
        }
        .right{
            width: 300px;
            height: 200px;
            float: left;
            background: #FF9660;
            margin-left: -300px;
            position: relative;
            right: -300px;
        }
    style>
head>
<body>
    <div class="container">
        <div class="middle">虽然表现一样,但是写代码的人的体验却大不一样:width、padding、border 混用的......div>
        <div class="left">我是左边div>
        <div class="right">我是右边div>
    div>
body>
html>

简单描述 就是将:

  1. 三个子元素middle left right 左浮动,middle设置width:100%;
  2. left设置负的margin-left,其值为middle的整个宽度,此时left块移到middle最左边紧贴浏览器左边。
  3. right设置负的margin-left,其值为自身宽度,此时right块移动到了middle右侧,紧贴浏览器右边。

此时三个元素在一排显示。但是left和right块遮住了middle块的左右两边内容。
圣杯布局的精要就在此刻彰显:

  1. 给container设置padding-left,值为left块的宽度,设置padding-right,值为right块的宽度。此时浏览器的样式如下图,整个container左右两边内容区空白。
  2. 此时再给左边left块 相对定位,left值为负的自身宽度。同样,给right块相对定位,设置right值为负的自身宽度。

这里写图片描述

此时布局完成。

双飞翼布局


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>双飞翼布局title>
    <style>
        .container{
            background: #000;
            overflow: hidden;
        }
        .middle{
            width: 100%;
            float: left;
            background: #C63430;
        }
        .content{
            margin: 0 300px;
        }
        .left{
            width: 300px;
            height: 200px;
            float: left;
            background: #89E5BF;
            margin-left: -100%;
        }
        .right{
            width: 300px;
            height: 200px;
            float: left;
            background: #FF9660;
            margin-left: -300px;
        }
    style>
head>
<body>
<div class="container">
    <div class="middle">
        <div class="content">虽然表现一样,但是写代码的人的体验却大不一样:width、padding、border 混用的 时候,任何修改我们都需要实时去计算现在 width 应该设置多大才能和之前的占用的宽度一 样,而后面 width 分离的实现,我们没有任何计算,要 padding 留白,加一下就好,要修改 边框宽度,改一下就好,浏览器会自动计算,完全不用担心尺寸的变化。div>
    div>
    <div class="left">我是左边div>
    <div class="right">我是右边div>
div>
body>
html>

双飞翼布局和圣杯布局的相似之处就在前面对三个子元素的处理。同样的浮动,负 margin处理。

双飞翼布局精髓:

  1. 将middle块需要显示的内容区再用一个div content包裹,然后给middle设置padding-left和padding-bottom,值分别为left块和right块的宽
  2. 。此时虽然left和right仍然遮挡在middle左右两侧,但是其两侧被padding撑满,内容区域依然自适应保持不被遮挡。

布局完成。最终成像:
圣杯布局与双飞翼布局_第1张图片

总结:两种方式其实大同小异,圣杯布局比双飞翼布局多了几行CSS。但是少了一层div嵌套,最终使用上并没有什么区别,大家可以根据个人喜好自由发挥。

你可能感兴趣的:(学习笔记)