Skip to content

布局基础

盒模型

标准盒模型中,widthheight 只包含 content;IE 盒模型中,widthheight 包含 content、padding 和 border。现代项目通常设置:

css
* {
  box-sizing: border-box;
}

这样组件宽度更可控,尤其适合表单、卡片、栅格这类需要固定边界的 UI。

水平垂直居中

Flex

css
.parent {
  display: flex;
  align-items: center;
  justify-content: center;
}

Flex 是最常用方案,适合单个或少量元素居中。

Grid

css
.parent {
  display: grid;
  place-items: center;
}

Grid 写法更短,适合明确的二维布局容器。

绝对定位

css
.child {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}

适合弹层、浮动按钮等脱离文档流的元素。

两栏布局

css
.layout {
  display: flex;
}

.sidebar {
  width: 240px;
  flex: none;
}

.main {
  flex: 1;
  min-width: 0;
}

min-width: 0 很关键。Flex 子项默认 min-width: auto,长文本或表格可能把主区域撑开。

三栏布局

css
.layout {
  display: grid;
  grid-template-columns: 220px minmax(0, 1fr) 280px;
  gap: 16px;
}

三栏、仪表盘、管理后台页面优先考虑 Grid,因为它能直接表达列结构。

常见追问

display: nonevisibility: hiddenopacity: 0 的区别?

display: none 不占布局空间,会触发布局变化;visibility: hidden 仍占空间,但不可见不可交互;opacity: 0 仍占空间,也可能继续响应事件,需要配合 pointer-events: none

position 有哪些值?

static 是默认文档流;relative 相对自身偏移且保留空间;absolute 相对最近定位祖先;fixed 相对视口;sticky 在滚动阈值前是相对定位,超过阈值后类似固定定位。

为什么文本会撑破容器?

常见原因是长单词、URL、表格或 Flex 子项默认最小宽度。可以用 min-width: 0overflow: hiddentext-overflow: ellipsisword-break: break-word 处理。