当前位置:首页 > JavaScript

js 实现画廊

2026-02-02 05:33:51JavaScript

使用CSS Grid实现基础画廊布局

通过CSS Grid可以快速创建响应式画廊布局,以下是一个基础实现方案:

<div class="gallery">
  <img src="image1.jpg" alt="Image 1">
  <img src="image2.jpg" alt="Image 2">
  <img src="image3.jpg" alt="Image 3">
  <!-- 更多图片 -->
</div>
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  gap: 16px;
  padding: 16px;
}

.gallery img {
  width: 100%;
  height: auto;
  object-fit: cover;
  border-radius: 8px;
  transition: transform 0.3s ease;
}

.gallery img:hover {
  transform: scale(1.03);
}

添加Lightbox图片预览功能

实现点击图片放大预览的交互效果:

document.querySelectorAll('.gallery img').forEach(img => {
  img.addEventListener('click', function() {
    const lightbox = document.createElement('div');
    lightbox.id = 'lightbox';
    document.body.appendChild(lightbox);

    const enlargedImg = document.createElement('img');
    enlargedImg.src = this.src;
    lightbox.appendChild(enlargedImg);

    lightbox.addEventListener('click', e => {
      if (e.target !== enlargedImg) {
        lightbox.remove();
      }
    });
  });
});
#lightbox {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.8);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1000;
}

#lightbox img {
  max-width: 90%;
  max-height: 90%;
}

实现图片懒加载优化性能

对于包含大量图片的画廊,懒加载可以显著提升页面性能:

const lazyImages = document.querySelectorAll('.gallery img[data-src]');

const lazyLoad = target => {
  const io = new IntersectionObserver((entries, observer) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        const img = entry.target;
        img.src = img.dataset.src;
        img.onload = () => img.removeAttribute('data-src');
        observer.disconnect();
      }
    });
  });

  io.observe(target);
};

lazyImages.forEach(lazyLoad);

HTML需要相应调整:

<img data-src="image1.jpg" alt="Image 1">

添加图片分类过滤功能

实现按类别筛选显示图片的功能:

const filterButtons = document.querySelectorAll('.filter-btn');
const galleryItems = document.querySelectorAll('.gallery-item');

filterButtons.forEach(button => {
  button.addEventListener('click', () => {
    const filterValue = button.dataset.filter;

    galleryItems.forEach(item => {
      if (filterValue === 'all' || item.dataset.category === filterValue) {
        item.style.display = 'block';
      } else {
        item.style.display = 'none';
      }
    });
  });
});

HTML结构示例:

<div class="filter-controls">
  <button class="filter-btn" data-filter="all">All</button>
  <button class="filter-btn" data-filter="nature">Nature</button>
  <button class="filter-btn" data-filter="urban">Urban</button>
</div>

<div class="gallery">
  <div class="gallery-item" data-category="nature">
    <img src="nature1.jpg" alt="Nature">
  </div>
  <!-- 更多项目 -->
</div>

实现无限滚动加载更多

当用户滚动到页面底部时自动加载更多图片:

let isLoading = false;
let page = 1;

window.addEventListener('scroll', () => {
  if (window.innerHeight + window.scrollY >= document.body.offsetHeight - 500 && !isLoading) {
    isLoading = true;
    page++;
    loadMoreImages(page);
  }
});

async function loadMoreImages(pageNum) {
  try {
    const response = await fetch(`/api/images?page=${pageNum}`);
    const newImages = await response.json();

    newImages.forEach(img => {
      const imgElement = document.createElement('img');
      imgElement.src = img.url;
      document.querySelector('.gallery').appendChild(imgElement);
    });
  } catch (error) {
    console.error('Error loading more images:', error);
  } finally {
    isLoading = false;
  }
}

添加图片排序功能

允许用户按不同条件排序图片:

const sortSelect = document.getElementById('sort-by');

sortSelect.addEventListener('change', () => {
  const gallery = document.querySelector('.gallery');
  const items = Array.from(gallery.children);

  items.sort((a, b) => {
    const valueA = a.dataset[sortSelect.value];
    const valueB = b.dataset[sortSelect.value];

    if (sortSelect.value === 'date') {
      return new Date(valueA) - new Date(valueB);
    } else {
      return valueA.localeCompare(valueB);
    }
  });

  items.forEach(item => gallery.appendChild(item));
});

HTML结构:

js 实现画廊

<select id="sort-by">
  <option value="date">By Date</option>
  <option value="title">By Title</option>
</select>

标签: 画廊js
分享给朋友:

相关文章

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似:…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…