美文网首页饥人谷技术博客
圣杯布局和双飞翼布局的理解

圣杯布局和双飞翼布局的理解

作者: 饥人谷_NewClass | 来源:发表于2017-04-05 16:36 被阅读0次

圣杯和双飞翼布局都是左右两栏宽度固定,中间部分宽度自适应。

圣杯布局

参考:http://www.alistapart.com/articles/holygrail/
1、创建HTML结构

<body>
    <div id="header">header</div>
    <div id="container"></div>
    <div id="footer"></div>
</body>

在css添加样式:

#header, 
#footer {
  height: 30px;
  background: #666;
}

2、在#container添加列,网页被浏览器解析时,按照中间、左、右的顺序进行加载 —— 也就是我们常说的”重要的内容先加载”。html代码中 middle部分首先要放在container的最前部分,然后是left,right。

<div id="header">header</div>
    <div id="container">
        <div class="middle">middle</div>
        <div class="left">left</div>
        <div class="right">right</div>
    </div>
    <div id="footer">footer</div>

在css添加对应的样式:

#container:after {
    content: '';
    display: block;
    clear: both;
}
.middle,
.left,
.right {
  float: left;
  height: 200px;    
}
.middle {
    width: 100%;
    background: #ccc;
}
.left {
   width: 200px;
   background: blue;
}
.right {
  width: 150px;
  background: orange;
}

此时页面效果如下:middle、left、right都设置左浮动,middle的width为100%自适应,所以占据一整行,left、right被挤到下一行;清除浮动使#footer不受影响。


3、将左列和右列放在对应的位置与middle在同一水平位置。
把left的左边距设置为负的middle的宽度,left才会移动到最左边与middle在同一行。

.left {
   width: 200px;
   margin-left: -100%;
   background: blue;
}

把right的左边距设置为负的自身宽度,让它移动到最右边和middle在同一行。

.right {
  width: 150px;
  margin-left: -150px;
  background: orange;
}

此时的效果如下,三栏在同一行。



4、虽然三栏都在同一行,但middle的左右部分都被left、right重叠遮住。所以给#container设置左右填充,往中间挤。

#container {
  padding: 0 150px 0 200px;
}

5、#container往中间挤后,左右留出的空间刚好可以给left和right。对left和right设置position:relative;相对自身位置移动到对应的位置。

.left {
   position: relative;
    right: 200px;
   width: 200px;
   margin-left: -100%;
   background: blue;
}
.right {
  position: relative;
  left: 150px;
  width: 150px;
  margin-left: -150px;
  background: orange;
}

最后的效果如下:


注意: 在浏览器调整大小时,当middle的宽度小于left的宽度时,布局会乱掉,middle会下移。所以在body设置最小宽度为2*left的宽度+right的宽度,当页面达到最小宽度时,middle的宽度等于left的宽度,不会小于。

body {
    min-width: 550px;
}

总的代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>圣杯布局</title>
  <style type="text/css">
  /*圣杯布局:网页被浏览器解析时,按照中间、左、右的顺序进行加载 —— 也就是我们常说的”重要的内容先加载”。
  1.
    #container里的三栏float:left;
    #middle的宽度是自适应的 width:100%,#left和#right的宽度时固定的width都为200px;
    所以#main占据一行,#left和#right被挤到下一行。

  2.要把#left和#right放在#main的左右两侧,使用负边距
        (#left)margin-left:-100%;
        (#right)margin-left:-200px;
            此时#left、#right虽然位置对了,但是是叠加在#middle的左右上,遮住了#middle的左右的部分。
    3.给#middle设置padding,padding-left:200px(#left的宽度);padding-right:200px(#right的宽度);
    4.给#left和#right设置position:relative;使其相对于自己的位置偏移到合适的位置。
  */
        body {
        min-width: 550px; /* 2lw+rw 2倍的左栏宽度+右栏宽度 当middle的宽度小于left的宽度时,布局才不会乱*/
    }
    #container:after {
        content: '';
        display: block;
        clear: both;
    }

    #header,#footer {
        height: 50px;
        background: #666;
    }

    #container {
        padding: 0 150px 0 200px;
        overflow: hidden;
    }

    #container .column {
        position: relative;
        float: left;
        height: 300px;
    }

    #middle {
        width: 100%;
        background: #ccc;
    }

    #left {
        right: 200px;
        width: 200px;
        margin-left: -100%;
        background: blue;
    }
    #right {
        left: 150px;
        width: 150px;
        margin-left: -150px;
        background: orange;
    }

    </style>
</head>
<body>
  <div id="header">header</div>
    <div id="container">
      <div id="middle" class="column">middle</div>
        <div id="left" class="column">left</div>
        <div id="right" class="column">right</div>
    </div>
    <div id="footer">footer</div>
</body>
</html>

双飞翼布局

双飞翼布局跟圣杯布局差不多,只是做了点修改。
1、创建HTML结构

<div id="header">header</div>
<div id="main"></div>
<div class="sub">sub</div>
<div class="extra">extra</div>
<div id="footer">footer</div>

在css添加样式:

#header, 
#footer {
  height: 30px;
  background: #666;
}
.sub,
.main,
.extra{ 
        float: left;
        min-height: 130px;
 }
.sub{
        width: 200px;
        background: red;
 }
.extra{
        width: 220px;
        background: blue;
 }
.main{ 
        width: 100%;
 }
.footer {
        clear: both;
}

此时页面效果如下:main、sub、extra都设置左浮动,main的width为100%自适应,所以占据一整行,sub、extra被挤到下一行;清除浮动使#footer不受影响。

2、将sub和extra放在对应的位置与main在同一水平位置。
把sub的左边距设置为负的main的宽度,sub才会移动到最左边与main在同一行;把extra的左边距设置为负的自身宽度,让它移动到最右边和main在同一行。

.sub{
    width: 200px;
    margin-left: -100%;
    background: red;
}
.extra{
    width: 220px;
    margin-left: -220px;
    background: blue;
}

效果如下:


3、main内容被覆盖了吧,除了使用外围的padding,还可以考虑使用margin。给main增加一个内层div-- main-inner, 然后margin:0 220px 0 200px。

<div class="header">header</div>
<div class="main">
    <div class="main-inner">main</div>
</div>
<div class="sub">sub</div>
<div class="extra">extra</div>
<div class="footer">footer</div>
.main-inner {
    margin: 0 220px 0 200px;
    height: 200px;
    background: #999;
}

完整代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>双飞翼</title>
  <style>
  body {
    min-width: 700px; 
}

.header, 
.footer {
  height: 30px;
  background: #666;
}

.sub,
.main,
.extra{ 
    float: left;
    height: 200px;
}
.sub{
    width: 200px;
    margin-left: -100%;
    background: red;
}
.extra{
    width: 220px;
    margin-left: -220px;
    background: blue;
}
.main{ 
    width: 100%;
}

.footer {
    clear: both;
}

.main-inner {
    margin: 0 220px 0 200px;
    height: 200px;
    background: #999;
}
  </style>
</head>
<body>
    <div class="header">header</div>
    <div class="main">
        <div class="main-inner">main</div>
    </div>
    <div class="sub">sub</div>
    <div class="extra">extra</div>
    <div class="footer">footer</div>
</body>
</html>

相关文章

  • 特殊布局方法

    关于圣杯布局和双飞翼布局:CSS布局之--淘宝双飞翼布局双飞翼布局介绍CSS控制自适应宽度两三栏布局圣杯布局的实现...

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

    标签(空格分隔): css 圣杯布局和双飞翼布局、flex布局 定义 圣杯布局(双飞翼布局):两边定宽,中间宽度自...

  • CSS 经典三列布局之双飞翼布局

    双飞翼布局 双飞翼布局与圣杯布局细微区别 双飞翼布局比圣杯布局多了一个 main-inner标签 双飞翼布局不需要...

  • CSS布局知识点

    双飞翼布局 (淘宝UED对圣杯布局的升级优化) 圣杯布局和双飞翼布局的实现(三栏布局),都是左右两栏固定宽度,中间...

  • 经典CSS布局:双飞翼和圣杯布局

    圣杯布局 HTML CSS 双飞翼布局 HTML CSS Flex布局 HTML和圣杯布局一样CSS

  • 圣杯布局和双飞翼布局

    圣杯布局 双飞翼布局

  • 双飞翼布局和圣杯布局

    推荐文章:深入理解圣杯布局和双飞翼布局[https://juejin.cn/post/68449038171048...

  • 圣杯布局和双飞翼布局

    实现圣杯布局和双飞翼布局,“负边距”是必不可少的。 了解圣杯布局和双飞翼布局之前,我们先来了解下负边距。一、定义:...

  • 实现三栏布局的六种方式

    六种布局方式总结:圣杯布局、双飞翼布局、Flex布局、绝对定位布局、表格布局、网格布局。 圣杯布局 圣杯布局是指布...

  • 浅谈双飞翼布局和圣杯布局(三)

    3、双飞翼布局和圣杯布局的区别 圣杯布局和双飞翼布局解决问题的方案在前一半是相同的,即: 中间栏宽度设置为100%...

网友评论

    本文标题:圣杯布局和双飞翼布局的理解

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