图片库

现在我们已经了解了 JavaScript 的基本构建块,我们将通过让你构建一个在很多网站上都能看到的非常常见的项目——一个由 JavaScript 驱动的图片库——来测试你对循环、函数、条件语句和事件的知识。

先决条件 在尝试此评估之前,你应该已经完成了本模块中的所有文章。
目标 测试对 JavaScript 循环、函数、条件语句和事件的理解。

起点

要开始此评估,你应该前往 下载示例的 ZIP 文件,将其解压缩到你的计算机上的某个位置,并从本地执行练习。

或者,你可以使用在线编辑器,例如 CodePenJSFiddleGlitch

注意:如果你卡住了,你可以在我们的 沟通渠道 中联系我们。

项目简述

我们为你提供了一些 HTML、CSS 和图像资产以及几行 JavaScript 代码;你需要编写必要的 JavaScript 代码将这些代码转化为一个可运行的程序。HTML 主体看起来像这样

html
<h1>Image gallery example</h1>

<div class="full-img">
  <img
    class="displayed-img"
    src="images/pic1.jpg"
    alt="Closeup of a blue human eye" />
  <div class="overlay"></div>
  <button class="dark">Darken</button>
</div>

<div class="thumb-bar"></div>

示例看起来像这样

An image gallery with a large image on top and five thumbnails below

示例 CSS 文件中最有趣的部分

  • 它在 full-img <div> 内绝对定位了三个元素——显示完整尺寸图片的 <img>、一个大小与 <img> 相同的空 <div>,并将其直接放在 <img> 的顶部(这用于通过半透明背景色对图片应用变暗效果),以及一个用于控制变暗效果的 <button>
  • 它将 thumb-bar <div>(所谓的“缩略图”图片)内的任何图片的宽度设置为 20%,并将它们浮动到左侧,以便它们在一行上并排排列。

你的 JavaScript 需要

  • 声明一个 const 数组,列出每个图片的文件名,例如 'pic1.jpg'
  • 声明一个 const 对象,列出每个图片的备用文本。
  • 遍历文件名数组,对于每个文件名,在 thumb-bar <div> 内插入一个 <img> 元素,将该图片嵌入到页面中,并附带其备用文本。
  • thumb-bar <div> 内的每个 <img> 上添加一个点击事件监听器,以便在点击它们时,在 displayed-img <img> 元素中显示相应的图片和备用文本。
  • <button> 上添加一个点击事件监听器,以便在点击它时,对完整尺寸图片应用变暗效果。再次点击它时,变暗效果会再次消失。

为了让你更好地了解,请查看 完成的示例(不要偷看源代码!)。

完成步骤

以下部分描述了你需要做的事情。

声明一个图像文件名数组

你需要创建一个数组,列出要包含在画廊中的所有图片的文件名。该数组应声明为常量。

遍历图片

我们已经为你提供了将 thumb-bar <div> 的引用存储在一个名为 thumbBar 的常量中的代码行,创建一个新的 <img> 元素,将其 srcalt 属性设置为占位符值 xxx,并将这个新的 <img> 元素追加到 thumbBar 内。

你需要

  1. 将“遍历图片”注释下的代码部分放在一个循环中,该循环遍历数组中的所有文件名。
  2. 在每次循环迭代中,用一个字符串替换 xxx 占位符值,该字符串将等于每个情况下的图片路径和 alt 属性。将 srcalt 属性的值设置为这些值。请记住,图片位于 images 目录内,其名称为 pic1.jpgpic2.jpg 等。

在每个缩略图图片上添加点击事件监听器

在每次循环迭代中,你需要在当前 newImage 上添加一个点击事件监听器——这个监听器应该找到当前图片的 src 属性的值。将 displayed-img <img>src 属性值设置为作为参数传递的 src 值。然后对 alt 属性执行相同的操作。

或者,你可以在缩略图栏上添加一个事件监听器。

编写一个运行变暗/变亮按钮的处理程序

只剩下我们的变暗/变亮 <button> 了——我们已经提供了一行代码,将 <button> 的引用存储在一个名为 btn 的常量中。你需要添加一个点击事件监听器,该监听器

  1. 检查当前在 <button> 上设置的类名——你也可以通过使用 getAttribute() 来实现这一点。
  2. 如果类名是 "dark",则将 <button> 类更改为 "light"(使用 setAttribute())、将它的文本内容更改为“变亮”,并将覆盖 <div>background-color 更改为 "rgb(0 0 0 / 50%)"
  3. 如果类名不是 "dark",则将 <button> 类更改为 "dark",将它的文本内容更改回“变暗”,并将覆盖 <div>background-color 更改为 "rgb(0 0 0 / 0%)"

以下几行代码为实现上面第 2 和第 3 点中规定的更改提供了一个基础。

js
btn.setAttribute("class", xxx);
btn.textContent = xxx;
overlay.style.backgroundColor = xxx;

提示和技巧

  • 你不需要以任何方式编辑 HTML 或 CSS。