核心思路

无论使用哪种方法,核心思想都是:

左固定宽度右自适应宽度div css模板
(图片来源网络,侵删)
  1. 左侧容器 (left-sidebar):设置一个明确的 width (200px),并设置 float: left; 使其脱离文档流。
  2. 右侧容器 (main-content):利用CSS的特性(如overflowFlexbox)来占据剩余的可用空间。

经典浮动 + overflow: hidden (兼容性最好)

这是最传统、兼容性最广的方法,适用于需要支持非常老旧的浏览器(如IE6/7)的场景。

HTML 结构

<div class="container">
  <div class="left-sidebar">
    左侧边栏,固定宽度,比如200px。
    <br>内容可以很多,会自动撑高。
  </div>
  <div class="main-content">
    右侧主内容区域,自适应宽度。
    <p>这里是主要内容,会自动填充左侧边栏以外的所有空间。</p>
    <p>当内容很长时,会撑开容器的高度。</p>
  </div>
  <!-- 清除浮动元素,非常重要! -->
  <div class="clearfix"></div>
</div>

CSS 代码

/* 容器,用于包裹布局,并清除浮动影响 */
.container {
  width: 100%; /* 或者不设置,由父元素决定 */
  border: 1px solid #ccc; /* 为了可视化布局 */
}
/* 左侧边栏 */
.left-sidebar {
  width: 200px; /* 固定宽度 */
  float: left;   /* 向左浮动 */
  background-color: #f0f0f0;
  padding: 10px;
}
/* 右侧主内容 */
.main-content {
  /* 关键:通过 overflow: hidden; 触发 BFC (Block Formatting Context)
     BFC会阻止其元素被浮动元素覆盖,并包含浮动元素 */
  overflow: hidden; 
  background-color: #e9f7fe;
  padding: 10px;
}
/* 清除浮动,防止容器高度塌陷 */
.clearfix::after {
  content: "";
  display: block;
  clear: both;
  visibility: hidden;
  height: 0;
  line-height: 0;
}

优点:

  • 兼容性极好,所有浏览器都支持。
  • 代码简单直观。

缺点:

  • 需要一个额外的 .clearfix 元素来清除浮动,结构稍显冗余。
  • overflow: hidden 会隐藏超出部分,如果内容有溢出需求(如弹出菜单),需要小心处理。

Flexbox (现代、灵活、推荐)

Flexbox 是现代布局的推荐方案,它更简单、更灵活,且不需要清除浮动。

左固定宽度右自适应宽度div css模板
(图片来源网络,侵删)

HTML 结构

<div class="container-flex">
  <div class="left-sidebar-flex">
    左侧边栏,固定宽度。
  </div>
  <div class="main-content-flex">
    右侧主内容区域,自适应宽度。
    <p>使用Flexbox实现,代码更简洁。</p>
  </div>
</div>

CSS 代码

.container-flex {
  display: flex; /* 声明为 Flex 容器 */
  width: 100%;
  border: 1px solid #ccc;
}
/* 左侧边栏 */
.left-sidebar-flex {
  /* 固定宽度 */
  width: 200px; 
  /* flex-shrink: 0; 防止在空间不足时被压缩,推荐加上 */
  flex-shrink: 0; 
  background-color: #f0f0f0;
  padding: 10px;
}
/* 右侧主内容 */
.main-content-flex {
  /* 关键:flex: 1; 表示占据所有剩余空间 */
  flex: 1; 
  background-color: #e9f7fe;
  padding: 10px;
}

flex: 1 的解释: 它是 flex-grow: 1; flex-shrink: 1; flex-basis: 0%; 的简写,这意味着:

  • flex-grow: 1;:当容器有剩余空间时,这个项目会增长以填充所有可用空间。
  • flex-shrink: 1;:当容器空间不足时,这个项目会收缩。
  • flex-basis: 0%;:在分配空间前,将项目的基础宽度设为0,确保flex-grow的计算是基于剩余全部空间的。

优点:

  • 代码极其简洁,无需清除浮动。
  • 布局非常灵活,可以轻松实现居中、等高、垂直排列等复杂效果。
  • 是现代Web开发的标准。

缺点:

  • 在IE9及以下浏览器不支持或支持不完整,但对于绝大多数现代项目来说,这不是问题。

Grid (最强大、二维布局)

CSS Grid 是为二维布局(行和列)而生的,用它来做这种一维的左右布局同样非常简单和强大。

左固定宽度右自适应宽度div css模板
(图片来源网络,侵删)

HTML 结构

<div class="container-grid">
  <div class="left-sidebar-grid">
    左侧边栏,固定宽度。
  </div>
  <div class="main-content-grid">
    右侧主内容区域,自适应宽度。
    <p>使用CSS Grid实现,语法清晰。</p>
  </div>
</div>

CSS 代码

.container-grid {
  display: grid; /* 声明为 Grid 容器 */
  /* 定义两列:第一列固定200px,第二列占据剩余空间 (1fr) */
  grid-template-columns: 200px 1fr; 
  width: 100%;
  border: 1px solid #ccc;
}
/* 左侧边栏 */
.left-sidebar-grid {
  background-color: #f0f0f0;
  padding: 10px;
}
/* 右侧主内容 */
.main-content-grid {
  background-color: #e9f7fe;
  padding: 10px;
}

grid-template-columns: 200px 1fr; 的解释:

  • 200px:定义第一列的宽度为固定值。
  • 1frfr (fractional unit) 是一个弹性单位,代表“可用空间的一份”。1fr 表示占据所有剩余的空间。

优点:

  • 语法非常直观,直接定义列。
  • 是目前最强大的布局系统,尤其适合复杂的页面结构。
  • 同样不需要清除浮动。

缺点:

  • 兼容性比Flexbox稍差,不支持IE11。

总结与如何选择

方法 核心CSS 优点 缺点 推荐场景
浮动法 float: left, overflow: hidden 兼容性最好 需要清除浮动,不够灵活 维护老旧项目,需要支持IE6/7等浏览器。
Flexbox display: flex, flex: 1 代码简洁,灵活,现代标准 IE9及以下不支持 绝大多数现代Web项目的首选。
Grid display: grid, grid-template-columns: 200px 1fr 语法直观,最强大 IE11支持有限,学习曲线稍高 复杂的二维布局,或者当你想用最清晰的方式定义列时。

我的建议:

  • 从今天开始的新项目,请直接使用 Flexbox 或 Grid。
  • Flexbox 更适合一维的布局(如左右、上下),语法简单,是处理这个问题的“完美”工具。
  • Grid 更适合二维布局,但用它来做一维布局同样优雅,并且未来潜力巨大。

如果你不确定,直接复制下面的 Flexbox模板,它是最通用和现代的解决方案。

最终推荐模板 (Flexbox)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">左固定右自适应布局</title>
  <style>
    * {
      box-sizing: border-box;
      margin: 0;
      padding: 0;
    }
    body {
      font-family: sans-serif;
    }
    .container {
      display: flex; /* 1. 声明为Flex容器 */
      width: 100%;
      min-height: 100vh; /* 让容器至少和视口一样高 */
    }
    .left-sidebar {
      /* 2. 固定宽度,并防止被压缩 */
      width: 250px; 
      flex-shrink: 0;
      background-color: #2c3e50;
      color: white;
      padding: 20