文本输入特效的一些技巧
表单输入可以使web页面增加微妙、有趣的特效。这是用户在某种情况下会与之交互的元素,使它们用起来很好玩可以提高用户体验。我们可能习惯了文本在纸张上的形式,但在数字世界里它们可以更加多姿多彩。这篇文章中,我将分享一些文本输入的新风格和特效。Andrej Radisic在Dribbble上已经有了不错的作品,比如Jawbreaker 输入域,我们的特效就是基于这其中的一种。大多数特效会结合使用CSS动画和伪元素。
注意,这仅仅是由灵感而来,并没有考虑兼容性,我们使用的CSS属性只适用于现代浏览器。
作为标记,我们使用span来封装输入域和标签。为了使特效工作,我们在输入域后放一个只有在使用复选框和单选框时才用到的标签。完全依赖于动态地添加类来获取当前操作的焦点是没有必要的。为了演示这个demo,我们使用了CSS中的:focus pseudo-class和邻接选择器组合的隐藏功能。但你也可以在触发类中使用更多的语义规则,触发类也被用来确保输入域总是打开的(由于标签的位置该输入域不可关闭)。注意,并不是所有特效在CSS中都有触发类。
1 2 3 4 5 6 |
<span class="input input--haruki"> <input class="input__field input__field--haruki" type="text" id="input-1" /> <label class="input__label input__label--haruki" for="input-1"> <span class="input__label-content input__label-content--haruki">First Name</span> </label> </span> |
标签的功能非常强大。我们可以使用伪类:before和:after来定义修饰部分,比如边界和背景,它们可以被移动和操作,甚至可以适当地使用一些CSS来制作简单动画。比如,可以做一个像“Kyo”那样的覆盖层。
第一个特效,“Haruki”,可能看起来好像改变了带有边界的元素高度,但实际上是移动了两个标签伪元素,每一个类似于一个边界(vendor-prefixed属性除外):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
.input--haruki { margin: 4em 1em 1em; } .input__field--haruki { padding: 0.4em 0.25em; width: 100%; background: transparent; color: #AFB5BB; font-size: 1.55em; } .input__label--haruki { position: absolute; width: 100%; text-align: left; pointer-events: none; } .input__label-content--haruki { transition: transform 0.3s; } .input__label--haruki::before, .input__label--haruki::after { content: ''; position: absolute; left: 0; z-index: -1; width: 100%; height: 4px; background: #6a7989; transition: transform 0.3s; } .input__label--haruki::before { top: 0; } .input__label--haruki::after { bottom: 0; } .input__field--haruki:focus + .input__label--haruki .input__label-content--haruki, .input--filled .input__label-content--haruki { transform: translate3d(0, -90%, 0); } .input__field--haruki:focus + .input__label--haruki::before, .input--filled .input__label--haruki::before { transform: translate3d(0, -0.5em, 0); } .input__field--haruki:focus + .input__label--haruki::after, .input--filled .input__label--haruki::after { transform: translate3d(0, 0.5em, 0); } |