CSS 字段大小调整

一行代码即可自动调整包含可编辑内容的元素的大小。

如果没有 field-sizing,若要创建尺寸合适的输入字段,您必须猜测文本字段输入的平均大小,或者使用 JavaScript 统计字符数,并在用户输入文本时增加元素的高度或宽度。换句话说,在尝试跟随用户输入的输入内容时,这并不容易,而且容易出错。

对于 field-sizing,您只需一行 CSS 即可实现根据内容调整大小。这种基于内容的大小调整样式不仅适用于 textarea,还适用于其他元素!

textarea, select, input {
  field-sizing: content;
}

浏览器支持

  • Chrome:123。
  • Edge:123。
  • Firefox:不受支持。
  • Safari:不支持。

来源

规范 | 产品讲解

喜欢短视频?

Wes BosJhey 在 Twitter 上各自发布了一段介绍 field-sizing 的优质视频。

哪些元素会受到字段大小的影响?

下面列出了 field-sizing 可以处理的 <form> 元素,并总结了它们对每个元素的影响。

<textarea>

输入内容会收起为 min-inline-size 或以适应占位符的大小显示。

随着用户输入,输入会沿内嵌方向增大,直到达到内嵌大小上限;届时文本将换行,且输入的块大小也会增大以适应新行。

<select><select multiple>

选择元素会缩小以适应所选选项。

具有 multiple 属性的 select 会扩展以适应最宽的选项,并根据需要设置高以适应选项数量。

<input type="text"><input type="email"><input type="number">

输入会收起为 min-inline-size 或以适合占位符。

当用户输入内容时,输入内容会沿内嵌方向增长,直到达到 max-inline-size,此时溢出会剪裁输入值。

<input type="file">

输入框会收起为按钮和预填充的文件名文本。

上传文件后,输入框的宽度会与按钮和文件名文本的宽度相同。

查看、测试和比较结果

下面是一个交互式最小示例,展示了每个表单元素在受 field-sizing 影响之前和之后的行为。

在 Codepen 上试用

仔细了解

使用 [placeholder] 时,占位符会变为内容。我们之前曾提到过这一点,但在此再次强调,因为在设置表单样式时,这一点非常重要。长或短占位符会更改使用 field-sizing: content 的输入的内在大小。

在 Codepen 上试用

空和溢出样式处理

使用 field-sizing 确实意味着您必须执行一些额外的工作。Ahmad Shaded 称之为“防御性 CSS”,其目标不一定是明确说明某项内容应如何表现或呈现,而是保护其免于陷入不良的视觉状态。以前,输入有相当多的固定大小,但应用 field-sizing: content 后,输入可能会变得太小或太大。

以下样式是一个不错的起点。它们有助于确保元素不会收起到太小的方框中,并且在 textarea 的情况下也不会变得太大。

textarea {
  min-block-size: 3.5rlh;
  min-inline-size: 20ch;
  max-inline-size: 50ch;
}

select {
  min-inline-size: 5ch;
  min-block-size: 1.5lh;
}

input {
  min-inline-size: 7ch;
}

此 CSS 使用相对单位进行大小调整。新的 lh 单位非常适合块大小,而 ch 非常适合内嵌大小。

字段大小调整的默认值是什么?

field-sizing 的默认值为 fixed,并且仅接受 fixedcontent 这两个值。