设置宽度和高度
width 和 height 设置元素内容盒的尺寸。默认情况下,内边距和边框会加在这个尺寸之外。
这个盒子是 260 × 100 像素:240 × 80 的内容,再加上每边 10px 的内边距。如果设置了 box-sizing: border-box,它就正好是 240 × 80;盒模型页面对两者都做了讲解。
取值
| 值 | 示例 | 含义 |
|---|---|---|
auto | width: auto | 默认值。块元素填满容器的宽度;高度适应内容 |
| 长度 | 300px、20rem | 固定尺寸 |
| 百分比 | 50% | 包含块宽度(对 width)或高度(对 height)的百分比 |
| 视口单位 | 100vh、50vw、100dvh | 相对于浏览器窗口 |
min-content | width: min-content | 尽可能窄,由最长的单词决定 |
max-content | width: max-content | 和内容排成一行时一样宽 |
fit-content | width: fit-content | 类似 max-content,但永远不会比容器宽 |
为什么 height: 100% 不起作用
百分比 height 需要父元素有一个确定的高度,才有可以计算百分比的基准。当父元素的高度是 auto 时(这是常见情况),子元素的 height: 100% 也会表现得像 auto。
第一个子元素的高度只等于它的文字高度。第二个子元素填满了父元素,因为父元素设置了高度。要让整个页面靠百分比层层生效,从 html、body 往下的每个祖先元素都需要设置高度,这就是为什么大多数布局改用 flexbox 或 grid:它们的子元素不用任何百分比就能拉伸填满。
min-height 和 max-width:能伸缩的尺寸
固定尺寸很容易出问题:文字比预期长时,固定高度会溢出;而固定宽度对手机来说又太宽。min- 和 max- 属性设置的是限制,而不是确切的尺寸。
| 属性 | 含义 |
|---|---|
min-width | 永远不比这个更窄 |
max-width | 永远不比这个更宽 |
min-height | 永远不比这个更矮,但可以变高 |
max-height | 永远不比这个更高(多出来的内容会溢出) |
在比 360px 更窄的屏幕上(比如手机),卡片会跟着缩小,因为 max-width 只是一个上限。
当尺寸和限制同时存在时,限制优先:max-width 胜过 width,min-width 胜过 max-width。
width: auto 与 width: 100%
对于块元素,让 width 保持 auto 几乎总是你想要的效果。auto 会把整个盒子(包括内边距和边框)放进容器里。100% 则让内容和容器一样宽,然后再加上内边距和边框:
width: 100% 对默认不是块元素的元素(<input>、<img>、inline-block 元素)仍然有用,最好配合 box-sizing: border-box 使用。
按内容设置尺寸:fit-content
想让一个块元素只和它的文字一样宽,又不想把它改成 inline-block,就用 fit-content:
fit-content 配合 margin-inline: auto,可以让一个标签或类似按钮的块元素居中,同时保持和文字完全一样宽。
全高区块与视口单位
vh 是视口高度的 1%,vw 是视口宽度的 1%。在手机上,浏览器的地址栏会随滚动伸缩,所以 100vh 可能比你看到的区域更高。动态单位 dvh 跟随可见区域,而 svh 使用最小的可见高度:
.hero {
min-height: 100vh; /* fallback */
min-height: 100dvh; /* follows mobile toolbars */
}
全屏区块用 min-height 而不是 height,这样在文字很多的小屏幕上,区块仍然能变高。固定高度装不下内容时,内容会溢出来,这正是 CSS overflow 页面要处理的问题。
常见错误
- 在没有高度的父元素中使用
height: 100%。它的效果等同于auto。给父元素设置高度,或者使用 flex 或 grid。 width: 100%加上内边距。元素会溢出容器。让块元素的宽度保持auto,或者使用box-sizing: border-box。- 给文字容器设置固定高度。使用
min-height,这样文字更长或字号更大时也不会溢出。 - 给行内元素设置
width。<span>和<a>会忽略width和height;把它们设为inline-block或block。 - 给页面包裹元素设置
width: 1200px。在每部手机上都会出现横向滚动。改用max-width: 1200px。
常见问题
为什么 height: 100% 不起作用?
百分比高度是父元素高度的百分比,只有当父元素高度是确定值时才有效。如果父元素的高度是 auto(由内容撑开),这个百分比就会被当作 auto。给父元素设置一个高度,或者使用 flexbox 或 grid,它们不需要百分比就能拉伸子元素。
width: 100% 和 width: auto 有什么区别?
对于块元素,auto 会让包括内边距和边框在内的整个盒子填满容器。width: 100% 把内容宽度设为容器的宽度,所以在默认的 box-sizing: content-box 下,只要有内边距或边框,元素就会溢出。
CSS 中的 min-height 有什么作用?
它设置元素允许的最小高度,同时仍然让元素随内容增高。min-height: 200px 让空卡片有 200px 高,而文字更多的卡片会变高,不会溢出,这是固定的 height 做不到的。
width 和 max-width 有什么区别?
width 设置一个确切的尺寸。max-width 设置一个上限:元素可以更窄(比如在手机上),但永远不会更宽。width: 100%; max-width: 600px; 在小屏幕上填满宽度,在大屏幕上停在 600px。
如何让元素铺满整个屏幕高度?
使用 min-height: 100vh(或者 100dvh,这样会考虑到移动浏览器的工具栏)。用 min-height 而不是 height,内容比屏幕高时区块才能继续变高。