前几天在W3cplus Demo站上放了一个CSS3 Sliding Form Helps效果。
今天我们就一起来看看他是如何实现的。
实现方法
在表单制作中,往往都在一个input后面或者右边有一个提示框效果,特别是表单验证的制作上。有错误的,警告的,正确的等多种帮助信息。以前大多数看到的有提示信息一直显示,第二种,当表单验正完后显示提示信息,第三种就是input得到焦点时提示用户如何操作。而这些效果以前都是依附在jQuery的上面实现,今天我想和大家一起探讨的是使用CSS3来实现。
实现原理也是来源于jQuery,在这个案例中,当表单载入时,所有提示信息都处理隐藏状态,一但input得到焦点,相对应的提示信息就会显示出来。
HTML Markup
<form action="#" method="post" class="form-horizontal"> <fieldset> <div class="control-group"> <label for="email" class="control-label">E-Mail:</label> <div class="controls controls-inline"> <input type="email" id="email" /> <span class="help-inline">Please Input Your Email!</span> </div> </div> <div class="control-group"> <label for="password" class="control-label">Password:</label> <div class="controls controls-inline"> <input type="password" id="password" /> <span class="help-inline">Please Input Your Password!</span> </div> </div> </fieldset> <fieldset> <div class="control-group"> <label for="email2" class="control-label">E-Mail:</label> <div class="controls controls-block"> <input type="email" id="email2" /> <span class="help-block">Please Input Your Email!</span> </div> </div> <div class="control-group"> <label for="password2" class="control-label">Password:</label> <div class="controls controls-block"> <input type="password" id="password2" >> <span class="help-block">Please Input Your Password!</span> </div> </div> </fieldset> </form>
这个结构很简单,渲染出来后就是左边label右边文本框的效果。在这里采用了Bootstrap的form结构和样式风格。详细的运用大家可以点击这里。我想在这里特别提出的是“帮助信息”的结构:
行内显示
<div class="controls controls-inline"> <input type="password" id="password" /> <span class="help-inline">Please Input Your Password!</span> </div>
表单的帮助信息和input将在同一行显示,在Bootstrap form基础上进行了扩展,给div.controls容器添加一个新类名“controls-inline”。
块状显示
<div class="controls controls-block"> <input type="password" id="password2" >> <span class="help-block">Please Input Your Password!</span> </div>
同样的道理,只不过更换了一个类名“controls-block”。
CSS Code
form { margin: 20px 0 18px; } fieldset { padding: 0; margin: 0; border: 0; } label, input, button{ font-size: 13px; font-weight: normal; line-height: 18px; } input, button{ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } label { display: block; margin-bottom: 5px; color: #333333; } input{ display: inline-block; width: 210px; height: 18px; padding: 4px; margin-bottom: 9px; font-size: 13px; line-height: 18px; color: #555555; border: 1px solid #cccccc; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } input[type="button"], input[type="reset"], input[type="submit"] { width: auto; height: auto; } input { -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; -moz-transition: border linear 0.2s, box-shadow linear 0.2s; -ms-transition: border linear 0.2s, box-shadow linear 0.2s; -o-transition: border linear 0.2s, box-shadow linear 0.2s; transition: border linear 0.2s, box-shadow linear 0.2s; } input:focus, textarea:focus { border-color: rgba(82, 168, 236, 0.8); -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); outline: 0; outline: thin dotted \9; } input{ margin-left: 0; } input:focus:required:invalid, textarea:focus:required:invalid, select:focus:required:invalid { color: #b94a48; border-color: #ee5f5b; } input:focus:required:invalid:focus, textarea:focus:required:invalid:focus, select:focus:required:invalid:focus { border-color: #e9322d; -webkit-box-shadow: 0 0 6px #f8b9b7; -moz-box-shadow: 0 0 6px #f8b9b7; box-shadow: 0 0 6px #f8b9b7; } :-moz-placeholder { color: #999999; } ::-webkit-input-placeholder { color: #999999; } .help-block, .help-inline { color: #555555; } .help-block { display: block; margin-bottom: 9px; } .help-inline { display: inline-block; *display: inline; *zoom: 1; vertical-align: middle; padding-left: 5px; } .form-horizontal input, .form-horizontal .help-inline { display: inline-block; margin-bottom: 0; } .control-group { margin-bottom: 9px; } .form-horizontal .control-group { margin-bottom: 18px; *zoom: 1; } .form-horizontal .control-group:before, .form-horizontal .control-group:after { display: table; content: ""; } .form-horizontal .control-group:after { clear: both; } .form-horizontal .control-label { float: left; width: 140px; padding-top: 5px; text-align: right; } .form-horizontal .controls { margin-left: 160px; *display: inline-block; *margin-left: 0; *padding-left: 20px; } .form-horizontal .help-block { margin-top: 9px; margin-bottom: 0; } .form-horizontal .form-actions { padding-left: 160px; } /*helps info*/ .form-horizontal .help-inline { position: relative; padding: 3px 6px; background: #444; color: #fff; z-index: -2; border-radius: 3px; -webkit-transition:all 0.5s; -moz-transition:all 0.5s; -o-transition:all 0.5s; -ms-transition:all 0.5s; transition:all 0.5s; position: relative; margin-left: -500px; } .form-horizontal .help-inline::before { content:""; display: block; height: 0; width: 0; position: absolute; top: 7px; left: -12px; border: 6px solid transparent; border-right-color: #444; z-index: 2; } .controls { position: relative; overflow: hidden; } .form-horizontal .help-block { background: #444; border-radius: 3px; padding: 3px 6px; position: absolute; top: 28px; left: 0; z-index: -2; color: #fff; -webkit-transition:all 0.5s; -moz-transition:all 0.5s; -o-transition:all 0.5s; -ms-transition:all 0.5s; transition:all 0.5s; } .form-horizontal .help-block::after { border: 6px solid transparent; border-bottom-color: #444; content:""; display: block; height:0; width: 0; left: 5px; top: -12px; z-index: 2; position: absolute; } .form-horizontal input:active + .help-inline, .form-horizontal input:focus + .help-inline { margin-left: 8px; } .form-horizontal .controls-block input:active, .form-horizontal .controls-block input:focus { margin-bottom: 35px; }
上面表单样式代码都是现成的,我就是一个拿来主义者,将bootstrap的表单的样式运用过来了,不过bootstrap表单的样式可没有动态显示帮助信息的功能。那么我在下面想给大家介绍的是这段代码。
1、提示信息样式
.controls { position: relative; overflow: hidden; } .form-horizontal .help-inline { position: relative; padding: 3px 6px; background: #444; color: #fff; z-index: -2; border-radius: 3px; -webkit-transition:all 0.5s; -moz-transition:all 0.5s; -o-transition:all 0.5s; -ms-transition:all 0.5s; transition:all 0.5s; position: relative; margin-left: -500px; } .form-horizontal .help-inline::before { content:""; display: block; height: 0; width: 0; position: absolute; top: 7px; left: -12px; border: 6px solid transparent; border-right-color: #444; z-index: 2; } .form-horizontal .help-block { background: #444; border-radius: 3px; padding: 3px 6px; position: absolute; top: 28px; left: 0; z-index: -2; color: #fff; -webkit-transition:all 0.5s; -moz-transition:all 0.5s; -o-transition:all 0.5s; -ms-transition:all 0.5s; transition:all 0.5s; } .form-horizontal .help-block::after { border: 6px solid transparent; border-bottom-color: #444; content:""; display: block; height:0; width: 0; left: 5px; top: -12px; z-index: 2; position: absolute; }
上面采用了一些CSS3属性,制作了一个tooltip的样式效果,代码很简单,不过有两种我单独提出来:
.form-horizontal .help-inline { margin-left: -500px; }
在“help-inline”样式中,使用“margin-left”的负值来隐藏帮助信息,当然大家可以将其值设置的更大,按需设置吧。
.form-horizontal .help-block { position: absolute; top: 28px; left: 0; z-index: -2; }
上面的这几行代码是用来设置块状帮助信息,在表单加入的时候不显示出来,位置的定制主要是靠“top”和“left”值,而隐藏是依靠“z-index”的值。
2、显示提示信息
这一步是今天的最关键的地方了,就是如何让表单的文本框得到焦点时,相对应的表单帮助信息能显示出来,下面我们先来看实现这个功能的代码:
.form-horizontal input:active + .help-inline, .form-horizontal input:focus + .help-inline { margin-left: 8px; } .form-horizontal .controls-block input:active, .form-horizontal .controls-block input:focus { margin-bottom: 35px; }
上面的几行代码就实现了我们需要功能,大家此时肯定会问为什么了?其实也并不是想像的那么复杂。关键性的功能来自于“CSS选择器”。一个是“相邻兄弟元素选择器(E + F)” ,另一个是伪类选择器。说得简单点“当表单得到焦点(:active和:focus)时其相邻的兄弟元素“help-inline/help-block”元素将做什么?”。因此在“.help-inline”我们改变了margin-left的值,由当初的“-500px”变成了“8px”。而对于块状提示信息,一但表单input得到焦点,就会增加一个“margin-bottom”值,从而使“help-block”显示出来。
功能就是这样实现的,是不是觉得很神呀,只可惜的是在IE下实现起来困难。不过对于不鸟IE的同学来说还是很适用的。我就把这个效果运用到一个iPhone的项目上。(^-^)
那么关于这个教程就说到这了,如果你感兴趣,可以点击这里查看所有代码,也可以下载源码自己学习。
最后希望大家喜欢,如果觉得这篇教程对你学习有帮助,多多支持本站。如果你有更好的思路可以在下面的评论中给我留言,与大家一起分享你的经验。
如需转载烦请注明出处:W3CPLUS