【H5】12 表单 其一 第一个表单
本系列的第一篇文章提供了您第一次创建HTML表单的经验,
包括设计一个简单表单,使用正确的HTML元素实现它,
通过CSS添加一些非常简单的样式,以及如何将数据发送到服务器。
HTML表单是什么?
HTML表单是用户和web站点或应用程序之间交互的主要内容之一。
它们允许用户将数据发送到web站点。
大多数情况下,数据被发送到web服务器,但是web页面也可以自己拦截它并使用它。
HTML表单是由一个或多个小部件组成的。
这些小部件可以是文本字段(单行或多行)、选择框、按钮、复选框或单选按钮。
大多数情况下,这些小部件与描述其目的的标签配对——正确实现的标签能够清楚地指示视力正常的用户和盲人用户输入表单所需的内容。
HTML表单和常规HTML文档的主要区别在于,大多数情况下,表单收集的数据被发送到web服务器。
在这种情况下,您需要设置一个web服务器来接收和处理数据。
如何设置这样的服务器超出了本文的范围,但是如果您想了解更多,请参阅模块后面的发送表单数据。
设计表单
在开始编写代码之前,最好先退一步,花点时间考虑一下您的表单。
设计一个快速的模型将帮助您定义您想要询问用户的正确的数据集。
从用户体验(UX)的角度来看,要记住:表单越大,失去用户的风险就越大。
保持简单,保持专注:只要求必要的数据。在构建站点或应用程序时,设计表单是非常重要的一步。
这超出了本文的范围,涵盖了表单的用户体验,但是如果您想深入了解这个主题,您应该阅读下面的文章:
- 杂志<Smashing Magazine>中有很好的关于表单用户体验的文章,或许其中最重要的应该是他们的Extensive Guide To Web Form Usability.
- UXMatters 也是一个非常有思想的资源,从基本的最佳实践到复杂的问题如多页表单,都有很好的建议。
在本文中,我们将构建一个简单的联系人表单。
让我们做一个粗略的草图。
我们的表单将包含三个文本字段和一个按钮。
我们向用户询问他们的姓名、电子邮件和他们想要发送的信息。
点击这个按钮将把他们的数据发送到一个web服务器。
主动学习:使用HTML实现我们的表单
好了,现在我们准备进入HTML代码并对表单进行编码。
为了构建我们的联系人表单,我们将使用以下HTML元素:<form>
, <label>
, <input>
, <textarea>
, and <button>
.
在进一步讨论之前,先创建一个简单HTML模板的本地副本—您将在这里输入您的表单HTML。
<form>
元素
所有HTML表单都以一个<form>
元素开始:
<form action="/my-handling-form-page" method="post"> </form>
这个元素正式定义了一个表单。就像<div>
元素或<p>
元素,它是一个容器元素,但它也支持一些特定的属性来配置表单的行为方式。它的所有属性都是可选的,但实践中最好至少要设置action
属性和method
属性。
action
属性定义了在提交表单时,应该把所收集的数据送给谁(/那个模块)(URL)去处理。.method
属性定义了发送数据的HTTP方法(它可以是“get”或“post”).
注意:如果您想深入了解这些属性是如何工作的,那么将在发送表单数据文章中详细说明。
现在,将上面的<form>
元素添加到您的HTML主体中
<label>
, <input>
和 <textarea>
元素
我们的联系人表单非常简单,包含三个文本字段,每个字段都有一个标签。
该名称的输入字段将是一个基本的单行文本字段,电子邮件的输入字段将是一个只接受电子邮件地址的单行文本字段,而消息的输入字段将是一个基本的多行文本字段。
就HTML代码而言,我们需要如下的东西来实现这些表单小部件:
<form action="/my-handling-form-page" method="post">
<div>
<label for="name">Name:</label>
<input type="text" id="name">
</div>
<div>
<label for="mail">E-mail:</label>
<input type="email" id="mail">
</div>
<div>
<label for="msg">Message:</label>
<textarea id="msg"></textarea>
</div>
</form>
更新您的表单代码,使其看起来像上面的代码。
使用<div>
元素可以使我们更加方便地构造我们自己的代码,并且更容易样式化(参见本文后面的文章)。
注意在所有<label>
元素上使用for
属性;它是将标签链接到表单小部件的一种正规方式。
这个属性引用对应的小部件的id
。这样做有一些好处。
最明显的一个好处是允许用户单击标签以激活相应的小部件。
如果您想更好地理解这个属性的其他好处,您可以找到如何构造HTML表单的详细信息。
在 <input>
元素中,最重要的属性是type
属性。
这个属性非常重要,因为它定义了<input>
属性的行为方式。
它可以从根本上改变元素,所以要注意它。稍后您将在原生表单控件文章中找到更多关于此的内容。
- 在我们的简单示例中,我们使用值
text
作为第一个输入——这个属性的默认值。它表示一个基本的单行文本字段,接受任何类型的文本输入。 - 对于第二个输入,我们使用值
email
,它定义了一个只接受格式正确的电子邮件地址的单行文本字段。这会将一个基本的文本字段转换为一种“智能”字段,该字段将对用户输入的数据进行一些检查。在稍后的表单数据验证文章中,您将了解到更多关于表单验证的信息。
最后但同样重要的是,要注意<input>
和 <textarea></textarea>
的语法。这是HTML的一个奇怪之处。
<input>
标签是一个空元素,这意味着它不需要关闭标签。相反, <textarea>
不是一个空元素,因此必须使用适当的结束标记来关闭它。
这对HTML表单的特定特性有影响:定义默认值的方式。
要定义<input>
的默认值,你必须使用value
属性,如下所示:
<input type="text" value="by default this element is filled with this text" />
相反,如果您想定义<textarea>
的默认值,您只需在<textarea>
元素的开始和结束标记之间放置默认值,就像这样:
<textarea>by default this element is filled with this text</textarea>
<button>
元素
我们的表格已经快准备好了,我们只需要再添加一个按钮,让用户在填写完表单后发送他们的数据。
这是通过使用 <button>
元素完成的。在 </form>这个结束
标签上方添加以下内容:
<div class="button">
<button type="submit">Send your message</button>
</div>
您会看到<button>
元素也接受一个 type
属性,它接受submit
, reset
或者 button
三个值中的任一个。
- 单击
type
属性定义为submit
值(也是默认值)的按钮会发送表单的数据到<form>
元素的action
属性所定义的网页。 - 单击
type
属性定义为reset
值的按钮 将所有表单小部件重新设置为它们的默认值。从用户体验的角度来看,这被认为是一种糟糕的做法。 - 单击
type
属性定义为button
值的按钮……不会发生任何事!这听起来很傻,但是用JavaScript构建定制按钮非常有用。
注意:您还可以使用相应类型的 <input>
元素来生成一个按钮,如 <input type="submit">
。
<button>
元素的主要优点是, <input>
元素只允许纯文本作为其标签,而<button>
元素允许完整的HTML内容,允许更复杂、更有创意的按钮文本。
基本表单样式
现在您已经完成了表单的HTML代码,尝试保存它并在浏览器中查看它。
现在,你会看到它看起来很丑。
注意: 如果你怀疑你的HTML代码不对,试着把它和我们完成的例子进行比较 —— first-form.html (你也可以观看预览版)。
如何排布好表单是公认的难点。这超出了本文的讨论范围,所以现在我们只需要让您添加一些CSS来让它看起来很好。
首先,在您的HTML头部中添加一个 <style>
元素。应该是这样的:
<style> </style>
在样式标签中,添加如下的CSS,如下所示:
form {
/* 居中表单 */
margin: 0 auto;
width: 400px;
/* 显示表单的轮廓 */
padding: 1em;
border: 1px solid #CCC;
border-radius: 1em;
} form div + div {
margin-top: 1em;
} label {
/* 确保所有label大小相同并正确对齐 */
display: inline-block;
width: 90px;
text-align: right;
} input, textarea {
/* 确保所有文本输入框字体相同
textarea默认是等宽字体 */
font: 1em sans-serif; /* 使所有文本输入框大小相同 */
width: 300px;
box-sizing: border-box; /* 调整文本输入框的边框样式 */
border: 1px solid #999;
} input:focus, textarea:focus {
/* 给激活的元素一点高亮效果 */
border-color: #000;
} textarea {
/* 使多行文本输入框和它们的label正确对齐 */
vertical-align: top; /* 给文本留下足够的空间 */
height: 5em;
} .button {
/* 把按钮放到和文本输入框一样的位置 */
padding-left: 90px; /* 和label的大小一样 */
} button {
/* 这个外边距的大小与label和文本输入框之间的间距差不多 */
margin-left: .5em;
}
现在,它看起来没那么丑了。
注意: 你可以在GitHub上的这里找到它 first-form-styled.html (也可以在这儿看运行结果).
向您的web服务器发送表单数据
最后一部分,也许是最棘手的部分,是在服务器端处理表单数据。
如前所述,大多数时候HTML表单是向用户请求数据并将其发送到web服务器的一种方便的方式。
<form>
元素将定义如何通过action
属性和 method
属性来发送数据的位置和方式。
但这还不够。我们还需要为我们的数据提供一个名称。
这些名字对双方都很重要:在浏览器端,它告诉浏览器给数据各自哪个名称,在服务器端,它允许服务器按名称处理每个数据块。
要将数据命名为表单,您需要在每个表单小部件上使用 name
属性来收集特定的数据块。让我们再来看看我们的表单代码:
<form action="/my-handling-form-page" method="post">
<div>
<label for="name">Name:</label>
<input type="text" id="name" name="user_name">
</div>
<div>
<label for="mail">E-mail:</label>
<input type="email" id="mail" name="user_email">
</div>
<div>
<label for="msg">Message:</label>
<textarea id="msg" name="user_message"></textarea>
</div> ...
在我们的例子中,表单会发送三个已命名的数据块 "user_name
", "user_email
", 和 "user_message
"。
这些数据将用使用HTTP POST
方法,把信息发送到URL为 "/my-handling-form-page
"目录下。
在服务器端,位于URL"/my-handling-form-page
" 上的脚本将接收的数据作为HTTP请求中包含的3个键/值项的列表。
这个脚本处理这些数据的方式取决于您。每个服务器端语言(PHP、Python、Ruby、Java、c等等)都有自己的机制。
深入到这个主题已经超出了本指南的范围,但是如果您想了解更多,我们已经在发送表单数据文章中提供了一些示例。
摘自: https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Forms/Your_first_HTML_form
【H5】12 表单 其一 第一个表单的更多相关文章
- Sql 关于 查俩个表 第二个表用到第一个表的某一个数据
今天在写程序的时候遇到一个问题 有一个这个需求 select top 1 Name,[Address] from UserInfo;select * from shoppingAddress whe ...
- mysql连表查空,查询第二张表中没有第一张表中的数据
select consumer_id,user_name,mobile,invite_code from csr_consumer where invite_count<(select coun ...
- Django之模型层第一篇:单表操作
Django之模型层第一篇:单表操作 一 ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数 ...
- 第一百八十六节,jQuery,验证表单插件,Ajax 表单插件,验证和提交表单
jQuery,验证表单插件,Ajax 表单插件,验证和提交表单 HTML <form id="reg" method="post" action=&quo ...
- 线性表->链式存储->线形链表(单链表)
文字描述: 为了表示前后两个数据元素的逻辑关系,对于每个数据元素,除了存储其本身的信息之外(数据域),还需存储一个指示其直接后继的信息(即直接后继的存储位置,指针域). 示意图: 算法分析: 在单链表 ...
- MySQL--详细查询操作(单表记录查询、多表记录查询(连表查询)、子查询)
一.单表查询 1.完整的语法顺序(可以不写完整,其次顺序要对) (不分组,且当前表使用聚合函数: 当前表为一组,显示统计结果 ) select distinct [*,查询字段1,查询字段2,表达式, ...
- [转]SpringMVC<from:form>表单标签和<input>表单标签简介
原文地址:https://blog.csdn.net/hp_yangpeng/article/details/51906654 在使用SpringMVC的时候我们可以使用Spring封装的一系列表单标 ...
- python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)
12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...
- ajax和servlet交互,表单日历插件,表单验证,form.js
我的index.jsp <body> <a>点我获取数据</a> <table border=1px> <tr> <td>ID& ...
- struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input
原文地址:struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input jsp页面 1 function dosearch() {2 if ($(&q ...
随机推荐
- webpack externals忽略不打入的包
例如项目中使用从 CDN 引入 jQuery,而不是把它打包进来使用 import $ from 'jquery' webpack.config.js externals: { jquery: 'jQ ...
- CF1184E1题解
CF11841E1 & blog 尽然想让第一条边最大且这条边在最小生成树中,那么这条边就需要尽量晚. 但是假如加上一条边 \(i\) 可以使 \(u_1\) 和 \(v_1\) 联通并且第 ...
- ABC346
D 枚举是哪一位相同,情况为 \(00\) 还是 \(11\),然后用前缀和和后缀和求一下即可. \(pre_{j,i}\) 表示第一位为 \(j\),前 \(i\) 位的每两个相同的字符均不相同的情 ...
- 《Android开发卷——设置圆形头像,Android截取圆形图片》
在有一些程序开发中,有时候会用到圆形,截取一张图片的一部分圆形,作为头像或者其他. 本实例就是截图圆形,设置头像的. 首先讲解一些代码 <ImageView android:id=&q ...
- 338 warnings potentially fixable with the `--fix` option.
将lint的值设置为eslint --fix --ext .js,.vue src,重启就可以了或者直接把lint这行删除掉
- 安装nodejs易遇到的坑
@ 目录 背景描述 流程步骤 小结 背景描述 我的服务器是centos7.9,打算先直接通过yum安装,但是yum不能指定node版本,我直接指定显示404找不到,然后我设置了下node下载的源,还是 ...
- spring使用jdk17运行出现编码问题
遇到一个比较奇怪的问题. 这个问题别人也遇到过. https://blog.csdn.net/gao_chuan_g/article/details/115117712 一.情况简介 使用jdk17+ ...
- spring使用RedisCacheManager管理key的一些问题
spring可以很好地管理各种内存的快速缓存. 这些常见的内存缓存库实现方式有redis,Ehcache. 本文阐述的是redis,毕竟这个东西相当容易使用. spring通过 org.springf ...
- Golang基于Mysql分布式锁实现集群主备
背景 集群中如果需要主备,可以基于Redis.zk的分布式锁等实现,本文将介绍如何利用Mysql分布式锁进行实现. 原理 数据库中包含数据字段(此处为Master的主机名).版本号和上一次更新时间. ...
- (数据科学学习手札162)Python GIS神器geopandas 1.0版本发布
本文完整代码及附件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,就在昨天,Python生 ...