diff --git a/files/zh-cn/learn/forms/advanced_form_styling/index.html b/files/zh-cn/learn/forms/advanced_form_styling/index.html index c87451ed18b793..f27ad38551c60a 100644 --- a/files/zh-cn/learn/forms/advanced_form_styling/index.html +++ b/files/zh-cn/learn/forms/advanced_form_styling/index.html @@ -6,22 +6,22 @@ ---
在本文中,我们将看到HTML表单怎样使用CSS装饰难以定制的表单小部件。如前面章节所示,文本域和按钮完全可以使用CSS,现在我们将深入探索HTML表单样式。
+在本文中,我们将看到HTML表单怎样使用CSS装饰难以定制的表单小部件。如前面章节所示,文本域和按钮完全可以使用 CSS,现在我们将深入探索 HTML 表单样式。
在继续之前,让我们回忆一下两种表单小部件:
除了文本框和按钮之外,使用其他表单小部件的主要问题是在许多情况下,CSS的表现不能满足设计复杂的小部件的要求。
+除了文本框和按钮之外,使用其他表单小部件的主要问题是在许多情况下,CSS 的表现不能满足设计复杂的小部件的要求。
-HTML和CSS最新的发展扩展了CSS的表现力:
+HTML 和 CSS 最新的发展扩展了 CSS 的表现力:
所有这一切是一个好的开端,但是有两个问题。首先,一些浏览器不需要实现CSS 2.1之上的特性。其次在设计像日期选择器这样的复杂的小部件时,这些实在不够好。
+所有这一切是一个好的开端,但是有两个问题。首先,一些浏览器不需要实现 CSS 2.1 之上的特性。其次在设计像日期选择器这样的复杂的小部件时,这些实在不够好。
-浏览器厂家在CSS表现力在表单方面的扩展做了一些尝试,在某些情况下,知道什么可用也挺不错的。
+浏览器厂家在 CSS 表现力在表单方面的扩展做了一些尝试,在某些情况下,知道什么可用也挺不错的。
警告: 尽管 这些尝试很有趣,但它们是非标准的,也就是不可靠的。. 如果你使用它们(也许你并不常用),你要自己承担风险,使用非标准的属性对于Web并不是好事 。
+警告: 尽管 这些尝试很有趣,但它们是非标准的,也就是不可靠的。. 如果你使用它们 (也许你并不常用),你要自己承担风险,使用非标准的属性对于 Web 并不是好事 。
基于WebKit(Chrome, Safari)和 Gecko(Firefox)的浏览器提供更高级的HTML部件定制。它们也实现了跨平台,因此需要一种方式把原生小部件转换为用户可设置样式的小部件。
+基于 WebKit(Chrome, Safari) 和 Gecko(Firefox) 的浏览器提供更高级的 HTML 部件定制。它们也实现了跨平台,因此需要一种方式把原生小部件转换为用户可设置样式的小部件。
-为此,它们使用了专有属性:{{cssxref("-webkit-appearance")}}或{{cssxref("-moz-appearance")}}。这些属性是非标准的,不应该使用。事实上,它们在WebKit 和Gecko中的表现也是不相同的。然而,有一个值很好用:none
,用这个值,你(几乎完全)能控制一个已知小部件的样式。
为此,它们使用了专有属性:{{cssxref("-webkit-appearance")}}或{{cssxref("-moz-appearance")}}。这些属性是非标准的,不应该使用。事实上,它们在 WebKit 和 Gecko 中的表现也是不相同的。然而,有一个值很好用:none
,用这个值,你(几乎完全)能控制一个已知小部件的样式。
因此,如果你在应用一个元素的样式时遇到麻烦,可以尝试使用那些专有属性。我们下面有一些例子,这个属性最成功的例子是WebKit浏览器中的搜索域的样式:
+因此,如果你在应用一个元素的样式时遇到麻烦,可以尝试使用那些专有属性。我们下面有一些例子,这个属性最成功的例子是 WebKit 浏览器中的搜索域的样式:
<form> <input type="search"> @@ -115,7 +115,7 @@控制表单元素的外观
{{EmbedLiveSample("控制表单元素的外观", 250, 40)}}
-注意:当我们谈及Web技术的时总是很难预测未来。扩展CSS表现力是很困难的,其他规范也做了一些探索性的工作,如Shadow DOM提供了一些观点。可完全设置样式的表单的问题还远未结束。
+注意:当我们谈及 Web 技术的时总是很难预测未来。扩展 CSS 表现力是很困难的,其他规范也做了一些探索性的工作,如Shadow DOM提供了一些观点。可完全设置样式的表单的问题还远未结束。
举例
@@ -183,7 +183,7 @@一个简单的测试用例
更复杂的例子
-由于Opera和Internet Explorer没有像{{cssxref("-webkit-appearance")}}或{{cssxref("-moz-appearance")}}这样的特性,使用它们是不合适的。幸运的是,CSS有足够多的表现方式可以找到解决方法。让我们做一个很普通的例子:
+由于 Opera 和 Internet Explorer 没有像{{cssxref("-webkit-appearance")}}或{{cssxref("-moz-appearance")}}这样的特性,使用它们是不合适的。幸运的是,CSS 有足够多的表现方式可以找到解决方法。让我们做一个很普通的例子:
<form> <fieldset> @@ -240,7 +240,7 @@更复杂的例子
现在,让我们设计一个定制复选框的样式
-计划用自己的图像替换原生的复选框,首先需要准备复选框在所有状态下的图像,那些状态是:未选、已选、禁用不选、禁用已选。该图像将用作CSS精灵:
+计划用自己的图像替换原生的复选框,首先需要准备复选框在所有状态下的图像,那些状态是:未选、已选、禁用不选、禁用已选。该图像将用作 CSS 精灵:
@@ -248,7 +248,7 @@更复杂的例子
display:none
来隐藏复选框,因为后面我们需要把复选框对用户可见。而使用display:none
,用户不能再访问这个复选框,这就表示复选框不能选择或不选择。:root input[type=checkbox] { @@ -257,7 +257,7 @@-更复杂的例子
left: -1000em; }
现在加上自己的图像就可以摆脱原来的复选框了,为此,要在初始的复选框后面加上{{HTMLElement("label")}}元素,并使用它的{{cssxref(":before")}}伪元素。因此在下面章节中,要使用selector属性来选择复选框,然后使用adjacent sibling selector来选择原有复选框后面的label
。最后,访问{{cssxref(":before")}}伪元素来设计复选框显示定制样式。
现在加上自己的图像就可以摆脱原来的复选框了,为此,要在初始的复选框后面加上{{HTMLElement("label")}}元素,并使用它的{{cssxref(":before")}}伪元素。因此在下面章节中,要使用selector 属性来选择复选框,然后使用adjacent sibling selector来选择原有复选框后面的label
。最后,访问{{cssxref(":before")}}伪元素来设计复选框显示定制样式。
:root input[type=checkbox] + label:before { content: ""; @@ -275,7 +275,7 @@-更复杂的例子
bottom: 2px; }
在初始复选框上使用{{cssxref(":checked")}}和{{cssxref(":disabled")}}伪类来改变定制复选框的状态。因为使用了CSS精灵,我们需要做的只是修改背景的位置。
+在初始复选框上使用{{cssxref(":checked")}}和{{cssxref(":disabled")}}伪类来改变定制复选框的状态。因为使用了 CSS 精灵,我们需要做的只是修改背景的位置。
:root input[type=checkbox]:checked + label:before { background-position: 0 -16px; @@ -289,7 +289,7 @@-更复杂的例子
background-position: 0 -48px; }
最后一件(但是很重要的)事情:当用户使用键盘从一个表单小部件导航到另一个表单小部件时,每个小部件都应该被显式聚焦。因为我们隐藏了初始的复选框,我们必须自己实现这个特性,让用户知道定制复选框在表单中的位置,下列的CSS实现了它们聚焦。
+最后一件(但是很重要的)事情:当用户使用键盘从一个表单小部件导航到另一个表单小部件时,每个小部件都应该被显式聚焦。因为我们隐藏了初始的复选框,我们必须自己实现这个特性,让用户知道定制复选框在表单中的位置,下列的 CSS 实现了它们聚焦。
:root input[type=checkbox]:focus + label:before { outline: 1px dotted black; @@ -319,7 +319,7 @@Dealing with the select nightmare
-下面的表格显示了在两种情况下不同浏览器的处理方式。头两列就是上面的例子。后面两列使用了其他的定制CSS,可以对小部件的外观进行更多的控制:
+下面的表格显示了在两种情况下不同浏览器的处理方式。头两列就是上面的例子。后面两列使用了其他的定制 CSS,可以对小部件的外观进行更多的控制:
select, option { -webkit-appearance : none; /* To gain control over the appearance on WebKit/Chromium */ @@ -401,42 +401,42 @@Dealing with the select nightmare
在我们的例子中,只使用了三个CSS属性,在考虑使用更多CSS属性时,可以想象是很混乱的。正如我们看到的,CSS始终不适合用来修改这些小部件的外观,但是仍然可以用来稍微做一些事情。如果愿意的话,可以演示一下在不同操作系统和浏览器之间的区别。
+在我们的例子中,只使用了三个 CSS 属性,在考虑使用更多 CSS 属性时,可以想象是很混乱的。正如我们看到的,CSS 始终不适合用来修改这些小部件的外观,但是仍然可以用来稍微做一些事情。如果愿意的话,可以演示一下在不同操作系统和浏览器之间的区别。
我们也可以帮助了解在下一章节中哪个属性更合适:Properties compatibility table for form widgets
-虽然对于复选框和单选按钮而言,CSS的表示方式足够丰富,但是对更高级的小部件来说差距仍然很大。即使可以用{{HTMLElement("select")}}元素作一些事情,但是对file小部件的样式完全没用。对于日期选择器也同样如此。
+虽然对于复选框和单选按钮而言,CSS 的表示方式足够丰富,但是对更高级的小部件来说差距仍然很大。即使可以用{{HTMLElement("select")}}元素作一些事情,但是对 file 小部件的样式完全没用。对于日期选择器也同样如此。
-要实现对表单小部件的完全控制,你别无选择,只能选择依靠JavaScript。在文章How to build custom form widgets中,我们将看到具体的做法,其中还有一些非常有用的库:
+要实现对表单小部件的完全控制,你别无选择,只能选择依靠 JavaScript。在文章How to build custom form widgets中,我们将看到具体的做法,其中还有一些非常有用的库:
下面的库不止应用于表单,他们在处理HTML表单时是非常有趣的:
+下面的库不止应用于表单,他们在处理 HTML 表单时是非常有趣的:
记住,使用CSS和JavaScript是有副作用的。所以在选择使用那些库时,应该在脚本失败的情况下能回滚样式表。脚本失败的原因很多,尤其在手机应用中,因此你需要尽可能好的设计你的Web站点或应用。
+记住,使用 CSS 和 JavaScript 是有副作用的。所以在选择使用那些库时,应该在脚本失败的情况下能回滚样式表。脚本失败的原因很多,尤其在手机应用中,因此你需要尽可能好的设计你的 Web 站点或应用。
虽然HTML表单使用CSS仍有一些黑洞,但通常也有方法绕过它们。即使没有清楚的,通用的解决方案,但新式的浏览器也提供了新的可能性。目前最好的方法是更多的学习不同浏览器支持CSS的方式,并应用于HTML表单小部件。
+虽然 HTML 表单使用 CSS 仍有一些黑洞,但通常也有方法绕过它们。即使没有清楚的,通用的解决方案,但新式的浏览器也提供了新的可能性。目前最好的方法是更多的学习不同浏览器支持 CSS 的方式,并应用于 HTML 表单小部件。
-在本指南的下一章节中,我们将探讨不同的HTML表单小部件怎样很好的支持更重要的CSS属性:Properties compatibility table for form widgets.
+在本指南的下一章节中,我们将探讨不同的 HTML 表单小部件怎样很好的支持更重要的 CSS 属性:Properties compatibility table for form widgets.
这就是表单校验 —— 当你向 Web 应用输入数据时,应用会验证你输入的数据是否是正确的。如果验证通过,应用允许提交这些数据到服务器并储存到数据库中(通常情况下),如果验证未通过,则 Web 应用会提示你有错误的数据,并且一般都会明确的告诉你错误发生在哪里。表单校验可以通过许多不同的方式实现。
@@ -51,7 +51,7 @@警告: 永远不要相信从客户端传递到服务器的数据。 即使您的表单正确验证并防止输入格式错误,恶意用户仍然可以更改网络请求。
+警告:永远不要相信从客户端传递到服务器的数据。即使您的表单正确验证并防止输入格式错误,恶意用户仍然可以更改网络请求。
如果一个元素未校验通过:
@@ -91,9 +91,9 @@在这一节,我们将会看到一些用于{{HTMLElement("input")}}元素校验的HTML5的特性。
+在这一节,我们将会看到一些用于{{HTMLElement("input")}}元素校验的 HTML5 的特性。
-让我们用一个简单的例子开始 — 一个可以让你从香蕉或樱桃中选择你最喜欢的水果的input。 这个包含了一个简单的文本{{HTMLElement("input")}} 和一个与之匹配的label,还有一个 submit {{htmlelement("button")}}。你可以在GitHub fruit-start.html找到源码,在线例子如下:
+让我们用一个简单的例子开始 — 一个可以让你从香蕉或樱桃中选择你最喜欢的水果的 input。 这个包含了一个简单的文本{{HTMLElement("input")}} 和一个与之匹配的 label,还有一个 submit {{htmlelement("button")}}。你可以在 GitHub fruit-start.html找到源码,在线例子如下:
最简单的HTML5校验功能是 {{htmlattrxref("required", "input")}}属性 — 如果要使输入成为必需的,则可以使用此属性标记元素。 当设置此属性时,如果输入为空,该表单将不会提交(并将显示错误消息),输入也将被视为无效。
+最简单的 HTML5 校验功能是 {{htmlattrxref("required", "input")}}属性 — 如果要使输入成为必需的,则可以使用此属性标记元素。当设置此属性时,如果输入为空,该表单将不会提交(并将显示错误消息),输入也将被视为无效。
-添加一个 required
属性到你的 input 元素, 如下所示:
添加一个 required
属性到你的 input 元素,如下所示:
<form> <label for="choose">Would you prefer a banana or cherry?</label> @@ -139,13 +139,13 @@-required 属性
border: 2px solid black; }
以上样式效果为:在校验失败时 输入框会有一个亮红色的虚线边框, 在校验通过时会有一个更微妙的黑色边框。在以下示例中尝试新的行为:
+以上样式效果为:在校验失败时 输入框会有一个亮红色的虚线边框,在校验通过时会有一个更微妙的黑色边框。在以下示例中尝试新的行为:
{{EmbedLiveSample("required_属性", "100%", 50)}}
另一个常用的校验功能是 {{htmlattrxref("pattern","input")}} 属性, 以 Regular Expression 作为 value 值. 正则表达式 (regex) 是一个可以用来匹配文本字符串中字符的组合的模式,所以它们是理想的表单校验器,也可以支持 JavaScript 中许多其它的用途。
+另一个常用的校验功能是 {{htmlattrxref("pattern","input")}} 属性,以 Regular Expression 作为 value 值。正则表达式 (regex) 是一个可以用来匹配文本字符串中字符的组合的模式,所以它们是理想的表单校验器,也可以支持 JavaScript 中许多其它的用途。
正则表达式相当复杂,我们不打算在本文中详尽地教你。
@@ -154,33 +154,33 @@a
— 匹配一个字符a
(不能匹配 b
, aa
等等.)abc
— 匹配 a
, 其次 b
, 最后 c
.a*
— 匹配0个或者多个字符 a
(+
代表至少匹配一个或者多个).a*
— 匹配 0 个或者多个字符 a
(+
代表至少匹配一个或者多个).[^a]
— 匹配一个字符,但它不能是a
.a|b
— 匹配一个字符 a
或者 b
.[abc]
— 匹配一个字符,它可以是a
,b
或c
.[^abc]
— 匹配一个字符,但它不可以是a
,b
或c
.[a-z]
— 匹配字符范围 a-z
且全部小写 (你可以使用 [A-Za-z]
涵盖大小写, 或 [A-Z]
来限制必须大写).a.c
— 匹配字符 a
,中间匹配任意一个字符,最后匹配字符 c
.a{5}
— 匹配字符 a
五次.a{5,7}
— 匹配字符 a
五到七次,不能多或者少.[a-z]
— 匹配字符范围 a-z
且全部小写 (你可以使用 [A-Za-z]
涵盖大小写,或 [A-Z]
来限制必须大写).a.c
— 匹配字符 a
,中间匹配任意一个字符,最后匹配字符 c
.a{5}
— 匹配字符 a
五次。a{5,7}
— 匹配字符 a
五到七次,不能多或者少。你也可以在这些表达式中使用数字和其他字符, 例如:
+你也可以在这些表达式中使用数字和其他字符,例如:
[ -]
— 匹配一个空格或者虚线.[0-9]
— 匹配数字范围0~9.[ -]
— 匹配一个空格或者虚线。[0-9]
— 匹配数字范围 0~9.你可以任意地组合这些,你可以任意指定不同的部分:
+你可以任意地组合这些,你可以任意指定不同的部分:
[Ll].*k
— 匹配一个大写L
或者小写的l
, 之后匹配0个或多个任意类型的字符, 最后匹配一个小写字母 k.[A-Z][A-Za-z' -]+
— 一个大写字母后面跟着匹配一个及以上的大小写字母或者中划线或者撇号或者空格. 这个可以用于校验英语会话中城市或城镇名, 但这需要首字母以大写开头,不包括其他字符,例如来自英国的Manchester, Ashton-under-lyne, 以及Bishop's Stortford等.[0-9]{3}[ -][0-9]{3}[ -][0-9]{4}
— 简单的匹配一个美国内的电话号码 — 三个数字 0-
9, 后面跟着一个空格或者中划线, 之后匹配三个数字 0-
9, 再跟着一个空格或者中划线, 最后跟着四个数字 0-
9. 但实际情况可能更加复杂,因为有些人会给号码加上括号什么的,这里的表达式只是用来做一个简单的演示.[Ll].*k
— 匹配一个大写L
或者小写的l
, 之后匹配 0 个或多个任意类型的字符,最后匹配一个小写字母 k.[A-Z][A-Za-z' -]+
— 一个大写字母后面跟着匹配一个及以上的大小写字母或者中划线或者撇号或者空格。这个可以用于校验英语会话中城市或城镇名,但这需要首字母以大写开头,不包括其他字符,例如来自英国的 Manchester, Ashton-under-lyne, 以及 Bishop's Stortford 等。[0-9]{3}[ -][0-9]{3}[ -][0-9]{4}
— 简单的匹配一个美国内的电话号码 — 三个数字 0-
9, 后面跟着一个空格或者中划线,之后匹配三个数字 0-
9, 再跟着一个空格或者中划线,最后跟着四个数字 0-
9. 但实际情况可能更加复杂,因为有些人会给号码加上括号什么的,这里的表达式只是用来做一个简单的演示。不管怎么说, 让我们来实现这些例子 — 更新你的html文档表单增加一个 pattern
属性, 如下:
不管怎么说,让我们来实现这些例子 — 更新你的 html 文档表单增加一个 pattern
属性,如下:
<form> <label for="choose">Would you prefer a banana or a cherry?</label> @@ -200,27 +200,27 @@使用正则表达式校验
{{EmbedLiveSample("使用正则表达式校验", "100%", 50)}}
-这个例子中, 该 {{HTMLElement("input")}} 元素接受两个值中的一个: 字符串 "banana" 或者字符串"cherry".
+这个例子中,该 {{HTMLElement("input")}} 元素接受两个值中的一个:字符串 "banana" 或者字符串"cherry".
-在这个基础上, 尝试把
+pattern
属性内部的表达式改变成上面的几个例子, 然后看看这些表达式如何影响您可以输入的值以使输入值有效. 尝试写一些你自己设计的,看看它如何工作。尽量让他们与水果有关这样你的例子才会有意义.在这个基础上,尝试把
pattern
属性内部的表达式改变成上面的几个例子,然后看看这些表达式如何影响您可以输入的值以使输入值有效。尝试写一些你自己设计的,看看它如何工作。尽量让他们与水果有关这样你的例子才会有意义。-注意: 一些 {{HTMLElement("input")}} 元素类型不需要{{htmlattrxref("pattern","input")}} 属性进行校验. 指定特定
+url
类型则会自动校验输入的是否为一个合法的链接.注意: 一些 {{HTMLElement("input")}} 元素类型不需要{{htmlattrxref("pattern","input")}} 属性进行校验。指定特定
url
类型则会自动校验输入的是否为一个合法的链接。-注意: 该 {{HTMLElement("textarea")}} 元素不支持{{htmlattrxref("pattern","input")}} 属性.
+注意: 该 {{HTMLElement("textarea")}} 元素不支持{{htmlattrxref("pattern","input")}} 属性。
限制输入的长度
-所有文本框 ({{HTMLElement("input")}} 或 {{HTMLElement("textarea")}}) 都可以使用{{htmlattrxref("minlength","input")}} 和 {{htmlattrxref("maxlength","input")}} 属性来限制长度. 如果输入的字段长度小于 {{htmlattrxref("minlength","input")}} 的值或大于 {{htmlattrxref("maxlength","input")}} 值则无效. 浏览器通常不会让用户在文本字段中键入比预期更长的值,不过更精细的设置总归是更好的。
+所有文本框 ({{HTMLElement("input")}} 或 {{HTMLElement("textarea")}}) 都可以使用{{htmlattrxref("minlength","input")}} 和 {{htmlattrxref("maxlength","input")}} 属性来限制长度。如果输入的字段长度小于 {{htmlattrxref("minlength","input")}} 的值或大于 {{htmlattrxref("maxlength","input")}} 值则无效。浏览器通常不会让用户在文本字段中键入比预期更长的值,不过更精细的设置总归是更好的。
-在数字条目中 (i.e.
+<input type="number">
), 该 {{htmlattrxref("min","input")}} 和 {{htmlattrxref("max","input")}} 属性同样提供校验约束.如果字段的值小于{{htmlattrxref("min","input")}} 属性的值或大于 {{htmlattrxref("max","input")}} 属性的值,该字段则无效.在数字条目中 (i.e.
-<input type="number">
), 该 {{htmlattrxref("min","input")}} 和 {{htmlattrxref("max","input")}} 属性同样提供校验约束。如果字段的值小于{{htmlattrxref("min","input")}} 属性的值或大于 {{htmlattrxref("max","input")}} 属性的值,该字段则无效。让我来看看另外一个例子. 创建一个 fruit-start.html 文件副本.
+让我来看看另外一个例子。创建一个 fruit-start.html 文件副本。
-现在删除
+<body>
元素中的内容, 替换成下面的代码:现在删除
<body>
元素中的内容,替换成下面的代码:<form> <div> @@ -237,8 +237,8 @@限制输入的长度
</form>
text
条目的属性minlength
和 maxlength
都为6 — 这 banana 和 cherry的长度都为6. 输入少于这个长度的字符显示无效, 大多浏览器不能输入超过该限制的长度的字符.number
条目数值限制在 min
为 1 和 一个 max
为 10 中 — 输入超出范围则显示无效, 并且您将无法使用递增/递减箭头将该值改变到此范围之外。text
条目的属性minlength
和 maxlength
都为 6 — 这 banana 和 cherry 的长度都为 6. 输入少于这个长度的字符显示无效,大多浏览器不能输入超过该限制的长度的字符。number
条目数值限制在 min
为 1 和 一个 max
为 10 中 — 输入超出范围则显示无效,并且您将无法使用递增/递减箭头将该值改变到此范围之外。这里是运行的例子:
+这里是运行的例子:
{{EmbedLiveSample("限制输入的长度", "100%", 70)}}
注意: <input type="number">
(或者其他类型, 像 range
) 也可以获取到一个{{htmlattrxref("step", "input")}} 属性, 指定了值在增减过程固定改变的值 (如向上增加和向下减少的按钮).
注意: <input type="number">
(或者其他类型,像 range
) 也可以获取到一个{{htmlattrxref("step", "input")}} 属性,指定了值在增减过程固定改变的值 (如向上增加和向下减少的按钮).
这里就是一个完整的展示 HTML 中使用校验属性的例子:
+这里就是一个完整的展示 HTML 中使用校验属性的例子:
<form> <p> @@ -277,8 +277,8 @@完整的例子
</p> <p> <label for="n1">How old are you?</label> - <!-- 这里的pattern属性可以用作不支持number类input浏览器的备用方法 - 请注意当与数字输入框一起使用时,支持pattern属性的浏览器会使它沉默失效。 + <!-- 这里的 pattern 属性可以用作不支持 number 类 input 浏览器的备用方法 + 请注意当与数字输入框一起使用时,支持 pattern 属性的浏览器会使它沉默失效。 它仅仅是在这里用作备用 --> <input type="number" min="12" max="120" step="1" id="n1" name="age" pattern="\d+"> @@ -330,7 +330,7 @@完整的例子
input[type=number], textarea, fieldset { -/* 需要在基于WebKit的浏览器上对表单元素进行恰当的样式设置 */ +/* 需要在基于 WebKit 的浏览器上对表单元素进行恰当的样式设置 */ -webkit-appearance: none; width : 100%; @@ -356,13 +356,13 @@完整的例子
自定义错误信息
-正如我们上面所看到的例子, 每次我们提交无效的表单数据时, 浏览器总会显示错误信息. 但是显示的信息取决于你所使用的浏览器.
+正如我们上面所看到的例子,每次我们提交无效的表单数据时,浏览器总会显示错误信息。但是显示的信息取决于你所使用的浏览器。
-这些自动生成的错误有两个缺点:
+这些自动生成的错误有两个缺点:
要自定义这些消息的外观和文本, 你必须使用 JavaScript; 不能使用 HTML 和 CSS 来改变.
+要自定义这些消息的外观和文本,你必须使用 JavaScript; 不能使用 HTML 和 CSS 来改变。
-HTML5 提供 constraint validation API 来检测和自定义表单元素的状态. 除此之外,他可以改变错误信息的文本. 让我们快速的看一个例子:
+HTML5 提供 constraint validation API 来检测和自定义表单元素的状态。除此之外,他可以改变错误信息的文本。让我们快速的看一个例子:
<form> <label for="mail">I would like you to provide me an e-mail</label> @@ -399,7 +399,7 @@-自定义错误信息
<button>Submit</button> </form>
在JavaScript 中, 你调用 setCustomValidity()
方法:
在 JavaScript 中,你调用 setCustomValidity()
方法:
var email = document.getElementById("mail"); @@ -413,13 +413,13 @@自定义错误信息
{{EmbedLiveSample("自定义错误信息", "100%", 50)}}
-使用 JavaScript校验表单
+使用 JavaScript 校验表单
-如果你想控制原生错误信息的界面外观,或者你想处理不支持HTML内置表单校验的浏览器,则必须使用 Javascript。
+如果你想控制原生错误信息的界面外观,或者你想处理不支持 HTML 内置表单校验的浏览器,则必须使用 Javascript。
约束校验的 API
-越来越多的浏览器支持限制校验API,并且这逐渐变得可靠。这些 API 由成组的方法和属性构成,可在特定的表单元素接口上调用:
+越来越多的浏览器支持限制校验 API,并且这逐渐变得可靠。这些 API 由成组的方法和属性构成,可在特定的表单元素接口上调用:
true
. 当返回为 false
时, 对每个无效元素可撤销 {{event("invalid")}} 事件会被唤起并且校验错误会报告给用户 。true
. 当返回为 false
时,对每个无效元素可撤销 {{event("invalid")}} 事件会被唤起并且校验错误会报告给用户。这个简单的表单使用 {{htmlattrxref("novalidate","form")}} 属性关闭浏览器的自动校验;这允许我们使用脚本控制表单校验。但是,这并不禁止对约束校验 API的支持或是以下 CSS 伪类:{{cssxref(":valid")}}、{{cssxref(":invalid")}}、{{cssxref(":in-range")}} 、{{cssxref(":out-of-range")}} 的应用。这意味着,即使浏览器在发送数据之前没有自动检查表单的有效性,您仍然可以自己做,并相应地设置表单的样式。
+这个简单的表单使用 {{htmlattrxref("novalidate","form")}} 属性关闭浏览器的自动校验;这允许我们使用脚本控制表单校验。但是,这并不禁止对约束校验 API 的支持或是以下 CSS 伪类:{{cssxref(":valid")}}、{{cssxref(":invalid")}}、{{cssxref(":in-range")}} 、{{cssxref(":out-of-range")}} 的应用。这意味着,即使浏览器在发送数据之前没有自动检查表单的有效性,您仍然可以自己做,并相应地设置表单的样式。
aria-live
属性确保我们的自定义错误信息将呈现给所有人,包括使用屏幕阅读器等辅助技术的人。
{{EmbedLiveSample("使用约束校验_API_的例子", "100%", 130)}}
-约束校验 API 为您提供了一个强大的工具来处理表单校验,让您可以对用户界面进行远超过仅仅使用 HTML 和 CSS所能得到的控制。
+约束校验 API 为您提供了一个强大的工具来处理表单校验,让您可以对用户界面进行远超过仅仅使用 HTML 和 CSS 所能得到的控制。
有时,例如使用旧版浏览器或自定义小部件,您将无法(或不希望)使用约束校验API。 在这种情况下,您仍然可以使用 JavaScript 来校验您的表单。 校验表单比起真实数据校验更像是一个用户界面问题。
+有时,例如使用旧版浏览器或自定义小部件,您将无法(或不希望)使用约束校验 API。在这种情况下,您仍然可以使用 JavaScript 来校验您的表单。校验表单比起真实数据校验更像是一个用户界面问题。
要校验表单,您必须问自己几个问题:
为了说明这一点,让我们重构一下前面的例子,以便它可以在旧版浏览器中使用:
@@ -694,11 +694,11 @@正如你所看到的,HTML 几乎是一样的;我们只是关闭了 HTML 校验功能。 请注意,ARIA 是与 HTML5 无关的独立规范。
+正如你所看到的,HTML 几乎是一样的;我们只是关闭了 HTML 校验功能。请注意,ARIA 是与 HTML5 无关的独立规范。
同样的,CSS也不需要太多的改动, 我们只需将 {{cssxref(":invalid")}} 伪类变成真实的类,并避免使用不适用于 Internet Explorer 6 的属性选择器。
+同样的,CSS 也不需要太多的改动,我们只需将 {{cssxref(":invalid")}} 伪类变成真实的类,并避免使用不适用于 Internet Explorer 6 的属性选择器。
/* 仅为了使示例更好看 */ body { @@ -792,7 +792,7 @@-JavaScript
}; // 现在我们可以重构字段的约束校验了 -// 由于不使用 CSS 伪类, 我们必须明确地设置 valid 或 invalid 类到 email 字段上 +// 由于不使用 CSS 伪类,我们必须明确地设置 valid 或 invalid 类到 email 字段上 addEvent(window, "load", function () { // 在这里验证字段是否为空(请记住,该字段不是必需的) // 如果非空,检查它的内容格式是不是合格的 e-mail 地址 @@ -831,11 +831,11 @@JavaScript
} });
该结果如下:
+该结果如下:
{{EmbedLiveSample("不使用内建_API_时的表单校验", "100%", 130)}}
-正如你所看到的,建立自己的校验系统并不难。 困难的部分是使其足够通用,以跨平台和任何形式使用它可以创建。 有许多库可用于执行表单校验; 你应该毫不犹豫地使用它们。 这里有一些例子:
+正如你所看到的,建立自己的校验系统并不难。困难的部分是使其足够通用,以跨平台和任何形式使用它可以创建。有许多库可用于执行表单校验; 你应该毫不犹豫地使用它们。这里有一些例子:
在某些情况下,执行一些远程校验可能很有用。 当用户输入的数据与存储在应用程序服务器端的附加数据绑定时,这种校验是必要的。 一个应用实例就是注册表单,在这里你需要一个用户名。 为了避免重复,执行一个 AJAX 请求来检查用户名的可用性,要比让先用户发送数据,然后因为表单重复了返回错误信息要好得多。
+在某些情况下,执行一些远程校验可能很有用。当用户输入的数据与存储在应用程序服务器端的附加数据绑定时,这种校验是必要的。一个应用实例就是注册表单,在这里你需要一个用户名。为了避免重复,执行一个 AJAX 请求来检查用户名的可用性,要比让先用户发送数据,然后因为表单重复了返回错误信息要好得多。
执行这样的校验需要采取一些预防措施:
@@ -864,7 +864,7 @@表单校验并不需要复杂的 JavaScript,但它需要对用户的仔细考虑。 一定要记住帮助您的用户更正他提供的数据。 为此,请务必:
+表单校验并不需要复杂的 JavaScript,但它需要对用户的仔细考虑。一定要记住帮助您的用户更正他提供的数据。为此,请务必:
这是解释 如何构建自定义表单小部件的第二个示例。
-{{ EmbedLiveSample('JS', 120, 130) }}
-{{ EmbedLiveSample('No_JS', 120, 130) }}
diff --git a/files/zh-cn/learn/forms/how_to_build_custom_form_controls/index.html b/files/zh-cn/learn/forms/how_to_build_custom_form_controls/index.html index 991879d96304dc..ce48fa3592710d 100644 --- a/files/zh-cn/learn/forms/how_to_build_custom_form_controls/index.html +++ b/files/zh-cn/learn/forms/how_to_build_custom_form_controls/index.html @@ -16,20 +16,20 @@在本文中,我们会看到如何构建这样的组件。为此,我们将使用这样一个例子:重建 {{HTMLElement("select")}}元素。
注意: 我们将专注于构建小部件,而不是怎样让代码更通用或可复用;那会涉及一些非基础的JavaScript代码和未知环境下的DOM操作,这超过了这篇文章的范围。
+注意: 我们将专注于构建小部件,而不是怎样让代码更通用或可复用;那会涉及一些非基础的 JavaScript 代码和未知环境下的 DOM 操作,这超过了这篇文章的范围。
在构建一个自定义控件之前,首先你要确切的知道你要什么。 这将为您节省宝贵的时间。 特别地,清楚地定义控件的所有状态非常重要。 为了做到这一点,从状态和行为表现都众所周知的现有小控件开始是很好的选择,这样你可以轻松的尽量模仿这些控件。
+在构建一个自定义控件之前,首先你要确切的知道你要什么。这将为您节省宝贵的时间。特别地,清楚地定义控件的所有状态非常重要。为了做到这一点,从状态和行为表现都众所周知的现有小控件开始是很好的选择,这样你可以轻松的尽量模仿这些控件。
-在我们的示例中,我们将重建HTML<select>元素,这是我们希望实现的结果:
+在我们的示例中,我们将重建 HTML<select>元素,这是我们希望实现的结果:
上面图片显示了我们控件的三个主要状态:正常状态(左); 活动状态(中)和打开状态(右)。
-在行为方面,我们希望我们的控件像任何原生控件一样对鼠标和键盘都可用。 让我们从定义控件如何到达每个状态开始:
+在行为方面,我们希望我们的控件像任何原生控件一样对鼠标和键盘都可用。让我们从定义控件如何到达每个状态开始:
注意: 在页面上移动焦点通常是通过按Tab键来完成的,但这并不是哪都通用的标准。 例如,在Safari中页面上的链接间的循环切换默认下是通过使用组合键Option + Tab完成的。
+注意: 在页面上移动焦点通常是通过按 Tab 键来完成的,但这并不是哪都通用的标准。例如,在 Safari 中页面上的链接间的循环切换默认下是通过使用组合键 Option + Tab完成的。
我们知道如何改变状态后,定义如何改变小工具的值还很重要:
+我们知道如何改变状态后,定义如何改变小工具的值还很重要:
最后,让我们定义控件的选项将要怎么表现:
+最后,让我们定义控件的选项将要怎么表现:
对于我们的例子的目的,我们将就此结束;但是,如果你是一个认真的读者,你会注意到我们省略了一些东西,例如,你认为用户在小部件处于打开状态时点击tab键会发生什么?答案是:什么也不会发生。好吧,似乎很明显这就是正确的行为,但事实是,因为在我们的规范中没有定义这种情况,我们很容易忽略这种行为。在团队环境中尤其是这样,因为设计小部件行为的人与实现的人通常是不同的。
+对于我们的例子的目的,我们将就此结束;但是,如果你是一个认真的读者,你会注意到我们省略了一些东西,例如,你认为用户在小部件处于打开状态时点击 tab 键会发生什么?答案是:什么也不会发生。好吧,似乎很明显这就是正确的行为,但事实是,因为在我们的规范中没有定义这种情况,我们很容易忽略这种行为。在团队环境中尤其是这样,因为设计小部件行为的人与实现的人通常是不同的。
另外一个有趣的例子是:当小部件处于打开状态时,用户按下键盘上方向键和下方向键将会发生什么?这个问题有些棘手,如果你认为活动状态和打开状态是完全不同的,那么答案就是“什么都不会发生”,因为我们没有定义任何在打开状态下键盘的交互行为。从另一个方面看,如果你认为活动状态和打开状态是有重叠的部分,那么控件的值可能会改变,但是被选中的选项肯定不会相应的进行突出显示,同样是因为我们没有定义在控件打开状态下的任何键盘交互事件(我们仅仅定义了控件打开会发生什么,而没有定义在其打开后会发生什么)
-在我们的例子中,缺失的规范是显而易见的,所以我们将着手处理他们,但是对于一些没有人想到去定义正确行为的小部件而言,这的确是一个问题。所以在设计阶段花费时间是值得的,因为如果你定义的行为不够好,或者忘记定义了一个行为,那么在用户开始实际使用时,将会很难去重新定义它们。如果你在定义时有疑问,请征询他人的意见,如果你有预算,请不要犹豫的去进行用户可行性测试,这个过程被称为UX design (User Experience Design用户体验设计),如果你想要深入的学习相关的内容,请查阅下面这些有用资源:
+在我们的例子中,缺失的规范是显而易见的,所以我们将着手处理他们,但是对于一些没有人想到去定义正确行为的小部件而言,这的确是一个问题。所以在设计阶段花费时间是值得的,因为如果你定义的行为不够好,或者忘记定义了一个行为,那么在用户开始实际使用时,将会很难去重新定义它们。如果你在定义时有疑问,请征询他人的意见,如果你有预算,请不要犹豫的去进行用户可行性测试,这个过程被称为 UX design (User Experience Design用户体验设计),如果你想要深入的学习相关的内容,请查阅下面这些有用资源:
注意: 另外, 在绝大多数系统中,还有一种方法能够打开{{HTMLElement("select")}}元素来观察其所有的选项(这和用鼠标点击{{HTMLElement("select")}}元素是一样的)。通过Windows下的Alt + 向下箭头实现,在我们的例子中没有实现---但是这样做会很方便,因为鼠标点击事件就是由该原理实现的。
+注意:另外, 在绝大多数系统中,还有一种方法能够打开{{HTMLElement("select")}}元素来观察其所有的选项(这和用鼠标点击{{HTMLElement("select")}}元素是一样的)。通过 Windows 下的 Alt + 向下箭头实现,在我们的例子中没有实现---但是这样做会很方便,因为鼠标点击事件就是由该原理实现的。
现在控件的基本功能已经决定了,可以开始构建自定义控件了。第一步是要确定 HTML 结构并给予一些基本的语义规则。第一步就是去确定它的HTML结构并给予一些基本的语义。重构{{HTMLElement("select")}}元素需要怎么做如下:
+现在控件的基本功能已经决定了,可以开始构建自定义控件了。第一步是要确定 HTML 结构并给予一些基本的语义规则。第一步就是去确定它的 HTML 结构并给予一些基本的语义。重构{{HTMLElement("select")}}元素需要怎么做如下:
-<!-- 这是我们小部件的主要容器. - tabindex属性是用来让用户聚焦在小部件上的. - 稍后我们会发现最好通过JavaScript来设定它的值. --> +-<!-- 这是我们小部件的主要容器。 + tabindex 属性是用来让用户聚焦在小部件上的。 + 稍后我们会发现最好通过 JavaScript 来设定它的值。--> <div class="select" tabindex="0"> <!-- 这个容器用来显示组件现在的值 --> <span class="value">Cherry</span> - <!-- 这个容器包含我们的组件的所有可用选项. - 因为他是一个列表,用ul元素是有意义的. --> + <!-- 这个容器包含我们的组件的所有可用选项。 + 因为他是一个列表,用 ul 元素是有意义的。--> <ul class="optList"> <!-- 每个选项只包含用来显示的值, 稍后我们会知道如何处理和表单一起发送的真实值 --> @@ -121,11 +121,11 @@-定义语义化的 HTML 结构
</div>注意类名的使用:不管实际使用了哪种底层HTML元素,它们都标识每个相关的部分。这很重要,因为这样做能确保我们的CSS和JavaScript不会和HTML结构强绑定,这样我们就可以在不破坏使用小部件的代码的情况下进行实现更改。比如,如果你希望增加一个等价的{{HTMLElement("optgroup")}}元素。
+注意类名的使用:不管实际使用了哪种底层 HTML 元素,它们都标识每个相关的部分。这很重要,因为这样做能确保我们的 CSS 和 JavaScript 不会和 HTML 结构强绑定,这样我们就可以在不破坏使用小部件的代码的情况下进行实现更改。比如,如果你希望增加一个等价的{{HTMLElement("optgroup")}}元素。
使用 CSS 创建外观
-现在我们有了控件结构,我们可以开始设计我们的控件了。构建自定义控件的重点是能够完全按照我们的期望设置它的样式。为了达到这个目的,我们将 CSS部分的工作分为两部分:第一部分是让我们的控件表现得像一个{{HTMLElement("select")}}元素所必需的的CSS规则,第二部分包含了让组件看起来像我们所希望那样的精妙样式。
+现在我们有了控件结构,我们可以开始设计我们的控件了。构建自定义控件的重点是能够完全按照我们的期望设置它的样式。为了达到这个目的,我们将 CSS 部分的工作分为两部分:第一部分是让我们的控件表现得像一个{{HTMLElement("select")}}元素所必需的的 CSS 规则,第二部分包含了让组件看起来像我们所希望那样的精妙样式。
所需的样式
@@ -139,14 +139,14 @@所需的样式
display : inline-block; }
我们需要一个额外的类 active
来定义我们的组件处于其激活状态时的的界面外观。因为我们的组件是可以聚焦的, 我们通过{{cssxref(":focus")}} 伪类重复自定义样式来确保它们表现得一样。
我们需要一个额外的类 active
来定义我们的组件处于其激活状态时的的界面外观。因为我们的组件是可以聚焦的,我们通过{{cssxref(":focus")}} 伪类重复自定义样式来确保它们表现得一样。
.select .active, .select:focus { outline: none; /* 这里的 box-shadow 属性并非必须,但确保活动状态能看出来非常重要---我们 - 将其作为一个默认值,你可以随意地覆盖掉它. */ + 将其作为一个默认值,你可以随意地覆盖掉它。*/ box-shadow: 0 0 3px 1px #227755; }@@ -165,7 +165,7 @@
我们需要一个额外的类来处理选项列表隐藏时的情况。为了管理没有完全匹配的活动状态和打开状态之间的差异,这是有必要的。
.select .optList.hidden { - /* 这是一个以可访问形式隐藏列表的简单方法, + /* 这是一个以可访问形式隐藏列表的简单方法, 对可访问性我们将在最后进一步拓展 */ max-height: 0; visibility: hidden; @@ -176,11 +176,11 @@美化
所以现在我们的基本功能已经就位,有趣的事情就可以开始了。下面是一个可行的简单的例子,和本文开头的截图是相对应的。不管怎样,你可以随意的体验一下看看能收获什么。
.select { - /* 出于可访问性方面的原因,所有尺寸都会由em值表示 + /* 出于可访问性方面的原因,所有尺寸都会由 em 值表示 (用来确保用户在文本模式下使用浏览器缩放时组件的可缩放性). - 在大多数浏览器下的默认换算是1em == 16px. - 如果你对em和px的转换感到疑惑, 请参考http://riddle.pl/emcalc/ */ - font-size : 0.625em; /* 这个(=10px)是以em方式表达的这个环境里的字体大小 */ + 在大多数浏览器下的默认换算是 1em == 16px. + 如果你对 em 和 px 的转换感到疑惑,请参考 http://riddle.pl/emcalc/ */ + font-size : 0.625em; /* 这个(=10px)是以 em 方式表达的这个环境里的字体大小 */ font-family : Verdana, Arial, sans-serif; -moz-box-sizing : border-box; @@ -195,8 +195,8 @@-美化
box-shadow : 0 .1em .2em rgba(0,0,0,.45); /* 0 1px 2px */ /* 第一段声明是为了不支持线性梯度填充的浏览器准备的。 - 第二段声明是因为基于WebKit的浏览器没有预先定义它。 - 如果你想为过时的浏览器提供支持, 请参阅 http://www.colorzilla.com/gradient-editor/ */ + 第二段声明是因为基于 WebKit 的浏览器没有预先定义它。 + 如果你想为过时的浏览器提供支持,请参阅 http://www.colorzilla.com/gradient-editor/ */ background : #F0F0F0; background : -webkit-linear-gradient(90deg, #E3E3E3, #fcfcfc 50%, #f0f0f0); background : linear-gradient(0deg, #E3E3E3, #fcfcfc 50%, #f0f0f0); @@ -210,15 +210,15 @@美化
vertical-align: top; - /* 如果内容溢出了, 最好有一个恰当的缩写. */ + /* 如果内容溢出了,最好有一个恰当的缩写。*/ white-space : nowrap; text-overflow: ellipsis; }我们不需要一个额外的元素来设计向下的箭头,而使用{{cssxref(":after")}} 伪类来替代。然而,这也可以通过使用一张加在
+select
class上的简单的背景图像来实现。我们不需要一个额外的元素来设计向下的箭头,而使用{{cssxref(":after")}} 伪类来替代。然而,这也可以通过使用一张加在
select
class 上的简单的背景图像来实现。.select:after { - content : "▼"; /* 我们使用了unicode 编码的字符 U+25BC; 参阅 http://www.utf8-chartable.de */ + content : "▼"; /* 我们使用了 unicode 编码的字符 U+25BC; 参阅 http://www.utf8-chartable.de */ position: absolute; z-index : 1; /* 这对于防止箭头覆盖选项列表很重要 */ top : 0; @@ -244,7 +244,7 @@美化
.select .optList { z-index : 2; /* 我们明确的表示选项列表会始终与向下箭头重叠 */ - /* 这会重置ul元素的默认样式 */ + /* 这会重置 ul 元素的默认样式 */ list-style: none; margin : 0; padding: 0; @@ -255,8 +255,8 @@-美化
/* 这会确保即使数值比组件小,选项列表仍能变得跟组件自身一样大*/ min-width : 100%; - /* 万一列表太长了, 它的内容会从垂直方向溢出(会自动添加一个竖向滚动条) - 但是水平方向不会(因为我们没有设定宽度, 列表会自适应宽度. 如果不能的话,内容会被截断) */ + /* 万一列表太长了,它的内容会从垂直方向溢出 (会自动添加一个竖向滚动条) + 但是水平方向不会 (因为我们没有设定宽度,列表会自适应宽度。如果不能的话,内容会被截断) */ max-height: 10em; /* 100px */ overflow-y: auto; overflow-x: hidden; @@ -280,7 +280,7 @@美化
color: #FFFFFF; }这是三种状态的结果:
+这是三种状态的结果:
现在我们的设计和结构已经完成了。我们可以写些JavaScript代码来让这个部件真正生效。
+现在我们的设计和结构已经完成了。我们可以写些 JavaScript 代码来让这个部件真正生效。
警告:下面的代码仅仅是教学性质的,并且不应该照搬使用。在许多方面,正如我们所看到的,这种方案不具有前瞻性,而且可能在旧浏览器上会不工作。这里面还有冗余的部分,在生产环境下,代码需要优化。
@@ -329,7 +329,7 @@因为这些风险,认真考虑 JavaScript 不生效时会发生什么是很重要的。处理这个问题的细节超出了这篇文章的范围,因为这与你有多么想使你的脚本具有通用性和可复用性更加相关,不过我们将在我们的例子中考虑与其相关的基本内容。
-在我们的例子中,如果JavaScript代码没有运行,我们会回退到显示一个标准的 {{HTMLElement("select")}} 元素。为了实现这一点,我们需要两样东西。
+在我们的例子中,如果 JavaScript 代码没有运行,我们会回退到显示一个标准的 {{HTMLElement("select")}} 元素。为了实现这一点,我们需要两样东西。
首先,在每次使用我们的自定义部件前,我们需要添加一个标准的 {{HTMLElement("select")}} 元素。实际上,为了能将来自我们自定义的表单组件和以及其他部分的表单数据发送出去,这个元素也是需要的。我们随后会详细的解释这一点。
@@ -357,21 +357,21 @@第二,我们需要两个新的 classes 来隐藏不需要的元素(即,当我们的脚本没有运行时的自定义组件, 或是脚本正常运行时的"真正的" {{HTMLElement("select")}} 元素)。注意默认情况下,我们的 HTML 代码会隐藏我们的自定义组件。
+第二,我们需要两个新的 classes 来隐藏不需要的元素 (即,当我们的脚本没有运行时的自定义组件,或是脚本正常运行时的"真正的" {{HTMLElement("select")}} 元素)。注意默认情况下,我们的 HTML 代码会隐藏我们的自定义组件。
.widget select, .no-widget .select { - /* 这个CSS选择器大体上说的是: - - 要么我们将body的class设置为"widget",隐藏真实的{{HTMLElement("select")}}元素 - - 或是我们没有改变body的class,这样body的class还是"no-widget", - 因此class为"select"的元素需要被隐藏 */ + /* 这个 CSS 选择器大体上说的是: + - 要么我们将 body 的 class 设置为"widget",隐藏真实的{{HTMLElement("select")}}元素 + - 或是我们没有改变 body 的 class,这样 body 的 class 还是"no-widget", + 因此 class 为"select"的元素需要被隐藏 */ position : absolute; left : -5000em; height : 0; overflow : hidden; }-
接下来我们需要一个 JavaScript 开关来决定脚本是否运行。这个开关非常简单:如果页面加载时,我们的脚本运行了,它将会移除 no-widget
class ,并添加 widget
class,由此切换 {{HTMLElement("select")}} 元素和自定义组件的可视性。
接下来我们需要一个 JavaScript 开关来决定脚本是否运行。这个开关非常简单:如果页面加载时,我们的脚本运行了,它将会移除 no-widget
class,并添加 widget
class,由此切换 {{HTMLElement("select")}} 元素和自定义组件的可视性。
window.addEventListener("load", function () { document.body.classList.remove("no-widget"); @@ -397,21 +397,21 @@它为什么不生效?
-注意: 如果你真的想让你的代码变得通用和可重用,最好不要做一个 class 选择器开关,而是通过添加一个组件 class 的方式来隐藏{{HTMLElement("select")}} 元素,并且动态地在每一个{{HTMLElement("select")}} 元素后面添加代表页面中自定义组件的 DOM 树。
+注意: 如果你真的想让你的代码变得通用和可重用,最好不要做一个 class 选择器开关,而是通过添加一个组件 class 的方式来隐藏{{HTMLElement("select")}} 元素,并且动态地在每一个{{HTMLElement("select")}} 元素后面添加代表页面中自定义组件的 DOM 树。
让工作变得更简单
在我们将要构建的代码之中,我们将会使用标准的 DOM API 来完成我们所要做的所有工作。尽管 DOM API 在浏览器中得到了更好支持,但是在旧的浏览器上还是会出现问题。( 特别是非常老的 Internet Explorer)。
-如果你想要避免旧浏览器带来的麻烦,这儿有两种解决方案:使用专门的框架,比如 jQuery, $dom, prototype, Dojo, YUI, 或者类似的框架,或者通过填充你想使用的缺失的特性 (这可以通过条件加载轻松完成——例如使用 yepnope 这样的库。
+如果你想要避免旧浏览器带来的麻烦,这儿有两种解决方案:使用专门的框架,比如 jQuery, $dom, prototype, Dojo, YUI, 或者类似的框架,或者通过填充你想使用的缺失的特性(这可以通过条件加载轻松完成——例如使用 yepnope 这样的库。
我们打算使用的特性如下所示(按照风险程度从高到低排列):
@@ -446,16 +446,16 @@
- {{domxref("element.classList","classList")}}
- {{domxref("EventTarget.addEventListener","addEventListener")}}
-- +
forEach
(这不是 DOM而是现代 JavaScript )forEach
(这不是 DOM 而是现代 JavaScript )- {{domxref("element.querySelector","querySelector")}} 和 {{domxref("element.querySelectorAll","querySelectorAll")}}
构造事件回调
} // 每当用户想要激活(或停用)这个组件的时候,会调用这个函数 -// 它需要2个参数: -// select : 要激活的带有'select'类的DOM节点 -// selectList : 包含所有带'select'类的DOM节点的列表 +// 它需要 2 个参数: +// select : 要激活的带有'select'类的 DOM 节点 +// selectList : 包含所有带'select'类的 DOM 节点的列表 function activeSelect(select, selectList) { // 如果组件已经激活了,不进行任何操作 if (select.classList.contains('active')) return; // 我们需要关闭所有自定义组件的活动状态 - // 因为deactiveselect函数满足forEach回调函数的所有请求, + // 因为 deactiveselect 函数满足 forEach 回调函数的所有请求, // 我们直接使用它,不使用中间匿名函数 selectList.forEach(deactivateSelect); @@ -464,8 +464,8 @@构造事件回调
} // 每当用户想要打开/关闭选项列表的时候,会调用这个函数 -// 它需要一个参数: -// select : 要触发的列表的DOM节点 +// 它需要一个参数: +// select : 要触发的列表的 DOM 节点 function toggleOptList(select) { // 该列表不包含在组件中 @@ -476,12 +476,12 @@构造事件回调
} // 每当我们要高亮一个选项的时候,会调用该函数 -// 它需要两个参数: -// select : 带有'select'类的DOM节点,包含了需要高亮强调的选项 -// option : 需要高亮强调的带有'option'类的DOM节点 +// 它需要两个参数: +// select : 带有'select'类的 DOM 节点,包含了需要高亮强调的选项 +// option : 需要高亮强调的带有'option'类的 DOM 节点 function highlightOption(select, option) { - // 为我们的自定义select元素获取所有有效选项的列表 + // 为我们的自定义 select 元素获取所有有效选项的列表 var optionList = select.querySelectorAll('.option'); // 我们移除所有选项的高亮强调 @@ -510,12 +510,12 @@构造事件回调
// 每当用户的鼠标悬停在一个选项上时,我们高亮这个指定的选项 optionList.forEach(function (option) { option.addEventListener('mouseover', function () { - // 注意:'select'和'option'变量是我们函数调用范围内有效的闭包 。 + // 注意:'select'和'option'变量是我们函数调用范围内有效的闭包。 highlightOption(select, option); }); }); - // 每当用户点击一个自定义的select元素时 + // 每当用户点击一个自定义的 select 元素时 select.addEventListener('click', function (event) { // 注意:'select'变量是我们函数调用范围内有效的闭包。 @@ -524,9 +524,9 @@构造事件回调
}); // 如果组件获得了焦点 - // 每当用户点击它或是用tab键访问这个组件时,组件获得焦点 + // 每当用户点击它或是用 tab 键访问这个组件时,组件获得焦点 select.addEventListener('focus', function (event) { - // 注意:'select'和'selectlist'变量是我们函数调用范围内有效的闭包 。 + // 注意:'select'和'selectlist'变量是我们函数调用范围内有效的闭包。 // 我们激活这个组件 activeSelect(select, selectList); @@ -569,12 +569,12 @@处理组件的值
像前面所看到的那样,出于可访问性的原因,我们已经使用了一个原生的选择组件作为后备显示内容;我们可轻松的将它的值与我们的自定义组件之间的值同步。
// 这个函数更新显示的值并将其通过原生组件同步 -// 它需要2个参数: -// select : 含有要更新的值的'select'类的DOM节点 +// 它需要 2 个参数: +// select : 含有要更新的值的'select'类的 DOM 节点 // index : 要被选择的值的索引 function updateValue(select, index) { // 我们需要为了给定的自定义组件获取原生组件 - // 在我们的例子中, 原生组件是自定义组件的‘同胞’ + // 在我们的例子中,原生组件是自定义组件的‘同胞’ var nativeWidget = select.previousElementSibling; // 我们也需要得到自定义组件的值占位符, @@ -594,11 +594,11 @@处理组件的值
}; // 这个函数返回原生组件里当前选定的索引 -// 它需要1个参数: -// select : 跟原生组件有关的'select'类DOM节点 +// 它需要 1 个参数: +// select : 跟原生组件有关的'select'类 DOM 节点 function getIndex(select) { // 我们需要为了给定的自定义组件访问原生组件 - // 在我们的例子中, 原生组件是自定义组件的一个“同胞” + // 在我们的例子中,原生组件是自定义组件的一个“同胞” var nativeWidget = select.previousElementSibling; return nativeWidget.selectedIndex; @@ -671,24 +671,24 @@处理组件的值
使其具有可访问性
-我们构建了一个能够生效的东西,尽管这离一个特性齐全的选择框还差得远,但是它效果不错。但是我们已经完成的事情只不过是摆弄DOM。这个组件并没有真正的语义,即使它看起来像一个选择框,但是从浏览器的角度来看并不是,所以辅助技术并不能明白这是一个选择框。简单来说,这个全新的选择框并不具备可访问性!
+我们构建了一个能够生效的东西,尽管这离一个特性齐全的选择框还差得远,但是它效果不错。但是我们已经完成的事情只不过是摆弄 DOM。这个组件并没有真正的语义,即使它看起来像一个选择框,但是从浏览器的角度来看并不是,所以辅助技术并不能明白这是一个选择框。简单来说,这个全新的选择框并不具备可访问性!
-幸运的是,有一种解决方案叫做 ARIA。ARIA代表"无障碍富互联网应用"。这是一个专为我们现在做的事情设计的 W3C 规范:使网络应用和自定义组件易于访问,它本质上是一组用来拓展 HTML 的属性集,以便我们能够更好的描述角色,状态和属性,就像我们刚才设计的元素是是它试图传递的原生元素一样。使用这些属性非常简单,所以让我们来试试看。
+幸运的是,有一种解决方案叫做 ARIA。ARIA 代表"无障碍富互联网应用"。这是一个专为我们现在做的事情设计的 W3C 规范:使网络应用和自定义组件易于访问,它本质上是一组用来拓展 HTML 的属性集,以便我们能够更好的描述角色,状态和属性,就像我们刚才设计的元素是是它试图传递的原生元素一样。使用这些属性非常简单,所以让我们来试试看。
-
role
属性ARIA 使用的关键属性是
+role
属性。role
属性接受一个值,该值定义了一个元素的用途。每一个 role 定义了它自己的需求和行为。在我们的例子中,我们会使用listbox
这一 role。这是一个 "合成角色",表示具有该role的元素应该有子元素,每个子元素都有特定的角色。(在这个案例中,至少有一个具有option
角色的子元素)。ARIA 使用的关键属性是
-role
属性。role
属性接受一个值,该值定义了一个元素的用途。每一个 role 定义了它自己的需求和行为。在我们的例子中,我们会使用listbox
这一 role。这是一个 "合成角色",表示具有该 role 的元素应该有子元素,每个子元素都有特定的角色。(在这个案例中,至少有一个具有option
角色的子元素)。同样值得注意的是,ARIA定义了默认应用于标准 HTML 标记的角色。例如,{{HTMLElement("table")}} 元素与角色
+grid
相匹配,而 {{HTMLElement("ul")}} 元素与角色list
相匹配。由于我们使用了一个 {{HTMLElement("ul")}} 元素,我们想要确保我们组件的listbox
角色能替代 {{HTMLElement("ul")}} 元素的list
角色。为此,我们会使用角色presentation
。这个角色被设计成让我们来表示一个元素没有特殊的含义,并且仅仅用于提供信息。我们会将其应用到{{HTMLElement("ul")}} 元素上。同样值得注意的是,ARIA 定义了默认应用于标准 HTML 标记的角色。例如,{{HTMLElement("table")}} 元素与角色
grid
相匹配,而 {{HTMLElement("ul")}} 元素与角色list
相匹配。由于我们使用了一个 {{HTMLElement("ul")}} 元素,我们想要确保我们组件的listbox
角色能替代 {{HTMLElement("ul")}} 元素的list
角色。为此,我们会使用角色presentation
。这个角色被设计成让我们来表示一个元素没有特殊的含义,并且仅仅用于提供信息。我们会将其应用到{{HTMLElement("ul")}} 元素上。为了支持
-listbox
角色,我们只需要将我们 HTML 改成这样:<!-- 我们把role="listbox" 属性添加到我们的顶部元素 --> +<!-- 我们把 role="listbox" 属性添加到我们的顶部元素 --> <div class="select" role="listbox"> <span class="value">Cherry</span> - <!-- 我们也把 role="presentation" 添加到ul元素中 --> + <!-- 我们也把 role="presentation" 添加到 ul 元素中 --> <ul class="optList" role="presentation"> - <!-- 然后把role="option" 属性添加到所有li元素里 --> + <!-- 然后把 role="option" 属性添加到所有 li 元素里 --> <li role="option" class="option">Cherry</li> <li role="option" class="option">Lemon</li> <li role="option" class="option">Banana</li> @@ -745,7 +745,7 @@
aria-selected
属性总结
-我们已经了解了所有和构建一个自定义表单组件相关的基础知识,但是如你所见做这件事非常繁琐,并且通常情况下依赖第三方库,而不是自己从头写起会更容易 ,也更好(当然,除非你的目的就是构建一个这样的库)。
+我们已经了解了所有和构建一个自定义表单组件相关的基础知识,但是如你所见做这件事非常繁琐,并且通常情况下依赖第三方库,而不是自己从头写起会更容易 ,也更好 (当然,除非你的目的就是构建一个这样的库)。
这儿有一些库,在你编写自己的之前应该了解一下:
@@ -756,7 +756,7 @@总结
如果你想更进一步, 本例中的代码需要一些改进,才能变得更加通用和可重用。这是一个你可以尝试去做的练习。这里有两个提示可以帮到你:我们所有函数的第一个参数是相同的,这意味着这些函数需要相同的上下文。构建一个对象来共享那些上下文是更聪明的做法。还有,你需要让它的特性适用性更好;也就是说,它要能在一系列对Web标准的兼容性不同的浏览器上工作良好。祝愉快!
+如果你想更进一步,本例中的代码需要一些改进,才能变得更加通用和可重用。这是一个你可以尝试去做的练习。这里有两个提示可以帮到你:我们所有函数的第一个参数是相同的,这意味着这些函数需要相同的上下文。构建一个对象来共享那些上下文是更聪明的做法。还有,你需要让它的特性适用性更好;也就是说,它要能在一系列对 Web 标准的兼容性不同的浏览器上工作良好。祝愉快!
{{PreviousMenuNext("Learn/HTML/Forms/Form_validation", "Learn/HTML/Forms/Sending_forms_through_JavaScript", "Learn/HTML/Forms")}}
diff --git a/files/zh-cn/learn/forms/how_to_structure_a_web_form/index.html b/files/zh-cn/learn/forms/how_to_structure_a_web_form/index.html index 996ab2af93062c..195e209f1edb64 100644 --- a/files/zh-cn/learn/forms/how_to_structure_a_web_form/index.html +++ b/files/zh-cn/learn/forms/how_to_structure_a_web_form/index.html @@ -1,5 +1,5 @@ --- -title: 如何构造HTML表单 +title: 如何构造 HTML 表单 slug: Learn/Forms/How_to_structure_a_web_form translation_of: Learn/Forms/How_to_structure_a_web_form original_slug: Learn/HTML/Forms/How_to_structure_an_HTML_form @@ -13,39 +13,39 @@前提条件: | -基本的计算机能力, 和基本的 对HTML的理解。 | +前提条件: | +基本的计算机能力,和基本的 对 HTML 的理解。 |
---|---|---|---|
目标: | -要理解如何构造HTML表单并赋予它们语义,以便它们是可用的和可访问的。 | +目标: | +要理解如何构造 HTML 表单并赋予它们语义,以便它们是可用的和可访问的。 |
HTML表单的灵活性使它们成为HTML中最复杂的结构之一;您可以使用专用的表单元素和属性构建任何类型的基本表单。在构建HTML表单时使用正确的结构将有助于确保表单可用性和可访问性。
+HTML 表单的灵活性使它们成为 HTML 中最复杂的结构之一;您可以使用专用的表单元素和属性构建任何类型的基本表单。在构建 HTML 表单时使用正确的结构将有助于确保表单可用性和可访问性。
{{HTMLElement("form")}} 元素按照一定的格式定义了表单和确定表单行为的属性。当您想要创建一个HTML表单时,都必须从这个元素开始,然后把所有内容都放在里面。许多辅助技术或浏览器插件可以发现{{HTMLElement("form")}}元素并实现特殊的钩子,使它们更易于使用。
+{{HTMLElement("form")}} 元素按照一定的格式定义了表单和确定表单行为的属性。当您想要创建一个 HTML 表单时,都必须从这个元素开始,然后把所有内容都放在里面。许多辅助技术或浏览器插件可以发现{{HTMLElement("form")}}元素并实现特殊的钩子,使它们更易于使用。
我们早在之前的文章中就遇见过它了。
-请注意,在{{HTMLElement("form")}}元素之外使用表单小部件是可以的,但是如果您这样做了,那么表单小部件与任何表单都没有任何关系。这样的小部件可以在表单之外使用,但是您应该对于这些小部件有特别的计划,因为它们自己什么也不做。您将不得不使用JavaScript定制他们的行为。
+请注意,在{{HTMLElement("form")}}元素之外使用表单小部件是可以的,但是如果您这样做了,那么表单小部件与任何表单都没有任何关系。这样的小部件可以在表单之外使用,但是您应该对于这些小部件有特别的计划,因为它们自己什么也不做。您将不得不使用 JavaScript 定制他们的行为。
注意: HTML5在HTML表单元素中引入form
属性。它让您显式地将元素与表单绑定在一起,即使元素不在{{ HTMLElement("form") }}中。不幸的是,就目前而言,跨浏览器对这个特性的实现还不足以使用。
注意: HTML5 在 HTML 表单元素中引入form
属性。它让您显式地将元素与表单绑定在一起,即使元素不在{{ HTMLElement("form") }}中。不幸的是,就目前而言,跨浏览器对这个特性的实现还不足以使用。
{{HTMLElement("fieldset")}}元素是一种方便的用于创建具有相同目的的小部件组的方式,出于样式和语义目的。 你可以在<fieldset>
开口标签后加上一个 {{HTMLElement("legend")}}元素来给{{HTMLElement("fieldset")}} 标上标签。 {{HTMLElement("legend")}}的文本内容正式地描述了{{HTMLElement("fieldset")}}里所含有部件的用途。
许多辅助技术将使用{{HTMLElement("legend")}} 元素,就好像它是相应的 {{HTMLElement("fieldset")}} 元素里每个部件的标签的一部分。例如,在说出每个小部件的标签之前,像Jaws或NVDA这样的屏幕阅读器会朗读出legend的内容。
+许多辅助技术将使用{{HTMLElement("legend")}} 元素,就好像它是相应的 {{HTMLElement("fieldset")}} 元素里每个部件的标签的一部分。例如,在说出每个小部件的标签之前,像Jaws或NVDA这样的屏幕阅读器会朗读出 legend 的内容。
-这里有一个小例子:
+这里有一个小例子:
<form> <fieldset> @@ -71,17 +71,17 @@-<fieldset> 和 <legend
当阅读上述表格时,屏幕阅读器将会读第一个小部件“Fruit juice size small”,“Fruit juice size medium”为第二个,“Fruit juice size large”为第三个。
-本例中的用例是最重要的。每当您有一组单选按钮时,您应该将它们嵌套在{{HTMLElement("fieldset")}}元素中。还有其他用例,一般来说,{{HTMLElement("fieldset")}}元素也可以用来对表单进行分段。理想情况下,长表单应该在拆分为多个页面,但是如果表单很长,却必须在单个页面上,那么将以不同的关联关系划分的分段,分别放在不同的fieldset里,可以提高可用性。
+本例中的用例是最重要的。每当您有一组单选按钮时,您应该将它们嵌套在{{HTMLElement("fieldset")}}元素中。还有其他用例,一般来说,{{HTMLElement("fieldset")}}元素也可以用来对表单进行分段。理想情况下,长表单应该在拆分为多个页面,但是如果表单很长,却必须在单个页面上,那么将以不同的关联关系划分的分段,分别放在不同的 fieldset 里,可以提高可用性。
因为它对辅助技术的影响, {{HTMLElement("fieldset")}} 元素是构建可访问表单的关键元素之一。无论如何,你有责任不去滥用它。如果可能,每次构建表单时,尝试侦听屏幕阅读器如何解释它。如果听起来很奇怪,试着改进表单结构。
<label> 元素
-正如我们在前一篇文章中看到的, {{HTMLElement("label")}} 元素是为HTML表单小部件定义标签的正式方法。如果你想构建可访问的表单,这是最重要的元素——当实现的恰当时,屏幕阅读器会连同有关的说明和表单元素的标签一起朗读。以我们在上一篇文章中看到的例子为例:
+正如我们在前一篇文章中看到的, {{HTMLElement("label")}} 元素是为 HTML 表单小部件定义标签的正式方法。如果你想构建可访问的表单,这是最重要的元素——当实现的恰当时,屏幕阅读器会连同有关的说明和表单元素的标签一起朗读。以我们在上一篇文章中看到的例子为例:
<label for="name">Name:</label> <input type="text" id="name" name="user_name">-+
<label>
标签与<input>
通过他们各自的for
属性和id
属性正确相关联(label的for属性和它对应的小部件的id属性),这样,屏幕阅读器会读出诸如“Name, edit text”之类的东西。
<label>
标签与<input>
通过他们各自的for
属性和id
属性正确相关联(label 的 for 属性和它对应的小部件的 id 属性),这样,屏幕阅读器会读出诸如“Name, edit text”之类的东西。如果标签没有正确设置,屏幕阅读器只会读出“Edit text blank”之类的东西,这样会没什么帮助。
@@ -93,7 +93,7 @@<label> 元素
尽管可以这样做,但人们认为设置
-for
属性才是最好的做法,因为一些辅助技术不理解标签和小部件之间的隐式关系。标签也可点击!
+标签也可点击!
正确设置标签的另一个好处是可以在所有浏览器中单击标签来激活相应的小部件。这对于像文本输入这样的例子很有用,这样你可以通过点击标签,和点击输入区效果一样,来聚焦于它,这对于单选按钮和复选框尤其有用——这种控件的可点击区域可能非常小,设置标签来使它们可点击区域变大是非常有用的。
@@ -153,32 +153,32 @@多个标签
-注意:你可能会得到一些不同的结果,这取决于你的屏幕阅读器。这是在VoiceOver上测试的(NVDA的行为也类似)。我们也乐于听听你的试验结果。
+注意:你可能会得到一些不同的结果,这取决于你的屏幕阅读器。这是在 VoiceOver 上测试的(NVDA 的行为也类似)。我们也乐于听听你的试验结果。
--注意: 你可以在 GitHub 上看到 required-labels.html (你也可以看预览版)。不要运行2个或3个未注释版本的示例—— 如果您有多个标签和多个输入相同的ID,那么屏幕阅读器肯定会感到困惑!
+注意: 你可以在 GitHub 上看到 required-labels.html (你也可以看预览版)。不要运行 2 个或 3 个未注释版本的示例—— 如果您有多个标签和多个输入相同的 ID,那么屏幕阅读器肯定会感到困惑!
用于表单的通用HTML结构
+用于表单的通用 HTML 结构
-除了特定于HTML表单的结构之外,还应该记住表单同样是HTML。这意味着您可以使用HTML的所有强大功能来构造一个HTML表单。
+除了特定于 HTML 表单的结构之外,还应该记住表单同样是 HTML。这意味着您可以使用 HTML 的所有强大功能来构造一个 HTML 表单。
-正如您在示例中可以看到的,用{{HTMLElement("div")}}元素包装标签和它的小部件是很常见的做法。{{HTMLElement("p")}}元素也经常被使用,HTML列表也是如此(后者在构造多个复选框或单选按钮时最为常见)。
+正如您在示例中可以看到的,用{{HTMLElement("div")}}元素包装标签和它的小部件是很常见的做法。{{HTMLElement("p")}}元素也经常被使用,HTML 列表也是如此(后者在构造多个复选框或单选按钮时最为常见)。
-除了{{HTMLElement("fieldset")}}元素之外,使用HTML标题(例如,{{htmlelement("h1")}}、{{htmlelement("h2")}})和分段(如{{htmlelement("section")}})来构造一个复杂的表单也是一种常见的做法。
+除了{{HTMLElement("fieldset")}}元素之外,使用 HTML 标题(例如,{{htmlelement("h1")}}、{{htmlelement("h2")}})和分段(如{{htmlelement("section")}})来构造一个复杂的表单也是一种常见的做法。
最重要的是,你要找到一种你觉得很舒服的风格去码代码,而且它也能带来可访问的、可用的形式。
它包含了从功能上划分开并分别包含在{{htmlelement("section")}}元素中的部分,以及一个{{htmlelement("fieldset")}}来包含单选按钮。
-自主学习:构建一个表单结构
+自主学习:构建一个表单结构
让我们把这些想法付诸实践,建立一个稍微复杂一点的表单结构——一个支付表单。这个表单将包含许多您可能还不了解的小部件类型—现在不要担心这个;在下一篇文章(原生表单小部件)中,您将了解它们是如何工作的。现在,当您遵循下面的指令时,请仔细阅读这些描述,并开始理解我们使用的包装器元素是如何构造表单的,以及为什么这么做。
-
- 在开始之前,在计算机上的一个新目录中,创建一个空白模板文件和我们的支付表单的CSS样式的本地副本。
-- 首先,通过添加下面这行代码到你的HTML{{htmlelement("head")}}使你的HTML应用CSS。 +
- 在开始之前,在计算机上的一个新目录中,创建一个空白模板文件和我们的支付表单的 CSS 样式的本地副本。
+- 首先,通过添加下面这行代码到你的 HTML{{htmlelement("head")}}使你的 HTML 应用 CSS。
<link href="payment-form.css" rel="stylesheet">- 接下来,通过添加外部{{htmlelement("form")}}元素来开始一张表单: @@ -186,11 +186,11 @@
自主学习:构建一个表单结 </form>
<form>
标签内,以添加一个标题和段落开始,告诉用户必需的字段是如何标记的:
+ <form>
标签内,以添加一个标题和段落开始,告诉用户必需的字段是如何标记的:
<h1>Payment form</h1> <p>Required fields are followed by <strong><abbr title="required">*</abbr></strong>.</p>
<section> <h2>Contact information</h2> <fieldset> @@ -239,7 +239,7 @@自主学习:构建一个表单结 </p> </section>
<section>
——支付信息。在这里,我们有三个不同的小部件以及它们的标签,每个都包含在一个<p>
中。第一个是选择信用卡类型的下拉菜单({{htmlelement("select")}})。第二个是输入一个信用卡号的类型编号的 <input>
元素。最后一个是输入date
类型的<input>
元素,用来输入卡片的过期日期(这将在支持的浏览器中出现一个日期选择器小部件,并在非支持的浏览器中回退到普通的文本输入)。同样,在之前的代码后面输入以下内容:
+ <section>
——支付信息。在这里,我们有三个不同的小部件以及它们的标签,每个都包含在一个<p>
中。第一个是选择信用卡类型的下拉菜单 ({{htmlelement("select")}})。第二个是输入一个信用卡号的类型编号的 <input>
元素。最后一个是输入date
类型的<input>
元素,用来输入卡片的过期日期(这将在支持的浏览器中出现一个日期选择器小部件,并在非支持的浏览器中回退到普通的文本输入)。同样,在之前的代码后面输入以下内容:
<section> <h2>Payment information</h2> <p> @@ -269,18 +269,18 @@自主学习:构建一个表单结 </p> </section>
submit
类型的 {{htmlelement("button")}} ,用于提交表单数据。现在把这个添加到你的表单的底部:
+ submit
类型的 {{htmlelement("button")}} ,用于提交表单数据。现在把这个添加到你的表单的底部:
<p> <button type="submit">Validate the payment</button> </p>
您可以在下面看到已完成的表单 (你可以在Github上看到源码和预览版):
+您可以在下面看到已完成的表单 (你可以在 Github 上看到源码和预览版):
{{EmbedLiveSample("a_payment_form","100%",620, "", "Learn/Forms/How_to_structure_a_web_form/Example")}}
现在,您已经具备了正确地构造HTML表单所需的所有知识;下一篇文章将深入介绍各种不同类型的表单小部件,您将希望从用户那里收集信息。
+现在,您已经具备了正确地构造 HTML 表单所需的所有知识;下一篇文章将深入介绍各种不同类型的表单小部件,您将希望从用户那里收集信息。
所有 web 开发者很快就会(有时候是痛苦地)发现网络是一个令人不快的地方。我们碰到的最恶毒的诅咒是旧式浏览器。好吧,让我们承认吧,当我们提到 “旧式浏览器” 时,脑海中出现就是 老版本的 Internet Explorer ……但是,这远远不是全部。只发布一年的 Firefox 比如 the ESR version 也是旧式浏览器。那么,在移动世界呢?当浏览器和 OS(操作系统) 都不能更新时?是的,有非常多老版本的 Android 手机或 iPhone 没有更新到最新的浏览器。它们同样是旧式浏览器。
+所有 web 开发者很快就会(有时候是痛苦地)发现网络是一个令人不快的地方。我们碰到的最恶毒的诅咒是旧式浏览器。好吧,让我们承认吧,当我们提到“旧式浏览器”时,脑海中出现就是 老版本的 Internet Explorer ……但是,这远远不是全部。只发布一年的 Firefox 比如 the ESR version 也是旧式浏览器。那么,在移动世界呢?当浏览器和 OS(操作系统)都不能更新时?是的,有非常多老版本的 Android 手机或 iPhone 没有更新到最新的浏览器。它们同样是旧式浏览器。
-可悲的是,处理这些传统浏览器的问题是工作的一部分。幸运的是,有一些技巧可以帮助您解决旧式浏览器导致的大约80%的问题。
+可悲的是,处理这些传统浏览器的问题是工作的一部分。幸运的是,有一些技巧可以帮助您解决旧式浏览器导致的大约 80%的问题。
实际上,最重要的事情是阅读那些浏览器的文档,并尝试理解通用的(解决)模式。例如,在许多情况下,HTML表单是否支持CSS是最大的问题。这是正确的开始,只需要检查你想用的元素或接口是否支持CSS即可。MDN有一个关于包含HTML中可用的元素、属性或API的兼容表单可查。 此外,仍有其他一些非常有用的资源:
+实际上,最重要的事情是阅读那些浏览器的文档,并尝试理解通用的(解决)模式。例如,在许多情况下,HTML 表单是否支持 CSS 是最大的问题。这是正确的开始,只需要检查你想用的元素或接口是否支持 CSS 即可。MDN 有一个关于包含 HTML 中可用的元素、属性或 API 的兼容表单可查。 此外,仍有其他一些非常有用的资源:
由于HTML forms 包含复杂的交互,所以有一条法则: keep it as simple as possible。很多时候,我们想让表单更美观或想使用更高级的技术,然而,构建高效的HTML表单不只是设计和技术问题。记得花时间读一下这篇文章t forms usability on UX For The Masses.
+由于HTML forms 包含复杂的交互,所以有一条法则:keep it as simple as possible。很多时候,我们想让表单更美观或想使用更高级的技术,然而,构建高效的 HTML 表单不只是设计和技术问题。记得花时间读一下这篇文章 t forms usability on UX For The Masses.
-Graceful degradation and progressive enhancement 是一个开发模式,它允许你通过同时支持多种浏览器来构建优秀内容。当你为现代浏览器构建内容时,你想确保它能在旧式浏览器中以某种方式工作,这就是优雅地降级(graceful degradation).
-让我们看一些关于HTML表单的例子:
+让我们看一些关于 HTML 表单的例子:
HTML5引入的新input类型十分酷,因为他们的降级(degrade)是高度可预测的。如果一个浏览器不能理解 {{HTMLElement("input")}}元素的 {{htmlattrxref("type","input")}} 属性, 它将会后退到text
一样的行为。
HTML5 引入的新 input 类型十分酷,因为他们的降级 (degrade) 是高度可预测的。如果一个浏览器不能理解 {{HTMLElement("input")}}元素的 {{htmlattrxref("type","input")}} 属性,它将会后退到text
一样的行为。
<label for="myColor"> Pick a color @@ -73,7 +73,7 @@-HTML input 类型
CSS 属性选择器
-CSS属性选择器 在 HTML Forms 中十分有用,然而旧式浏览器不支持. 在那种情形下,一般会习惯性使用等价的class:
+CSS 属性选择器 在 HTML Forms 中十分有用,然而旧式浏览器不支持。在那种情形下,一般会习惯性使用等价的 class:
<input type="number" class="number">@@ -85,7 +85,7 @@CSS 属性选择器
/* 可以在任何浏览器中执行 */ }
注意下面的写法没有用(由于它是重复的),在某些浏览器中会失败:
+注意下面的写法没有用(由于它是重复的),在某些浏览器中会失败:
input[type=number], input.number { @@ -94,19 +94,19 @@CSS 属性选择器
表单按钮
-有两种定义HTML表单按钮的方式:
+有两种定义 HTML 表单按钮的方式:
button
, submit
, reset
or image
如果你想通过元素选择器在按钮上应用CSS的话,采用 {{HTMLElement("input")}} 元素的方式会让事情变得稍微有点复杂:
+如果你想通过元素选择器在按钮上应用 CSS 的话,采用 {{HTMLElement("input")}} 元素的方式会让事情变得稍微有点复杂:
<input type="button" class="button" value="click me">
input { - /* 此规则关闭了input元素定义的按钮的默认渲染样式 */ + /* 此规则关闭了 input 元素定义的按钮的默认渲染样式 */ border: 1px solid #CCC; } @@ -116,15 +116,15 @@-表单按钮
} input.button { - /* 这条也不会(恢复)! 实际上在浏览器中没有标准方式实现这一目标 */ + /* 这条也不会 (恢复)! 实际上在浏览器中没有标准方式实现这一目标 */ border: auto; }
{{HTMLElement("button")}} 元素有两个问题令人困扰:
+{{HTMLElement("button")}} 元素有两个问题令人困扰:
submit
作为 {{htmlattrxref("type","button")}} 属性的默认值, 所以建议总是在{{HTMLElement("button")}} 元素上设置设置 {{htmlattrxref("type","button")}} 属性.submit
作为 {{htmlattrxref("type","button")}} 属性的默认值,所以建议总是在{{HTMLElement("button")}} 元素上设置设置 {{htmlattrxref("type","button")}} 属性。<!-- 某些情形下,点击按钮将发送 "<em>Do A</em>" 而不是值"A" --> @@ -134,41 +134,41 @@表单按钮
给予你的工程限制来选择上述任一种解决方案。
-让我们过一遍CSS
+让我们过一遍 CSS
-HTML表单和旧式浏览器最大的问题是CSS的兼容性。正如你可以从这篇文章 Property compatibility table for form widgets 中看到的复杂性, 它非常的困难。即使仍然可以对文本元素(如大小、字体颜色等)进行一些调整,但那样做会有副作用。最好的办法还是不要美化HTML表单小组件。但你仍然可以将样式应用到表单周围的项目上。如果你是一个专业人士,并且你的客户需要那么做,在这种情况下,你可以研究一些硬技能,如 rebuilding widgets with JavaScript。但在那种情况下,最好还是毫不犹豫的让客户收回这些愚蠢的决定。
+HTML 表单和旧式浏览器最大的问题是 CSS 的兼容性。正如你可以从这篇文章 Property compatibility table for form widgets 中看到的复杂性,它非常的困难。即使仍然可以对文本元素(如大小、字体颜色等)进行一些调整,但那样做会有副作用。最好的办法还是不要美化 HTML 表单小组件。但你仍然可以将样式应用到表单周围的项目上。如果你是一个专业人士,并且你的客户需要那么做,在这种情况下,你可以研究一些硬技能,如 rebuilding widgets with JavaScript。但在那种情况下,最好还是毫不犹豫的让客户收回这些愚蠢的决定。
-功能检测和模拟(polyfills)
+功能检测和模拟 (polyfills)
-尽管JavaScript在现代浏览中是非常棒的技术,但在旧式浏览器中可能存在很多的问题。
+尽管 JavaScript 在现代浏览中是非常棒的技术,但在旧式浏览器中可能存在很多的问题。
Unobtrusive JavaScript
-API的兼容性是最大的问题。由于这个原因,与"不引人注意的(unobtrusive)" JavaScript一起工作被认为是最佳实践(译者注:此处意思是说没有/忽略JS或JS出了问题也能工作)。这个开发模式定义了两个需求:
+API 的兼容性是最大的问题。由于这个原因,与"不引人注意的(unobtrusive)" JavaScript 一起工作被认为是最佳实践(译者注:此处意思是说没有/忽略 JS 或 JS 出了问题也能工作)。这个开发模式定义了两个需求:
The principles of unobtrusive JavaScript (最早是由Peter-Paul Koch为 Dev.Opera.com 所撰写,现在已转移到 Docs.WebPlatform.org) 同样阐述了上述观点。
+The principles of unobtrusive JavaScript (最早是由 Peter-Paul Koch 为 Dev.Opera.com 所撰写,现在已转移到 Docs.WebPlatform.org) 同样阐述了上述观点。
有很多情形,好的"polyfill"能通过提供缺少的API以提供帮助。一个 polyfill 是一些JavaScript(脚本) 用于填补旧式浏览器中的功能缺失。虽然它们可以用来改进对任何功能的支持,并且使用它们Nederland风险小于CSS和HTML,然而,JS仍然会在很多情况下不工作(网络问题,脚本冲突等)。但是对于JavaScript,如果你总是记住和unobetructive的Javascript一起工作,不适用polyfill也没什么大不了。
+有很多情形,好的"polyfill"能通过提供缺少的 API 以提供帮助。一个 polyfill 是一些 JavaScript(脚本) 用于填补旧式浏览器中的功能缺失。虽然它们可以用来改进对任何功能的支持,并且使用它们 Nederland 风险小于 CSS 和 HTML,然而,JS 仍然会在很多情况下不工作(网络问题,脚本冲突等)。但是对于 JavaScript,如果你总是记住和 unobetructive 的 Javascript 一起工作,不适用 polyfill 也没什么大不了。
-最好的polyfill缺失API的方式是使用Modernizr 库以及它的子项目 YepNope. Modernizr 库允许您测试功能可用性,以便采取相应的行动。YepNope 是一个条件加载库。
+最好的 polyfill 缺失 API 的方式是使用Modernizr 库以及它的子项目 YepNope. Modernizr 库允许您测试功能可用性,以便采取相应的行动。YepNope 是一个条件加载库。
-下面是一个例子:
+下面是一个例子:
Modernizr.load({ - // 这会测试您的浏览器是否支持HTML5表单验证API + // 这会测试您的浏览器是否支持 HTML5 表单验证 API test : Modernizr.formvalidation, - // 如果浏览器不支持它,则会加载以下polyfill + // 如果浏览器不支持它,则会加载以下 polyfill nope : form-validation-API-polyfill.js, - // 无论如何,你的核心App文件依赖于该API被加载 + // 无论如何,你的核心 App 文件依赖于该 API 被加载 both : app.js, // 一旦加载了这两个文件,就会调用该函数来初始化应用程序 @@ -180,12 +180,12 @@Modernizr 库
Modernizr 团队按照惯例维护着a list of great polyfills。仅仅按需使用即可。
-Note: Modernizr还有其他很棒的功能可以帮助您处理unobstructive的JavaScript和优雅的降级技术。请阅读 Modernizr documentation.
+Note: Modernizr 还有其他很棒的功能可以帮助您处理 unobstructive 的 JavaScript 和优雅的降级技术。请阅读 Modernizr documentation.
注意性能
-尽管像Modernizr这样的脚本对性能非常敏感,但加载200千字节的polyfill仍然会影响程序的性能。这对旧式浏览器来说尤其重要,这些浏览器有处理速度非常慢的JavaScript引擎,让polyfills的执行对于用户来说变得很痛苦。性能本身就是一个主题,但旧式浏览器对它非常敏感:基本上,它们速度慢,需要的poliyfill越多,它们需要处理的JavaScript越多。与现代浏览器相比,它们承受双重负担。使用旧版浏览器测试你的代码,了解它们的实际表现。有时,放弃某些功能会带来更好的用户体验,而不是在所有浏览器中具有完全相同的功能。作为最后提醒,总是优先考虑用户。
+尽管像 Modernizr 这样的脚本对性能非常敏感,但加载 200 千字节的 polyfill 仍然会影响程序的性能。这对旧式浏览器来说尤其重要,这些浏览器有处理速度非常慢的 JavaScript 引擎,让 polyfills 的执行对于用户来说变得很痛苦。性能本身就是一个主题,但旧式浏览器对它非常敏感:基本上,它们速度慢,需要的 poliyfill 越多,它们需要处理的 JavaScript 越多。与现代浏览器相比,它们承受双重负担。使用旧版浏览器测试你的代码,了解它们的实际表现。有时,放弃某些功能会带来更好的用户体验,而不是在所有浏览器中具有完全相同的功能。作为最后提醒,总是优先考虑用户。
总结
@@ -207,7 +207,7 @@In this module
-webkit-appearance:none
才能将这个属性应用到搜索域上。background:none
已应用。background:none
已应用。-webkit-appearance:none
才能将这个属性应用到搜索域上。background:none
已应用。background:none
已应用。{{LearnSidebar}}{{PreviousMenuNext("Learn/HTML/Forms/The_native_form_widgets", "Learn/HTML/Forms/Form_validation", "Learn/HTML/Forms")}}
-本文将讨论当用户提交表单时发生了什么——数据去了哪,以及当它到达时该如何处理?我们还研究了与发送表单数据相关的一些安全问题。
+本文将讨论当用户提交表单时发生了什么——数据去了哪,以及当它到达时该如何处理?我们还研究了与发送表单数据相关的一些安全问题。
预备知识: | - + | |||||||
---|---|---|---|---|---|---|---|---|
预备知识: |
- 基本计算机素养和对HTML的基本理解。 +基本计算机素养和对 HTML 的基本理解。 |
|
---|---|---|
目标: | -为了熟悉HTML表单是什么,它们被用来做什么,如何设计它们,以及简单情况下需要的基本HTML元素。 | +为了熟悉 HTML 表单是什么,它们被用来做什么,如何设计它们,以及简单情况下需要的基本 HTML 元素。 |
HTML表单是用户和web站点或应用程序之间交互的主要内容之一。它们允许用户将数据发送到web站点。大多数情况下,数据被发送到web服务器,但是web页面也可以自己拦截它并使用它。
+HTML 表单是用户和 web 站点或应用程序之间交互的主要内容之一。它们允许用户将数据发送到 web 站点。大多数情况下,数据被发送到 web 服务器,但是 web 页面也可以自己拦截它并使用它。
-HTML表单是由一个或多个小部件组成的。这些小部件可以是文本字段(单行或多行)、选择框、按钮、复选框或单选按钮。大多数情况下,这些小部件与描述其目的的标签配对——正确实现的标签能够清楚地指示视力正常的用户和盲人用户输入表单所需的内容。
+HTML 表单是由一个或多个小部件组成的。这些小部件可以是文本字段 (单行或多行)、选择框、按钮、复选框或单选按钮。大多数情况下,这些小部件与描述其目的的标签配对——正确实现的标签能够清楚地指示视力正常的用户和盲人用户输入表单所需的内容。
-HTML表单和常规HTML文档的主要区别在于,大多数情况下,表单收集的数据被发送到web服务器。在这种情况下,您需要设置一个web服务器来接收和处理数据。如何设置这样的服务器超出了本文的范围,但是如果您想了解更多,请参阅模块后面的发送表单数据。
+HTML 表单和常规 HTML 文档的主要区别在于,大多数情况下,表单收集的数据被发送到 web 服务器。在这种情况下,您需要设置一个 web 服务器来接收和处理数据。如何设置这样的服务器超出了本文的范围,但是如果您想了解更多,请参阅模块后面的发送表单数据。
在开始编写代码之前,最好先退一步,花点时间考虑一下您的表单。设计一个快速的模型将帮助您定义您想要询问用户的正确的数据集。从用户体验(UX)的角度来看,要记住:表单越大,失去用户的风险就越大。保持简单,保持专注:只要求必要的数据。在构建站点或应用程序时,设计表单是非常重要的一步。这超出了本文的范围,涵盖了表单的用户体验,但是如果您想深入了解这个主题,您应该阅读下面的文章:
+在开始编写代码之前,最好先退一步,花点时间考虑一下您的表单。设计一个快速的模型将帮助您定义您想要询问用户的正确的数据集。从用户体验 (UX) 的角度来看,要记住:表单越大,失去用户的风险就越大。保持简单,保持专注:只要求必要的数据。在构建站点或应用程序时,设计表单是非常重要的一步。这超出了本文的范围,涵盖了表单的用户体验,但是如果您想深入了解这个主题,您应该阅读下面的文章:
我们的表单将包含三个文本字段和一个按钮。我们向用户询问他们的姓名、电子邮件和他们想要发送的信息。点击这个按钮将把他们的数据发送到一个web服务器。
+我们的表单将包含三个文本字段和一个按钮。我们向用户询问他们的姓名、电子邮件和他们想要发送的信息。点击这个按钮将把他们的数据发送到一个 web 服务器。
-好了,现在我们准备进入HTML代码并对表单进行编码。为了构建我们的联系人表单,我们将使用以下HTML元素:{{HTMLElement("form")}}, {{HTMLElement("label")}}, {{HTMLElement("input")}}, {{HTMLElement("textarea")}}, and {{HTMLElement("button")}}.
+好了,现在我们准备进入 HTML 代码并对表单进行编码。为了构建我们的联系人表单,我们将使用以下 HTML 元素:{{HTMLElement("form")}}, {{HTMLElement("label")}}, {{HTMLElement("input")}}, {{HTMLElement("textarea")}}, and {{HTMLElement("button")}}.
-在进一步讨论之前,先创建一个简单HTML模板的本地副本—您将在这里输入您的表单HTML。
+在进一步讨论之前,先创建一个简单 HTML 模板的本地副本—您将在这里输入您的表单 HTML。
所有HTML表单都以一个{{HTMLElement("form")}}元素开始:
+所有 HTML 表单都以一个{{HTMLElement("form")}}元素开始:
<form action="/my-handling-form-page" method="post"> @@ -63,21 +63,21 @@{{HTMLElement("form")}} 元素
这个元素正式定义了一个表单。就像{{HTMLElement("div")}}元素或{{HTMLElement("p")}}元素,它是一个容器元素,但它也支持一些特定的属性来配置表单的行为方式。它的所有属性都是可选的,但实践中最好至少要设置
action
属性和method
属性。
action
属性定义了在提交表单时,应该把所收集的数据送给谁(/那个模块)(URL)去处理。.method
属性定义了发送数据的HTTP方法(它可以是“get”或“post”).action
属性定义了在提交表单时,应该把所收集的数据送给谁 (/那个模块)(URL) 去处理。.method
属性定义了发送数据的 HTTP 方法 (它可以是“get”或“post”).现在,将上面的{{htmlelement("form")}} 元素添加到您的HTML主体中
+现在,将上面的{{htmlelement("form")}} 元素添加到您的 HTML 主体中
我们的联系人表单非常简单,包含三个文本字段,每个字段都有一个标签。该名称的输入字段将是一个基本的单行文本字段,电子邮件的输入字段将是一个只接受电子邮件地址的单行文本字段,而消息的输入字段将是一个基本的多行文本字段。
-就HTML代码而言,我们需要如下的东西来实现这些表单小部件:
+就 HTML 代码而言,我们需要如下的东西来实现这些表单小部件:
<form action="/my-handling-form-page" method="post">
<div>
@@ -96,7 +96,7 @@ {{HTML
更新您的表单代码,使其看起来像上面的代码。
-使用{{HTMLElement("div")}} 元素可以使我们更加方便地构造我们自己的代码,并且更容易样式化(参见本文后面的文章)。注意在所有{{HTMLElement("label")}}元素上使用for
属性;它是将标签链接到表单小部件的一种正规方式。这个属性引用对应的小部件的id
。这样做有一些好处。最明显的一个好处是允许用户单击标签以激活相应的小部件。如果您想更好地理解这个属性的其他好处,您可以找到如何构造HTML表单的详细信息。
+使用{{HTMLElement("div")}} 元素可以使我们更加方便地构造我们自己的代码,并且更容易样式化 (参见本文后面的文章)。注意在所有{{HTMLElement("label")}}元素上使用for
属性;它是将标签链接到表单小部件的一种正规方式。这个属性引用对应的小部件的id
。这样做有一些好处。最明显的一个好处是允许用户单击标签以激活相应的小部件。如果您想更好地理解这个属性的其他好处,您可以找到如何构造 HTML 表单的详细信息。
在 {{HTMLElement("input")}}元素中,最重要的属性是type
属性。这个属性非常重要,因为它定义了{{HTMLElement("input")}}属性的行为方式。它可以从根本上改变元素,所以要注意它。稍后您将在原生表单控件文章中找到更多关于此的内容。
@@ -105,11 +105,11 @@ {{HTML
- 对于第二个输入,我们使用值
email
,它定义了一个只接受格式正确的电子邮件地址的单行文本字段。这会将一个基本的文本字段转换为一种“智能”字段,该字段将对用户输入的数据进行一些检查。在稍后的表单数据验证文章中,您将了解到更多关于表单验证的信息。
-最后但同样重要的是,要注意<input>
和 <textarea></textarea>
的语法。这是HTML的一个奇怪之处。 <input>
标签是一个空元素,这意味着它不需要关闭标签。相反, {{HTMLElement("textarea")}}不是一个空元素,因此必须使用适当的结束标记来关闭它。这对HTML表单的特定特性有影响:定义默认值的方式。要定义{{HTMLElement("input")}}的默认值,你必须使用value
属性,如下所示:
+最后但同样重要的是,要注意<input>
和 <textarea></textarea>
的语法。这是 HTML 的一个奇怪之处。 <input>
标签是一个空元素,这意味着它不需要关闭标签。相反, {{HTMLElement("textarea")}}不是一个空元素,因此必须使用适当的结束标记来关闭它。这对 HTML 表单的特定特性有影响:定义默认值的方式。要定义{{HTMLElement("input")}}的默认值,你必须使用value
属性,如下所示:
<input type="text" value="by default this element is filled with this text" />
-相反,如果您想定义{{HTMLElement("textarea")}}的默认值,您只需在{{HTMLElement("textarea")}}元素的开始和结束标记之间放置默认值,就像这样:
+相反,如果您想定义{{HTMLElement("textarea")}}的默认值,您只需在{{HTMLElement("textarea")}}元素的开始和结束标记之间放置默认值,就像这样:
<textarea>by default this element is filled with this text</textarea>
@@ -125,35 +125,35 @@ {{HTMLelement("button")}} 元素
您会看到{{htmlelement("button")}}元素也接受一个 type
属性,它接受submit
, reset
或者 button
三个值中的任一个。
- - 单击
type
属性定义为 submit
值(也是默认值)的按钮会发送表单的数据到{{HTMLElement("form")}}元素的action
属性所定义的网页。
+ - 单击
type
属性定义为 submit
值 (也是默认值) 的按钮会发送表单的数据到{{HTMLElement("form")}}元素的action
属性所定义的网页。
- 单击
type
属性定义为 reset
值的按钮 将所有表单小部件重新设置为它们的默认值。从用户体验的角度来看,这被认为是一种糟糕的做法。
- - 单击
type
属性定义为 button
值的按钮……不会发生任何事!这听起来很傻,但是用JavaScript构建定制按钮非常有用。
+ - 单击
type
属性定义为 button
值的按钮……不会发生任何事!这听起来很傻,但是用 JavaScript 构建定制按钮非常有用。
-注意:您还可以使用相应类型的 {{HTMLElement("input")}}元素来生成一个按钮,如 <input type="submit">
。{{htmlelement("button")}}元素的主要优点是, {{HTMLElement("input")}}元素只允许纯文本作为其标签,而{{htmlelement("button")}}元素允许完整的HTML内容,允许更复杂、更有创意的按钮文本。
+注意:您还可以使用相应类型的 {{HTMLElement("input")}}元素来生成一个按钮,如 <input type="submit">
。{{htmlelement("button")}}元素的主要优点是, {{HTMLElement("input")}}元素只允许纯文本作为其标签,而{{htmlelement("button")}}元素允许完整的 HTML 内容,允许更复杂、更有创意的按钮文本。
基本表单样式
-现在您已经完成了表单的HTML代码,尝试保存它并在浏览器中查看它。
+
现在您已经完成了表单的 HTML 代码,尝试保存它并在浏览器中查看它。
现在,你会看到它看起来很丑。
-注意: 如果你怀疑你的HTML代码不对,试着把它和我们完成的例子进行比较 —— first-form.html (你也可以观看预览版)。
+注意: 如果你怀疑你的 HTML 代码不对,试着把它和我们完成的例子进行比较 —— first-form.html (你也可以观看预览版)。
-如何排布好表单是公认的难点。这超出了本文的讨论范围,所以现在我们只需要让您添加一些CSS来让它看起来很好。
+如何排布好表单是公认的难点。这超出了本文的讨论范围,所以现在我们只需要让您添加一些 CSS 来让它看起来很好。
-首先,在您的HTML头部中添加一个 {{htmlelement("style")}}元素。应该是这样的:
+首先,在您的 HTML 头部中添加一个 {{htmlelement("style")}}元素。应该是这样的:
<style>
</style>
-在样式标签中,添加如下的CSS,如下所示:
+在样式标签中,添加如下的 CSS,如下所示:
form {
/* 居中表单 */
@@ -176,7 +176,7 @@ 基本表单样式
}
label {
- /* 确保所有label大小相同并正确对齐 */
+ /* 确保所有 label 大小相同并正确对齐 */
display: inline-block;
width: 90px;
text-align: right;
@@ -184,7 +184,7 @@ 基本表单样式
input, textarea {
/* 确保所有文本输入框字体相同
- textarea默认是等宽字体 */
+ textarea 默认是等宽字体 */
font: 1em sans-serif;
/* 使所有文本输入框大小相同 */
@@ -201,7 +201,7 @@ 基本表单样式
}
textarea {
- /* 使多行文本输入框和它们的label正确对齐 */
+ /* 使多行文本输入框和它们的 label 正确对齐 */
vertical-align: top;
/* 给文本留下足够的空间 */
@@ -210,11 +210,11 @@ 基本表单样式
.button {
/* 把按钮放到和文本输入框一样的位置 */
- padding-left: 90px; /* 和label的大小一样 */
+ padding-left: 90px; /* 和 label 的大小一样 */
}
button {
- /* 这个外边距的大小与label和文本输入框之间的间距差不多 */
+ /* 这个外边距的大小与 label 和文本输入框之间的间距差不多 */
margin-left: .5em;
}
@@ -223,18 +223,18 @@ 基本表单样式
-注意: 你可以在GitHub上的这里找到它 first-form-styled.html (也可以在这儿看运行结果).
+注意: 你可以在 GitHub 上的这里找到它 first-form-styled.html (也可以在这儿看运行结果).
-向您的web服务器发送表单数据
+向您的 web 服务器发送表单数据
-最后一部分,也许是最棘手的部分,是在服务器端处理表单数据。如前所述,大多数时候HTML表单是向用户请求数据并将其发送到web服务器的一种方便的方式。
+最后一部分,也许是最棘手的部分,是在服务器端处理表单数据。如前所述,大多数时候 HTML 表单是向用户请求数据并将其发送到 web 服务器的一种方便的方式。
{{HTMLelement("form")}} 元素将定义如何通过action
属性和 method
属性来发送数据的位置和方式。
但这还不够。我们还需要为我们的数据提供一个名称。这些名字对双方都很重要:在浏览器端,它告诉浏览器给数据各自哪个名称,在服务器端,它允许服务器按名称处理每个数据块。
-要将数据命名为表单,您需要在每个表单小部件上使用 name
属性来收集特定的数据块。让我们再来看看我们的表单代码:
+要将数据命名为表单,您需要在每个表单小部件上使用 name
属性来收集特定的数据块。让我们再来看看我们的表单代码:
<form action="/my-handling-form-page" method="post">
<div>
@@ -252,16 +252,16 @@ 向您的web服务器发送表
...
-在我们的例子中,表单会发送三个已命名的数据块 "user_name
", "user_email
", 和 "user_message
"。这些数据将用使用HTTP POST
方法,把信息发送到URL为 "/my-handling-form-page
"目录下。
+在我们的例子中,表单会发送三个已命名的数据块 "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等等)都有自己的机制。深入到这个主题已经超出了本指南的范围,但是如果您想了解更多,我们已经在发送表单数据文章中提供了一些示例。
+在服务器端,位于 URL"/my-handling-form-page
" 上的脚本将接收的数据作为HTTP请求中包含的3个键/值项的列表。这个脚本处理这些数据的方式取决于您。每个服务器端语言(PHP、Python、Ruby、Java、c等等)都有自己的机制。深入到这个主题已经超出了本指南的范围,但是如果您想了解更多,我们已经在发送表单数据文章中提供了一些示例。
总结
-祝贺您,您已经构建了您的第一个HTML表单。它看起来就像这样:
+祝贺您,您已经构建了您的第一个 HTML 表单。它看起来就像这样:
{{ EmbedLiveSample('A_simple_form', '100%', '240', '', 'Learn/HTML/Forms/Your_first_HTML_form/Example') }}
-然而,这仅仅是开始,现在是时候深入研究了。HTML表单比我们在这里看到的要强大得多,本指南的其他文章将帮助您掌握其余部分。
+然而,这仅仅是开始,现在是时候深入研究了。HTML 表单比我们在这里看到的要强大得多,本指南的其他文章将帮助您掌握其余部分。
{{NextMenu("Learn/HTML/Forms/How_to_structure_an_HTML_form", "Learn/HTML/Forms")}}
diff --git a/files/zh-cn/learn/front-end_web_developer/index.md b/files/zh-cn/learn/front-end_web_developer/index.md
index 2f5240e5637b15..e2b8469b2bd1c8 100644
--- a/files/zh-cn/learn/front-end_web_developer/index.md
+++ b/files/zh-cn/learn/front-end_web_developer/index.md
@@ -20,7 +20,7 @@ translation_of: Learn/Front-end_web_developer
## 涵盖的主题
-该路线图涵盖的主题大致范围如下:
+该路线图涵盖的主题大致范围如下:
- 基础准备以及如何学习
- Web 标准和最佳实践 (例如辅助功能和跨浏览器兼容)
@@ -49,13 +49,13 @@ translation_of: Learn/Front-end_web_developer
### 起步
-学习用时: 1–2 小时
+学习用时:1–2 小时
#### 预备知识
仅需基础的计算机知识。
-#### 我怎么知道自己是否可以继续往下学习了?
+#### 我怎么知道自己是否可以继续往下学习了?
本章节没有评估测试,但是请不要跳过它 — 这对于帮你准备好应对后面的练习和学习非常重要。
@@ -67,13 +67,13 @@ translation_of: Learn/Front-end_web_developer
### HTML 语义和结构
-学习用时: 35–50 小时
+学习用时:35–50 小时
#### 预备知识
基础的计算机知识和基本的 Web 开发环境。
-#### 我怎么知道自己是否可以继续往下学习了?
+#### 我怎么知道自己是否可以继续往下学习了?
每个模块的评估练习都是针对测试你主题相关知识掌握能力设计的,完成了每个练习就表示你可以继续往后学习下一个模块了。
@@ -85,13 +85,13 @@ translation_of: Learn/Front-end_web_developer
### 使用 CSS 布局和美化
-学习用时: 90–120 小时
+学习用时:90–120 小时
#### 预备知识
学习 CSS 前需要有基础的 HTML 知识,请至少学习完 [HTML 介绍](/zh-CN/docs/Learn/HTML/Introduction_to_HTML)再开始。
-#### 我怎么知道自己是否可以继续往下学习了?
+#### 我怎么知道自己是否可以继续往下学习了?
每个模块的评估练习都是针对测试你主题相关知识掌握能力设计的,完成了每个练习就表示你可以继续往后学习下一个模块了。
@@ -108,13 +108,13 @@ translation_of: Learn/Front-end_web_developer
### 使用 JavaScript 开发交互
-学习用时: 135–185 小时
+学习用时:135–185 小时
#### 预备知识
学习 JavaScript 前需要有基础的 HTML 知识,请至少学习完 [HTML 介绍](/zh-CN/docs/Learn/HTML/Introduction_to_HTML)再开始。
-#### 我怎么知道自己是否可以继续往下学习了?
+#### 我怎么知道自己是否可以继续往下学习了?
每个模块的评估练习都是针对测试你主题相关知识掌握能力设计的,完成了每个练习就表示你可以继续往后学习下一个模块了。
@@ -128,13 +128,13 @@ translation_of: Learn/Front-end_web_developer
### Web 表单 — 处理用户数据
-学习用时: 40–50 小时
+学习用时:40–50 小时
#### 预备知识
高效使用 Web 表单需要 HTML、CSS 和 JavaScript 知识。鉴于与表格打交道的复杂性,这一节被独立了出来。
-#### 我怎么知道自己是否可以继续往下学习了?
+#### 我怎么知道自己是否可以继续往下学习了?
每个模块的评估练习都是针对测试你主题相关知识掌握能力设计的,完成了每个练习就表示你可以继续往后学习下一个模块了。
@@ -144,13 +144,13 @@ translation_of: Learn/Front-end_web_developer
### 让所有人都能使用 Web
-学习用时: 45-55 小时
+学习用时:45-55 小时
#### 预备知识
学习本章前最好对 HTML、CSS 和 JavaScript 都有一定了解— 本章很多技术和最佳实践都需要用到它们。
-#### 我怎么知道自己是否可以继续往下学习了?
+#### 我怎么知道自己是否可以继续往下学习了?
每个模块的评估练习都是针对测试你主题相关知识掌握能力设计的,完成了每个练习就表示你可以继续往后学习下一个模块了。
@@ -161,13 +161,13 @@ translation_of: Learn/Front-end_web_developer
### 现代工具
-学习用时: 55–90 小时
+学习用时:55–90 小时
#### 预备知识
学习本章前最好对 HTML、CSS 和 JavaScript 都有一定了解— 本章很多技术和最佳实践都需要用到它们。
-#### 我怎么知道自己是否可以继续往下学习了?
+#### 我怎么知道自己是否可以继续往下学习了?
本章节各模块均没有评估测试,但是第 2 章和第 3 章的学习教程应该能够让你很好的掌握现代工具的要义。
diff --git a/files/zh-cn/learn/getting_started_with_the_web/css_basics/index.html b/files/zh-cn/learn/getting_started_with_the_web/css_basics/index.html
index 0f88c1fb9041df..97665460332a17 100644
--- a/files/zh-cn/learn/getting_started_with_the_web/css_basics/index.html
+++ b/files/zh-cn/learn/getting_started_with_the_web/css_basics/index.html
@@ -41,7 +41,7 @@ CSS 究竟什么来头?
“CSS 规则集”详解
-让我们来仔细看一看上述CSS:
+让我们来仔细看一看上述 CSS:
@@ -97,7 +97,7 @@ 不同类型的选择器
元素选择器(也称作标签或类型选择器)
- 所有指定(该)类型的 HTML 元素
+ 所有指定 (该) 类型的 HTML 元素
p
选择 <p>
@@ -148,7 +148,7 @@ 字体和文本
将下列代码添加到相应的位置,用你在 Google Fonts 找到的字体替代 font-family
中的占位行。( font-family
意味着你想要你的文本使用的字体。)这条规则首先为整个页面设定了一个全局字体和字号(因为 <html>
是整个页面的父元素,而且它所有的子元素都会继承相同的 font-size
和 font-family
):
html {
- /* px 表示 “像素(pixels)”: 基础字号为 10 像素 */
+ /* px 表示“像素(pixels)”: 基础字号为 10 像素 */
font-size: 10px;
/* Google fonts 输出的 CSS */
font-family: 'Open Sans', sans-serif;
@@ -233,7 +233,7 @@ 文档体格式设置
width: 600px;
—— 强制页面永远保持 600 像素宽。
margin: 0 auto;
—— 为 margin
或 padding
等属性设置两个值时,第一个值代表元素的上方和下方(在这个例子中设置为 0
),而第二个值代表左边和右边(在这里,auto
是一个特殊的值,意思是水平方向上左右对称)。你也可以使用一个,三个或四个值,参考 这里 。
background-color: #FF9500;
—— 如前文所述,指定元素的背景颜色。我们给 body 用了一种略微偏红的橘色以与深蓝色的 {{htmlelement("html")}} 元素形成反差,你也可以尝试其它颜色。
- padding: 0 20px 20px 20px;
—— 我们给内边距设置了四个值来让内容四周产生一点空间。这一次我们不设置上方的内边距,设置右边,下方,左边的内边距为20像素。值以上、右、下、左的顺序排列。
+ padding: 0 20px 20px 20px;
—— 我们给内边距设置了四个值来让内容四周产生一点空间。这一次我们不设置上方的内边距,设置右边,下方,左边的内边距为 20 像素。值以上、右、下、左的顺序排列。
border: 5px solid black;
—— 直接为 body 设置 5 像素的黑色实线边框。
@@ -288,7 +288,7 @@ 小结
若遇到问题,可以参考 GitHub 上的 完整示例代码 做对比。
-本章介绍的 CSS 知识非常有限,更多内容请访问 CSS学习页面。
+本章介绍的 CSS 知识非常有限,更多内容请访问 CSS 学习页面。
{{PreviousMenuNext("Learn/Getting_started_with_the_web/HTML_basics", "Learn/Getting_started_with_the_web/JavaScript_basics", "Learn/Getting_started_with_the_web")}}
diff --git a/files/zh-cn/learn/getting_started_with_the_web/dealing_with_files/index.md b/files/zh-cn/learn/getting_started_with_the_web/dealing_with_files/index.md
index 135d62d30b7a59..16eae59b032147 100644
--- a/files/zh-cn/learn/getting_started_with_the_web/dealing_with_files/index.md
+++ b/files/zh-cn/learn/getting_started_with_the_web/dealing_with_files/index.md
@@ -24,7 +24,7 @@ translation_of: Learn/Getting_started_with_the_web/Dealing_with_files
## 关于大小写和空格的提示
-你会注意到,在这篇文章中,我们要求你完全用小写字母命名文件夹和文件,没有空格. 这是因为:
+你会注意到,在这篇文章中,我们要求你完全用小写字母命名文件夹和文件,没有空格。这是因为:
1. 许多计算机,特别是网络服务器,是区分大小写的。因此,假如你把一张图片放在你的网站上 `test-site/MyImage.jpg`,然后在一个不同的文件中,你试图以 `test-site/myimage.jpg` 来调用该图片,它可能无法工作。
2. 浏览器、网络服务器和编程语言对空格的处理并不一致。例如,如果你在文件名中使用空格,一些系统可能将其视为两个文件名。一些服务器会用“%20”(URL 中空格的字符代码)替换文件名中的区域,导致所有链接被破坏。最好用连字符而不是下划线来分隔单词。对比 `my-file.html` 与 `my_file.html`。
@@ -35,10 +35,10 @@ translation_of: Learn/Getting_started_with_the_web/Dealing_with_files
接下来,让我们看看我们的测试网站应该是什么结构。在我们创建的任何网站项目中,最常见的是一个主页 HTML 文件和包含图像、样式文件和脚本文件的文件夹。现在让我们来创建这些:
-1. **`index.html`**: 这个文件一般会包含主页内容,也就是人们第一次进入网站时看到的文字和图片。使用文本编辑器,创建一个名为`index.html`的新文件,并将其保存在`test-site`文件夹内。
-2. **`images` 文件夹**: 这个文件夹包含网站上使用的所有图片。在 `test-site` 文件夹内创建一个名为 `images` 的文件夹。
-3. **`styles` 文件夹**: 这个文件夹包含用于设置内容样式的 CSS 代码(例如,设置文本和背景颜色)。在你的 `test-site` 文件夹内创建一个名为 `styles` 的文件夹。
-4. **`scripts` 文件夹**: 这个文件夹包含所有用于向网站添加交互功能的 JavaScript 代码(例如,点击时加载数据的按钮)。在 `test-site` 文件夹内创建一个名为 `scripts` 的文件夹。
+1. **`index.html`**:这个文件一般会包含主页内容,也就是人们第一次进入网站时看到的文字和图片。使用文本编辑器,创建一个名为`index.html`的新文件,并将其保存在`test-site`文件夹内。
+2. **`images` 文件夹**:这个文件夹包含网站上使用的所有图片。在 `test-site` 文件夹内创建一个名为 `images` 的文件夹。
+3. **`styles` 文件夹**:这个文件夹包含用于设置内容样式的 CSS 代码(例如,设置文本和背景颜色)。在你的 `test-site` 文件夹内创建一个名为 `styles` 的文件夹。
+4. **`scripts` 文件夹**:这个文件夹包含所有用于向网站添加交互功能的 JavaScript 代码(例如,点击时加载数据的按钮)。在 `test-site` 文件夹内创建一个名为 `scripts` 的文件夹。
> **备注:** 在 Windows 上你可能看不到文件扩展名,因为 Windows 有一个默认开启的**隐藏已知文件类型的扩展名**的选项。一般来说,你可以通过 Windows 资源管理器,选择**文件夹选项**选项,取消勾选**隐藏已知文件类型的扩展名**复选框,然后点击**确认**将其关闭。对于涉及你的 Windows 版本的更多具体信息,你可以在网上搜索。
@@ -62,7 +62,7 @@ translation_of: Learn/Getting_started_with_the_web/Dealing_with_files