mcpField
I
image-zoom-360

image-zoom-360

github.com/finsilabs设计与 UI6083 次安装6 天前更新
代码仓库

关于 image-zoom-360

用于在电商商品页实现更丰富媒体体验的技能,涵盖图片缩放、360 度旋转展示和视频。为商家及店面开发者提供平台配置与自定义图库实现指导。

主要功能

  1. 01高分辨率图片缩放
  2. 02移动端捏合缩放指导
  3. 03360 度旋转查看器
  4. 04图库内播放商品视频
  5. 05媒体加载性能优化

适用场景

  1. 01为服装或电子产品页添加细节查看
  2. 02用照片序列展示商品旋转效果
  3. 03在商品图库中呈现视频
  4. 04改善商品页媒体加载

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill image-zoom-360

安装后在 Claude Code 中输入/image-zoom-360确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

tile.json
evals/360-degree-spin-viewer/
criteria.json
task.md
evals/css-lens-zoom-component/
criteria.json
task.md
evals/video-integration-and-cdn-image-optimiza/
criteria.json
task.md

详细介绍

图像缩放与 360 度视图

概述

打造丰富的商品媒体体验,包括悬停时高清缩放、移动设备上的原生触控双指缩放、通过一组图像实现 360 度旋转视图,以及内嵌视频播放。对于时尚、珠宝、电子产品及其他注重细节的品类,丰富的媒体展示与较低的退货率和较高的转化率相关。

何时使用此技能

  • 商品退货率较高,更多视觉细节有助于降低退货率时
  • 为时尚、珠宝、电子产品或其他注重细节的品类实现商品详情页时
  • 从单张静态图片升级为完整的媒体图库时
  • 集成包含 360 度旋转素材的商品摄影工作流时
  • 商品视频需要以内嵌方式显示在 PDP 上时

核心说明

步骤 1:确定商家的平台并选择合适的方案
平台推荐方案原因
Shopify使用 OS2.0 主题(Dawn、Sense)内置的媒体支持 + Magic Zoom Plus 应用或用于 360 度视图的 Swiper GalleryDawn 原生支持在媒体图库中显示商品图片、视频和 3D 模型;Magic Zoom Plus(一次性收费 $69)无需修改主题即可添加悬停缩放和 360 度旋转
WooCommerce安装 WooCommerce Product Gallery Slider 或 YITH WooCommerce Zoom Magnifier(免费/高级版)WooCommerce 自带基础图库;YITH Zoom Magnifier 可添加悬停缩放和灯箱;Product Gallery Slider 可添加滑动、缩略图和视频支持
BigCommerce使用 Cornerstone 主题内置的缩放功能(默认启用悬停缩放)+ 安装 Magic 360 或 Sirv 应用以显示旋转视图Cornerstone 提供原生缩放;Sirv(每月 $20 起)通过 Stencil 小组件提供托管式 360 度旋转和缩放 CDN
自定义 / 无头架构使用 CSS transform 缩放、Pointer Events API 双指缩放和基于帧的旋转查看器,构建自定义图库组件完全掌控性能和用户体验;参见下方实现
步骤 2:设置商品图库

Shopify

内置媒体图库(无需应用):

  1. 在商品管理后台(Products → [product] → Media)上传图片、添加 YouTube/Vimeo 视频 URL,并上传 .glb 文件作为 3D 模型
  2. Shopify OS2.0 主题(Dawn、Sense、Craft)会自动在图库中显示所有媒体类型——图片、视频和 3D 模型
  3. 在 Online Store → Themes → Customize 中,前往商品页面模板并找到 Product media 区域:
    • 启用 Image zoom(悬停时显示放大镜)
    • 将 Media size 设为 Large 或 Extra Large,以获得更好的缩放效果
    • 为商品视频启用 Video looping
  4. 对于特定款式的图片:在 Products → [product] → Variants → [variant] → Image 中为款式指定图片——买家选择相应款式时,图库会自动切换到该款式图片

360 度旋转视图——Magic Zoom Plus(一次性收费 $69):

  1. 从 Shopify App Store 安装
  2. 将旋转序列图片上传为带编号的文件(例如,product-001.jpg 到 product-036.jpg)
  3. 此应用会创建一个嵌入商品页面的旋转查看器小组件,无需修改主题代码

WooCommerce

内置缩放(无需插件):

WooCommerce 默认在商品页面提供基础图片缩放功能(由 Zoom.js 提供支持)。配置方法:

  1. 前往 WooCommerce → Settings → Products → Display
  2. 在 Product Images 下设置 Zoom 行为:启用、禁用或内部缩放
  3. 上传高分辨率图片(至少 1000×1000px)——缩放功能会使用完整的上传图片

YITH WooCommerce Zoom Magnifier(免费 + 高级版):

  1. 从 WordPress.org 安装
  2. 前往 YITH → Zoom Magnifier → Settings
  3. 配置缩放类型:Inner(在图片容器内放大)、Outer(在图片旁显示放大面板)或 Lens(圆形放大镜随光标移动)
  4. 启用灯箱,以便点击后全屏缩放

Product Gallery Slider(免费 — WooCommerce.com):

  1. 安装并启用
  2. 为内置 WooCommerce 图库添加滑动支持、缩略图条和全屏灯箱
  3. 支持在图库中使用视频缩略图(YouTube/Vimeo)

**360 度视图:**使用 WooCommerce 360° Image 插件(免费,wordpress.org)——将编号后的旋转帧作为商品图片上传,并在文件名前加上 360_ 前缀,插件便会创建可拖动旋转的查看器。


BigCommerce

内置缩放(Cornerstone 主题):

  1. 前往 Storefront → My Themes → Customize
  2. 在 Product Page → Image 下启用 Image zoom(默认启用悬停缩放)
  3. 将 Image size 设为 Large,以获得更好的缩放画质 — BigCommerce 会自动以多种尺寸提供图片

Sirv(托管式 360 度旋转 + 缩放 CDN):

  1. 从 BigCommerce App Marketplace 安装 Sirv
  2. 将旋转序列图片上传到 Sirv 的 CDN — 它会自动检测编号序列
  3. 将 Sirv 嵌入代码粘贴到商品描述中,或使用 Sirv BigCommerce 小组件
  4. Sirv 还会通过其 CDN 提供所有商品图片,并自动转换为 WebP 格式

商品视频:

  1. 在 BigCommerce 商品管理后台的媒体区域中,点击 Add Video 并粘贴 YouTube 或 Vimeo URL
  2. 视频会自动作为缩略图条目显示在商品图库中

自定义 / 无头架构

CSS 悬停缩放(无需 JavaScript 加载图片):

// ZoomImage.jsx
import { useState, useRef } from 'react';

export function ZoomImage({ src, alt }) {
  const [zoom, setZoom] = useState(null);
  const containerRef = useRef(null);

  function handleMouseMove(e) {
    const rect = containerRef.current.getBoundingClientRect();
    const x = ((e.clientX - rect.left) / rect.width) * 100;
    const y = ((e.clientY - rect.top) / rect.height) * 100;
    setZoom({ x, y });
  }

  return (
    <div
      ref={containerRef}
      className="zoom-container"
      onMouseMove={handleMouseMove}
      onMouseLeave={() => setZoom(null)}
    >
      <img
        src={src}
        alt={alt}
        className="zoom-image"
        style={zoom ? {
          transformOrigin: `${zoom.x}% ${zoom.y}%`,
          transform: 'scale(2.5)',
        } : {}}
        draggable={false}
      />
    </div>
  );
}
.zoom-container { overflow: hidden; cursor: crosshair; aspect-ratio: 1/1; }
.zoom-image { width: 100%; height: 100%; object-fit: cover; transition: transform 0.05s linear; will-change: transform; }

360 度旋转查看器:

// SpinViewer.jsx — preloads all frames, switches on drag
export function SpinViewer({ frames, productName = 'Product' }) {
  const [frameIndex, setFrameIndex] = useState(0);
  const [loaded, setLoaded] = useState(false);
  const dragStart = useRef(null);

  useEffect(() => {
    let count = 0;
    frames.forEach(src => {
      const img = new Image();
      img.src = src;
      img.onload = () => { if (++count === frames.length) setLoaded(true); };
    });
  }, [frames]);

  function handleDragStart(e) { dragStart.current = e.clientX ?? e.touches?.[0]?.clientX; }
  function handleDragMove(e) {
    if (dragStart.current === null) return;
    const clientX = e.clientX ?? e.touches?.[0]?.clientX;
    const delta = Math.round((clientX - dragStart.current) / 8);
    if (delta !== 0) {
      setFrameIndex(i => ((i + delta) % frames.length + frames.length) % frames.length);
      dragStart.current = clientX;
    }
  }
  function handleDragEnd() { dragStart.current = null; }

  if (!loaded) return <div aria-label="Loading 360 view">Loading...</div>;
  return (
    <div
      onMouseDown={handleDragStart} onMouseMove={handleDragMove}
      onMouseUp={handleDragEnd} onMouseLeave={handleDragEnd}
      onTouchStart={handleDragStart} onTouchMove={handleDragMove} onTouchEnd={handleDragEnd}
      aria-label="360 degree product view — drag to rotate"
      role="img" style={{ cursor: 'ew-resize' }}
    >
      <img src={frames[frameIndex]} alt={`${productName}, frame ${frameIndex + 1} of ${frames.length}`} draggable={false} />
      <span aria-hidden="true" style={{ fontSize: '0.75rem', color: '#666' }}>Drag to rotate</span>
    </div>
  );
}
第 3 步:优化媒体性能

无论使用哪个平台,都请遵循以下媒体指南:

  1. 主视觉图片:为保证缩放画质,上传最长边至少为 2000px 的图片;平台会自动缩小图片以生成缩略图
  2. 格式:如果平台支持,请上传 WebP 图片 — Shopify、BigCommerce 和 Sirv 会自动转换;对于 WooCommerce,请使用 Imagify 或 ShortPixel 插件
  3. 360 度旋转帧:24-36 帧最为合适;按每帧 30 KB(优化后的 JPEG)计算,完整序列总大小不到 1 MB
  4. 视频:将 MP4 直接上传到 Shopify/BigCommerce,或嵌入 YouTube/Vimeo 以降低托管成本;务必包含海报图片
  5. LCP(最大内容绘制):主商品图片几乎总是 LCP 元素 — 确保以高优先级加载

最佳实践

  • 图片显示尺寸应为渲染尺寸的 2 倍,以适配 Retina 屏幕,但不要更大 — 400px 的容器需要 800px 的图片,而不是 2000px
  • 使用 WebP 或 AVIF 格式 — 在画质相当的情况下,比 JPEG 小 30-50%
  • 预加载主视觉图片 — 为第一张商品图片添加 fetchpriority="high" 和 loading="eager"
  • 延迟加载非主视觉媒体 — 缩略图、360 度旋转帧 2–N 和视频应在首次交互后加载
  • 为 360 度视图显示加载状态 — 预加载 36 帧在移动设备上可能需要几秒钟;请显示进度指示器
  • 为拖动交互提供键盘替代操作 — 360 度旋转除了支持鼠标拖动外,还应支持左右方向键
  • 避免自动播放声音 — 静音自动播放可以接受;大多数浏览器会阻止音频自动播放

常见问题

问题解决方案
Zoom CSS transform 导致布局偏移在容器上使用 will-change: transform 和 overflow: hidden,避免缩放后的图像导致相邻元素重新排版
360 度旋转在移动设备上卡顿将帧更新节流至每次 requestAnimationFrame 更新一次;不要在每个 touchmove 事件中调用 setState
视频在 iOS 上无法自动播放添加 playsInline 和 muted 属性;iOS 要求同时设置这两个属性,才能在没有用户手势的情况下自动播放
主视觉大图导致 LCP 分数较差为主产品图片添加 fetchpriority="high" 和 loading="eager";使用 Lighthouse 验证
360 度素材体积过大(36 × 500 KB)通过 CDN 将宽度设为 800px,并使用 JPEG 质量 75,将每帧控制在 20–40 KB

相关技能

  • @product-page-design
  • @responsive-storefront
  • @accessibility-commerce
  • @image-optimization-cdn

评论

支持 Markdown