图库:一张图片显示多个类别

Posted

技术标签:

【中文标题】图库:一张图片显示多个类别【英文标题】:Gallery: one image display in multiple categories 【发布时间】:2022-01-24 05:56:48 【问题描述】:

我找到了一个漂亮画廊的代码(html、CSS、javascript)。

在我的网站上使用响应式可过滤图片库按类别显示。

但是,只有一张图片只选择了一个类别。

如何更改此代码,一张图片可以显示2-3个类别?

此代码:https://jsfiddle.net/bvotcode/0okt4b5c/5/

HTML

<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">


</head>
<body>
  <div class="wrapper">
    <!-- filter Items -->
    <nav>
      <div class="items">
        <span class="item active" data-name="all">All</span>
        <span class="item" data-name="bag">Bag</span>
        <span class="item" data-name="shoe">Shoe</span>
        <span class="item" data-name="watch">Watch</span>
        <span class="item" data-name="camera">Camera</span>
        <span class="item" data-name="headphone">Headphone</span>
      </div>
    </nav>
    <!-- filter Images -->
    <div class="gallery">
       <div class="image" data-name="bag"><span><img src="https://i.imgur.com/eK1Xi1j.jpeg" ></span></div> 
      <div class="image" data-name="headphone"><span><img src="https://i.imgur.com/EFAjZo3.jpeg" ></span></div> 
      <div class="image" data-name="camera"><span><img src="https://i.imgur.com/FtJh53x.jpeg" ></span></div>
       <div class="image" data-name="shoe"><span><img src="https://i.imgur.com/2eMprWj.jpg" ></span></div> 
       <div class="image" data-name="headphone"><span><img src="https://i.imgur.com/fQwkTA0.jpeg" ></span></div>
      <div class="image" data-name="watch"><span><img src="https://i.imgur.com/J7SbiDH.png" ></span></div>
      <div class="image" data-name="shoe"><span><img src="https://i.imgur.com/J7SbiDH.png" ></span></div> 
       <div class="image" data-name="camera"><span><img src="https://i.imgur.com/J7SbiDH.png" ></span></div>
    </div>
  </div>
  <!-- fullscreen img preview box -->
  <div class="preview-box">
    <div class="details">
      <span class="title">Image Category: <p></p></span>
      <span class="icon fas fa-times"></span>
    </div>
    <div class="image-box"><img src="" ></div>
  </div>
  <div class="shadow"></div>



    </body>
    </html>


**CSS:**

    @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap');
*
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  font-family: 'Poppins', sans-serif;

::selection
  color: #fff;
  background: #007bff;

body
  padding: 10px;

.wrapper
  margin: 100px auto;
  max-width: 1100px;

.wrapper nav
  display: flex;
  justify-content: center;

.wrapper .items
  display: flex;
  max-width: 720px;
  width: 100%;
  justify-content: space-between;

.items span
  padding: 7px 25px;
  font-size: 18px;
  font-weight: 500;
  cursor: pointer;
  color: #007bff;
  border-radius: 50px;
  border: 2px solid #007bff;
  transition: all 0.3s ease;

.items span.active,
.items span:hover
  color: #fff;
  background: #007bff;


.gallery
  display: flex;
  flex-wrap: wrap;
  margin-top: 30px;

.gallery .image
  width: calc(100% / 4);
  padding: 7px;

.gallery .image span
  display: flex;
  width: 100%;
  overflow: hidden;

.gallery .image img
  width: 100%;
  vertical-align: middle;
  transition: all 0.3s ease;

.gallery .image:hover img
  transform: scale(1.1);

.gallery .image.hide
  display: none;

.gallery .image.show
  animation: animate 0.4s ease;

@keyframes animate 
  0%
    transform: scale(0.5);
  
  100%
    transform: scale(1);
  


.preview-box
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%) scale(0.9);
  background: #fff;
  max-width: 700px;
  width: 100%;
  z-index: 5;
  opacity: 0;
  pointer-events: none;
  border-radius: 3px;
  padding: 0 5px 5px 5px;
  box-shadow: 0px 0px 15px rgba(0,0,0,0.2);

.preview-box.show
  opacity: 1;
  pointer-events: auto;
  transform: translate(-50%, -50%) scale(1);
  transition: all 0.3s ease;

.preview-box .details
  padding: 13px 15px 13px 10px;
  display: flex;
  align-items: center;
  justify-content: space-between;

.details .title
  display: flex;
  font-size: 18px;
  font-weight: 400;

.details .title p
  font-weight: 500;
  margin-left: 5px;

.details .icon
  color: #007bff;
  font-style: 22px;
  cursor: pointer;

.preview-box .image-box
  width: 100%;
  display: flex;

.image-box img
  width: 100%;
  border-radius: 0 0 3px 3px;

.shadow
  position: fixed;
  left: 0;
  top: 0;
  height: 100%;
  width: 100%;
  z-index: 2;
  display: none;
  background: rgba(0,0,0,0.4);

.shadow.show
  display: block;


@media (max-width: 1000px) 
  .gallery .image
    width: calc(100% / 3);
  

@media (max-width: 800px) 
  .gallery .image
    width: calc(100% / 2);
  

@media (max-width: 700px) 
  .wrapper nav .items
    max-width: 600px;
  
  nav .items span
    padding: 7px 15px;
  

@media (max-width: 600px) 
  .wrapper
    margin: 30px auto;
  
  .wrapper nav .items
    flex-wrap: wrap;
    justify-content: center;
  
  nav .items span
    margin: 5px;
  
  .gallery .image
    width: 100%;
  

CSS

    //selecting all required elements
const filterItem = document.querySelector(".items");
const filterImg = document.querySelectorAll(".gallery .image");

window.onload = ()=> //after window loaded
  filterItem.onclick = (selectedItem)=> //if user click on filterItem div
    if(selectedItem.target.classList.contains("item")) //if user selected item has .item class
      filterItem.querySelector(".active").classList.remove("active"); //remove the active class which is in the first item
      selectedItem.target.classList.add("active"); //add that active class on user selected item
      let filterName = selectedItem.target.getAttribute("data-name"); //getting data-name value of user selected item and store in a filtername variable
      filterImg.forEach((image) => 
        let filterImges = image.getAttribute("data-name"); //getting image data-name value
        //if user selected item data-name value is equal to the image data-name value
        //or user selected item data-name value is equal to "all"
        if((filterImges == filterName) || (filterName == "all"))
          image.classList.remove("hide"); //first remove the hidden class from the image
          image.classList.add("show"); //add show class in image
        else
          image.classList.add("hide"); //add hide class in image
          image.classList.remove("show"); //remove show class from the image
        
      );
    
  
  for (let i = 0; i < filterImg.length; i++) 
    filterImg[i].setAttribute("onclick", "preview(this)"); //adding onclick attribute in all available images
  


//fullscreen image preview function
//selecting all required elements
const previewBox = document.querySelector(".preview-box"),
categoryName = previewBox.querySelector(".title p"),
previewImg = previewBox.querySelector("img"),
closeIcon = previewBox.querySelector(".icon"),
shadow = document.querySelector(".shadow");

function preview(element)
  //once user click on any image then removes the scroll bar from the body, so user cant scroll up or down
  document.querySelector("body").style.overflow = "hidden";
  let selectedPrevImg = element.querySelector("img").src; //getting user clicked image source link and stored in a variable
  let selectedImgCategory = element.getAttribute("data-name"); //getting user clicked image data-name value
  previewImg.src = selectedPrevImg; //passing the user clicked image source in preview image source
  categoryName.textContent = selectedImgCategory; //passing user clicked data-name value in category name
  previewBox.classList.add("show"); //show the preview image box
  shadow.classList.add("show"); //show the light grey background
  closeIcon.onclick = ()=> //if user click on close icon of preview box
    previewBox.classList.remove("show"); //hide the preview box
    shadow.classList.remove("show"); //hide the light grey background
    document.querySelector("body").style.overflow = "auto"; //show the scroll bar on body
  

谢谢。

【问题讨论】:

您的问题出现格式错误。标题是 CSS,后面的代码是 JS,CSS 是 HTML 部分。 【参考方案1】:

这可能不是最好的解决方案,但这是我想到的第一件事。

为图像添加多个类别名称,数据名称以特定字符分隔

&lt;div class="image" data-name="headphone,bag"&gt;&lt;span&gt;&lt;img src="..."/&gt;&lt;/span&gt;&lt;/div&gt;
当您比较所选类别和图像数据名称时,请执行以下操作(假设您选择分号)

...
let filterName = selectedItem.target.getAttribute("data-name");

filterImg.forEach((image) => 
  let filterImges = image.getAttribute("data-name").split(",");
  if((filterImges.includes(filterName)) || (filterName == "all"))
...

【讨论】:

以上是关于图库:一张图片显示多个类别的主要内容,如果未能解决你的问题,请参考以下文章

swiftui 2.0 图片库 onTapgesture 只显示数组中的第一张图片

如何在 ImageView 中显示图库中的图像?

Android图片下载到本地,系统图库不显示

从 Android Gallery 和 Picassa 中挑选一张图片

在文件夹中可以找到图片,为啥在图库中显示不出来? 我的手机是华为荣耀2

图库照片不见了怎么恢复?