【CSS】三栏式布局5种方案

344 阅读3分钟

1. 使用浮动(Float)布局:

  • 原理:
    • 将左侧和右侧栏使用 float: left; 和 float: right; 进行浮动,使它们脱离文档流并排列在一行。
    • 设置中间内容区域的 margin-left 和 margin-right 分别为左侧和右侧栏的宽度,以避免重叠。
  • 优点:
    • 兼容性较好,适用于旧版本的浏览器。
    • 相对简单易懂,并且代码量较少。
  • 缺点:
    • 需要处理浮动元素脱离文档流导致的高度塌陷问题。
    • 对于动态高度的内容,可能需要额外的清除浮动的处理。
    • 宽度不够灵活, 左右两栏的宽度发生变化,中间栏的宽度需要重新调整,否则会影响到整体布局。不能做到自适应。
<div class="container">
  <div class="left-column">左侧栏</div>
  <div class="middle-column">中间内容区域</div>
  <div class="right-column">右侧栏</div>
</div>
.container {
  overflow: hidden; /* 清除浮动 */
}

.left-column {
  float: left;
  width: 200px;
}

.middle-column {
  margin-left: 200px; /* 左侧栏宽度 */
  margin-right: 200px; /* 右侧栏宽度 */
}

.right-column {
  float: right;
  width: 200px;
}

2. 使用绝对定位(Absolute Positioning)布局:

  • 原理:
    • 将左侧和右侧栏使用 position: absolute; 进行定位,并设置相应的宽度。
    • 设置中间内容区域的 margin-left 和 margin-right 分别为左侧和右侧栏的宽度。
  • 优点:
    • 可以灵活控制各列的位置和宽度,适用于复杂的布局需求。
    • 不会出现高度塌陷的问题。
  • 缺点:
    • 需要手动设置每个元素的位置和宽度。
    • 对于内容区域长度超过其他列的情况,可能需要额外的处理来保证整体布局的正确性。
    • 在响应式布局中可能需要针对不同屏幕大小进行调整。
<div class="container">
  <div class="left-column">左侧栏</div>
  <div class="middle-column">中间内容区域</div>
  <div class="right-column">右侧栏</div>
</div>
.container {
  position: relative;
}

.left-column {
  position: absolute;
  left: 0;
  width: 200px;
}

.middle-column {
  margin-left: 200px; /* 左侧栏宽度 */
  margin-right: 200px; /* 右侧栏宽度 */
}

.right-column {
  position: absolute;
  right: 0;
  width: 200px;
}

3. 使用弹性盒子(Flexbox)布局:

  • 原理:
    • 将容器设置为弹性盒子,并使用 flex 属性控制三个列的宽度分配。
    • 设置中间内容区域的 flex-grow 属性为 1,使其占据剩余空间。
  • 优点:
    • 简单易懂,语义化,代码量较少。
    • 可以轻松实现等高布局。
    • 支持响应式布局,易于适应不同屏幕尺寸和设备。
  • 缺点:
    • 对于一些旧版本的浏览器支持可能不够完善。
    • 某些复杂布局情况下,可能需要额外的样式调整来满足需求。
<div class="container">
  <div class="left-column">左侧栏</div>
  <div class="middle-column">中间内容区域</div>
  <div class="right-column">右侧栏</div>
</div>

.container {
  display: flex;
}

.left-column {
  flex: 0 0 200px;
}

.middle-column {
  flex-grow: 1;
}

.right-column {
  flex: 0 0 200px;
}

4. 表格Table布局

  • 原理:
    • 设置容器为表格,宽度为100%,与页面宽度相同。
    • 左边/右边元素宽度都为300px,剩余的宽度会自动分配给中间元素

5. 网格Grid布局

  • 原理:
    • 设置容器为网格,宽度为100%,与页面宽度相同。
    • 左边/右边两列的宽度都为300px,剩余的空间会自动分配给中间列。
<div class="container">
  <div class="left-column">左侧栏</div>
  <div class="middle-column">中间内容区域</div>
  <div class="right-column">右侧栏</div>
</div>

.container {
   width: 100%;
   display: grid;
   grid-template-rows: 100px;
   grid-template-columns: 300px auto 300px;
}