CSS3:常见布局

175 阅读4分钟

一、自适应布局

1. 两栏布局:左侧固定右侧自适应,高度填满屏幕

  1. flex布局
<div class="outer">
  <div class="left">左侧固定</div>
  <div class="right">右侧自适应</div>
</div>

.outer {
  height:200px;  // 宽度不用指定
  background-color:#674ac3e0;
  display:flex;   
  // 不加这句的话,高度会填充整个父元素;加上的话子元素高度适应于自身
  align-items:flex-start;  
}
.left {
  width:100px;  // 宽度
  background-color:#3ef8cc;
}
.right {
  background-color:#FFC107;
  flex:1;     // 1 1 0%
}
  1. 左侧盒子设置float:left脱离文档流,右侧盒子设置margin-left空出左侧盒子的宽度。
<div class="outer">
  <div class="left"></div>
  <div class="right"></div>
</div>
  
.outer {
  height: 200px;
}
.left {
  float: left;
  width: 100px;
  height: 200px;
  background-color: blue;
}
.right {
  margin-left: 100px;
  height: 200px;
  background-color: blueviolet;
}
  1. 父元素设置overflow: hidden,右边元素就不用设置margin-left

2. 三栏布局:中间自适应

  1. flex同上
  2. float:
  • middlediv必须在最后,否则会把rightdiv挤下去。
  • 父元素overflow:hidden触发BFC,左右子元素都各种float: leftfloat: right,高度都要设置。
<div class="outer">
  <div class="left"></div>
  <div class="right"></div>
  <div class="middle"></div>
</div>
.outer {
  height: 200px;
  overflow: hidden;
}
.left {
  float:left;
  width: 100px;
  height: 200px;
  background-color: blue;
}
.right {
  float: right;
  width: 200px;
  height: 200px;
  background-color: blueviolet;
}
.middle {
  height: 200px;
  background-color: brown;
}

3. 四个宽度均分的布局

4个子元素均设置为 flex:1

二、五点布局

<div class="outer">
<div class="inner">
  <div class="item"></div>
  <div class="item"></div>
</div>
<div class="item"></div>
<div class="inner">
  <div class="item"></div>
  <div class="item"></div>
</div>
</div>

.outer {
  width: 100px;
  height: 100px;
  background-color: brown;
  display: flex;
  justify-content: space-between;  // inner、item、inner 三个元素从左到右排列,两边相切
}
.inner {
  display: flex;
  flex-direction: column;
  justify-content: space-between;  // inner内部的两个item元素从上到下排列,两边相切
}
.item {
  width: 10px;
  height: 10px;
  background-color: black;
  // 此时四个顶点已经配置好,只差中间的的元素
  align-self: center;  // 设置对齐方式
}

三、双飞翼布局和圣杯布局

两者都是:左右两栏固定宽度,中间自适应的三栏布局。中间栏要优先渲染。

  • 圣杯布局:左右和中间的div互不包含。
  • 双飞翼布局:在中间 div 内部创建左右子 div。 image.png
  1. 圣杯布局 为了中间div不被遮挡,将中间div设置了padding-leftpadding-right后,将左右两个div用相对布局 position:relative 分别配合 right 和 left 属性,以便左右两栏div移动后不遮挡中间div。
  • 均设置为左浮动,然后设置middle=100%,将 left 和 right 挤到下一行。
  • 通过设置 margin-left 为负值,让 left 和 right 回到和 middle 同一行。
  • 通过设置父元素的 padding-left 和 padding-right ,让两边留出空隙。
  • 通过相对定位,让left和right移到两边。
<div class="outer">
    <div class="middle"></div>  // 中间栏先渲染
    <div class="left"></div>
    <div class="right"></div>
</div>

.outer {
  padding-left: 200px;   /* 为左右子栏腾出空间 */
  padding-right: 200px;
  background-color: brown;
}
.middle, .left, .right {
  float: left;
}
.middle {
  width: 100%;  /* 把 left 和 right都挤到了下一行 */
  background-color: rgb(61, 48, 240);
}
.left {
  width: 200px;
  /* 负值表示子元素相对于父元素右内边距,实现元素居左 */
  margin-left: -100%; 
  /* 挪到父元素的左内边距 */
  position: relative;
  left:-200px;
  background-color: rgb(59, 233, 24);
}
.right {
  width: 200px;
  /* 实现元素居右*/
  margin-left: -200px;
  /* 挪到父元素的右内边距 */
  position: relative;
  left:200px;
  background-color: rgb(222, 236, 19);
}
  1. 双飞翼布局 为了中间内容不被遮挡,直接在中间div内部创建子div用于放置内容,在该子div里用margin-leftmargin-right
  • 均设置为左浮动,然后设置middle=100%,将 left 和 right 挤到下一行。
  • 通过设置 margin-left 为负值,让 left 和 right 回到和 middle 同一行。
  • middle部分增加一个内层div,并设置margin。
<div class="outer">
<div class="middle">
  <div class="inner">中间栏</div>
</div>
<div class="left">左侧栏</div>
<div class="right">右侧栏</div>
</div>
    
.outer {
  background-color: brown;
}
.middle, .left, .right {
  float: left;
}
.middle {
  width: 100%;
  height: 100px;
  background-color: rgb(61, 48, 240);
}
.left {
  width: 200px;
  margin-left: -100%;
  background-color: rgb(59, 233, 24);
}
.right {
  width: 200px;
  margin-left: -200px;
  background-color: rgb(222, 236, 19);
}
.inner, .middle {  /* 整个背景还是middle */
  margin: 0 200px; 
}

四、画圆形、三角形

canvas画圆形、三角形

五、响应式布局

我们需要网页适应不同分辨率的设备,能够兼容多个终端,也就是根据分辨率来自动调整页面的展示方式和布局,不用为每一个终端做一个特定的版本。常见的 4 种自适应方案有:

  • 百分比布局:当浏览器的宽度或者高度发生变化时,通过百分比单位可以使相关组件的宽和高随着浏览器的变化而变化。

  • 媒体查询布局:使用@media媒体查询,针对不同类型的设备定义不同的样式。

  • 通过rem:因为rem只是相对于根元素html的font-size,因此通过rem实现响应式布局,只需要根据视图容器大小、动态改变font-size即可。

  • 通过vw/vh实现:css3新引入的单位,与视图窗口有关。任意层级元素,在使用vw单位的情况下,1vw都等于视图宽度的百分之一。 参考文章

  1. 圣杯布局和双飞翼布局
  2. 常见布局