当前位置:首页 > JavaScript

js实现查看大图

2026-01-31 02:13:49JavaScript

使用原生JavaScript实现查看大图功能

通过监听图片点击事件,动态创建遮罩层和大图容器,实现点击查看大图效果。

// 获取所有需要查看大图的图片元素
const images = document.querySelectorAll('.thumbnail');

images.forEach(img => {
  img.addEventListener('click', function() {
    // 创建遮罩层
    const overlay = document.createElement('div');
    overlay.style.position = 'fixed';
    overlay.style.top = '0';
    overlay.style.left = '0';
    overlay.style.width = '100%';
    overlay.style.height = '100%';
    overlay.style.backgroundColor = 'rgba(0,0,0,0.8)';
    overlay.style.zIndex = '1000';
    overlay.style.display = 'flex';
    overlay.style.justifyContent = 'center';
    overlay.style.alignItems = 'center';

    // 创建大图容器
    const largeImg = document.createElement('img');
    largeImg.src = this.src;
    largeImg.style.maxWidth = '90%';
    largeImg.style.maxHeight = '90%';
    largeImg.style.objectFit = 'contain';

    // 点击遮罩层关闭大图
    overlay.addEventListener('click', function() {
      document.body.removeChild(overlay);
    });

    overlay.appendChild(largeImg);
    document.body.appendChild(overlay);
  });
});

使用CSS过渡动画增强体验

为大图的显示和隐藏添加平滑的过渡效果,提升用户体验。

/* CSS部分 */
.large-image-container {
  opacity: 0;
  transition: opacity 0.3s ease;
}

.large-image-container.show {
  opacity: 1;
}
// JavaScript部分
// 在创建大图容器后添加
setTimeout(() => {
  overlay.classList.add('show');
}, 10);

// 关闭时先移除show类
overlay.addEventListener('click', function() {
  overlay.classList.remove('show');
  setTimeout(() => {
    document.body.removeChild(overlay);
  }, 300);
});

支持键盘操作和手势缩放

添加键盘ESC关闭功能,并支持触摸设备的手势缩放。

// 添加键盘事件监听
document.addEventListener('keydown', function(e) {
  if (e.key === 'Escape' && document.querySelector('.overlay')) {
    const overlay = document.querySelector('.overlay');
    overlay.classList.remove('show');
    setTimeout(() => {
      document.body.removeChild(overlay);
    }, 300);
  }
});

// 添加触摸手势支持
let initialDistance = null;

overlay.addEventListener('touchstart', function(e) {
  if (e.touches.length === 2) {
    initialDistance = Math.hypot(
      e.touches[0].clientX - e.touches[1].clientX,
      e.touches[0].clientY - e.touches[1].clientY
    );
  }
});

overlay.addEventListener('touchmove', function(e) {
  if (e.touches.length === 2 && largeImg) {
    const currentDistance = Math.hypot(
      e.touches[0].clientX - e.touches[1].clientX,
      e.touches[0].clientY - e.touches[1].clientY
    );

    if (initialDistance) {
      const scale = currentDistance / initialDistance;
      largeImg.style.transform = `scale(${scale})`;
    }
  }
});

overlay.addEventListener('touchend', function() {
  initialDistance = null;
  if (largeImg) {
    largeImg.style.transform = 'scale(1)';
  }
});

预加载大图优化性能

在鼠标悬停时预加载大图,减少点击后的等待时间。

images.forEach(img => {
  // 预加载大图
  const largeImage = new Image();
  largeImage.src = img.dataset.largeSrc || img.src;

  img.addEventListener('mouseenter', function() {
    largeImage.src = this.dataset.largeSrc || this.src;
  });

  img.addEventListener('click', function() {
    // 使用预加载的图片
    if (largeImage.complete) {
      largeImg.src = largeImage.src;
    } else {
      largeImage.onload = function() {
        largeImg.src = largeImage.src;
      };
    }
  });
});

响应式设计适配不同设备

根据设备屏幕尺寸调整大图显示方式。

function adjustImageSize() {
  const windowWidth = window.innerWidth;
  const windowHeight = window.innerHeight;

  if (largeImg) {
    if (windowWidth < 768) {
      largeImg.style.maxWidth = '95%';
      largeImg.style.maxHeight = '95%';
    } else {
      largeImg.style.maxWidth = '80%';
      largeImg.style.maxHeight = '80%';
    }
  }
}

window.addEventListener('resize', adjustImageSize);

// 在创建大图时调用
adjustImageSize();

js实现查看大图

标签: 大图js
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Pa…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…