Menu

CSS 宽度和高度:min、max、% 与 auto 详解

width 和 height 设置元素盒子的尺寸。本文讲解固定尺寸和百分比尺寸、为什么 height: 100% 常常不起作用、用 min-height 和 max-width 实现灵活布局、auto 与 100% 的区别,以及 fit-content 等关键字。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

设置宽度和高度

width 和 height 设置元素内容盒的尺寸。默认情况下,内边距和边框会加在这个尺寸之外。

这个盒子是 260 × 100 像素:240 × 80 的内容,再加上每边 10px 的内边距。如果设置了 box-sizing: border-box,它就正好是 240 × 80;盒模型页面对两者都做了讲解。

取值

值示例含义
autowidth: auto默认值。块元素填满容器的宽度;高度适应内容
长度300px、20rem固定尺寸
百分比50%包含块宽度(对 width)或高度(对 height)的百分比
视口单位100vh、50vw、100dvh相对于浏览器窗口
min-contentwidth: min-content尽可能窄,由最长的单词决定
max-contentwidth: max-content和内容排成一行时一样宽
fit-contentwidth: 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,内容比屏幕高时区块才能继续变高。

Coddy 编程语言插图

和 Coddy 一起学编程

开始