Chinese translation of responsive-web-design (#40607)

This commit is contained in:
Xing Liu
2021-01-08 11:20:48 -08:00
committed by GitHub
parent 9770cd0f81
commit 05ba7c3482
193 changed files with 1266 additions and 1273 deletions

View File

@ -8,7 +8,7 @@ forumTopicId: 16627
# --description--
让我们来给表单添加一个`submit`提交按钮,当点击提交按钮时,表单中的数据将会被发送到`action`属性指定的 URL 上。
让我们来给表单添加一个 `submit`提交按钮点击提交按钮时,表单中的数据将会被发送到 `action` 属性指定的 URL 上。
例如:
@ -16,23 +16,23 @@ forumTopicId: 16627
# --instructions--
在表单底部创建一个`button`按钮,按钮的`type`属性值`submit`,文本为`提交`
在表单`form` 元素)底部创建一个 `button` 元素,将按钮的 `type` 属性值设置为 `submit`内容文本为 `提交`
# --hints--
表单内部应有一个按钮
表单内部应有一个 `button` 元素
```js
assert($('form').children('button').length > 0);
```
按钮的`type`属性值应`submit`
按钮的 `type` 属性值应为 `submit`
```js
assert($('button').attr('type') === 'submit');
```
提交按钮的文本应该为`提交`
提交按钮的文本应`Submit`
```js
assert(
@ -42,7 +42,7 @@ assert(
);
```
确保按钮有结束标
`button` 元素应有结束标
```js
assert(

View File

@ -8,51 +8,51 @@ forumTopicId: 16640
# --description--
`img`元素来为你的网站添加图片,其中`src`属性指向一个图片的地址。
你可以使用 `img` 元素来为你的网站添加图片,其中 `src` 属性指向图片的地址。
例如:
`<img src="https://www.freecatphotoapp.com/your-image.jpg">`
注意:`img`元素是没有结束标的。
注意:`img` 元素是没有结束标的。
所有的`img`元素必须有`alt`属性`alt`属性的文本是当图片无法加载时显示的替代文本,这对于通过屏幕阅读器来浏览网页的用户非常重要
所有的 `img` 元素**必须**有 `alt` 属性`alt` 的属性值有两个作用,第一个作用是让屏幕阅读器可以知晓图片的内容,这会对网页的可访问性有很大提升;另一个作用是当图片无法加载时,页面需要显示的替代文本。
注意:如果图片是纯装饰性的,用一个空的`alt`是最佳实践。
注意:如果图片是纯装饰性的,`alt` 的属性值设置为空是最佳实践。
理想情况下,`alt`属性不应该包含特殊字符,除非要。
理想情况下,`alt` 属性不应该包含特殊字符,除非有特殊需要。
让我们给上面例子的`img`添加`alt`属性。
让我们给上面例子的 `img` 添加 `alt` 属性。
`<img src="https://www.freecatphotoapp.com/your-image.jpg" alt="作者站在沙滩上竖起两个大拇指">`
`<img src="https://www.freecatphotoapp.com/your-image.jpg" alt="一只打着领带的商务猫">`
# --instructions--
让我们给网站添加图片:
`main`元素里,给`p`前面插入一个`img`元素
`main` 元素里,给 `p` 元素前面插入一个 `img` 元素
现在设置`src`属性指向这个地址
然后将 `src` 的属性值设置为这个 URL
`https://bit.ly/fcc-relaxing-cat`
最后不要忘记给图片添加一个`alt`文本
最后不要忘记给图片加上 `alt` 属性
# --hints--
网页应该有一张图片。
你的网页应该有一张图片。
```js
assert($('img').length);
```
`img` 应该有一个`src`属性,指向猫咪图片。
`img` 应该有一个 `src` 属性,其值为猫咪图片的 URL
```js
assert(/^https:\/\/bit\.ly\/fcc-relaxing-cat$/i.test($('img').attr('src')));
```
`img` 元素的`alt`属性值不应为空。
`img` 元素的 `alt` 属性值不应为空。
```js
assert(

View File

@ -8,25 +8,27 @@ forumTopicId: 16647
# --description--
`Placeholder`占位符是用户在`input`输入框中输入任何东西前的预定义文本。
`Placeholder` 占位符是用户在 `input` 输入框中输入任何东西前的预定义文本。
你可以像这样创建一个占位符:
`<input type="text" placeholder="this is placeholder text">`
**注意:**别忘了 `input` 元素是 "自闭和标签",即不需要结束标签。
# --instructions--
`input`输入框的`placeholder`占位符文本设置为 “猫咪图片地址”
`input` 输入框的 `placeholder` 占位符文本设置为 "cat photo URL"
# --hints--
给现有的`input`输入框添加一个`placeholder`属性。
给现有的 `input` 输入框添加一个 `placeholder` 属性。
```js
assert($('input[placeholder]').length > 0);
```
设置`placeholder`属性的值为 ”猫咪图片地址“
设置 `placeholder` 属性的值为 `cat photo URL`
```js
assert(
@ -34,17 +36,17 @@ assert(
$('input').attr('placeholder') &&
$('input')
.attr('placeholder')
.match(/猫咪图片地址/gi)
.match(/cat\s+photo\s+URL/gi)
);
```
完整的`input`元素应有一个结束标签
`input` 元素不该有结束标签
```js
assert(!code.match(/<input.*\/?>.*<\/input>/gi));
```
`input`输入框的语法必须正确。
`input` 输入框的语法必须正确。
```js
assert($('input[type=text]').length > 0);

View File

@ -8,23 +8,23 @@ forumTopicId: 301094
# --description--
如果想设置某个单选按钮或多选按钮默认被选中,只需给`input`元素添加 "checked" 属性。 例如:
如果想设置某个单选按钮或多选按钮默认被选中,只需给 `input` 元素添加 "checked" 属性。 例如:
`<input type="radio" name="test-name" checked>`
# --instructions--
把第一个`radio button`和第一个`checkbox`都设置为默认选中。
把第一个 `radio button` 和第一个 `checkbox` 都设置为默认选中。
# --hints--
表单的第一个单选按钮应被默认选中。
表单的第一个单选按钮应被默认选中。
```js
assert($('input[type="radio"]').prop('checked'));
```
表单的第一个多选按钮应被默认选中。
表单的第一个多选按钮应被默认选中。
```js
assert($('input[type="checkbox"]').prop('checked'));

View File

@ -8,41 +8,41 @@ forumTopicId: 16782
# --description--
记住:注释的开始标记是`<!--`,结束标记是`-->`
记住:注释的开始标记是 `<!--`,结束标记是 `-->`
现在你需要在`h2`元素前终止注释。
现在你需要在 `h2` 元素开始前终止注释。
# --instructions--
任务:注释掉`h1`元素和`p`元素,保留`h2`元素。
任务:注释掉 `h1` 元素和 `p` 元素,保留 `h2` 元素。
# --hints--
注释掉`h1`元素,这样它就从网页上消失了。
注释掉 `h1` 元素,这样它就从网页上消失了。
```js
assert($('h1').length === 0);
```
`h2`元素保持原样,这样网页上还能看到它。
`h2` 元素保持原样,这样网页上还能看到它。
```js
assert($('h2').length > 0);
```
注释掉`p`元素,这样它就从网页上消失了。
注释掉 `p` 元素,这样它就从网页上消失了。
```js
assert($('p').length === 0);
```
确保每一个注释都`-->`结尾。
每一个注释都应以 `-->` 结尾。
```js
assert(code.match(/[^fc]-->/g).length > 1);
```
不要更改`h1`元素、`h2` 元素、`p`元素的顺序。
不要更改 `h1` 元素、`h2` 元素、`p` 元素的顺序。
```js
assert(

View File

@ -8,9 +8,9 @@ forumTopicId: 16814
# --description--
HTML 有一个特定的元素用于创建无序列表`unordered lists缩写 ul`
HTML 有一个特定的元素用于创建<dfn>无序列表</dfn>
无序列表以`<ul>`开始,中间包含一个或多个`<li>`元素,最后以`</ul>`结尾
无序列表以 `<ul>` 开始,中间包含一个或多个 `<li>` 元素,最后以 `</ul>` 结束
例如:
@ -25,23 +25,23 @@ HTML 有一个特定的元素用于创建无序列表`unordered lists缩写 u
# --instructions--
删除页面底部的两个`p`元素,然后在底部创建一个无序列表,其中包含你认为猫咪最喜欢的三件东西。
删除页面底部的两个 `p` 元素,然后在底部创建一个无序列表,其中包含你认为猫咪最喜欢的三件东西。
# --hints--
创建一个`ul`无序列表。
应存在一个 `ul` 无序列表。
```js
assert($('ul').length > 0);
```
你应该在`ul`无序列表中添加三个`li`条目。
应在 `ul` 无序列表中添加三个 `li` 条目。
```js
assert($('ul li').length > 2);
```
确保`ul`无序列表有结束标
确保 `ul` 无序列表有结束标
```js
assert(
@ -51,7 +51,7 @@ assert(
);
```
确保每个`li`条目都有结束标
确保每个 `li` 条目都有结束标
```js
assert(
@ -61,7 +61,7 @@ assert(
);
```
每个`li`元素都应该有一个空字符串或空格。
每个 `li` 元素不应只包含空字符串或只包含空格。
```js
assert($('ul li').filter((_, item) => !$(item).text().trim()).length === 0);

View File

@ -8,7 +8,7 @@ forumTopicId: 16817
# --description--
如果想使用 HTML 向服务器提交数据,可以给`form`添加`action`属性。
我们可以只通过 HTML 来实现发送数据给服务器的表单,只需要给 `form` 元素添加 `action` 属性即可
例如:
@ -16,21 +16,21 @@ forumTopicId: 16817
# --instructions--
`input`输入框外层创建一个`form`表单,然后设置表单的`action`属性为`"https://freecatphotoapp.com/submit-cat-photo"`
把现有的 `input` 输入框放到一个新建的 `form` 表单,然后设置表单的 `action` 属性为 `"https://freecatphotoapp.com/submit-cat-photo"`
# --hints--
`input`输入框外层创建一个`form`表单。
现有的 `input` 输入框应位于新创建的 `form` 表单里面
```js
const inputElem = document.querySelector('form input');
assert(
$('form') &&
$('form').children('input') &&
$('form').children('input').length > 0
inputElem.getAttribute('type') === 'text' &&
inputElem.getAttribute('placeholder') === 'cat photo URL'
);
```
确保表单的`action`属性`"https://freecatphotoapp.com/submit-cat-photo"`
表单的 `action` 属性值应设置为 `https://freecatphotoapp.com/submit-cat-photo`
```js
assert(
@ -38,7 +38,7 @@ assert(
);
```
确保表单有开始标和结束标
`form` 元素应有开始标和结束标
```js
assert(

View File

@ -10,13 +10,13 @@ forumTopicId: 16821
`checkboxes`(复选框)就好比多项选择题,正确答案有多个。
复选框是`input`选择框的一种类型。
复选框是 `input` 选择框的一种类型。
每一个复选框都应该嵌套在它自己的`label`(标签)元素中。
每一个复选框都应该嵌套在它自己的 `label`(标签)元素中。这样,我们相当于给 `input` 元素和包裹它的 `label` 元素建立起了对应关系。
所有关联的复选框应该拥有相同的`name`属性。
所有关联的复选框应该拥有相同的 `name` 属性。
最佳实践是在`label`元素上设置`for`属性,让其值与复选框的`id`属性值相等,这样就在`label`元素和它的子元素复选框之间创建了一种链接关系。例如:
使得 `input``label` 关联的最佳实践是在 `label` 元素上设置 `for` 属性,让其值与复选框的 `id` 属性值相同。
下面是一个复选框的例子:
@ -24,23 +24,23 @@ forumTopicId: 16821
# --instructions--
给表单添加三个复选框,每个复选框都被嵌套进`label`元素中,并且它的`name`属性均为`personality`,它们的内容可以随意指定
给表单添加三个复选框,每个复选框都被嵌套进 `label` 元素中,并且它的 `name` 属性均为 `personality`。你可以随意指定每个复选框的内容文本
# --hints--
表单应该有三个复选框。
表单中应存在三个复选框。
```js
assert($('input[type="checkbox"]').length > 2);
```
每个复选框都应该被嵌套进`label`元素中。
每个复选框都应该被嵌套进 `label` 元素中。
```js
assert($('label > input[type="checkbox"]:only-child').length > 2);
```
确保`label`元素有结束标
确保 `label` 元素有结束标
```js
assert(
@ -50,7 +50,7 @@ assert(
);
```
设置复选框的`name`属性均为`personality`
复选框的 `name` 属性值均应为 `personality`
```js
assert(

View File

@ -10,11 +10,11 @@ forumTopicId: 16822
`radio buttons`(单选按钮)就好比单项选择题,正确答案只有一个。
单选按钮是`input`选择框的一种类型。
单选按钮是 `input` 选择框的一种类型。
每一个单选按钮都应该嵌套在它自己的`label`(标签)元素中。
每一个单选按钮都应该嵌套在它自己的 `label`(标签)元素中。这样,我们相当于给 `input` 元素和包裹它的 `label` 元素建立起了对应关系。
所有关联的单选按钮应该拥有相同的`name`属性。
所有关联的单选按钮应该拥有相同的 `name` 属性。
下面是一个单选按钮的例子:
@ -24,7 +24,7 @@ forumTopicId: 16822
</label>
```
最佳实践是在`label`元素上设置for属性,让其值与单选按钮的`id`属性值相等,这样就在`label`元素和它的子元素单选按钮之间创建了一种链接关系。例如:
使得 `input``label` 关联的最佳实践是在 `label` 元素上设置 `for` 属性,让其值与单选按钮的 `id` 属性值相同。
```html
<label for="indoor">
@ -34,29 +34,29 @@ forumTopicId: 16822
# --instructions--
给表单添加两个单选按钮,一个叫`indoor`另一个叫`outdoor`单选按钮的 `name``indoor-outdoor`
给表单添加两个单选按钮,一个叫 `indoor` 另一个叫 `outdoor`。并将单选按钮的 `name` 属性值设置`indoor-outdoor`
# --hints--
页面上应该有两个单选按钮元素。
页面上应存在两个单选按钮元素。
```js
assert($('input[type="radio"]').length > 1);
```
设置单选按钮的`name`属性`indoor-outdoor`
设置单选按钮的 `name` 属性值为 `indoor-outdoor`
```js
assert($('input[type="radio"]').filter("[name='indoor-outdoor']").length > 1);
```
个单选按钮都应嵌套进它自己的`label`元素中。
每个单选按钮都应嵌套进它自己的 `label` 元素中。
```js
assert($('label > input[type="radio"]:only-child').length > 1);
```
每一个`label`元素都有结束标
每一个 `label` 元素都有结束标
```js
assert(
@ -66,7 +66,7 @@ assert(
);
```
其中一个`label`元素的文本为`indoor`
其中一个 `label` 元素的文本为 `indoor`
```js
assert(
@ -76,7 +76,7 @@ assert(
);
```
其中一个`label`元素的文本为`outdoor`
其中一个 `label` 元素的文本为 `outdoor`
```js
assert(
@ -86,7 +86,7 @@ assert(
);
```
所有的单选按钮都应该包含在`form`表单中。
所有的单选按钮都应该包含在 `form` 表单中。
```js
assert($('label').parent().get(0).tagName.match('FORM'));

View File

@ -8,23 +8,23 @@ forumTopicId: 16823
# --description--
现在让我们来创建一个`form`表单。
现在让我们来创建一个 `form` 表单。
`input`输入框可以让你轻松获得用户的输入。
`input` 输入框可以让你轻松获得用户的输入。
你可以像这样创建一个文本输入框:
`<input type="text">`
注意:`input`输入框是没有结束标的。
**注意:**`input` 输入框是没有结束标的。
# --instructions--
在列表下面创建一个`type`属性为`text``input`输入框。
在列表下面创建一个 `type``text``input` 输入框。
# --hints--
网页中一个`type`属性为`text``input`输入框。
网页中应存在一个 `type``text``input` 输入框。
```js
assert($('input[type=text]').length > 0);

View File

@ -8,9 +8,9 @@ forumTopicId: 16824
# --description--
HTML 有一个特定的元素用于创建有序列表`ordered lists缩写 ol`
HTML 中有用于创建<dfn>有序列表</dfn>的特定元素
有序列表以`<ol>`开始,中间包含一个或多个`<li>`元素,最后以`</ol>`结尾
有序列表以 `<ol>` 开始,中间包含一个或多个 `<li>` 元素,最后以 `</ol>` 结束
例如:
@ -21,51 +21,51 @@ HTML 有一个特定的元素用于创建有序列表`ordered lists缩写 ol
</ol>
```
将会创建一个包含加菲猫和哆啦A梦的有序列表。
将会创建一个包含加菲猫和哆啦 A 梦的有序列表。
# --instructions--
创建一个有序列表,内容是猫咪最讨厌的三东西,内容可以任意指定。
创建一个有序列表,内容是猫咪最讨厌的三东西`Top 3 things cats hate:`,内容可以任意指定。
# --hints--
页面应该有一个序列表,内容是猫咪最喜欢的三东西。
应包含一个序列表,内容是猫咪最讨厌的三东西`Top 3 things cats hate:`
```js
assert(/Top 3 things cats hate:/i.test($('ol').prev().text()));
```
页面应该有一个序列表,内容是猫咪最讨厌的三件东西
应包含有一个序列表,内容是猫咪最喜欢的东西(`Things cats love:`
```js
assert(/Things cats love:/i.test($('ul').prev().text()));
```
页面应该只有一个`ul`元素。
页面应只包含一个 `ul` 元素。
```js
assert.equal($('ul').length, 1);
```
页面应该只有一个`ol`元素。
页面应只包含一个 `ol` 元素。
```js
assert.equal($('ol').length, 1);
```
`ul`无序列表应该包含3个`li`条目
`ul` 无序列表中应包含 3 个 `li` 元素
```js
assert.equal($('ul li').length, 3);
```
`ol`有序列表应该包含3个`li`元素。
`ol` 有序列表应该包含 3 个 `li` 元素。
```js
assert.equal($('ol li').length, 3);
```
确保`ul`无序列表有结束标
`ul` 无序列表有结束标
```js
assert(
@ -74,7 +74,7 @@ assert(
);
```
确保`ol`有序列表有结束标
`ol` 有序列表有结束标
```js
assert(
@ -83,7 +83,8 @@ assert(
);
```
确保每个`li`条目都有结束标
`li` 元素应有结束标
```js
assert(
@ -93,16 +94,20 @@ assert(
);
```
无序列表里的 `li` 元素不应为空。
无序列表里的 `li` 元素内容不应为空。
```js
$('ul li').each((i, val) => assert(val.textContent.replace(/\s/g, '')));
$('ul li').each((i, val) =>
assert(__helpers.removeWhiteSpace(val.textContent))
);
```
有序列表里的 `li` 元素不应该为空。
有序列表里的 `li` 元素内容不应该为空。
```js
$('ol li').each((i, val) => assert(!!val.textContent.replace(/\s/g, '')));
$('ol li').each((i, val) =>
assert(!!__helpers.removeWhiteSpace(val.textContent))
);
```
# --solutions--

View File

@ -8,17 +8,17 @@ forumTopicId: 301095
# --description--
到目前为止,我们学习了一些特定的 HTML 标签还有一些标签是用来组成网页的总体结构,并且它们在每个 HTML 文档中都能看到
到目前为止,我们已经学习了一些 HTML 标签还有一些标签是用来组成网页体结构,每个 HTML 文档中都有这些标签的身影
在文档的顶部,需要告诉浏览器你的网页用的 HTML 哪个版本。 HTML 是一个不停进化的语言,大部分浏览器都支持 HTML 的最新标准,也就是 HTML5。但是一些陈旧的网页可能使用的是 HTML 的旧版本
在文档的顶部,我们需要告诉浏览器网页所使用的 HTML 版本。HTML 是一个不停发展的语言,大部分浏览器都支持 HTML 的最新标准,也就是 HTML5。但是一些陈旧的网页可能使用的是老版本的 HTML。
你可以通过`<!DOCTYPE ...>`来告诉浏览器使用的 HTML 的哪个版本,"`...`" 部分就是版本的数字信息`<!DOCTYPE html>`对应的就是 HTML5。
你可以通过 `<!DOCTYPE ...>` 来告诉浏览器页面上使用的 HTML 版本,"`...`" 部分就是版本`<!DOCTYPE html>` 对应的就是 HTML5。
`!`和大写的`DOCTYPE`是很重要的,特别是对于老的浏览器。但`html`大写小写都可以。
`!` 和大写的 `DOCTYPE` 是很重要的,尤其是对那些老的浏览器。但 `html` 无论大写小写都可以。
所有的 HTML 代码都必须位于`html`标签中。其中`<html>`位于`<!DOCTYPE html>`的后面`</html>`位于网页的结尾。
所有的 HTML 代码都必须位于 `html` 标签中。其中 `<html>` 位于 `<!DOCTYPE html>` 之后`</html>` 位于网页的结尾。
是网页结构一个例子:
以下是网页结构一个例子:
```html
<!DOCTYPE html>
@ -29,23 +29,23 @@ forumTopicId: 301095
# --instructions--
在代码编辑器的顶部添加一个`DOCTYPE文档类型`为 HTML5 的声明,然后添加一个`html`元素,再添加一个`h1`元素,标题的文本可以随意填
在代码编辑器的顶部添加一个 `DOCTYPE文档类型` 为 HTML5 的声明,然后添加一个 `html` 元素,再添加一个 `h1` 元素,你可以随意填写 `h1` 的内容文本
# --hints--
网页中应包含`<!DOCTYPE html>`标签。
网页中应包含 `<!DOCTYPE html>` 标签。
```js
assert(code.match(/<!DOCTYPE\s+?html\s*?>/gi));
```
网页中只有一个`html`元素。
网页中应只存在一个 `html` 元素。
```js
assert($('html').length == 1);
```
`h1`元素应该位于`html`元素内部。
`h1` 元素应该位于 `html` 元素内部。
```js
assert(code.match(/<html>\s*?<h1>\s*?.*?\s*?<\/h1>\s*?<\/html>/gi));

View File

@ -8,9 +8,9 @@ forumTopicId: 301096
# --description--
`html`的结构主要分为两大部分:`head``body`关于网页的描述都应该放入`head`标签,网页的内容都应该放入`body`标签。
`html` 的结构主要分为两大部分:`head``body`。网页的描述放入 `head` 标签,网页的内容则应放入 `body` 标签。
比如`link``meta``title``style`都应放入`head`标签。
比如 `link``meta``title``style` 都应放入 `head` 标签。
这是网页布局的一个例子:
@ -28,41 +28,41 @@ forumTopicId: 301096
# --instructions--
给网页添加`head``body``head`元素应包含`title``body`元素应该包含`h1``p`
给网页添加 `head``body``head` 元素应包含 `title``body` 元素应该包含 `h1``p`
# --hints--
网页应只有一个`head`元素。
网页应只有一个 `head` 元素。
```js
assert($('head').length == 1);
```
网页应只有一个`body`元素。
网页应只有一个 `body` 元素。
```js
assert($('body').length == 1);
```
`head`应该是`html`的子元素。
`head` 应为 `html` 的子元素。
```js
assert($('html').children('head').length == 1);
```
`body`应该是`html`的子元素。
`body` 应为 `html` 的子元素。
```js
assert($('html').children('body').length == 1);
```
`title`应该是`head`的子元素。
`title` 应为 `head` 的子元素。
```js
assert(code.match(/<head>\s*?<title>\s*?.*?\s*?<\/title>\s*?<\/head>/gi));
```
`h1``p`都应该是`body`的子元素。
`h1``p` 都应`body` 的子元素。
```js
assert(

View File

@ -8,29 +8,29 @@ forumTopicId: 17559
# --description--
手机屏幕空间是有限的。
手机屏幕空间是有限的。
让我们删除不必要的元素开始设计我们的CatPhotoApp。
让我们删除不必要的元素,开始设计我们的 CatPhotoApp。
# --instructions--
任务:删除`h1`元素以简化视图。
任务:删除 `h1` 元素以简化视图。
# --hints--
删除`h1`元素。
删除 `h1` 元素。
```js
assert(!code.match(/<h1>/gi) && !code.match(/<\/h1>/gi));
```
保留`h2`元素。
保留 `h2` 元素。
```js
assert(code.match(/<h2>[\w\W]*<\/h2>/gi));
```
保留`p`元素。
保留 `p` 元素。
```js
assert(code.match(/<p>[\w\W]*<\/p>/gi));

View File

@ -8,17 +8,17 @@ forumTopicId: 18178
# --description--
Web 开发者通常用[lorem ipsum text](https://baike.baidu.com/item/Lorem%20ipsum/3684081)来做占位符,占位符就是占着位置的一些文字,没有实际意义。
Web 开发者通常用 [lorem ipsum text](https://baike.baidu.com/item/Lorem%20ipsum/3684081) 来做占位符,占位符就是一些用于占位的文字,没有实际意义。
为什么叫`lorem ipsum text`呢?是因为`lorem ipsum`是古罗马西塞罗谚语的前两个单词。
之所以叫 `lorem ipsum text`是因为 `lorem ipsum` 是古罗马西塞罗谚语的前两个单词。
# --instructions--
`p`元素的内容换为:`Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.`
请把 `p` 元素的内容文本替换为:`Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.`
# --hints--
`p`元素的内容必须包含`Monkey code`
`p` 元素的内容文本应包含 `Kitty ipsum`
```js
assert.isTrue(/Kitty(\s)+ipsum/gi.test($('p').text()));

View File

@ -8,25 +8,25 @@ forumTopicId: 18196
# --description--
在接下来的几节课里,我们将会由浅入深地制作一个 CatPhotoApp。
在接下来的几节课里,我们将会一步一步地制作一个展示猫咪图片的 HTML5 app。
这节课将会引入`h2`元素。
这节课中,我们将会为页面引入作为第二级标题的 `h2` 元素。
这些元素用来告诉浏览器网站的结构是什么样子。`h1`元素通常被用作主标题,`h2`元素通常被用作副标题,还有`h3``h4``h5``h6`元素,它们分别用作不同级别的标题。
这些元素用来告诉浏览器网站的结构是什么样子。`h1` 元素通常被用作主标题,`h2` 元素通常被用作副标题,还有 `h3``h4``h5``h6` 元素,它们分别用作不同级别的标题。
# --instructions--
`h1`元素下面创建一个`h2`元素,元素内容为`CatPhotoApp`
内容为 "Hello World" 的 `h1` 元素下面创建一个 `h2` 元素,`h2` 元素内容为 `CatPhotoApp`
# --hints--
创建一个`h2`元素。
创建一个 `h2` 元素。
```js
assert($('h2').length > 0);
```
`h2`元素应该有结束标
`h2` 元素应该有结束标
```js
assert(
@ -35,17 +35,23 @@ assert(
);
```
`h2`元素的内容应为:`CatPhotoApp`
`h2` 元素的内容应为:`CatPhotoApp`
```js
assert.isTrue(/cat(\s)?photo(\s)?app/gi.test($('h2').text()));
```
`h1`元素的内容应为:`Hello World`
`h1` 元素的内容应为:`Hello World`
```js
assert.isTrue(/hello(\s)+world/gi.test($('h1').text()));
```
`h1` 元素应出现在 `h2` 元素之前。
```js
assert(code.match(/<h1>\s*?.*?\s*?<\/h1>\s*<h2>\s*?.*?\s*?<\/h2>/gi));
```
# --solutions--

View File

@ -8,7 +8,7 @@ forumTopicId: 18202
# --description--
`p``paragraph`的缩写,通常用来创建一个段落,就和你写作文一样。
`p``paragraph` 的缩写,通常用来创建一个段落,就和你写作文一样。
你可以像这样创建一个段落:
@ -16,23 +16,23 @@ forumTopicId: 18202
# --instructions--
`h2`元素下面新增一个`p`元素,元素内容是`Hello Paragraph`
请在 `h2` 元素下方添加一个 `p` 元素,元素内容是 `Hello Paragraph`
# --hints--
创建一个`p`元素。
应包含一个 `p` 元素。
```js
assert($('p').length > 0);
```
`p`元素的内容应为`Hello Paragraph`
`p` 元素的内容文本应为 `Hello Paragraph`
```js
assert.isTrue(/hello(\s)+paragraph/gi.test($('p').text()));
```
`p`元素应有结束标
`p` 元素应有结束标
```js
assert(

View File

@ -8,13 +8,13 @@ forumTopicId: 301097
# --description--
HTML5 引入了很多更具描述性的 HTML 元素,例如:`header``footer``nav``video``article``section`等等。
HTML5 引入了很多更具描述性的 HTML 元素,例如:`header``footer``nav``video``article``section` 等等。
这些元素让 HTML 更易读,同时有助于搜索引擎优化和无障碍访问。
`main`元素让搜索引擎和开发者瞬间就能找到网页的主要内容。
`main` 元素让搜索引擎和开发者能很快地找到网页的主要内容。
举个栗子, 下面的 `main` 元素嵌套了两个子元素:
举个例子,下面的 `main` 元素嵌套了两个子元素:
```html
<main>
@ -23,23 +23,23 @@ HTML5 引入了很多更具描述性的 HTML 元素,例如:`header`、`foote
</main>
```
**提示:** 在后面的应用无障碍课程中我们会接触到更多新的 HTML5 元素,以及明白它们的用处。
**提示:**在后面的应用无障碍课程中我们会接触到更多新的 HTML5 元素,以及明白它们的用处。
# --instructions--
在现有的段落创建一个新的段落,段落内容为:`养猫有的时候,就是介于爱与恨之间,当你钦羡别人萌宠这么可爱的时候,你一定没有想过,猫咪会到处掉毛,甚至会屯老鼠,啃鞋子,用爪子爬门,你不理它,它就挠你,你要对它发脾气,它会比你更来劲。所以,猫咪慎入,没有一定的准备,切勿随便去侍养动物。它们一旦认定你了,你就是它们的主人,如果你抛弃它们,它们必定心中重创。`
在现有的段落之后创建一个新的段落,段落内容为:`Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.`
在第一个段落前添加`<main>`,在第二个段落后添加`</main>`
然后,请添加一个 `main` 元素,作为现有的两个 `p` 元素的父级元素
# --hints--
页面中应该有两个段落
页面中应该有两个 `p` 元素
```js
assert($('p').length > 1);
```
确保每个段落都有结束标
每个 `p` 元素都应有结束标
```js
assert(
@ -48,31 +48,31 @@ assert(
);
```
新建的段落应包含关键词:猫咪
新建的段落应包含关键词 `Purr jump eat`
```js
assert.isTrue(/Purr\s+jump\s+eat/gi.test($('p').text()));
```
代码中应该包含`main`元素。
应该存在 `main` 元素。
```js
assert($('main').length === 1);
```
`main`元素应有两个 `p`元素作为它的子元素。
`main` 元素应有两个 `p` 元素作为它的子元素。
```js
assert($('main').children('p').length === 2);
```
开始标记\`\`应位于第一个段落之前。
`main` 的开始标签应位于第一个段落之前。
```js
assert(code.match(/<main>\s*?<p>/g));
```
结束标记\`\`应位于第二段落之后。
`main` 的结束标签应位于第二段落之后。
```js
assert(code.match(/<\/p>\s*?<\/main>/g));

View File

@ -8,33 +8,33 @@ forumTopicId: 18226
# --description--
你可以用 `a`Anchor简写 a来实现网页间的跳转。
你可以用 `a`Anchor简写 a来实现网页间的跳转。
`a` 需要一个`href`属性指向目的地,它还需要有 `a` 文本,例如:
`a` 需要一个 `href` 属性指向跳转的目的地,同时,它还应有内容,例如:
`<a href="https://freecodecamp.org">传送至</a>`
`<a href="https://freecodecamp.org">链接到 freeCodeCamp</a>`
然后你的浏览器会显示一个可点击的文本,点击该文本就会跳转到`https://freecodecamp.org`
在浏览器中,以上的标签会将文字 **"链接到 freeCodeCamp"** 展示成一个可点击的超链接。点击该文本就会跳转到 `https://freecodecamp.org`
# --instructions--
创建一个 `a`,它的`href`属性`https://freecatphotoapp.com` ,它的文本为`cat photos`
创建一个内容文本为 `cat photos``a` 元素,并将其 `href` 属性值设置为 `https://freecatphotoapp.com`
# --hints--
`a`元素的 `a` 文本应为:`cat photos`
`a` 元素的内容文本应为:`cat photos`
```js
assert(/cat photos/gi.test($('a').text()));
```
`a`元素`href`属性应为:"`http&#58;//freecatphotoapp<wbr>.com`"
你的 `a` 元素应链接到 `https://freecatphotoapp.com`
```js
assert(/http:\/\/(www\.)?freecatphotoapp\.com/gi.test($('a').attr('href')));
```
确保`a`元素有结束标
确保 `a` 元素有结束标
```js
assert(

View File

@ -8,7 +8,7 @@ forumTopicId: 301098
# --description--
`a` 元素还可以用来实现页面内不同区域的跳转,只需要把`a`元素的`href`值设置为井号`#`加欲跳转区域对应的`id`值即可。`id`是描述网页元素的一个属性,它的值在整个页面中唯一。
`a` 元素还可以用来实现页面内不同区域的跳转,只需要把 `a` 元素的 `href` 值设置为井号 `#` 加欲跳转区域对应的 `id` 属性值即可。`id` 是描述网页元素的一个属性,它的值在整个页面中唯一。
下面是用来创建内部 `a` 的例子:
@ -18,37 +18,37 @@ forumTopicId: 301098
<h2 id="contacts-header">Contacts</h2>
```
当用户点击了`Contacts`链接,页面就会跳转到网页的**Contacts**区域。
当用户点击了 `Contacts` 链接,页面就会跳转到网页的 **Contacts** 区域。
# --instructions--
通过修改`href`属性`#footer`来更改外部链接为内部链接,同时修改文本`cat photos``Jump to Bottom`
修改 `href` 属性值为 `#footer` 来将外部链接更改为内部链接,同时修改文本 `cat photos``Jump to Bottom`
移除 target="\_blank" 属性,它会使得链接在新标签页中打开。
移除 `target="\_blank"` 属性,这个属性的存在会让链接在新标签页中打开。
然后添加一个`<footer>`元素,它的`id`值为`footer`
然后添加一个 `<footer>` 元素,并将它的 `id` 属性值设置为 `footer`
# --hints--
页面中应该只有一个 `a`
页面中应只存在一个 `a` 元素
```js
assert($('a').length == 1);
```
页面中应该只有一个`footer`元素。
页面中应只存在一个 `footer` 元素。
```js
assert($('footer').length == 1);
```
`a``href`属性应为 "#footer"
`a` `href` 属性应为 `#footer`
```js
assert($('a').eq(0).attr('href') == '#footer');
```
`a` 不应`target`属性。
`a` 不应有 `target` 属性。
```js
assert(
@ -57,7 +57,7 @@ assert(
);
```
`a` 的文本应为`Jump to Bottom`
`a`内容文本应为 `Jump to Bottom`
```js
assert(
@ -68,7 +68,7 @@ assert(
);
```
`footer`元素的`id`属性应为 "footer"
`footer` 元素的 `id` 属性应为 `footer`
```js
assert($('footer').eq(0).attr('id') == 'footer');

View File

@ -8,19 +8,19 @@ forumTopicId: 18230
# --description--
有时你想为网站添加一个 `a`,但如果你还不确定要将它链接到哪儿,这时可以使用链接占位符。
有时你想为网站添加一个 `a` 元素,但还不确定要将它链接到哪里。这时,你可以使用链接占位符。
在后面的课程中我们会学到:如何轻松通过`JavaScript`更改链接指向的地址
链接占位符还有一个应用场景,就是实现在点击 `a` 元素时执行 `JavaScript` 代码。我们会在后面的课程中学到
# --instructions--
`href`属性的当前值是指向 "`https://freecatphotoapp.com`",将`href`属性的值替换为`#`就可以创建固定链接
目前,`href` 的属性值是 "`https://freecatphotoapp.com`"。请将 `href` 属性的值替换为`#`以此来创建链接占位符
例如: `href="#"`
# --hints--
`a``href`属性应为 "#"。
`a` `href` 属性应为 "#"。
```js
assert($('a').attr('href') === '#');

View File

@ -16,21 +16,21 @@ forumTopicId: 18244
</p>
```
让我们来分解这个例子: 通常,文本是被包裹在`p`段落内:
`<p> Here's a ... for you to follow. </p>` 接下来是`anchor` `a` `<a>`需要结束标 `</a>`:
`<a> ... </a>` `target``a`一个属性,用来指定链接的打开方式。属性值 `"_blank"` 的意思是链接会在新标签页打开。 `href``a` 的另一个属性用来指定链接的 URL
`<a href="https://freecodecamp.org"> ... </a>` `a` 元素内的文本:**"link to freecodecamp.org"**,会显示为一个可以点击的链接:
`<a href=" ... ">link to freecodecamp.org</a>`的最输出将会是这样:
让我们来拆解一下这个例子: 通常,文本是被包裹在 `p` 元素内:
`<p> Here's a ... for you to follow. </p>` 接下来是 `<a>` 元素(它需要结束标 `</a>`
`<a> ... </a>` `target` `a` 元素的属性,用来指定链接的打开方式。属性值 `"_blank"` 表示链接会在新标签页打开。`href` `a` 的另一个属性,它用来指定链接的 URL
`<a href="https://freecodecamp.org"> ... </a>` `a` 元素内的内容文本 **"link to freecodecamp.org"**,会显示为一个可以点击的链接:
`<a href=" ... ">link to freecodecamp.org</a>` 此示例的最输出结果是这样:
Here's a [link to freecodecamp.org](http://freecodecamp.one) for you to follow.
# --instructions--
用一个段落(`p`)标签来包裹`main`元素里的`a`节点。新段落的文本为:View more cat photos,其中 "cat photos" 是一个链接,其余是纯文本。
创建一个新的段落(`p`)标签来包裹 `main` 元素里的 `a` 节点。新段落标签的内容为:"View more cat photos",其中 "cat photos" 是一个链接,其余是纯文本。
# --hints--
你需要一个指向 "`https://freecatphotoapp.com`" 的 `a`
应包含一个链接到 "`https://freecatphotoapp.com`" 的 `a` 元素
```js
assert(
@ -39,7 +39,7 @@ assert(
);
```
`a` 文本应为cat photos。
`a` 元素的内容文本应为 "cat photos"
```js
assert(
@ -49,13 +49,13 @@ assert(
);
```
`a` 的外部创建一个新段落,这样页面就有 3 个段落了
你应该`a` 标签的外部创建一个新`p` 标签。页面中应至少包含 3 个 `p` 标签
```js
assert($('p') && $('p').length > 2);
```
`a` 应嵌套在新段落内。
`a` 应嵌套在新创建的 `p` 元素内。
```js
assert(
@ -64,7 +64,7 @@ assert(
);
```
段落应该包含文本 View more(记得 more 后有一个空格)。
`p` 元素应该包含文本 "View more "(请注意,more 后有一个空格)。
```js
assert(
@ -79,7 +79,7 @@ assert(
);
```
`a` 不应包含文本 View more。
`a` 元素中不应包含文本 "View more"
```js
assert(
@ -89,7 +89,7 @@ assert(
);
```
确保每个段落有结束标
确保每个 `p` 元素有结束标
```js
assert(
@ -99,7 +99,7 @@ assert(
);
```
确保每个段落有结束标
确保每个 `a` 元素有结束标
```js
assert(

View File

@ -8,39 +8,39 @@ forumTopicId: 18246
# --description--
`div`元素也叫 Content Division Element内容划分元素元素是一个包裹其他元素的通用容器。
`div` 元素也叫 Content Division Element内容划分元素元素是一个包裹其他元素的通用容器。
它也是 HTML 中出现频率最高的元素。
和其他普通元素一样,你可以用`<div>`来标记一个`div`元素的开始,用`</div>`来标记一个`div`元素的结束。
和其他普通元素一样,你可以用 `<div>` 来标记一个 `div` 元素的开始,用 `</div>` 来标记一个 `div` 元素的结束。
# --instructions--
把无序列表、有序列表和段落都嵌套进同一个`div`元素。
把无序列表、有序列表和段落都嵌套进同一个 `div` 元素。
提示:你可以在第一个`<p>`之前插入`div`开始标记,在`</ol>`之后插入`div`结束标记,这样,所有的列表都位于`div`之内。
提示:你可以在第一个 `<p>` 之前插入 `div` 开始标记,在 `</ol>` 之后插入 `div` 结束标签。这样,所有的列表都位于 `div` 之内。
# --hints--
所有的`p`元素嵌入`div`元素中。
所有的 `p` 元素都应嵌套在 `div` 元素中。
```js
assert($('div').children('p').length > 1);
```
`ul`元素嵌入`div`元素中。
所有的 `ul` 元素都应嵌套在 `div` 元素中。
```js
assert($('div').children('ul').length > 0);
```
`ol`元素嵌入`div`元素中。
所有的 `ol` 元素都应嵌套在 `div` 元素中。
```js
assert($('div').children('ol').length > 0);
```
确保`div`元素有结束标
`div` 元素有结束标
```js
assert(

View File

@ -12,25 +12,25 @@ forumTopicId: 18276
HTML 是英文 Hyper Text Markup Language超文本标记语言的缩写。首先我们来用 HTML 制作一个简单的网页,你可以直接在网页内置的代码编辑器中编辑代码。
看到代码编辑器中的`<h1>Hello</h1>`了吗? 那就是一个 HTML 元素。
看到代码编辑器中的 `<h1>Hello</h1>` 了吗? 那就是一个 HTML 元素。
大部分 HTML 元素都有一个`开始标`和一个`结束标`
大部分 HTML 元素都有一个`开始标`和一个`结束标`
开始标像这样:`<h1>`
开始标像这样:`<h1>`
结束标像这样:`</h1>`
结束标像这样:`</h1>`
开始标和结束标的唯一区别就是结束标多了一个`/`
开始标和结束标的唯一区别就是结束标多了一个 `/`
每个挑战都有测试,任何时候点击**运行测试**按钮就可以运行测试。如果代码通过测试,将会弹出一个窗口,你就可以进入下一个挑战。反之,测试区会显示你没有通过测试的原因。
# --instructions--
请把`h1`元素的内容改为`Hello World`
请把 `h1` 元素的内容改为 `Hello World`
# --hints--
`h1`元素的内容应该为:`Hello World`
`h1` 元素的内容文本应为 `Hello World`
```js
assert.isTrue(/hello(\s)+world/gi.test($('h1').text()));

View File

@ -10,33 +10,33 @@ forumTopicId: 18327
你可以通过把元素嵌套进 `a` 里使其变成一个链接。
你的图片嵌套进 `a`。举例如下
如果我们要把图片嵌套进 `a` 元素,可以这样写
`<a href="#"><img src="https://bit.ly/fcc-running-cats" alt="三只萌萌的小猫"></a>`
`a``href`属性设置为`#`,就可以创建固定链接。
如果`a` `href` 属性设置为 `#`,就可以创建固定链接。
# --instructions--
把现存的图片嵌套进 `a` 中。
把现存的图片嵌套进 `a` 中。
鼠标悬停在图片上时,鼠标的光标如果从箭头指针变成手形指针,那么此时图片就是一个链接了。
如果鼠标悬停在图片上时,鼠标的光标如果从箭头指针变成手形指针,那么此时图片就是一个链接了。
# --hints--
把现存的图片嵌套进 `a` 中。
应将图片嵌套进 `a` 元素中。
```js
assert($('a').children('img').length > 0);
```
`a``href`属性应为`#`
`a` `href` 属性应为 `#`
```js
assert(new RegExp('#').test($('a').children('img').parent().attr('href')));
```
确保每个 `a` 有结束标
每个 `a` 元素都应有结束标
```js
assert(

View File

@ -12,33 +12,33 @@ forumTopicId: 18329
注释的另一个用途就是在不删除代码的前提下,让代码不起作用。
在 HTML 中,注释的开始标记是`<!--`,结束标记是`-->`
在 HTML 中,注释的开始标签是 `<!--`,结束标签是 `-->`
# --instructions--
现在我们反其道而行之,去掉`h1`元素、`h2`元素、`p`元素的注释。
现在我们反其道而行之,去掉 `h1` 元素、`h2` 元素、`p` 元素的注释。
# --hints--
确保网页中能看到`h1`元素。
页面上应存在 `h1` 元素。
```js
assert($('h1').length > 0);
```
确保网页中能看到`h2`元素。
页面上应存在 `h2` 元素。
```js
assert($('h2').length > 0);
```
确保网页中能看到`p`元素。
页面上应存在 `p` 元素。
```js
assert($('p').length > 0);
```
确保删除注释的结束标`-->`
删除注释的结束标`-->`
```js
assert(!$('*:contains("-->")')[1]);

View File

@ -8,17 +8,17 @@ forumTopicId: 18360
# --description--
当你设计表单时,你可以指定某些字段为必填项(required),只有当用户填写了该字段后,才可以提交表单。
当你设计表单时,你可以指定某些字段为必填项required,只有当用户填写了该字段后,才可以提交表单。
如果你想把文本输入框设置为必填项,在`input`元素中加上 required 属性就可以了,例如:`<input type="text" required>`
如果你想把文本输入框设置为必填项,在 `input` 元素中加上 `required` 属性就可以了,例如:`<input type="text" required>`
# --instructions--
`input`元素加上`required`属性,这样用户就必须先在输入框里填入内容,然后才可以提交表单。
请给 `input` 元素加上 `required` 属性,这样用户就必须先在输入框里填入内容,然后才可以提交表单。
# --hints--
`input`元素必须有`required`属性。
`input` 元素应有 `required` 属性。
```js
assert($('input').prop('required'));

View File

@ -7,7 +7,7 @@ forumTopicId: 301099
# --description--
当表单提交时,包括 options 已选值在内的数据会发送给服务端。`radio``checkbox``value`值决定了发送到服务端的实际内容。
提交表单时,所选项的值会发送给服务端。`radio``checkbox``value` 属性值决定了发送到服务端的实际内容。
例如:
@ -20,17 +20,17 @@ forumTopicId: 301099
</label>
```
这里有两个 `radio` 单选框。如果当用户提交表单时 `indoor` 选项被选中,表单数据会包含:`indoor-outdoor=indoor`。也就是 "indoor" 单选框`name``value` 属性。
这里有两个 `radio` 单选框。当用户提交表单时,如果 `indoor` 选项被选中,表单数据会包含:`indoor-outdoor=indoor`。也就是所选项`name``value` 属性
如果没 `value` 属性会使用默认值做为表单数据提交,也就是 `on`。在这种情况下,如果用户点击 "indoor" 选项然后提交表单,表单数据的值为 `indoor-outdoor=on`,这可能并没有什么意义。因此最好将 `value` 属性设置一些有意义的内容。
如果没有指明 `value` 属性值,则会使用默认值做为表单数据提交,也就是 `on`。在这种情况下,如果用户选中 "indoor" 选项然后提交表单,表单数据则会包含 `indoor-outdoor=on`。这样的表单数据看起来不够直观,因此最好将 `value` 属性设置一些有意义的内容。
# --instructions--
给每一个`radio``checkbox`输入框添加`value`属性。请把每个`input`对应`label`文本转换为小写(如 Outdoor 应转换为 outdoor设置其为 value 的值(`value="outdoor"`
给每一个 `radio``checkbox` 输入框添加 `value` 属性,属性值为 `input` 对应 `label` 中文本的小写形式。如 Outdoor 的 `value` 应设置为 `"outdoor"``value="outdoor"`
# --hints--
一个单选按钮应该包含 `indoor` `value` 属性。
应有一个单选按钮的 `value` 属性值为 `indoor`
```js
assert(
@ -39,7 +39,7 @@ assert(
);
```
一个单选按钮应该包含 `outdoor` `value` 属性。
应有一个单选按钮的 `value` 属性值为 `outdoor`
```js
assert(
@ -49,7 +49,7 @@ assert(
);
```
一个复选框应该包含 `loving` `value` 属性。
应有一个复选框的 `value` 属性值为 `loving`
```js
assert(
@ -59,7 +59,7 @@ assert(
);
```
一个复选框应该包含 `lazy` `value` 属性。
应有一个复选框的 `value` 属性值为 `lazy`
```js
assert(
@ -68,7 +68,7 @@ assert(
);
```
一个复选框应该包含 `lazy` `energetic` 属性
应有一个复选框`value` 属性值为 `energetic`
```js
assert(