当前位置:首页 > 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需要相应调整:

js 实现画廊

<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结构示例:

js 实现画廊

<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结构:

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

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

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…