您可能已经看到这种模式在流行。 它是一个输入,看起来像是带有占位符文本,但当您单击/点击该输入时,该文本会让路,让您在其中输入。 我认为它相当聪明。 Brad Frost 有 一篇关于它的非常好的文章,详细介绍了优缺点等等。
我看到过许多演示都涉及 JavaScript。 几天前,我在 Nest.com 结账时,看到了他们使用这种技术的方法,我想到了一个无需 JavaScript 就可以实现该方法的方法。 所以我们在这里。
以下是 Nest.com 的外观

这是我的看法
它不像 Nest 的那样性感,因为标签向上滑动时文本会逐渐消失。 当然,可以使用一些 JavaScript 实现,但我们将在本文中坚持使用纯 CSS。 尽管如此,这仍然可能实现。 我将把这个挑战留给您。
一些快速提醒
您可能考虑执行此操作有两个原因
- 它可能会节省空间。 由于输入和标签合并在一起,因此它占用的空间更少。 当输入处于焦点时,您仍然需要同时显示标签和输入,但您可以通过使用输入已经使用的一些空间或仅针对处于焦点的输入暂时扩展该区域来获得该空间。
- 它使输入成为一个大按钮。 这并非说输入本身不是按钮,也并非说标签在拥有适当的
for
属性时不是按钮,但一个大的矩形可以告诉您它想要的东西,您只需点击/点击它,这感觉有点好。 特别是在移动设备上,这可能是一种不错的体验。
我认为,通常情况下,始终可见的标签可能“更好”——但这是一个聪明的想法,如果做得正确,可能会在某些情况下有用。 这也总是存在搞砸并影响可访问性的风险,因此请小心。 这种模式的一个缺点是:我们不能在标签之外使用 placeholder
,这可能会有所帮助(例如,标签为“电话号码”,占位符提示为“(555) 555-5555”)。
技巧 (1/3) – 标签即占位符
有一个 <div>
包含 <label>
和 <input>
(无论如何都需要这样做,因为表单中的输入需要位于块级元素中),它具有相对定位。 这允许在其中使用绝对定位,这意味着我们可以将标签和输入定位在彼此之上。 如果我们这样做,将输入放在上面,但使用透明背景,您将能够看到下面的标签,同时仍然可以单击它。
<div>
<input id="name" name="name" type="text" required>
<label for="name">Your Name</label>
</div>
form > div {
position: relative;
}
form > div > label {
position: absolute;
}
技巧 (2/3) – :focus 状态和相邻同级组合器
<label>
和 <input>
的源代码顺序在这里关系不大,因为它们在语义上与 for
属性绑定在一起。但如果我们将输入放在前面,这意味着我们可以利用它的 :focus
状态和相邻同级组合器 (+) 来影响标签的焦点状态。 类似于 复选框黑客 的概念。
input:focus + label {
/* do something with the label */
}
您可以对标签执行任何操作。 只需找到一个酷炫的位置将其移动并进行样式设置,使其不会影响在输入中键入。 我的示例有两个可能性:一个是使其变小并移向输入的底部,另一个是将其移到最右侧。
form.go-bottom label {
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 100%;
transition: 0.2s;
}
form.go-bottom input:focus + label
top: 100%;
margin-top: -16px;
}
技巧 (3/3) – :valid 状态
当输入中有实际文本,并且输入再次失去焦点时,看到标签和输入文本重叠在一起会非常奇怪(糟糕)。 幸运的是,CSS 中有一个 :valid
选择器,当输入处于有效状态时,它会在输入上生效。 该有效状态可以是“任何文本”,假设使其有效的唯一条件是具有任何值,这可以通过以下方法实现
<input type="text" required>
然后记住,您能够看到标签的唯一原因是输入具有透明背景。 要隐藏它,我们可以使用不透明背景代替
form input:valid {
background: white;
}
其余部分只是调整设计细节,直到您满意为止。
更多
这个想法 最初来自 Matt D. Smith,他的设计如下

- 请务必阅读 Brad Frost 的文章,它很好地介绍了优缺点。
- 许多人使用 JavaScript 解决过这个问题:Jeremy Fields、Jim Nielsen 和 maman
- 在寻找要放在这里的一些链接时,我发现 David Bushell 几乎完全 做了我在这里做的事情。
- 这是 一个关于浮动标签的 CodePen 示例集。
:placeholder-shown
2018 年更新 - 使用 :placeholder-shown
选择器 在本文最初撰写时并不存在。 Emil Björklund 重新讨论了这个话题,因为它现在已经存在。
太棒了!!!
这真的很令人印象深刻......如果它能在所有浏览器上完全支持就好了
几乎所有比较新的 CSS 功能都可以这么说!
话虽如此,这对占位符文本来说是一个很好的补充。
即使它不起作用,也没关系。
不错! 说明一点:与其重载
:valid
(您可能希望将其用于字段验证),不如使用:empty
选择器......Alex,我认为
:empty
选择器在这种情况下不起作用。:empty
选择器不是只选择没有子元素的元素吗? 在这种情况下,我们需要检查输入字段的值——而不是它是否具有任何子元素。输入显然始终被认为是
:empty
- http://codepen.io/chriscoyier/pen/oiKwD事实上,根据 HTML 规范,
input
元素是“空”元素(就像图像一样),因此它们永远不会有任何子节点。即使没有效果,这仍然比使用占位符作为标签更好,因为它们的语义完全不同,不应该这样使用。
https://mdn.org.cn/en-US/docs/Web/HTML/Element/input#attr-placeholder
是的,这也是我最初的想法。
Jonathan Snook 更快——http://snook.ca/archives/html_and_css/floated-label-pattern-css
我做了一个 [类似示例]((http://codepen.io/Wakkos/pen/hCquc) 以视觉方式“验证”(情感验证 =P),但我发现了一个问题:我(我们所有人)都需要一个 not[:focus]:invalid-input-but-not-empty 选择器来用它创造美丽的事物。
因为我尝试在用户输入无效文本但将焦点从字段中移出时给它一个颜色 =(
http://codepen.io/Wakkos/pen/hCquc
太棒了!
如果有一个 CSS 选择器可以识别
input
和label
元素之间的关系,那就太好了。因此我们可以说类似input:focus:label
的东西。这可能会让创造力更上一层楼,因为我们不需要在 DOM 中让label
紧接在input
之后。只是一个想法。纯粹的赞叹。我想我可能会在我的一个新网站项目中使用它,这是我为客户做的。
非常感谢。
实际上,不久前我就做了一个关于这个的 笔!
这是一个经过深思熟虑的、很棒的概念。
我喜欢 Matt 的一个地方(你提到的你基于其版本构建的原始版本),那就是字段标签在你离开字段后仍然存在。有没有办法在你的版本中保留视觉标签?我真的很喜欢这种行为。我也真的很喜欢它没有涉及到 JS。
是我还是它太性感了?
这是一个不错的技巧,我尝试过做一些类似的事情,但给输入添加了一个 z-index,并使用输入的焦点状态,以便标签仍然可以以可访问的方式放置。可惜的是,这个技巧需要所有字段都是必填的才能起作用。
此外,以这种方式添加一些额外的验证也很不错。这样,所有内容都保留在同一个输入字段中。
是的……我现在正在使用它,谢谢。
这里真正让我兴奋的是使用 相邻兄弟选择器。然而,我不得不说,我一点也没有使用过这个选择器。这种情况即将改变。
即使你没有听说过它们,当你看到浏览器兼容性 - IE7 时,你也可以知道相邻兄弟选择器已经存在了一段时间。哈哈,说笑而已,它们非常有用!祝你好运!;)
对于右边的标签,
input:focus
和textarea:focus
上的padding-right
大于或等于标签的宽度(演示中为 40%),可以防止你的输入在你输入时跑到标签下面。权衡是,当你用点击手动设置光标时,填充会在焦点之后但在点击设置光标之前发生变化,因此它有点不可预测。
(在 Codepen 上:仅使用 CSS + padding-right 的标签模式)
不错,不错,太棒了!
用一个词概括就是,“太棒了”
玩得很开心。复杂的代码会让更多浏览器失败,比如 Opera Presto。
http://codepen.io/Merri/full/boDgs
嗨,我是 Nest 浮动标签版本背后的开发者。我很高兴你喜欢它!在它投入生产之前不久,我发布了关于我如何用示例代码和简化的演示来实现它的文章。我也对它需要 JavaScript 感到不满意,并已经开发了一种类似的纯 CSS 方法,希望很快就会发布到网站上。原始文章:http://mozmonkey.com/2013/12/good-ux-for-placeholders-as-field-labels/
这是一个非常酷的表单概念。
一定会将它整合到当前项目中。非常,非常棒!!
另外,也要向上面提到的 Jeremy Gillick 致敬,因为他链接了他的原始文章。
我真正喜欢的是,他提到了字段处于 焦点 状态时的可用性。我完全没有想到。一点也没有!真的不错。
太酷了!
不错!告诉我如何在这里显示表单验证?
我很想看到关于这方面的演示。由于该技巧的主要目的是节省空间,我猜你需要巧妙地添加错误消息,使其 1) 明显 2) 易于理解 3) 仍然节省空间。
样式化工具提示不会太难。
Nest 表单通过在字段上方创建一个漂浮的红色气泡来显示错误。我在 Codepen 上创建了一个简单的示例
http://codepen.io/jgillick/pen/JKwlq?asdfasdf
不错。谢谢。
我在这里制作了一个带验证的 Mailchimp 注册表单:http://mattdsmith.com/float-label-demo/ 感谢你的文章 Chris!
我会稍微更新一下,如果浏览器不支持 占位符 (IE 8/9),默认情况下显示标签。
另外,一些基于 jQuery 的 JavaScript 应该转换为纯 JavaScript 或添加到你的 Modernizr 测试中
$( ‘html’ ).addClass( ‘placeholder’ in document.createElement( ‘input’ ) ? ‘placeholder’ : ‘no-placeholder’ );
我想看看选择标签在这种情况下如何工作。我认为垂直偏移必须从箭头开始,水平偏移必须覆盖箭头。
Chris,你又做到了。
看来我得更新我的 Drupal 模块,以便使用这个最新最好的模块:Label Trash 模块
太棒了。我迫不及待地想在我的下一个项目中使用它。
很棒,但在 ie8 及以下版本中效果不太好。
太棒了!
我也做了 这个的实现,并通过突出显示上面的标签来添加验证(状态)。我的概念不同:标签在语义上是输入所必需的。
请查看它,并告诉我你的想法。
之前尝试过这种方法,它存在一个问题,即当字段不为空但无效时。
Screen
如果你能够将标签移开,你仍然可以使用占位符。不过,我不确定它会是什么样子。
另一个选择是在你将焦点放在字段上之前“隐藏”占位符 - http://codepen.io/zaus/pen/gKnhl
Chris 的文章很棒。它激发了我创建 Bootstrap 实现和外观和感觉的混音。在我的博客上查看:http://mattlambert.ca/blog/animate-bootstrap-form-labels-using-css3-transitions/
谢谢!信息量很大。继续努力!
天才。这是一个为表单创造新体验的好方法。正是这样的细微之处才能带来天壤之别。
嗯.. 我不太明白.. 从底部滑入的效果也可以用纯 CSS 实现。(关键帧动画)…. http://codepen.io/pixelass/pen/nujKD
这很聪明。但我必须保存动画,因为动画会稍微分散打字注意力。除此之外,这是一个减少空间并使表单看起来更现代的好方法。
这是一个非常棒的想法。近年来,很多东西都用 CSS3 和 jQuery 进行装饰,但表单却基本被忽略了… 可能是因为大多数人讨厌制作表单 :P。我喜欢它如何节省空间并为表单增添一点酷炫的感觉。我可能会在我的当前项目中使用它来装饰我那乏味的联系表单。IE8 兼容性是一个问题,但使用 \9 CSS 技巧,我认为这个概念是可行的。在不久的将来可能会创建一个小的表单框架。谢谢。
你是如何制作那些展示表单工作原理的动画图像的?
我认为,如果标签在输入了一些信息后就消失了,将会影响可用性,因此我还会添加一个规则,以便它在 `input` 的 `:valid` 状态下保持可见。
我在 Firefox 和 IE 上遇到了一个问题。标签没有与输入对齐,而是偏离到输入的右侧。在 Chrome、Safari 和 Opera 中看起来不错。有人遇到过这种情况吗?还是只有我遇到了?
如果字段有效,颜色标签更改就完美了
就像这里 http://caldev.io/a 一样,带有图标状态(星号或勾号)
由 angularjs 驱动
我已经创建了一个与最后一个示例相同的表单。
http://codepen.io/jzilg/full/mujzo
太棒了
充满活力,很棒。在 Firefox 中运行良好,但在 Adsense 广告出现时它会消失(根据广告宽度)。如果您能为这个问题提供解决方案,我将不胜感激。提前感谢并期待您的回复。
我想知道为什么没有人提到非输入 UI 元素。你如何将其应用于下拉菜单、复选框、单选按钮、自动完成等?
因为没有完整的 UI 支持,这只是一个原型想法。恕我直言,在文本字段上使用一些 UI 模式,而在其他类型上不使用是不合适的。
这很可爱,但我遇到了 Chris B. 提到的相同问题。标签只是偏离到框的右侧,并且除了边框颜色变化之外,焦点上什么也没有发生。这在一个只包含从这个 css-tricks 示例复制的表单和样式代码的文件中。然后我将我的文档类型等更改为 html5,以为可能是以前版本没有处理的某些东西,但显然不是这样。
我非常感谢任何建议。到目前为止,除了基础知识之外,我对 CSS 没有做过太多(虽然我一直将编码作为爱好,但已有好几年了),但通常当我直接使用他人的示例并且没有其他任何内容时,它都能正常工作。
补充一下:Jeremy S 的版本在框中放置了一个占位符,该占位符在获得焦点时会“消失”,但它仍然不会将标签带到框的底部(在任何浏览器中)。你们确定页面不需要一些必需的头部标签或 JavaScript 来实现此功能吗?也许你们认为这是显而易见的?