让我们仅使用 HTML 和 CSS 创建一个浮动标签输入
浮动标签输入是一种将输入标签和输入框本身在视觉上合并为一个元素的元素。当输入框获得焦点或包含内容时,标签会从占位符模式切换为标签模式。这一概念由Matt D. Smith于 2013 年首次提出,自此便成为一种广泛使用的模式,甚至成为 Google Material Design 的标准元素。
这种模式至今仍在使用,原因如下:
- 节省空间
- 看起来很干净,使扫描表格更容易
- 流畅的过渡效果看起来很棒
- 无障碍
但开发人员和设计师也需要注意以下几点:
- 不能同时使用标签和占位符 - 标签也代替了占位符。
- 浏览器支持 - 根据实现情况,您需要使用 Javascript(性能问题、JS 依赖性等)或更现代的 CSS(不支持 Edge 和 IE 浏览器)。
- 标签在输入焦点时会变小,如果它有值 - 它会更难阅读。
要求和规范
在此示例中,我们将不使用 JavaScript 来实现此输入,而是使用现代 CSS 语法。这意味着 Edge 和 Internet Explorer 浏览器将无法完全支持其视觉功能和过渡效果,但仍可使用。
我们的实施将遵循针对高质量用户体验进行优化并基于用户研究的设计。
过渡(动画)需要流畅,并尽可能利用硬件加速。
我们还希望使输入变得可访问并保留本机选项卡导航。
可访问的标记
<div class="floating">
<input id="inputId" class="floating__input" name="input name" placeholder="Placeholder" />
<label for="inputId" class="floating__label" data-content="Placeholder">
<span class="hidden--visually">Placeholder</span>
</label>
</div>
我们将使用一个包装元素<div class="floating">
,将输入框和标签框组合到一个容器中,并处理输入框之间的间距。包装元素并非必需,但它可以简化组的样式设置。
我们还使用了 来实现元素的无障碍隐藏<span class="hidden--visually">
。我在之前的一篇文章中介绍过这种隐藏元素的方法。
造型
为这个元素设置样式所需的代码大约有 80-95 行,因此我决定只重点解释一些比较复杂的具体部分。完整的 HTML 和 CSS 代码可以在下面的 Codepen 示例中查看。
样式实现细节:
- 我们使用
:placeholder-shown
CSS 选择器和placeholder
HTML 属性让浏览器执行检测何时应将标签调整为较小尺寸或以全尺寸显示的逻辑 - 我们正在使用 CSS 变量轻松更改配色方案
- 我们使用
:focus
CSS 选择器来允许键盘选项卡交互以及常规点击(或触摸)交互
CSS 的过渡和动画需要流畅,因此我们将使用translate3d
和来为动画scale3d
添加硬件加速top
支持。大多数其他纯 CSS 解决方案都使用绝对位置 CSS 属性(例如和 )left
来实现过渡,而这些属性由于性能不佳而需要避免使用。我在之前的一篇文章中更深入地讨论过这个主题。
其他一些纯 CSS 解决方案利用required
HTML 属性:valid
或:invalid
选择器来判断标签何时需要转换,这种做法不仅不规范,而且语义错误。此外,它还使得非必需输入无法实现。
在我们的实现中,标签转换逻辑与占位符显示逻辑共享,因此使代码在语义上更加正确和灵活。
示例和源代码
Edge 和 IE 后备
如前所述,我们使用了现代 CSS 语法而不是 JavaScript,并且获得了更清晰、更高效的标记,但由于 Edge 和 Internet Explorer 不支持:placeholder-shown
选择器,因此我们也减少了浏览器支持。
幸运的是,我们的示例在这些浏览器上仍然可用。我们只是不显示动画,并且标签始终显示在其焦点状态下。我们也可以使用浏览器特定的选择器(hacky)或使用Modernizr(Javascript)(如果已包含在项目中)为这些浏览器提供更好的回退。
这些文章都是咖啡带来的灵感。所以,如果你喜欢我的文章,觉得它有用,不妨请我喝杯咖啡!我会非常感激的。
感谢您花时间阅读这篇文章。如果您觉得它有用,请点赞 ❤️ 或 🦄,分享并评论。
文章来源:https://dev.to/adrianbdesigns/let-s-create-a-floating-label-input-with-html-and-css-only-4mo8