表单是HTML最主要的用户输入元素

用户和网页的交互动作有鼠标悬停、点击链接(或移动触摸)和页面滚动等,这些交互方式一般只是服务器单向信息输出

有时候用户需要输入一些信息给服务器来完成双向交互,这类交互包括:

  • 注册/登录
  • 用户信息填写
  • 搜索/过滤
  • 上传文件
  • 文章编辑

表单及其控件就是HTML用来支持上述交互的主要元素:

  • 文本输入(单行或多行)
  • 单选框
  • 多选框
  • 下拉列表
  • 文件上传控件
  • 表单提交按钮

这些控件使用不同的HTML 标签,但大部分使用 <input> 标签,而使用 type 属性来区别输入控件的类型:

<!-- 文本输入 -->
<input type="text">
<!-- 复选框 -->
<input type="checkbox">
<!-- 单选框 -->
<input type="radio">
 
 

表单元素(form)

<form> 是块级元素,用来定义网页中的交互输入部分。所有的表单控件必须包含在 <form> 元素中。

表单元素有两个必须的属性:

  • action 用来定义信息提交的目标(即表单提交到哪里去)
  • method 用来定义信息提交的方式(即表单怎么提交),可以是 GET 或 POST 其中之一。

通常表单信息被提交给 action 所指定的服务器程序,服务器(即后端程序如PHP/Java)会对表单信息做出处理并给出应答。

表单用来把一组表单控件集中起来完成一个特定的交互操作,比如登录表单,通常包含3个控件:

  • 电子邮箱 <input type="email">
  • 用户密码 <input type="password">
  • 提交按钮 <input type="submit">

这些控件被包含在一个 <form action="/login" method="POST"> 元素中。

文本输入框

为了支持用户输入姓名,电子邮件,密码,地址等信息,HTML表单中的文本输入框控件包含多种类型:

普通文本 <input type="text"> 可以输入任意字符
电子邮件 <input type="email"> 如果输入的是非法电子邮件,会出现告警提示
密码 <input type="password"> 显示为小黑点,隐藏用户输入
数字 <input type="number"> 只能输入数字,且可以使用上下键来快速改变数值
电话 <input type="tel"> 可以触发自动填充
多行文本 <textarea></textarea>  (注:复制原因显示效果不完善,请自行测试,或查看底部原网址) 可以调整文本输入框的大小

尽管这些输入框看起来很相似,且数据类型的默认校验也不那么有效,似乎有点冗余,但从语义上来看,type 赋予了输入框更具体的含义,这会有助于浏览器在实现这些控件接口时更好的提升用户交互体验。

占位符(Placeholders)

为了更好的提示用户输入,文本输入框可以显示占位符文本而不是空白,占位符在用户开始输入时会自动消失,不会形成干扰。

<input type="text" placeholder="请输入昵称">
(注:复制原因显示效果不完善,请自行测试,或查看底部原网址)

试一下,当你开始输入时,“请输入昵称” 会消失。

标签(Labels)

由于表单控件本身不具备很好的自描述性,通常会在控件前面添加配对的文本标签(label),对控件作用做出提示。

<label>Email</label>
<input type="email">
Email 

对于纯文本输入框而言标签(label)和占位符(placeholder)功能类似,不过标签会一直显示,且可以用于保持和其它表单元素对齐,比如选择框。

尽管我们可以使用简短的文本来描述表单控件,使用 <label> 在语义上要更符合规范,它们只用于表单内,还可以通过 for 属性来和拥有特定 id 的输入控件配对使用。

<label for="first_name">名字</label>
<input id="first_name" type="text">
名字 

点击标签文本,输入焦点会移动到文本输入框内。这对于单选和复选框的操作尤为方便。

复选框(Checkboxes)

复选框 是选择型控件,拥有两个状态:选中(checked)和未选中(unchecked)。一般用来接受用户回答“是”或“否”。

<input type="checkbox"> 同意用户协议
 同意用户协议

由于选择框很小,点击选中不方便,因此,比较好的实践是在该元素外面包裹一个 <label> :

<label>
<input type="checkbox"> 同意用户协议
</label>
 同意用户协议

除了上面的方法,也可以使用label的 <for> 属性来和input配对:

<input id="terms" type="checkbox">
<label for="terms">同意用户协议</label>
 同意用户协议

这样你就可以通过点击 “同意用户协议” 来切换复选框的选择状态。

默认情况下,复选框是未选中状态,你可以简单的通过设置 checked 属性来改变状态。

<label>
<input type="checkbox" checked> 同意用户协议
</label>
 同意用户协议

复选框还有一个重要的用途是可以让用户在一组可选项中进行多项选择

首先我们需要组合(group)一些复选框,为此我们为它们设置相同的 name 属性:


<label>兴趣</label>
<input id="game" type="checkbox" name="interests">
<label for="game">电竞</label>
<input id="coding" type="checkbox" name="interests">
<label for="coding">编码</label>
<input id="rock" type="checkbox" name="interests">
<label for="rock">摇滚</label>
兴趣
 电竞  编码  摇滚

单选框(Radioboxes)

单选框用来给用户在一组可选项中做单项选择

同上,我们通过为单选框设置相同的 name 属性来把它们编组:

<label>婚姻状态</label>
<label>
<input type="radio" name="status">
单身
</label>
<label>
<input type="radio" name="status">
已婚
</label>
<label>
<input type="radio" name="status">
离异
</label>
婚姻状态
 单身  已婚  离异

由于我们把这组单选框的 name 属性都设置成了相同的 "status",选择其中一项,将导致其它选项被重置为未选中状态。这就是单选框的互斥(mutually exclusive)特性。

单选框和复选框的差异

复选框可以只有一个,用于提示用户回答是或否。而单个的单选框却没有意义,必须是一组可选项(至少2个),用于多选1。

此外,你可以不点击任何的复选框,但是你必须点击来选择一个单选框,且你无法通过再次点击同一个单选框来让它处于未选中状态,你只有通过选择一组单选框中的其他兄弟选项来重置之前的状态。

下拉菜单(Dropdown menus)

对于少量的选项,单选框和复选框已经可以满足要求,但是如果选项很多时,从界面布局以及可扩展性的角度而言,选择框是受到空间限制的。 而且对于大量的选项,我们还需要提供选项过滤功能以便快速定位选项,因此在这种情况下,我们需要使用新的表单界面组件: <select> 下拉列表框。 该控件通过滚动条和接受键盘输入事件的界面设计无限扩展了选项可用空间。

下拉列表框同时支持单项或多项选择,下面是月份选择的下拉列表框控件:

<select>
<option>January</option>
<option>February</option>
<option>March</option>
<option>April</option>
<option>May</option>
<option>June</option>
<option>July</option>
<option>August</option>
<option>September</option>
<option>October</option>
<option>November</option>
<option>December</option>
</select>
January
February
March
April
May
June
July
August
September
October
November
December

你可以试着输入字母S,将很快定位到September选项,类似的,如果连续输入May字符串,将直接定位到May选项。这大大加快了选项检索过程。

上面的列表你只能选择一个选项,要想选择多个选项,可以通过设置 multiple 属性:

<label>浏览器兼容性:</label>
<select multiple>
<option>Google Chrome</option>
<option>Internet Explorer</option>
<option>Mozilla Firefox</option>
<option>Opera</option>
<option>Safari</option>
</select>
浏览器兼容性 
Google Chrome
Internet Explorer
Mozilla Firefox
Opera
Safari

按住Ctrl(或⌘)键,然后点击多个选项。重复点击即取消之前的选项。

我们还可以使用<optgroup>给下拉列表框中的选项进行分组,这样就能形成类似树形的分级选择控件。

下面给出一个完整包含上述各个元素的表单实例:

<form action="#" method="post">
<h1>Sign Up</h1>
<fieldset>
<legend><span class="number">1</span> Your basic info</legend>
<label for="name">Name:</label>
<input type="text" id="name" name="user_name"> <label for="mail">Email:</label>
<input type="email" id="mail" name="user_email"> <label for="password">Password:</label>
<input type="password" id="password" name="user_password"> <label>Age:</label>
<input type="radio" id="under_13" value="under_13" name="user_age">
<label for="under_13" class="light">Under 13</label> <input type="radio" id="over_13" value="over_13" name="user_age">
<label for="over_13" class="light">Over 13</label>
</fieldset> <fieldset>
<legend><span class="number">2</span> Your profile</legend> <label for="bio">Biography:</label>
<input id="bio" name="user_bio"></input> <label for="job">Job role:</label>
<select id="job" name="user_job"> <optgroup label="Web">
<option value="frontend_developer">Front-End Developer</option>
<option value="php_developer">PHP Developer</option>
<option value="python_developer">Python Developer</option>
<option value="rails_developer">Rails Developer</option>
<option value="web_designer">Web Designer</option>
<option value="wordpress developer">Wordpress Developer</option>
</optgroup> <optgroup label="Mobile">
<option value="android_developer">Android Developer</option>
<option value="ios_developer">iOS Developer</option>
<option value="mobile_designer">Mobile Designer</option>
</optgroup> <optgroup label="Business">
<option value="business_owner">Business Owner</option>
<option value="freelancer">Freelancer</option>
</optgroup>
</select> <label>Interests:</label>
<br>
<input type="checkbox" id="development" value="interest_development" name="user_interest">
<label for="development">Development</label>
<br> <input type="checkbox" id="design" value="interest_design" name="user_interest">
<label for="design">Design</label>
<br> <input type="checkbox" id="business" value="business" name="user_interest">
<label for="business">Business</label> </fieldset>
<button type="submit">Sign Up</button>
</form>
*,
*:before,
*:after {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
:root {
background-color: #2e4049;
color: white;
}
form {
width: 40%;
max-width: 350px;
margin: 0 auto 30px;
}
fieldset {
background: #202d33;
border-radius: 4px;
border: none;
border-top: 2px solid tomato;
margin-bottom: 30px;
box-shadow: 0 5px 30px rgba(0, 0, 0, .3);
padding: 10px 15px;
}
legend {
font-weight: bold;
margin-bottom: 10px;
padding-right: 10px;
}
.number {
background: tomato;
margin-right: 10px;
padding: 10px 4px 4px;
}
h1 {
margin: 60px 0;
text-align: center;
font-size: 3em;
color: tomato;
text-shadow: 0 1px 0 #ea553a, 0 3px 0 #b72b12, 0 7px 0 #420900, 0 5px 10px #0b3f3b, 0 5px 11px #ff546a, 0 0 20px tomato;
}
input[type="text"],
input[type="password"],
input[type="date"],
input[type="datetime"],
input[type="email"],
input[type="number"],
input[type="search"],
input[type="tel"],
input[type="time"],
input[type="url"],
textarea,
select {
background: rgba(255, 255, 255, 0.1);
border: none;
font-size: 16px;
height: auto;
margin:;
outline:;
padding: 10px;
width: 100%;
background-color: #e8eeef;
color: #2e4049;
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.03) inset;
margin-bottom: 20px;
}
input[type="checkbox"] {
margin: 0 4px 8px 0;
}
input[type="radio"] {
margin: 0 2px 0 15px;
}
label {
display: inline-block;
margin-bottom: 10px;
}
button {
display: block;
width: 30%;
margin: 50px auto 0;
padding: 10px 20px;
background-color: tomato;
border: none;
border-radius: 5px;
font-weight: bold;
text-shadow: 0 1px 0 rgba(0, 0, 0, .5);
box-shadow: 0 2px 0 #ea553a, 0 4px 0 #b72b12, 0 6px 0 #420900, 0 6px 10px #0b3f3b, 0 6px 11px #ff546a, 0 0 20px tomato;
}
button:hover {
text-shadow: 0 3px 2px rgba(0, 0, 0, .5);
}
button:active {
box-shadow: 0 0px 0 #ea553a, 0 1px 0 #b72b12, 0 2px 0 #420900, 0 2px 10px #0b3f3b, 0 2px 11px #ff546a, 0 0 20px tomato;
outline:;
}
button:focus {
outline:;
}
@media (max-width: 840px) {
form {
width: 70%;
}
}
@media (max-width: 490px) {
form {
width: 100%;
}
button {
width: 50%;
}
}

为了布局的美观,使用了CSS样式,也就是接下来我们要讲解的课程内容(http://techbrood.com/h5b2a?p=css-basics)。

本文参考自:http://techbrood.com/h5b2a?p=html-forms

[HTML5]HTML表单(Forms)的更多相关文章

  1. BootStrap入门教程 (二) :BASE CSS(排版(Typography),表格(Table),表单(Forms),按钮(Buttons))

    上讲回顾:Bootstrap的手脚架(Scaffolding)提供了固定(fixed)和流式(fluid)两种布局,它同时建立了一个宽达940px和12列的格网系统. 基于手脚架(Scaffoldin ...

  2. hTML5实现表单内的上传文件框,上传前预览图片,针刷新预览images

    hTML5实现表单内的上传文件框,上传前预览图片,针刷新预览images, 本例子主要是使用HTML5 的File API,建立一個可存取到该file的url, 一个空的img标签,ID为img0,把 ...

  3. Laravel教程 六:表单 Forms

    Laravel教程 六:表单 Forms 此文章为原创文章,未经同意,禁止转载. Form laravel 5.2 之后请使用 laravelcollective/html 替换 illuminate ...

  4. HTML5 智能表单

    HTML5 智能表单 1.表单新增属性  ☀ autofocus 属性 <input type="text" autofocus/>设置 autofocus 属性,使文 ...

  5. HTML5智能表单

    HTML5 智能表单 1.表单新增属性  ☀ autofocus 属性 <input type="text" autofocus/>设置 autofocus 属性,使文 ...

  6. 精美的HTML5/CSS3表单 带小图标

    今天我们要来分享一款非常精美的HTML5/CSS3表单,准备地说,这是一款经过美化的input输入表单,每一个输入表单都可以定义其两侧的小图标,非常华丽.另外,这款表单应用还采用了3种不同的风格主题, ...

  7. 关于创建Django表单Forms继承BaseForm的问题

    在创建Django表单时,因为需要验证用户输入的验证码是否正确,因此需要在session里提取当前验证码的值和POST提交过来的值进行比对,如图: form.py from django import ...

  8. HTML5新表单新功能解析

    HTML5新增了很多属性功能.但是有兼容性问题,因为这些表单功能新增的.我这里做了一个简单的练习,方便参考.如果完全兼容的话,那我们写表单的时候就省了很多代码以及各种判断. <!DOCTYPE ...

  9. HTML5的表单input元素的新属性

    知识点 <HTML5的表单input元素的新属性>,留待学习分享... <!-- HTML5的表单input元素的新属性 Autocomplete:自动完成功能 Autofocus: ...

随机推荐

  1. ajax异步提交的两种方法

    第一种是原始的ajax,第二种是在jQuery中使用ajax.这是我为测试两种提交方法而写的一段代码. 1.struts.xml <package name="json" e ...

  2. XML代码生成器——XMLFACTORY 简介(一)

    XML代码生成器——XMLFACTORY 简介(一) 软件开发中经常要和第三方应用交互数据,特别是在银行.电信行业,这种需求更是必不可少,往往一个系统要和三五个其它系统交互数据,而数据交换的报文经常采 ...

  3. 《HP大规模敏捷开发实践》读书笔记

    读这本书的心得,敏捷是实践出来的,哪怕不懂srcum**等方法,只要坚持心中的价值观,朝一个方向改进,哪怕不能“任何时候都拥有符合发布要求的代码”,今天比昨天好,也是成功.     通过业务分析确定开 ...

  4. java文件编译及运行

    1 配置环境变量 使用鼠标右击“我的电脑”->属性->高级->环境变量 系统变量->新建->变量名:JAVA_HOME 变量值:C:\Program Files (x86 ...

  5. Java高级规范之四

    四十一.控制层不能调用model层除了最顶级的接口外的任何内容.要通过new顶级接口才能调用. 不规范示例: public class UserServiceImpl{ private UserDAO ...

  6. ScriptableObject本地序列化后重启Unity后报The associated script can not be loaded.Please fix any compile errors and assign a valid script的坑

    踩坑 做编辑器一些设置序列化存在本地的时候,继承自ScriptableObject的类通过 创建的asset文件. 在重启Unity后查看这个asset发现上面的所有序列化属性丢失,报的错就是 在不存 ...

  7. Java用户线程和守护线程

    今天看Java一个关于多线程返回值方式的示例,发现一个自己不太能理解的问题,就是在主线程中启动了几个工作线程,主线程中也没有join,工作线程居然也是正常输出了回调的结果.这个跟linux C++下的 ...

  8. 记录一个UDP收包丢包的问题

    这几天写GB28181平台接入层代码,对收到的PS包进行解包时,总是出现误码,最终导致rtsp点播服务中画面花屏. 分析了码流抓包数据之后,发现网络上没有丢包,遂认为PS流解包代码有bug,于是埋头分 ...

  9. myeclipse10中文注释乱码问题

    将别人的项目或JAVA文件导入到自己的Eclipse中时,常常会出现JAVA文件的中文注释变成乱码的情况,主要原因就是别人的IDE编码格式和自己的Eclipse编码格式不同. 总结网上的建议和自己的体 ...

  10. 2015.10.15class

    #include<stdio.h> main() { int a; printf("你的智商是多少?\n"); scanf("%d",&a) ...