【经典面试题】圣杯布局以及双飞翼布局原理

什么是圣杯布局以及双飞翼布局


上图就是一个经典的圣杯布局和双飞翼布局的模型,即三列结构,左右两边定宽,中间自适应,能根据屏幕大小做响应。

实现方式

浮动(经典方式)

在介绍这种方式之前要先说一下margin设置负值的作用:

  1. margin-top/margin-left设置负值会将元素拉入对应位置


可以看到,当margin-top负值增大时,元素也跟着上移了,margin-left同理,负值增大会左移,两者都会导致元素溢出视口

  1. margin-right/margin-bottom设置负值会让后续元素拉入


上图看到当margin-right增大时,元素本身不变,后续元素会跟过来并覆盖本元素,margin-bottom同理,负值增大时后续元素会上移并覆盖。

如何实现

  1. 先给出html结构,注意中间自适应的center元素放在最前面:
<body>
  <div id="header">#header</div>
  <div id="container">
    <div id="center" class="column">#center</div>
    <div id="left" class="column">#left</div>
    <div id="right" class="column">#right</div>
  </div>
  <div id="footer">#footer</div>
</body>
  1. 写好header和footer样式,使之横向撑满。

  #header, #footer {
    background: rgba(29, 27, 27, 0.726);
    text-align: center;
    height: 60px;
    line-height: 60px;
  }
  1. 三列的左右两列分别定宽200px和150px,中间部分center设置100%撑满

  .column{
      height: 200px;
  }
  #left{
      width: 200px;
      background-color: aqua;
  }
  #right{
      width: 200px;
      background-color: wheat;
  }
  #center{
      width: 100%;
      background-color: tomato;
  }
  1. 设置全部左浮动,并清除footer浮动

  .column{
      height: 200px;
      float: left;
  }

现在center由于width是100%,所以占据了一整行。

  1. left元素设置margin-left:100%;拉回行头


之前说过,设置margin-left为负值会让元素自身位置发生变化,由于浮动的关系,元素被往左拉了一个center元素的宽度(100%)故回到了开头

  1. right元素设置margin-left: -200px;拉回行尾

  1. 设置padding

现在的问题就是左右两边的元素覆盖了center元素的内容,我们可以给容器main加上两边padding:

  1. 设置定位

在设置了padding后,左右元素都被挤了进来,我们可以设置position:relative解决,因为浮动元素已经脱离了文档流,所以不能设置absolute。
通过设置left和right元素的相对位置,实现定位:

  1. 完整代码
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
</head>
<style>
  body {
    min-width: 550px;  /* 2x leftContent width + rightContent width */
    font-weight: bold;
    font-size: 20px;
  }

  #header, #footer {
    background: rgba(29, 27, 27, 0.726);
    text-align: center;
    height: 60px;
    line-height: 60px;
    clear: both;
  }
  #container{
      padding: 0 200px;
      overflow: hidden;
  }
  .column{
      height: 200px;
      float: left;
      position: relative;
  }
  #left{
      width: 200px;
      margin-left: -100%;
      left: -200px;
      background-color: aqua;
  }
  #right{
      width: 200px;
      margin-left: -200px;
      right: -200px;
      background-color: wheat;
  }
  #center{
      width: 100%;
      background-color: tomato;
  }
</style>

<body>
  <div id="header">#header</div>
  <div id="container">
    <div id="center" class="column">#center</div>
    <div id="left" class="column">#left</div>
    <div id="right" class="column">#right</div>
  </div>
  <div id="footer">#footer</div>
</body>

</html>

flex布局

使用flex布局显得更加简单易懂,原理就是将容器设置为display: flex;

两侧设置固定宽度,并不允许弹性缩放flex: 0; flex-basis: 200px;

中间允许弹性缩放,不设置宽度flex:1;

结语

双飞翼布局其实和圣杯布局的精髓是一样的,都是通过设置负margin来实现元素的排布,不同的就是html结构,双飞翼是在center元素内部又设置了一层inner-center的元素并设置它的左右margin,而非圣杯布局的padding,来排除两边元素的覆盖。所以这两种布局原理基本一样,关键就是在于设置负margin的技巧,和元素浮动的相对定位技巧来实现。

原文地址:https://www.cnblogs.com/hansonfang/p/12228826.html

时间: 2024-08-29 21:32:22

【经典面试题】圣杯布局以及双飞翼布局原理的相关文章

css布局--圣杯布局和双飞翼布局

圣杯布局和双飞翼布局是经典的三栏式布局.两种布局达到效果上基本相同,都是两边两栏宽度固定,中间栏宽度自适应.(这两种布局都比较老) 在HTML结构上中间栏在最前面保证了最先渲染中间提升性能,并且兼容性良好.两种布局的实现方法前半部分相同,后半部分的实现各有利弊,下面会简单介绍两者的区别. 布局效果: 注意点: 1. .middle元素位于最前面,保证最先渲染middle部分 2. 三个元素都浮动,使元素保持在一行上 3. .middle元素宽度设为100%,独占一行 4. .left元素设置ma

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

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

css布局之圣杯布局和双飞翼布局

圣杯布局和双飞翼布局 今天看了很多圣杯布局和双飞翼布局的技术博客,通过自己的理解总结一下吧. 1.二者相同点: 实现的都是三栏布局,两边的盒子宽度固定,中间盒子自适应,也就是我们常说的固比固布局.它们实现的效果是一样的. 2.不同点: 圣杯布局知识点:浮动,负边距,相对定位,不需要添加额外标签. 双飞翼:只用到浮动,负边距,不需要使用相对定位,需要添加一个额外的标签. 注意:html结构中中间部分要写在左右布局之前,为了优先渲染. 下面就先来看一下圣杯布局的实现过程吧: 先写出基本DOM结构:

圣杯布局和双飞翼布局

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

对于圣杯布局和双飞翼布局的新认识

今天刷题的时候碰见了一道要求使用双飞翼布局的题.于是便对比了一下圣杯布局得到了点新认识. 我们都知道圣杯布局和双飞翼布局都实现了中间宽度自适应,两边定宽的效果.这样做的优势是重要的东西放在文档流前面可以优先渲染.两者又有什么差别呢? 对比圣杯布局和双飞翼布局 1.二者都主要使用了浮动和负边距来达到中间宽度自适应,两边定宽的目的. 具体来说就是设置左右两边div的margin-left为一负值并设置浮动.于是便会移动到上方的div内(也就是中间的div)与之重叠. 2.相比于圣杯布局双飞翼布局没有

圣杯布局,双飞翼布局详解

圣杯布局和双飞翼布局解决的问题是一样的,都是用来解决左右定宽,中间自适应的三栏布局,中间栏要放在文档流前面以优先渲染. 圣杯布局和双飞翼布局:三栏全部加上float:left,左右两栏加上负margin,以形成三栏布局. 圣杯布局:大的div设置padding-left和padding-right,左右两个div用相对布局position: relative,加上right和left属性.双飞翼布局:中间div内加一层标签,在设置内层标签的margin html圣杯布局: <div class=

圣杯布局和双飞翼布局的作用和区别

圣杯布局和双飞翼布局解决的问题是一样的,就是两边顶宽,中间自适应的三栏布局,中间栏要在放在文档流前面以优先渲染. 圣杯布局和双飞翼布局解决问题的方案在前一半是相同的,也就是三栏全部float浮动,但左右两栏加上负margin让其跟中间栏div并排,以形成三栏布局. 不同在于解决”中间栏div内容不被遮挡“问题的思路不一样:圣杯布局,为了中间div内容不被遮挡,将中间div设置了左右padding-left和padding-right后,将左右两个div用相对布局position: relativ

圣杯布局与双飞翼布局

圣杯布局和双飞翼布局的目的都是:左右两栏固定宽度,中间部分自适应: 圣杯布局 圣杯布局HTML: <div class="wrap"> <div class="main"> 我是主要 </div> <div class="left"> 我是左边 </div> <div class="right"> 我是右边 </div> </div>

圣杯布局and双飞翼布局

*圣杯布局 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>ajax</title> <style> *{ padding:0; margin:0 } .header{ width:100%; background:#e1ef05; height:50px; } /*main写前目的是让它先加载*/ .main{ padding:0