今天我们一起来看看如何创建一个实用并且功能强大的表单,表单使用如今最热门的技术HTML5和css3来创建,并且可以通过HTML5进行客户端验证。

查看预览下载附件

第一步:策划表单功能

首先,我们得为我们的表单策划一下该有什么功能,用什么形式表现。在这个示例中,我们就制作一个比较简单的留言表单。需要的功能如下:

  • 名称
  • 电子邮件
  • 网站地址
  • 提交按钮

我们都希望用户能够填写正确的信息再提交,要实现这一点,我们可以使用HTML5客户端验证新技术。那怎么样使用这个功能呢?在这里简单的使用服务器验证,不做进一步的深入了解。

第二步:策划表单形式

在我心中,憧憬着一个美丽而简约的提交表单。虽然现在很丑,但是他不是野鸡是凤凰。

就像上图显示的,包含下面几个部分:

  • 表格标题(Required fields)
  • 表格标签
  • 表格输入(Placeholder text)
  • 表单提示
  • 提交按钮

现在我们已经确定好了表单的形式,就开始创建HTML结构代码。

第三步:创建HTML结构代码

根据上面确定的形式来创建最基本的HTML代码。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>HTML5 Contact Form</title>
  6. <link rel="stylesheet" media="screen" href="styles.css" >
  7. </head>
  8. <body>
  9. </body>
  10. </html>

在这里页面还是空白的。这只是一个网页最基本的代码。

第四步:HTML表单

开始在页面中创建表单。

  1. <form class="contact_form" action="" method="post" name="contact_form">
  2. </form>

第五步:HTML表单元素

为了更好的理解和维持表单的形式,我们将一步一步的添加表单里面的元素。
那最先开始的是创建表单表头和第一个输入框:

  1. <ul>
  2. <li>
  3. <h2>联系我们</h2>
  4. <span class="required_notification">* 表示必填项</span>
  5. </li>
  6. <li>
  7. <label for="name">姓名:</label>
  8. <input type="text" name="name" />
  9. </li>
  10. </ul>

表单提示

根据我们的策划图来看,我们要给表单的“电子邮件”、“网站”增加提示语,所以我们要在input下面增加提示语区域,再将他们统一样式处理。

  1. <li>
  2. <label for="email">电子邮件:</label>
  3. <input type="text" name="email" />
  4. <span class="form_hint">正确格式为:javin@example.com</span>
  5. </li>

其余的表单输入元素

继续添加其他的表单输入元素。

  1. <li>
  2. <label for="website">网站:</label>
  3. <input type="text" name="website" />
  4. <span class="form_hint">正确格式为:http://www.jiawin.com</span>
  5. </li>
  6. <li>
  7. <label for="message">留言:</label>
  8. <textarea name="message" cols="40" rows="6" ></textarea>
  9. </li>
  10. <li>
  11. <button class="submit" type="submit">提交</button>
  12. </li>

第六步:添加占位符属性

作为HTML5的改进之一的网页表单可以设置placeholder占位符属性。占位符字段会在输入区域为空时或者不处于焦点时显示的,在以前我们只能用javascript来实现。增加占位符字段可以引导用户正确的输入信息。

  1. <input type="text" name="name" placeholder="Javin" />
  2. <input type="text" name="email" placeholder="javin@example.com" />
  3. <input type="text" name="website" placeholder="http://www.jiawin.com/" />

提示技巧:placeholder文本风格定义:

这里给大家一个小技巧,如果你想改变占位符的默认风格,可以通过下面的代码方式修改(注意浏览器的前缀):

  1. :-moz-placeholder {
  2. color: blue;
  3. }
  4. ::-webkit-input-placeholder {
  5. color: blue;
  6. }

在现代的浏览器中一般都支持placeholder,除了IE9。如果你需要他在所有的浏览器中都支持的话,可以考虑用javascript解决方案。

第七步:定义基本的CSS

接下来定义下基本的CSS样式。

1、格式化 :focus 的样式

Webkit内核浏览器会自动给添加一些焦点样式,我们要自定义风格,所以需要把它给去掉默认值。

  1. *:focus {outline: none;}

2、字体排版样式

添加字体以及字体大小样式。

  1. body {font: 14px/21px "Lucida Sans", "Lucida Grande", "Lucida Sans Unicode", sans-serif;}
  2. .contact_form h2, .contact_form label {font-family:Georgia, Times, "Times New Roman", serif;}
  3. .form_hint, .required_notification {font-size: 11px;}

3、列表样式

因为我们的表单结构是用列表,所以定义列表来美化。

  1. .contact_form ul {
  2. width:750px;
  3. list-style-type:none;
  4. list-style-position:outside;
  5. margin:0px;
  6. padding:0px;
  7. }
  8. .contact_form li{
  9. padding:12px;
  10. border-bottom:1px solid #eee;
  11. position:relative;
  12. }

此外,我们增加了顶部和底部的边框线,使用:first-child:last-child选择符来实现。这样子就增加了我们表单的美观,但是古老的浏览器不支持这两个选择符,不过这不是重点,我们要向前看,只要最流行的现代浏览器支持就行。

  1. .contact_form li:first-child, .contact_form li:last-child {
  2. border-bottom:1px solid #777;
  3. }

4、表头样式

现在来定义我们的表头风格,有两部分,一个是标题标题,另一个是通知的星号(*)表示必填字段。

  1. .contact_form h2 {
  2. margin:0;
  3. display: inline;
  4. }
  5. .required_notification {
  6. color:#d45252;
  7. margin:5px 0 0 0;
  8. display:inline;
  9. float:right;
  10. }

5、表单输入样式

表单的输入元素是表单的核心,用来收集信息。

  1. .contact_form label {
  2. width:150px;
  3. margin-top: 3px;
  4. display:inline-block;
  5. float:left;
  6. padding:3px;
  7. }
  8. .contact_form input {
  9. height:20px;
  10. width:220px;
  11. padding:5px 8px;
  12. }
  13. .contact_form textarea {padding:8px; width:300px;}
  14. .contact_form button {margin-left:156px;}

现在再加入一些额外的美化样式,其中会使用到CSS3,在现代浏览器中视觉效果会更加。

  1. .contact_form input, .contact_form textarea {
  2. border:1px solid #aaa;
  3. box-shadow: 0px 0px 3px #ccc, 0 10px 15px #eee inset;
  4. border-radius:2px;
  5. }
  6. .contact_form input:focus, .contact_form textarea:focus {
  7. background: #fff;
  8. border:1px solid #555;
  9. box-shadow: 0 0 3px #aaa;
  10. }
  11. /* Button Style */
  12. button.submit {
  13. background-color: #68b12f;
  14. background: -webkit-gradient(linear, left top, left bottom, from(#68b12f), to(#50911e));
  15. background: -webkit-linear-gradient(top, #68b12f, #50911e);
  16. background: -moz-linear-gradient(top, #68b12f, #50911e);
  17. background: -ms-linear-gradient(top, #68b12f, #50911e);
  18. background: -o-linear-gradient(top, #68b12f, #50911e);
  19. background: linear-gradient(top, #68b12f, #50911e);
  20. border: 1px solid #509111;
  21. border-bottom: 1px solid #5b992b;
  22. border-radius: 3px;
  23. -webkit-border-radius: 3px;
  24. -moz-border-radius: 3px;
  25. -ms-border-radius: 3px;
  26. -o-border-radius: 3px;
  27. box-shadow: inset 0 1px 0 0 #9fd574;
  28. -webkit-box-shadow: 0 1px 0 0 #9fd574 inset ;
  29. -moz-box-shadow: 0 1px 0 0 #9fd574 inset;
  30. -ms-box-shadow: 0 1px 0 0 #9fd574 inset;
  31. -o-box-shadow: 0 1px 0 0 #9fd574 inset;
  32. color: white;
  33. font-weight: bold;
  34. padding: 6px 20px;
  35. text-align: center;
  36. text-shadow: 0 -1px 0 #396715;
  37. }
  38. button.submit:hover {
  39. opacity:.85;
  40. cursor: pointer;
  41. }
  42. button.submit:active {
  43. border: 1px solid #20911e;
  44. box-shadow: 0 0 10px 5px #356b0b inset;
  45. -webkit-box-shadow:0 0 10px 5px #356b0b inset ;
  46. -moz-box-shadow: 0 0 10px 5px #356b0b inset;
  47. -ms-box-shadow: 0 0 10px 5px #356b0b inset;
  48. -o-box-shadow: 0 0 10px 5px #356b0b inset;
  49. }

第八步:添加CSS3互动

我们一起来添加一下互动效果,当鼠标点中输入框时,增加输入框的长度。

  1. .contact_form input:focus, .contact_form textarea:focus { /* add this to the already existing style */
  2. padding-right:70px;
  3. }

在支持transition的浏览器中,增加CSS缓慢过渡效果。

  1. .contact_form input, .contact_form textarea { /* add this to the already existing style */
  2. -moz-transition: padding .25s;
  3. -webkit-transition: padding .25s;
  4. -o-transition: padding .25s;
  5. transition: padding .25s;
  6. }

第九步:增加HTML5 required属性

我们一直期待的东西,终于要来了,就是HTML5表单处理工具。在HTML5中添加required到input/textarea后,会告诉浏览器在提交表单前,表单值必须是存在的;因此,如果没有填入字段,表单将不会被提交。现在我们在需要验证的输入框里面加上required

  1. <input type="text" name="name" required />
  2. <input type="text" name="email" required />
  3. <input type="text" name="website" required />
  4. <textarea name="message" cols="40" rows="6" required ></textarea>

第十步:定义required字段样式

这里定义输入框输入文本后的样式,我们将星号(*)作为背景图放置到每个必填项,因此我们得先填充右侧的空间,防止文字重叠到红色的星号图像。

  1. .contact_form input, .contact_form textarea {
  2. padding-right:30px;
  3. }

使用css的伪类选择符:required来增加红色的星号图像。

  1. input:required, textarea:required {
  2. background: #fff url(images/red_asterisk.png) no-repeat 98% center;
  3. }

表单提交后会发生什么呢?

现在的表单提交后,如果表单是不正确的填写信息或者空白,那么将会出现不同的显示效果,这是因为不同的浏览器之间,提示用户的弹出框的视觉效果是不一样的,希望在以后的某一天能够真正的全部标准化。

你可以查看quirksmode来检查你的浏览器是否支持required

提示技巧:

实际上你可以修改一些浏览器的弹出框的风格:

  1. ::-webkit-validation-bubble-message {
  2. padding: 1em;
  3. }

第十一步:理解HTML5新的type属性和客户端验证

HTML5的验证都是根据表单内的type属性来工作的,在过去的几年,HTML只支持一小部分的type属性,例如:type="text",HTML5出现后增加了几个type新的属性,其中就包含emailurl,这些都将会被使用到我们的表单当中。
通过结合输入type属性和新的required属性,浏览器现在可以实现验证表单数据的客户端。如果浏览器不支持新的type属性,例如:type="email",那么他会被默认成为type="text",这点是非常值得我们兴奋的,实质上,这是一种倒退兼容性的表现,在地球上的所有浏览器都可以与之兼容。
那么,如果浏览器不支持新的type属性,对于移动设备上的浏览器来说是没什么明显区别的(除非定义了css规则),type="email"属性将会和type="text"看起来是相同的,然后只有当涉及到用户界面时,对于移动浏览器是有差别的。

一个例子:iPhone

苹果公司的iPhone手机检测表单类型和动态的改变屏幕上的键盘时会提供上下文联想的字符。例如,所有的电子邮件地址,需要字符:“ @ ”和“ . ”, 那iPhone会在确认输入类型为电子邮件时,会自动提供这些字符。

第十二步:更改type属性

我们在本例中到现在为止,设置的表单字段都默认为type="text",现在我们需要改变“电子邮箱”和“网站”这两个为:type="email"type="url"

  1. <input type="email" name="email" placeholder="javin@example.com" required />
  2. <input type="url" name="website" placeholder="http://www.jiawin.com/" required/>

第十三步:HTML5验证

正如在前面所说到的,HTML5在默认情况下是通过type来验证的。这个验证功能是默认激活状态的,如果你要关闭这个功能可以用novalidate属性来实现:

  1. <form novalidate>
  2. <-- do not validate this form -->
  3. <input type="text" />
  4. </form>
Name字段

先来看看第一个字段,是“姓名”,要求填写的是名称。首先,先定义显示为错误(无效)时的样式,当鼠标在焦点上的时候,我们就添加一个红色的边框和红色的阴影。最后也显示一个“无效”的感叹号小图标。

  1. .contact_form input:focus:invalid, .contact_form textarea:focus:invalid { /* when a field is considered invalid by the browser */
  2. background: #fff url(images/invalid.png) no-repeat 98% center;
  3. box-shadow: 0 0 5px #d45252;
  4. border-color: #b03535
  5. }

如果,用户填写的信息是正确的,那我们就定义这时的样式为绿色的边框和绿色的阴影以及显示一个“正确”打勾的小图标,这时候,不管鼠标是否在焦点上,都要保持正确的状态。

  1. .contact_form input:required:valid, .contact_form textarea:required:valid { /* when a field is considered valid by the browser */
  2. background: #fff url(images/valid.png) no-repeat 98% center;
  3. box-shadow: 0 0 5px #5cd053;
  4. border-color: #28921f;
  5. }

Email字段和URL字段

因为我们设置了typerequired的属性,所以我们的css样式和验证规则已经被运用到浏览器,会自动根据特有的规则自行验证。

第十四步:介绍HTML5的pattern属性

type="email"属性来举例说明,在大部分浏览器中验证的字段为@(任意字符 + “@” 符号 + 任意字符)。这显示是有限的,靠它阻止用户输入空格或信息是不能完美解决的。另一个type="url"属性,在大多数浏览器中的验证字段的最低限度为“任意字符加一个冒号”。假如,你输入的是“H:”,然后进行验证,这将会通过验证,但很明显这不是一个网址,所以我们希望可以更加详细具体的验证用户所输入的信息,那我们应该在HTML5中怎么解决使用服务器验证来实现上述说到的问题呢?

pattern属性

这个pattern属性可以接受一个JavaScript的正则表达式,我们可以通过一个正则表达式来验证字段,最后看看我们的HTML代码:

  1. <input type="url" name="website" placeholder="http://johndoe.com" required pattern="(http|https)://.+" />

现在我们的“网站”字段将只会接受http://或者https://开头的字符了。这个正则表达式模式有时候的确让人难以捉摸,但如果你有时间去学习它,那么你们将会开阔另一片天地。

第十五步:表单字段的提示语的样式

现在我们来定义下表单提示语,他们会在用户使用表单时根据表单验证规则的正确与否按照特定的提示语显示出来,最终指引用户正确提交表单。

  1. .form_hint {
  2. background: #d45252;
  3. border-radius: 3px 3px 3px 3px;
  4. color: white;
  5. margin-left:8px;
  6. padding: 1px 6px;
  7. z-index: 999; /* hints stay above all other elements */
  8. position: absolute; /* allows proper formatting if hint is two lines */
  9. display: none;
  10. }

因为在默认表单下,提示语是不会出现的,所以我们先设置为display:none,然后根据表单填写信息的正确与否来显示不同风格的提示语。

使用::before选择符

现在,为了美化提示语的提示框,我们需要一个小的三角形,来指引用户。小三角形可以用图片来显示,但在这里我们用css来编写显示,因为这个三角形在页面中不是一个很重要的功能,只是一个视觉形式。我们可以使用unicode几何图像,再结合::before选择符来实现最终效果。

在通常情况下,我们在网页中会使用unicode格式编码来显示特殊图形(如上图所示)。因为我们要使用css::before选择符,所以在content:""规则里面,我们必须要使用三角形所对应的unicode转义编码。然后我们通过定位,将它显示在我们希望显示的地方。

  1. .form_hint::before {
  2. content: "\25C0"; /* left point triangle in escaped unicode */
  3. color:#d45252;
  4. position: absolute;
  5. top:1px;
  6. left:-6px;
  7. }
使用相邻选择符

最后,我们使用相邻选择符来显示或者隐藏表单的提示语。相邻选择符(x + y)选择的是紧贴在x元素之后的y元素。根据表单字段验证后的结果来显示提示语,然后在使用相邻选择符来显示和隐藏。

  1. .contact_form input:focus + .form_hint {display: inline;}
  2. .contact_form input:required:valid + .form_hint {background: #28921f;} /* change form hint color when valid */
  3. .contact_form input:required:valid + .form_hint::before {color:#28921f;} /* change form hint arrow color when valid */

正如你从css中看到的,我们还设置了随着判断一个字段是否正确来显示不同的风格样式的提示语。

第十六步:坐下来慢慢的欣赏你美丽的HTML5表单

查看预览下载附件

结论

正如你所看到的,HTML5表单的特点就是简洁漂亮,而且具有倒退兼容性,如果运用到你的网站中,它不会破坏你的任何东西。HTML5的验证功能也越来越接近客户端的验证,可以很有效的帮助用户填写正确的表单。然而,HTML5的验证仍然更换不了服务器端验证。就目前为止,这是最好的处理方法,非常感谢你的阅读。
译文:Webdesigntuts+

本文来自:http://www.jiawin.com/forms-css3-html5-validation/

教程:让你的表单升级到CSS3和HTML5客户端验证的更多相关文章

  1. vue教程1-01 v-model 一般表单元素(input) 双向数据绑定

    vue教程1-01   v-model 一般表单元素(input) 双向数据绑定el:'#box',//这里放的是选择器.不然会不生效 <!DOCTYPE html> <html l ...

  2. jquery.validate.js 验证表单时,在IE当中未验证就直接提交的原因

    jquery.validate.js 验证表单时,在IE当中未验证就直接提交的原因 今天利用了jquery.validate.js来验证表单,发现在火狐.谷歌浏览器当中都可以进行验证,但是在IE系列浏 ...

  3. JQ表单选择器和CSS3表单选择器

    JQ表单选择器和CSS3表单选择器 JQ表单选择器 为了使用户能够更加灵活地操作表单,jQuery中加入了表单选择器,利用这个选择器能极其方便的获取到表单的某个或者某类型的元素.表单选择器的介绍如图: ...

  4. ASP.NET Aries 入门开发教程9:业务表单的开发

    前言: 经过前面那么多篇的列表的介绍,终于到了大伙期待的表单开发了. 也是本系列的最后一篇文章了! 1:表单页面的权限设置与继承 对于表单页面,权限的设置有两种: 1:你可以选择添加菜单(设置为不显示 ...

  5. struts2官方 中文教程 系列六:表单验证

    先贴个本帖的地址,以免被爬:struts2教程 官方系列六:表单验证  即 http://www.cnblogs.com/linghaoxinpian/p/6906720.html 下载本章节代码 介 ...

  6. Gemini.Workflow 双子工作流入门教程五:业务表单开发

    简介: Gemini.Workflow 双子工作流,是一套功能强大,使用简单的工作流,简称双子流,目前配套集成在Aries框架中. 下面介绍本篇教程:业务表单开发. 业务表单开发 业务表单的开发,和在 ...

  7. Python+Django+SAE系列教程11-----request/pose/get/表单

    表单request,post,get 首先我们来看看Request对象,在这个对象中包括了一些实用的信息,学过B/S开发的人来说这并不陌生,我们来看看在Django中是怎样实现的: 属性/方法 说明 ...

  8. Vue.js教程--基础2(事件处理 表单输入绑定

    事件处理 表单输入绑定 事件处理 监听v-on 监听 DOM 事件,并在触发时运行一些 JavaScript 代码. 可以在v-on:click=''加内联语句. 有时也需要在内联语句处理器中访问原始 ...

  9. Bootstarp学习教程(7) 表单

    基本案例:“form-control”修饰的<input>.<textarea>和<select>元素都将被默认设置为width: 100%;表单控件包裹在&quo ...

随机推荐

  1. iOS学习笔记(5)——显示简单的TableView

    1. 创建工程 创建一个新的Xcode工程命名为SimpleTableTest. 删除main.storyboard文件和info.plist中有关storyboard的相关属性. 按command+ ...

  2. Visual Studio各个版本对应关系

  3. Cause: org.jetbrains.plugins.gradle.tooling.util.ModuleComponentIdentifierIm Lorg/gradle/api/artifacts/ModuleIdentifier;

    今天碰到一个问题, 正常的下载gradle到本地,然后到spring官网上通过他们提供的start.spring.io创建一个demo项目, 然后在idea中打开,并配置下载的gradle到idea中 ...

  4. Spring集成ignite,服务发现问题

    问题: 解决办法: 修改C:\Windows\System32\drivers\etc\hosts 配置主机名和ip对应关系: 试试!

  5. localStorage注册页面A注册数据在本地储存并在B页面打开

    如题目的这么一个问题, A页面代码 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  6. 皕杰报表 javax.naming.NameNotFoundException: Name jdbc is not bound in this Context

    今天做报表的时候,跳转到显示报表页面的时候不出来数据,报错说数据集未产生. 后台报错 javax.naming.NameNotFoundException: Name jdbc is not boun ...

  7. POJ_3470 Walls 【离散化+扫描线+线段树】

    一.题面 POJ3470 二.分析 POJ感觉是真的老了. 这题需要一些预备知识:扫描线,离散化,线段树.线段树是解题的关键,因为这里充分利用了线段树区间修改的高效性,再加上一个单点查询. 为什么需要 ...

  8. curl 命令大全

    post json curl -H "Content-Type: application/json" -X POST --data '{"userID":100 ...

  9. OS X获取process.env.NODE_ENV出错

    原来项目是其它小组在维护,现在我们需要维护部分功能,把项目带到OS X上运行发现 webpack.config.js获取process.env.NODE_ENV变量出错 解决: 根据电脑操作系统平台类 ...

  10. 【Three.js】模型抗锯齿处理

    1.锯齿消除方法 three.js参考使用官方demo发现模型渲染有锯齿,这种情况在旋转视角时候就非常明显. 抗锯齿的方法,很简单,只需要配置render两个属性即可: renderer = new ...