面试题库 词条目录
前端Wiki/面试题库/HTML 与 CSS/CSS 高频题

CSS 三栏布局:圣杯 / 双飞翼 / Flex

三栏布局要求:左右两栏定宽、中间栏自适应且“主体内容先渲染”。圣杯布局用 padding 留白 + 相对定位:三栏都浮动,中间栏 DOM 放最前、width: 100%,左右栏用负 margin 移到父级 padding 留出的位置,再用 position: relative 微调。双飞翼布局是圣杯的改良:中间栏内再包一层 div,用子元素 margin 避开左右栏,省掉了相对定位的脆弱性。

现代答案直接 Flex:左右 flex: none 定宽,中间 flex: 1 自适应;DOM 顺序上把中间写最前即可先渲染。三种方案都要会:先给 Flex,再解释圣杯与双飞翼的历史意义。

  • Flex:左右 flex:none 定宽 + 中间 flex:1 自适应,DOM 中中间栏放最前
  • 圣杯:父级 padding 留白 + 负 margin + 相对定位,中间栏内容最先渲染
  • 双飞翼:中间再套一层容器用 margin 避让,比圣杯更稳,流行更广
HTML
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<style>
  /* 现代方案:Flex 三栏,中间 DOM 最前 */
  .layout { display: flex; }
  .center { flex: 1; order: 2; background: #ffd; padding: 10px; }
  .left   { flex: 0 0 180px; order: 1; background: #efe; padding: 10px; }
  .right  { flex: 0 0 200px; order: 3; background: #eef; padding: 10px; }

  /* 经典:双飞翼(中间套容器,margin 避让) */
  .wing .center { float: left; width: 100%; }
  .wing .center .inner { margin: 0 200px 0 180px; background: #ffd; padding: 10px; }
  .wing .left  { float: left; width: 180px; margin-left: -100%; background: #efe; padding: 10px; }
  .wing .right { float: left; width: 200px; margin-left: -200px; background: #eef; padding: 10px; }
  .wing::after { content: ''; display: block; clear: both; }
</style>
</head>
<body>
  <div class="layout">
    <div class="center">中间(先渲染)</div>
    <div class="left">左 180</div>
    <div class="right">右 200</div>
  </div>
  <hr>
  <div class="wing">
    <div class="center"><div class="inner">双飞翼中间</div></div>
    <div class="left">左 180</div>
    <div class="right">右 200</div>
  </div>
</body>
</html>
本节要点三栏布局:Flex 一行解(左定中间 flex:1);圣杯与双飞翼是浮动时代的遗产,理解“主体先渲染 + 负 margin 避让”即可。
🔗 相关词条CSSCSS 特效自适应