这两种三栏式布局都实现了中间内容优先渲染、两侧固定宽度、中间宽度自适应的特点

圣杯布局

<div class="container">
  <div class="main">#main (自适应)</div>
  <div class="left">#left (200px)</div>
  <div class="right">#right (200px)</div>
</div>
.container {
  padding: 0 200px; /* 左右内间距等于左右列宽度 */
}
.main {
  width: 100%;
  float: left;
}
.left {
  width: 200px;
  float: left;
  margin-left: -100%; /* 移动到 main 左侧 */
  position: relative;
  left: -200px; /* 再向左移动自身宽度 */
}
.right {
  width: 200px;
  float: left;
  margin-left: -200px; /* 移动到 main 右侧 */
  position: relative;
  right: -200px; /* 再向右移动自身宽度 */
}

双飞翼布局

<div class="container">
  <div class="main-wrapper">
    <div class="main">#main (自适应)</div>
  </div>
  <div class="left">#left (200px)</div>
  <div class="right">#right (200px)</div>
</div>
.main-wrapper {
  width: 100%;
  float: left;
}
.main {
  margin: 0 200px; /* 内容区域留出边距 */
}
.left {
  width: 200px;
  float: left;
  margin-left: -100%; /* 移动到最左侧 */
}
.right {
  width: 200px;
  float: left;
  margin-left: -200px; /* 移动到最右侧 */
}

核心区别:

  • DOM 结构:圣杯的列元素直接位于容器内,而双飞翼在 main 外层添加了容器
  • 实现方式:圣杯通过相对定位调整位置,双飞翼通过 margin 控制
  • 兼容性:双飞翼解决圣杯布局中小屏下的样式错乱问题