当前位置: 首页 > 知识库问答 >
问题:

“我的模式库”只能打开列表的最后一张图片

闾丘山
2023-03-14

我试着为一个网站做一个模型库。实际上它几乎可以工作。它打开了我的照片,但只打开了画廊的最后一张。我知道我需要选择在我的JS中点击的图片,但我真的不知道怎么做。

我有(部分):

超文本标记语言

<section>
    <ul class="gallery">
      <li>
        <img src="images/arcticfox/Arctic_1.jpg" alt="Arctic Fox" />
      </li>
    </ul>
    <!-- The Modal -->
    <div id="myModal" class="modal">

    <!-- The Close Button -->
    <span class="close">&times;</span>

    <!-- Modal Content (The Image) -->
    <img class="modal-content" id="img01">

    <!-- Modal Caption (Image Text) -->
    <div id="caption"></div>
</section>

CSS

.gallery {
    margin: 0;
    padding: 0;
    grid-gap: 10px;
    list-style: none;
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
}

/* The Modal (background) */
.modal {
    display: none; /* Hidden by default */
    position: fixed; /* Stay in place */
    z-index: 1; /* Sit on top */
    padding-top: 100px; /* Location of the box */
    left: 0;
    top: 0;
    width: 100%; /* Full width */
    height: 100%; /* Full height */
    overflow: auto; /* Enable scroll if needed */
    background-color: rgb(0, 0, 0); /* Fallback color */
    background-color: rgba(0, 0, 0, 0.9); /* Black w/ opacity */
}

/* Modal Content (Image) */
.modal-content {
    margin: auto;
    display: block;
    width: 80%;
    max-width: 700px;
}

/* Caption of Modal Image (Image Text) - Same Width as the Image */
#caption {
    margin: auto;
    display: block;
    width: 80%;
    max-width: 700px;
    text-align: center;
    color: #ccc;
    padding: 10px 0;
    height: 150px;
}

/* Add Animation - Zoom in the Modal */
.modal-content,
#caption {
    animation-name: zoom;
    animation-duration: 0.6s;
}

@keyframes zoom {
    from {
        transform: scale(0);
    }
    to {
        transform: scale(1);
    }
}

/* The Close Button */
.close {
    position: absolute;
    top: 15px;
    right: 35px;
    color: #f1f1f1;
    font-size: 40px;
    font-weight: bold;
    transition: 0.3s;
}

.close:hover,
.close:focus {
    color: #bbb;
    text-decoration: none;
    cursor: pointer;
}

JS

const modal = document.getElementById("myModal");
const img = document.querySelectorAll(".gallery li img");
const modalImg = document.getElementById("img01");
const captionText = document.getElementById("caption");
const span = document.getElementsByClassName("close")[0];
const gallery = document.querySelector(".gallery")

gallery.addEventListener("click", () => {
    img.forEach(imgs => {
        console.log(imgs)
        modal.style.display = "block";
        modalImg.src = imgs.src;
        captionText.innerHTML = imgs.alt;
    })
})

span.onclick = function() {
    modal.style.display = "none";
}

modal.onclick = function() {
    modal.style.display = "none";
}

我知道问题出在我的JS中,但我不知道如何选择正确的图片。

你能帮助我吗?谢谢,这是事先准备好的。

共有2个答案

仲学真
2023-03-14

是的,很管用,乔纳森·诺尔,非常感谢。星期二我的项目已经发送了第一个,我已经将JS升级为:因为querySelector已经有一个常量了

const img = document.querySelectorAll(".gallery li img");

img.forEach(item => {
    item.addEventListener('click', event => {
        modal.style.display = "block";
        modalImg.src = item.src;
        captionText.innerHTML = item.alt;
    })
})

超文本标记语言和CSS现在在帖子中。(部分)

再次感谢你,这是一个很大的帮助。

田焕
2023-03-14

看起来你确实很接近了,很难判断没有你的超文本标记语言是否可行,但是试试这个而不是gallery.addEventListener

document.querySelectorAll('.gallery li img').forEach(item => {
  item.addEventListener('click', event => {
    modal.style.display = "block";
    modalImg.src = item.src;
    captionText.innerHTML = item.alt;
  })
})
  • 当我点击图库中的任意位置时,我希望您循环浏览图库中的每个img标记

当循环结束时,它将始终使用库中最后一个图像的属性离开模式。

  • 我希望您获取图库中的所有图像并循环浏览它们

您可能需要对此进行一些调整,但您面临的问题是,您没有告诉JS哪些属性是您想要的。

另一种方法是将自定义数据属性添加到库中包含所需数据的图像中。然后编写一个函数,接受这些属性并更新模态。这样做的原因是,您可以在gallery上加载缩略图大小,并在modal上创建指向全分辨率图像的链接。它看起来像这样。

<li class="gallery-item" modal-src="https://fullImageURL.com" modal-caption="Caption Text Here">
    <img src="https://thumbnailURL.com"/>
</li>

document.querySelectorAll('.gallery-item').forEach(item => {
  item.addEventListener('click', event => {
   updateModal(item);
  })
})

function updateModal(item) {
  const src = .getAttribute('modal-src');
  const caption = .getAttribute('modal-caption');

  modal.style.display = "block";
  modalImg.src = src;
  captionText.innerHTML = caption;
}
 类似资料:
  • 我试图使用文本视图来显示从列表视图中选择的联系人。列表视图包含用户从加载到列表视图中的Android电话簿中选择的联系人。文本视图将只显示列表视图中的最后一项,即使用户选择了另一个不是列表视图中最后一个联系人的联系人。 即使在我的日志打印中,我可以看到我选择了哪个联系人,但当我试图将其打印到另一个窗口中的文本视图时,它仍然默认为最后一个联系人。 添加调制解调器。JAVA 主要活动。JAVA

  • 我有一个非常好的手风琴,它在网站上看起来很好,并且可以正常工作。但是,我正在尝试为其添加更多JavaScript功能,以使其看起来更专业。 目前,手风琴允许您一次打开多个面板,即如果我打开一个选项卡,然后打开另一个选项卡,两个选项卡将同时打开。关闭这些面板的唯一方法是重新单击标题。 我想要的是一些防止同时打开多个选项卡的JavaScript代码,所以如果我单击一个新面板,它应该首先关闭现有的打开面

  • 您好,我试图从另一个表中为我的表在最后一列中插入值,但出现错误错误: 列“name”中的空值违反了非空约束详细信息:失败的行包含(ddf1Caf0-26c2-49e1-8a73-64227eae1f50, null, null, null, null, null,2532)。

  • 问题内容: 我有一个列表’a’,在这里我需要用文本文件’hello.txt’的行打印列表中所有匹配的字母,但是它只打印列表和行中的第一个单词而不是所有列表和线 结果为: 所需的输出: 请帮助我获得期望的输出。答案将不胜感激! 问题答案: 文件对象是一个迭代器。迭代之后,它就筋疲力尽了,因此您的循环仅适用于第一个键。将这些行存储在中,这样就可以了。 另外,您也可以交换循环,因此只将文件迭代一次。如果

  • 关于合流博客 只有一次语义是可能的:Kafka就是这样做的 精确一次语义学:即使生产者重试发送消息,它也会导致消息仅一次传递给最终消费者。精确一次语义学是最理想的保证,但也是一个很少被理解的保证。这是因为它需要消息传递系统本身与生成和消费消息的应用程序之间的合作。例如,如果在成功消费消息后,您将Kafka消费者倒带到上一个偏移量,您将再次收到从该偏移量到最新偏移量的所有消息。这说明了为什么消息传递

  • 目前控制台打印循环中的所有值,但只需要打印最后一个