Project Icon

medium-zoom

轻量级JavaScript图片缩放库

medium-zoom为网站图片实现类Medium缩放效果。这个JavaScript库具有响应式设计、高清图像支持和自定义选项,可集成到主流前端框架中。它无外部依赖,支持多种交互方式,适用于提升网站的图片浏览体验。

演示

medium-zoom

一个像Medium那样缩放图片的JavaScript库

版本 MIT许可证 下载量
gzip大小 无依赖

Medium Zoom 演示

🔬 在线试玩🔎 演示📚 Storybook

目录

特性

  • 📱 响应式 — 在移动端和桌面端都能缩放
  • 🚀 高性能且轻量 — 优化以达到60帧每秒
  • ⚡️ 支持高清 — 缩放时加载图片的高清版本
  • 🔎 灵活性 — 可以对选定的图片应用缩放
  • 🖱 支持鼠标、键盘和手势 — 点击任意位置、按键或滚动都可关闭缩放
  • 🎂 事件处理 — 缩放进入新状态时触发事件
  • 📦 可定制 — 设置自己的边距、背景和滚动偏移量
  • 🔧 可扩展 — 为缩放添加自己的功能
  • 💎 自定义模板 — 扩展默认外观以匹配你的应用界面
  • 🔌 框架无关 — 适用于React、Vue、Angular、Svelte、Solid等

安装

该模块可在 npm 仓库中找到。

npm install medium-zoom
# 或
yarn add medium-zoom
下载
CDN

使用方法

在浏览器中试用

以模块方式导入库:

import mediumZoom from 'medium-zoom'

或通过script标签导入库:

<script src="node_modules/medium-zoom/dist/medium-zoom.min.js"></script>

就这么简单!你不需要导入任何CSS样式。

假设你给图片添加了data-zoomable属性:

mediumZoom('[data-zoomable]')

[!提示] 如果你想控制何时注入Medium Zoom的CSS样式,可以使用纯JavaScript包:

import mediumZoom from 'medium-zoom/dist/pure'
import 'medium-zoom/dist/style.css'

API

mediumZoom(selector?: string | HTMLElement | HTMLElement[] | NodeList, options?: object): Zoom

选择器

选择器用于将图片附加到缩放。它可以是以下类型之一:

// CSS选择器
mediumZoom('[data-zoomable]')

// HTMLElement
mediumZoom(document.querySelector('#cover'))

// NodeList
mediumZoom(document.querySelectorAll('[data-zoomable]'))

// 数组
const images = [
  document.querySelector('#cover'),
  ...document.querySelectorAll('[data-zoomable]'),
]

mediumZoom(images)

选项

选项用于自定义缩放。它们被定义为一个具有以下属性的对象:

属性类型默认值描述
marginnumber0缩放图片外的空间
backgroundstring"#fff"遮罩层的背景
scrollOffsetnumber40关闭缩放需要滚动的像素数
containerstring | HTMLElement | objectnull渲染缩放的视口
了解更多 →
templatestring | HTMLTemplateElementnull缩放时显示的模板元素
了解更多 →
mediumZoom('[data-zoomable]', {
  margin: 24,
  background: '#BADA55',
  scrollOffset: 0,
  container: '#zoom-container',
  template: '#zoom-template',
})

方法

open({ target?: HTMLElement }): Promise<Zoom>

打开缩放并返回一个解析为缩放对象的Promise。

const zoom = mediumZoom('[data-zoomable]')

zoom.open()

动画开始时触发open事件,完成时触发opened事件。

close(): Promise<Zoom>

关闭缩放并返回一个解析为缩放对象的Promise。

const zoom = mediumZoom('[data-zoomable]')

zoom.close()

动画开始时触发close事件,完成时触发closed事件。

toggle({ target?: HTMLElement }): Promise<Zoom>

当关闭时打开缩放,当打开时关闭缩放,并返回一个解析为缩放对象的Promise。

const zoom = mediumZoom('[data-zoomable]')

zoom.toggle()

attach(...selectors: string[] | HTMLElement[] | NodeList[] | Array[]): Zoom

将图片附加到缩放并返回缩放对象。

const zoom = mediumZoom()

zoom.attach('#image-1', '#image-2')
zoom.attach(
  document.querySelector('#image-3'),
  document.querySelectorAll('[data-zoomable]')
)

detach(...selectors: string[] | HTMLElement[] | NodeList[] | Array[]): Zoom

从缩放中释放图片并返回缩放对象。

const zoom = mediumZoom('[data-zoomable]')

zoom.detach('#image-1', document.querySelector('#image-2')) // 分离两张图片
zoom.detach() // 分离所有图片

在图片上触发detach事件。

update(options: object): Zoom

更新选项并返回缩放对象。

const zoom = mediumZoom('[data-zoomable]')

zoom.update({ background: '#BADA55' })

在缩放的每张图片上触发update事件。

clone(options?: object): Zoom

克隆缩放,将提供的选项与当前选项合并,并返回缩放对象。

const zoom = mediumZoom('[data-zoomable]', { background: '#BADA55' })

const clonedZoom = zoom.clone({ margin: 48 })

clonedZoom.getOptions() // => { background: '#BADA55', margin: 48, ... }

on(type: string, listener: () => void, options?: boolean | AddEventListenerOptions): Zoom

在缩放的每个目标上注册监听器。

使用与addEventListener相同的options

const zoom = mediumZoom('[data-zoomable]')

zoom.on('closed', event => {
  // 图片已关闭
})

zoom.on(
  'open',
  event => {
    // 图片已打开(仅跟踪一次)
  },
  { once: true }
)

缩放对象可在event.detail.zoom中访问。

off(type: string, listener: () => void, options?: boolean | AddEventListenerOptions): Zoom

移除之前在缩放的每个目标上注册的监听器。

使用与removeEventListener相同的options

const zoom = mediumZoom('[data-zoomable]')

function listener(event) {
  // ...
}

zoom.on('open', listener)
// ...
zoom.off('open', listener)

缩放对象可在event.detail.zoom中访问。

getOptions(): object

以对象形式返回缩放选项。

const zoom = mediumZoom({ background: '#BADA55' })

zoom.getOptions() // => { background: '#BADA55', ... }

getImages(): HTMLElement[]

HTMLElement数组形式返回附加到缩放的图片。

const zoom = mediumZoom('[data-zoomable]')

zoom.getImages() // => [HTMLElement, HTMLElement]

getZoomedImage(): HTMLElement

返回当前缩放的图像作为 HTMLElementnull(如果没有)。

const zoom = mediumZoom('[data-zoomable]')

zoom.getZoomedImage() // => null
zoom.open().then(() => {
  zoom.getZoomedImage() // => HTMLElement
})

属性

data-zoom-src

指定在缩放时打开的高清图像。当用户点击源图像时,此图像会加载。

<img src="https://raw.githubusercontent.com/francoischalifour/medium-zoom/master/image-thumbnail.jpg" data-zoom-src="image-hd.jpg" alt="我的图片" />

事件

事件描述
open当调用 open 方法时立即触发
opened当缩放动画完成时触发
close当调用 close 方法时立即触发
closed当缩小动画完成时触发
detach当调用 detach 方法时触发
update当调用 update 方法时触发
const zoom = mediumZoom('[data-zoomable]')

zoom.on('open', event => {
  // 在图像被缩放时进行跟踪
})

缩放对象可以通过 event.detail.zoom 访问。

框架集成

Medium Zoom 是一个可以与任何框架一起使用的 JavaScript 库。以下是一些可以快速入门的集成方案:

示例

从另一个元素触发缩放
const button = document.querySelector('[data-action="zoom"]')
const zoom = mediumZoom('#image')

button.addEventListener('click', () => zoom.open())
跟踪事件(用于分析)

你可以使用 open 事件来跟踪用户与图像交互的次数。这对于收集用户参与度的分析数据很有用。

let counter = 0
const zoom = mediumZoom('#image-tracked')

zoom.on('open', event => {
  console.log(`"${event.target.alt}" 已被缩放 ${++counter} 次`)
})
关闭后分离缩放
const zoom = mediumZoom('[data-zoomable]')

zoom.on('closed', () => zoom.detach(), { once: true })
附加 jQuery 元素

jQuery 元素在转换为数组后与 medium-zoom 兼容。

mediumZoom($('[data-zoomable]').toArray())
创建可缩放的 React 组件
import React, { useRef } from 'react'
import mediumZoom from 'medium-zoom'

export function ImageZoom({ options, ...props }) {
  const zoomRef = useRef(null)

  function getZoom() {
    if (zoomRef.current === null) {
      zoomRef.current = mediumZoom(options)
    }

    return zoomRef.current
  }

  function attachZoom(image) {
    const zoom = getZoom()

    if (image) {
      zoom.attach(image)
    } else {
      zoom.detach()
    }
  }

  return <img {...props} ref={attachZoom} />
}

你可以查看更多示例,包括 ReactVue,或者查看 storybook

调试

缩放的图像不可见

该库不为缩放的图像提供 z-index 值,以避免与其他框架冲突。某些框架可能为其元素指定了 z-index,导致缩放的图像不可见。

如果出现这种情况,你可以在 CSS 中提供 z-index 值:

.medium-zoom-overlay,
.medium-zoom-image--opened {
  z-index: 999;
}

浏览器支持

IEEdgeChromeFirefoxSafari
10*12*36349

* 这些浏览器在使用自定义模板时需要 template 填充

跨浏览器测试由以下机构赞助

BrowserStack

贡献

  • 运行 yarn 安装 Node 开发依赖
  • 运行 yarn start 以监视模式构建库
  • 运行 yarn run storybookhttp://localhost:9001 查看你的更改

请阅读贡献指南以获取更详细的说明。

你也可以使用 npm

许可证

MIT © François Chalifour

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号