前端常用技术汇总

圣杯布局与双飞翼布局、Flex布局的经典案例

2019-07-28  本文已影响0人  前端驿站

面试时,经常会被问到关于各种布局的问题,今天抽空总结一下,直接上代码:

要求:实现一个三栏布局--左右翼两侧width为定值,中间部分自适应,如下(以左侧width为200px,右侧为150px为例):

image.png
用圣杯布局实现
 <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 {
  min-width: 550px;
}
#header{
  width: 100%;
  height: 80px;
  line-height: 80px;
  background: paleturquoise
}
#footer{
  width: 100%;
  height: 50px;
  line-height: 50px;
  background: paleturquoise
}

#container {
  padding-left: 200px; 
  padding-right: 150px;
}

#container .column {
  float: right;
}
#center, #footer, #header, #left, #right{text-align: center}
#center {
  width: 100%;
  height: 450px;
  line-height: 450px;
  background: palegreen
}

#left {
  width: 200px; 
  height: 450px;
  line-height: 450px;
  background: blue;
  margin-left: -200px;
}

#right {
  width: 150px; 
  height: 450px;
  line-height: 450px;
  background: red;
  margin-right: -100%;
  position: relative;
  left: 150px;
}

#footer {
  clear: both;
}

特别注意那就是页面的最小宽度:要想保证该布局效果正常显示,由于两侧都具有固定的宽度,所以需要给定页面一个最小的宽度,但这并不只是简单的200+150=350px。回想之前left使用了position: relative,所以就意味着在center开始的区域,还存在着一个left的宽度。所以页面的最小宽度应该设置为200+150+200=550px:

用双飞翼布局实现
<div id="header">Header</div>
    <div id="container" class="column">
      <div id="center"></div>
    </div>
    <div id="left" class="column">Left</div>
    <div id="right" class="column">Right</div>
    <div id="footer">Footer</div>
body {
  min-width: 350px;
}
#header{
  width: 100%;
  height: 80px;
  line-height: 80px;
  background: paleturquoise
}
#footer{
  width: 100%;
  height: 50px;
  line-height: 50px;
  background: paleturquoise
}
#container {
  width: 100%;
}
.column {
  float: left;
}
#center, #footer, #header, #left, #right{text-align: center}
#center {
  height: 450px;
  line-height: 450px;
  background: palegreen;
  margin-left: 200px;
  margin-right: 150px;
}

#left {
  width: 200px; 
  height: 450px;
  line-height: 450px;
  background: blue;
  margin-left: -100%;
}

#right {
  width: 150px; 
  height: 450px;
  line-height: 450px;
  background: red;
  margin-left: -150px;
}
#footer {
  clear: both;
}

特别注意:
由于双飞翼布局没有用到position:relative进行定位,所以最小页面宽度应该为200+150=350px。但是当页面宽度缩小到350px附近时,会挤占中间栏的宽度,使得其内容被右侧栏覆盖

用Flex布局实现
<div id="header">Header</div>
  <div id="container">
    <div id="center">Center</div>
    <div id="left">Left</div>
    <div id="right">Right</div>
  </div>
  <div id="footer">Footer</div>
body {
  min-width: 350px;
}
#header{
  width: 100%;
  height: 80px;
  line-height: 80px;
  background: paleturquoise
}
#footer{
  width: 100%;
  height: 50px;
  line-height: 50px;
  background: paleturquoise
}
#container{  display: flex;}
#center, #footer, #header, #left, #right{text-align: center}
#center {
  height: 450px;
  line-height: 450px;
  background: palegreen;
  flex: 1;
}

#left {
  height: 450px;
  line-height: 450px;
  background: blue;
  flex: 0 0 200px;
  order: -1;
}

#right {
  height: 450px;
  line-height: 450px;
  background: red;
   flex: 0 0 150px;
}

#footer {
  clear: both;
}
上一篇下一篇

猜你喜欢

热点阅读