CSS :placeholder-shown伪类实现输入框浮动文字效果

栏目: CSS · 发布时间: 4年前

内容简介:翻译自在这篇文章中,我们将使用:placeholder-shown伪类创建一个浮动的问题标签效果,使用纯CSS实现。

翻译自 《CSS Only Floated Labels with :placeholder-shown pseudo class》

在这篇文章中,我们将使用:placeholder-shown伪类创建一个浮动的问题标签效果,使用纯CSS实现。

CSS :placeholder-shown伪类实现输入框浮动文字效果

浮动的文字标签

当我们处理输入框时,会想方设法提供给用户更好的体验。有两个标签属性是我们经常会用到的:

1. label标签是关联表单元素,提供说明信息最适合的元素。

2. 输入框的placeholder属性允许您指定没有输入内容时出现在<input>元素内的文本。它用于显示示例文字,而不是解释或提示。

这两个标签属性可以组合起来创建“浮动文字标签”的效果,这种效果具体指的是:

1. 首先,用户看到一个带有placeholder属性的input标签,显示了一些示例性质的问题。label元素默认是隐藏的。

2. 当input输入框被激活并开始输入内容时,label元素会浮动显示在输入框的上方。

3. 当输入框内有文字内容时,label元素就一直保持显示在输入框的上方,用于标示用户输入的内容。

CSS :placeholder-shown伪类实现输入框浮动文字效果

纯CSS实现浮动的标签文字

注册focus事件,判断是否输入有值,隐藏一个元素,并根据输入框是否有内容来决定是否显示这个元素。这听起来像是JavaScript的工作,对吗?并不是的!因为有一个CSS伪类:placeholder-shown可以实现上述的效果。MDN中是这样解释这个伪类的:

:placeholder-shown CSS 伪类 在 <input> 或 <textarea> 元素显示 placeholder text时生效。

换句话说,如果输入框中有任何值,我们都可以认为:placeholder-shown伪类不会被触发。

下面是我使用这个伪类来实现浮动标签的思路:

1.构建HTML代码,通过相邻兄弟选择器就可以选择input元素所对应的label标签,并将这两个元素包裹在一个div中。

2.设置input,label以及::placeholder伪元素的样式。

3.将label元素放置在起始位置,并在div中垂直居中,然后隐藏它。

4.通过:not, :focus和:placeholder-shown伪类的组合决定什么时候显示label标签:如果placeholder text消失了,则显示label — input:not(:placeholder-shown) + label;如果输入框获取到了焦点,并且没有显示placeholder text,则显示label — input:focus:not(:placeholder-shown) + label

下面就按照上面的思路来完成HTML与CSS。

HTML & CSS

HTML的结构实际上非常简单,就像这样:

  1. <div class="Input">
  2. <input type="text" id="input" class="Input-text" placeholder="Your first name, e.g. Nicholas">
  3. <label for="input" class="Input-label">First name</label>
  4. </div>

CSS代码:

  1. .Input {
  2. /**
  3.    * 容器的相对定位很重要, 因为label元素的浮动位置是相对于它计算的
  4.    */
  5. position: relative;
  6. }
  7. .Input-text {
  8. /**
  9.    * 设置输入框的样式。 字体大小和行高对于确定标签的精确定位非常重要
  10.    */
  11. display: block;
  12. margin: 0;
  13. width: 100%;
  14. /**
  15.    * 这些属性在示例中会通过自定义属性的方式一次性设置:
  16.    *
  17.    * padding
  18.    * font-size
  19.    * line-height
  20.    */
  21. }
  22. .Input-text:focus {
  23. /**
  24.    * 输入框获取焦点时的样式
  25.    */
  26. }
  27. .Input-label {
  28. /**
  29.    * label元素设置为绝对定位,并根据父元素和输入框计算出它的位置与移动距离
  30.    */
  31. display: block;
  32. position: absolute;
  33. opacity: 0;
  34. /**
  35.    * 这些属性在示例中会通过自定义属性的方式一次性设置:
  36.    *
  37.    * bottom
  38.    * left
  39.    * font-size
  40.    * line-height
  41.    * transform
  42.    * transform-origin
  43.    * transition
  44.    */
  45. }
  46. .Input-text:placeholder-shown + .Input-label {
  47. /**
  48.    * 当占位文字可见时,会隐藏label
  49.    */
  50. visibility: hidden;
  51. z-index: -1;
  52. }
  53. .Input-text:not(:placeholder-shown) + .Input-label,
  54. .Input-text:focus:not(:placeholder-shown) + .Input-label {
  55. /**
  56.    * 当占位文字消失后,例如当输入内容时,label元素会显示并浮动在输入框的上面
  57.    */
  58. visibility: visible;
  59. z-index: 1;
  60. opacity: 1;
  61. /**
  62.    * 这些属性在示例中会通过自定义属性的方式一次性设置
  63.    *
  64.    * transform
  65.    * transition
  66.    */
  67. }

完整的演示效果

See the Pen CSS Only Floated Labels by Nick Salloum ( @callmenick ) on CodePen .

浏览器支持

到目前为止,浏览器支持度还不错,除了Edge。

CSS :placeholder-shown伪类实现输入框浮动文字效果

总结

我希望你通过这篇文章学到了一些东西,你还可以想出一些使用:placeholder伪类有趣的新方法。再次感谢您的阅读!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

XML Hacks

XML Hacks

Michael Fitzgerald / O'Reilly Media, Inc. / 2004-07-27 / USD 24.95

Developers and system administrators alike are uncovering the true power of XML, the Extensible Markup Language that enables data to be sent over the Internet from one computer platform to another or ......一起来看看 《XML Hacks》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具