ImageViewer

建立於 5 天前
更新於 5 天前
ImageViewer 是一个轻量级的纯 JavaScript 图片查看器库,无需任何第三方依赖。提供了丰富的交互功能,包括缩放、拖拽、键盘快捷键等,适用于各种 Web 项目。
總安裝量
20
今日新增
+0
使用者評分
- / 5.0 (0)
目前版本
1.0.0
// @require https://scriptcat.org/lib/4625/1.0.0/ImageViewer.js?sha384-SX26HDt5ICRIw03Z4JwZWNqMyVgZKHTQQ4Q4S6wDhvNir2NBro81yWtdPq7rPMcm
庫詳情
這是一個使用者腳本使用的庫,你可以在你的腳本中直接引用它。

ImageViewer 图片查看器 - 使用说明文档

📖 简介

ImageViewer 是一个轻量级的纯 JavaScript 图片查看器库,无需任何第三方依赖。提供了丰富的交互功能,包括缩放、拖拽、键盘快捷键等,适用于各种 Web 项目。
特点:

  • 🚀 零依赖,纯原生 JavaScript
  • 📦 体积小巧,代码简洁
  • 🎨 界面美观,交互流畅
  • 📱 响应式设计,支持移动端
  • ⚡ 性能优秀,内存占用低

🎯 功能特性

核心功能

功能 描述
遮罩层显示 黑色半透明背景(90%透明度)
图片居中 自动将图片居中显示在视口中
尺寸自适应 默认大小不超过视口的 90%
滚轮缩放 向上滚动放大,向下滚动缩小
拖拽移动 缩放后可用鼠标拖拽查看
ESC关闭 按 ESC 键快速关闭
点击关闭 点击遮罩层或关闭按钮关闭
防止背景滚动 打开时禁止背景页面滚动
响应式设计 自动适配不同屏幕尺寸

键盘快捷键

按键 功能
ESC 关闭图片查看器

鼠标操作

操作 功能
滚轮向上 放大图片
滚轮向下 缩小图片
点击拖拽 移动图片(仅在缩放后可用)
点击遮罩 关闭查看器
点击关闭按钮 关闭查看器

📥 安装

方式1:直接引入

下载 image-viewer.js 文件,然后在 HTML 中引入:

<script src="path/to/image-viewer.js"></script>

方式2:ES6 模块

import ImageViewer from './image-viewer.js';

方式3:NPM(如果发布到 npm)

npm install your-image-viewer
const ImageViewer = require('your-image-viewer');// 或import ImageViewer from 'your-image-viewer';

🚀 快速开始

基础用法

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>图片查看器示例</title>
</head>
<body>
  <img src="photo.jpg" id="myImage" style="cursor: pointer;">

  <script src="image-viewer.js"></script>
  <script>
    // 创建查看器实例
    const viewer = new ImageViewer();

    // 绑定图片点击事件
    document.getElementById('myImage').addEventListener('click', function() {
      viewer.open(this.src);
    });
  </script>
</body>
</html>

便捷方法(推荐)

使用 bindImages 静态方法快速为多张图片添加查看功能:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>图片查看器 - 便捷方法</title>
</head>
<body>
  <!-- 为图片添加 data-viewer 属性 -->
  <img src="photo1.jpg" data-viewer alt="图片1">
  <img src="photo2.jpg" data-viewer alt="图片2">
  <img src="photo3.jpg" data-viewer alt="图片3">

  <script src="image-viewer.js"></script>
  <script>
    // 一行代码搞定!
    ImageViewer.bindImages('img[data-viewer]');
  </script>
</body>
</html>

🔧 配置选项

构造函数参数

const viewer = new ImageViewer({
  maxZoom: 5,        // 最大缩放倍数,默认 5
  minZoom: 0.5,      // 最小缩放倍数,默认 0.5
  zoomStep: 0.1      // 每次滚轮缩放的步长,默认 0.1
});

配置示例

// 允许更大的缩放范围
const viewer = new ImageViewer({
  maxZoom: 10,
  minZoom: 0.2,
  zoomStep: 0.2
});
// 更精细的缩放控制
const viewer2 = new ImageViewer({
  maxZoom: 3,
  minZoom: 0.8,
  zoomStep: 0.05
});

📚 API 文档

实例方法

viewer.open(src)

打开图片查看器并显示指定图片。
参数:

  • src (string) - 图片的 URL 地址

示例:

const viewer = new ImageViewer();
viewer.open('https://example.com/photo.jpg');

viewer.close()

关闭图片查看器。
示例:

viewer.close();

viewer.destroy()

销毁查看器实例,移除所有事件监听器和 DOM 元素。
示例:

viewer.destroy();

静态方法

ImageViewer.bindImages(selector)

批量为图片添加点击查看功能。
参数:

  • selector (string) - CSS 选择器,默认为 'img[data-viewer]'

返回值:

  • ImageViewer - 返回创建的查看器实例

示例:

// 使用默认选择器const viewer = ImageViewer.bindImages();// 自定义选择器const viewer2 = ImageViewer.bindImages('.gallery img');// 为特定类名的图片添加查看功能const viewer3 = ImageViewer.bindImages('.viewable');

💡 使用场景示例

场景1:相册画廊

<div class="gallery">
  <img src="photo1.jpg" data-viewer>
  <img src="photo2.jpg" data-viewer>
  <img src="photo3.jpg" data-viewer>
  <img src="photo4.jpg" data-viewer>
</div>

<style>
  .gallery {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 20px;
    padding: 20px;
  }
  .gallery img {
    width: 100%;
    height: 200px;
    object-fit: cover;
    cursor: pointer;
    border-radius: 8px;
    transition: transform 0.3s;
  }
  .gallery img:hover {
    transform: scale(1.05);
  }
</style>

<script>
  ImageViewer.bindImages('img[data-viewer]');
</script>

场景2:产品详情页

<div class="product">
  <img src="product-main.jpg" class="product-image" alt="产品主图">
  <div class="thumbnails">
    <img src="product-thumb1.jpg" class="thumb" data-full="product-1.jpg">
    <img src="product-thumb2.jpg" class="thumb" data-full="product-2.jpg">
    <img src="product-thumb3.jpg" class="thumb" data-full="product-3.jpg">
  </div>
</div>

<script>
  const viewer = new ImageViewer();
  
  // 主图点击查看
  document.querySelector('.product-image').addEventListener('click', function() {
    viewer.open(this.src);
  });
  
  // 缩略图点击查看大图
  document.querySelectorAll('.thumb').forEach(thumb => {
    thumb.addEventListener('click', function() {
      const fullSrc = this.getAttribute('data-full');
      viewer.open(fullSrc);
    });
  });
</script>

场景3:文章内图片

<article class="blog-post">
  <h1>文章标题</h1>
  <p>这是一段文字...</p>
  <img src="article-image1.jpg" class="content-image" alt="配图1">
  <p>更多内容...</p>
  <img src="article-image2.jpg" class="content-image" alt="配图2">
</article>

<script>
  ImageViewer.bindImages('.content-image');
</script>

场景4:动态加载图片

const viewer = new ImageViewer();

// Ajax 获取图片数据
fetch('/api/images')
  .then(response => response.json())
  .then(images => {
    const container = document.getElementById('image-container');
    
    images.forEach(image => {
      const img = document.createElement('img');
      img.src = image.thumbnail;
      img.dataset.full = image.fullSize;
      img.style.cursor = 'pointer';
      
      img.addEventListener('click', function() {
        viewer.open(this.dataset.full);
      });
      
      container.appendChild(img);
    });
  });

场景5:多个独立查看器

// 为不同区域创建独立的查看器实例
const galleryViewer = new ImageViewer({
  maxZoom: 8,
  zoomStep: 0.2
});

const productViewer = new ImageViewer({
  maxZoom: 3,
  zoomStep: 0.1
});

// 画廊图片
document.querySelectorAll('.gallery img').forEach(img => {
  img.addEventListener('click', () => galleryViewer.open(img.src));
});

// 产品图片
document.querySelectorAll('.product img').forEach(img => {
  img.addEventListener('click', () => productViewer.open(img.src));
});

🎨 自定义样式

虽然 ImageViewer 使用内联样式,但你仍然可以通过 CSS 覆盖默认样式:

/* 自定义遮罩层背景 */
.image-viewer-overlay {
  background: rgba(0, 0, 0, 0.95) !important;
}

/* 自定义关闭按钮样式 */
.image-viewer-close {
  background: rgba(255, 0, 0, 0.8) !important;
  font-size: 30px !important;
  width: 40px !important;
  height: 40px !important;
}

.image-viewer-close:hover {
  background: rgba(255, 0, 0, 1) !important;
}

/* 自定义图片边框 */
.image-viewer-image {
  border: 3px solid white !important;
  box-shadow: 0 0 30px rgba(0, 0, 0, 0.5) !important;
}

⚠️ 注意事项

1. 跨域图片

如果图片来自其他域名,请确保服务器配置了正确的 CORS 头:

Access-Control-Allow-Origin: *

2. 图片加载失败

建议添加错误处理:

const img = document.querySelector('#myImage');
img.addEventListener('error', function() {
  console.error('图片加载失败');
});

3. 移动端优化

在移动端使用时,建议添加 viewport 元标签:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

4. 内存管理

如果页面有大量图片或长时间运行,建议在不需要时销毁查看器:

const viewer = new ImageViewer();// 使用完毕后viewer.destroy();

5. 性能建议

  • 使用适当大小的图片,避免加载过大的原图
  • 考虑使用缩略图 + 大图的方案
  • 大量图片时使用懒加载技术

🔍 故障排除

问题1:图片不能拖拽

原因: 只有当图片缩放大于 1 时才能拖拽。
解决: 先使用滚轮放大图片,然后再尝试拖拽。

问题2:关闭按钮不显示

原因: 可能被其他元素遮挡或 z-index 不够高。
解决: 检查页面其他元素的 z-index 值,确保不超过 9999。

问题3:背景仍然可以滚动

原因: 可能有其他 JavaScript 代码干扰了 overflow 属性。
解决: 检查其他代码,或手动设置:

viewer.open(src);document.body.style.overflow = 'hidden';

问题4:滚轮缩放不流畅

原因: zoomStep 值设置过大。
解决: 调小 zoomStep 值:

const viewer = new ImageViewer({  zoomStep: 0.05  // 更精细的缩放});

🌐 浏览器兼容性

浏览器 版本 支持情况
Chrome 60+ ✅ 完全支持
Firefox 55+ ✅ 完全支持
Safari 11+ ✅ 完全支持
Edge 79+ ✅ 完全支持
IE 11 ⚠️ 需要 polyfill

IE11 支持: 需要添加以下 polyfill:

  • Promise
  • Object.assign
  • Array.from

📄 许可证

MIT License