elmhurs/panzoom

一个使用 CSS3 实现元素平移和缩放的 jQuery 插件。

dev-main 2021-02-17 15:12 UTC

This package is not auto-updated.

Last update: 2024-09-27 07:53:55 UTC


README

Build Status

示例

Panzoom 是一个小型库 (~3.7kb gzipped),用于向元素添加平移和缩放功能。Panzoom 不使用绝对定位或设置宽度和高度,而是使用 CSS 变换来利用浏览器中的硬件/GPU 加速,这意味着元素可以是 任何东西:一张图片、一个视频、一个 iframe、一个 canvas、文本,等等。

对于常见支持问题,请参阅 常见问题解答

浏览器支持

以下是当前支持的浏览器列表:链接

移动支持

iOS、Android 和 Windows Mobile 支持。

Panzoom 包括对触摸手势的支持,甚至支持 捏合手势 进行缩放。它非常适合移动和桌面浏览器。它默认在任何支持的地方使用 pointer events

SVG 支持

Panzoom 支持直接平移和缩放 SVG 元素。

在 IE11 中,CSS 动画/过渡在 SVG 元素上不工作,至少对于 transform 样式来说是这样。在其他浏览器中它们是工作的。

可以在 IE11 中使用 setTransform 选项手动实现过渡,并集成一个用于javascript动画的插值库(如 tween.js)。

安装

使用 npm

$ npm install --save @panzoom/panzoom

使用 yarn

$ yarn add @panzoom/panzoom

Panzoom 使用 UMD,可以通过多种方式加载。

使用 ES6 导入

import Panzoom from '@panzoom/panzoom'

使用 commonjs 或 browserify

const Panzoom = require('@panzoom/panzoom')

在一个匿名模块中使用 AMD 加载器

define(['@panzoom/panzoom'], function (Panzoom) {
  const elem = document.getElementById('panzoom-element')
  Panzoom(elem)
})

使用 script 标签

<script src="/js/panzoom.js"></script>

使用方法

const elem = document.getElementById('panzoom-element')
const panzoom = Panzoom(elem, {
  maxScale: 5
})
panzoom.pan(10, 10)
panzoom.zoom(2, { animate: true })

// Panning and pinch zooming are bound automatically (unless disablePan is true).
// There are several available methods for zooming
// that can be bound on button clicks or mousewheel.
button.addEventListener('click', panzoom.zoomIn)
elem.parentElement.addEventListener('wheel', panzoom.zoomWithWheel)

常见问题解答

1. transform-origin 是什么,为什么要在 panzoom 元素上添加它?

  • transform-origin 是应用变换的起点。Panzoom 确保默认设置为预期的计算焦点缩放。
  • HTML 元素的默认值为 '50% 50%'。
  • SVG 元素的默认值为 '0 0'。

2. 我在使用 Panzoom 和 <object> 标签时遇到了问题。什么问题?

Object 元素会消耗事件,使得事件永远不会到达 Panzoom。要修复此问题,请在 <object> 标签上禁用指针事件 (pointer-events: none) 并使用包装器调用 Panzoom。

我的链接没有工作!我如何在 panzoom 元素内启用锚点?

options.excludeClass 类(默认为 "panzoom-exclude")添加到您想要可点击的任何元素。Panzoom 在处理事件之前将检查此类。或者,将元素的引用添加到 exclude 选项中,或者在可点击元素的的事件处理器中调用 event.stopImmediatePropagation()

关于 Panzoom 的异步性质的一则注释

在某些情况下,同步设置一项然后再设置另一项可能不会按预期工作。

例如,以下通常可以正常工作。

const panzoom = Panzoom(elem)
panzoom.zoom(2)
panzoom.pan(100, 100)

但是,您可能会发现当设置了 contain 选项时,事物开始出现问题。

这是由于 Panzoom 为了检索正确的尺寸,需要绘制比例。

如果您发现事物看起来不太对劲,请尝试以下操作...

panzoom.zoom(2)
setTimeout(() => panzoom.pan(100, 100))

文档

Panzoom(elem: HTMLElement | SVGElement, options?: Omit<PanzoomOptions, "force">): PanzoomObject

定义于 panzoom.ts:58

参数

返回值: PanzoomObject

PanzoomOptions

包括 MiscOptions, PanOptions, 和 ZoomOptions

MiscOptions

animate

可选 animate: boolean (默认: false)

定义于 types.ts:21

是否动画化过渡

canvas

可选 canvas: boolean (默认: false)

定义于 types.ts:32

此选项将Panzoom元素的父元素视为画布。实际上,Panzoom将按下处理程序绑定到父元素而不是Panzoom元素,因此“画布”上的任何指针事件都会移动其子元素。参见问题 #472。

注意:将此选项设置为 true 也会更改 cursor 样式应用的区域(即父元素)。

duration

可选 duration: number (默认: 200)

定义于 types.ts:34

过渡的持续时间(毫秒)

easing

可选 easing: string (默认: "ease-in-out")

定义于 types.ts:36

用于过渡的CSS Easing

exclude

可选 exclude: Element[] (默认: [])

定义于 types.ts:43

将此数组中应排除在Panzoom处理之外的元素添加进来。也会检查事件目标的上层元素。例如,不应传播点击事件的链接和按钮。

excludeClass

可选 excludeClass: string (默认: "panzoom-exclude")

定义于 types.ts:50

将此类添加到Panzoom元素内部您想要排除在Panzoom处理之外的任何元素中。该元素的后代也将被排除。例如,不应传播点击事件的链接和按钮。

force

可选 force: boolean

定义于 types.ts:66

force 应该谨慎使用,以暂时覆盖和忽略例如 disablePan、disableZoom 和 panOnlyWhenZoomed 这样的选项。此选项不能传递给 Panzoom 构造函数或 setOptions(以避免全局设置此选项)。

// Overrides disablePan and panOnlyWhenZoomed
panzoom.pan(50, 100, { force: true })
// Overrides disableZoom
panzoom.zoom(1, { force: true })

handleStartEvent

可选 handleStartEvent: (event: Event) => void (默认: (e: Event) => void)

定义于 types.ts:91

在第一个指针事件上,当平移开始时,Panzoom的默认行为是在该事件上调用 event.preventDefault()event.stopPropagation()。前者几乎是必需的;后者使得Panzoom元素中的Panzoom元素能够工作。

但在某些情况下,默认值可能不是期望的行为。设置此选项以覆盖该行为。

// Only call preventDefault()
Panzoom(elem, {
  handleStartEvent: (event) => {
    event.preventDefault()
  }
})
// Do nothing.
// This can change dragging behavior on mobile.
Panzoom(elem, {
  handleStartEvent: () => {}
})

noBind

可选 noBind: boolean

定义于 types.ts:95

跳过绑定默认的Panzoom事件监听器

origin

可选 origin: string

types.ts:109 中定义

修改此属性存在风险。 transform-origin 是变换应用的起点。默认值:HTML 为 '50% 50%',SVG 为 '0 0'。默认值设置的原因是更改 SVG 元素的 transform-origin 在 IE 中不起作用。

更改此属性可能适用于许多情况,但会破坏焦点缩放,因为它假设默认值被设置为进行更复杂的计算。

再次提醒,更改 IE 中 SVG 的此属性根本不起作用。

overflow

可选 overflow:字符串(默认:"hidden"

types.ts:111 中定义

父元素的 overflow CSS 值。默认为 'hidden'

setTransform

可选 setTransformtypeof setTransform(默认:setTransform

types.ts:129 中定义

覆盖变换设置器。这主要是为了让用户能够设置除了缩放和平移以外的其他变换部分。默认值在 src/css.ts 中定义。

// This example always sets a rotation
// when setting the scale and translation
const panzoom = Panzoom(elem, {
  setTransform: (elem, { scale, x, y }) => {
    panzoom.setStyle('transform', `rotate(0.5turn) scale(${scale}) translate(${x}px, ${y}px)`)
  }
})

silent

可选 silent:布尔值

types.ts:131 中定义

静音所有事件

startScale

可选 startScale:数字(默认:1

types.ts:137 中定义

用于设置初始变换的缩放比例

startX

可选 startX:数字(默认:0

types.ts:133 中定义

用于设置初始变换的 X 值

startY

可选 startY:数字(默认:0

types.ts:135 中定义

用于设置初始变换的 Y 值

touchAction

可选 touchAction:字符串(默认:"none"

types.ts:147 中定义

此值用于设置 Panzoom 元素及其父元素的 touch-action。这是必要的,因为移动设备上的原生滚动会干扰平移和捏缩操作。将其设置为空字符串以重新启用移动设备上的滚动,但请注意,滚动和平移不能同时工作。

PanOptions

包括 MiscOptions

contain

可选 contain:"inside" | "outside"

types.ts:166 中定义

将 panzoom 元素包含在父元素内部或外部。内部:panzoom 元素比其父元素小,无法平移到外部。外部:panzoom 元素比其父元素大,无法平移到内部。换句话说,元素周围不会显示空白空间。

注意:包含平调整整没有受 disablePan 选项的影响。

cursor

可选 cursor:字符串(默认:"move"

types.ts:168 中定义

设置在 panzoom 元素上的光标样式

disablePan

可选 disablePan:布尔值(默认:false

types.ts:174 中定义

禁用平移功能。注意:disablePan 不影响焦点缩放或包含选项。元素仍会相应地平移。

disableXAxis

可选 disableXAxis:布尔值(默认:false

定义于 types.ts:176

仅在Y轴上平移

disableYAxis

可选 disableYAxis: boolean (默认: false)

定义于 types.ts:178

仅在X轴上平移

panOnlyWhenZoomed

可选 panOnlyWhenZoomed: boolean (默认: false)

定义于 types.ts:182

当比例等于起始值时禁用平移

relative

可选 relative: boolean (默认: false)

定义于 types.ts:180

当向 .pan() 方法传递 x 和 y 值时,将这些值视为相对于当前值的相对值

ZoomOptions

包括 MiscOptions

disableZoom

可选 disableZoom: boolean (默认: false)

定义于 types.ts:187

禁用缩放功能

focal

可选 focal: { x: number ; y: number }

定义于 types.ts:194

将缩放元素上的指定点缩放。此点预期是相对于缩放元素尺寸的,与父尺寸无关。

类型声明

maxScale

可选 maxScale: number (默认: 4)

定义于 types.ts:198

缩放时的最大比例

minScale

可选 minScale: number (默认: 0.125)

定义于 types.ts:196

缩放时的最小比例

step

可选 step: number (默认: 0.3)

定义于 types.ts:200

步长影响使用鼠标滚轮、捏合缩放或使用 zoomIn/zoomOut 缩放时的缩放计算

PanzoomObject

这些方法在初始化 Panzoom 后可用

bind()

bind: () => void

定义于 types.ts:221

将默认的按下、移动和抬起事件监听器绑定到 Panzoom 元素上。这通常不需要调用。在创建新的 Panzoom 对象时默认会调用,但可以使用 noBind 选项跳过。

destroy()

destroy: () => void

定义于 types.ts:223

移除绑定到 Panzoom 元素的所有事件监听器

eventNames()

eventNames: { down: string ; move: string ; up: string }

定义于 types.ts:229

此对象公开了 Panzoom 使用的当前浏览器对 Pointer 或 Touch 事件支持的名称。

带有返回类型的签名

getOptions()

getOptions: () => PanzoomOptions

定义于 types.ts:235

返回当前选项对象的副本

getPan()

getPan: () => { x: number ; y: number }

定义在 types.ts:231

获取当前的 x/y 平移量

getScale()

getScale: () => number

定义在 types.ts:233

获取当前的缩放比例

pan()

pan: (x: number | string, y: number | string, panOptions?: PanOptions](../modules/types.md#panoptions)) => [CurrentValues

定义在 types.ts:246

将 Panzoom 元素平移到给定的 x 和 y 坐标

// Translates the element to 50px, 100px
panzoom.pan(50, 100)
// Pans the element right 10px and down 10px from its current position
panzoom.pan(10, 10, { relative: true })

reset()

reset: (resetOptions?: PanzoomOptions](../modules/types.md#panzoomoptions)) => [CurrentValues

定义在 types.ts:259

将平移和缩放重置为 startX, startY, 和 startScale。默认情况下执行动画,忽略全局选项。通过传递 { animate: false } 来覆盖。重置忽略 disablePandisableZoompanOnlyWhenZoomed 选项。通过传递 { force: false } 来覆盖。

panzoom.reset()
panzoom.reset({ animate: false })

setOptions()

setOptions: (options?: PanzoomOptions) => void

定义在 types.ts:261

更改 Panzoom 实例的选项

setStyle()

setStyle: (name: string, value: string) => void

定义在 types.ts:263

用于在 Panzoom 元素上设置前缀样式的便捷方法

zoom()

zoom: (scale: number, zoomOptions?: ZoomOptions](../modules/types.md#zoomoptions)) => [CurrentValues

定义在 types.ts:272

将 Panzoom 元素缩放到给定的缩放比例

panzoom.zoom(2.2)
panzoom.zoom(2.2, { animate: true })

zoomIn()

zoomIn: (zoomOptions?: ZoomOptions](../modules/types.md#zoomoptions)) => [CurrentValues

定义在 types.ts:283

使用选项中设置的预定增量进行缩放。默认情况下执行动画,忽略全局选项。通过传递 { animate: false } 来覆盖。

panzoom.zoomIn()
panzoom.zoomIn({ animate: false })

zoomOut()

zoomOut: (zoomOptions?: ZoomOptions](../modules/types.md#zoomoptions)) => [CurrentValues

定义在 types.ts:294

使用选项中设置的预定增量进行缩放。默认情况下执行动画,忽略全局选项。通过传递 { animate: false } 来覆盖。

panzoom.zoomOut()
panzoom.zoomOut({ animate: false })

zoomToPoint()

zoomToPoint: (scale: number, point: { clientX: number ; clientY: number }, zoomOptions?: ZoomOptions](../modules/types.md#zoomoptions)) => [CurrentValues

定义在 types.ts:305

使用给定的指针/触摸/鼠标事件或构造的点将 Panzoom 元素缩放到焦点。clientX/clientY 值应与 Panzoom 元素父元素的 pointermove 事件计算方式相同。

panzoom.zoomToPoint(1.2, pointerEvent)

zoomWithWheel()

zoomWithWheel: (event: WheelEvent, zoomOptions?: ZoomOptions](../modules/types.md#zoomoptions)) => [CurrentValues

定义在 types.ts:334

使用给定的 WheelEvent 将 Panzoom 元素缩放到焦点

这是一个便利函数,可能无法处理所有用例。其他情况应使用 zoomToPoint 方法或 zoom 方法的焦点选项来手动实现解决方案。

注意:焦点缩放平移调整不受 disablePan 选项的影响。

// Bind to mousewheel
elem.parentElement.addEventListener('wheel', panzoom.zoomWithWheel)
// Bind to shift+mousewheel
elem.parentElement.addEventListener('wheel', function (event) {
  if (!event.shiftKey) return
  // Panzoom will automatically use `deltaX` here instead
  // of `deltaY`. On a mac, the shift modifier usually
  // translates to horizontal scrolling, but Panzoom assumes
  // the desired behavior is zooming.
  panzoom.zoomWithWheel(event)
})

CurrentValues

isSVG

可选 isSVG: boolean

定义在 types.ts:211

scale

scale: number

定义在 types.ts:210

x

x: number

定义在 types.ts:208

y

y: number

定义在 types.ts:209

事件

以下事件可以作为自定义事件在 panzoom 元素上使用原生的 CustomEvent API。添加监听器的方式与添加其他事件相同。

elem.addEventListener('panzoomchange', (event) => {
  console.log(event.detail) // => { x: 0, y: 0, scale: 1 }
})

所有事件说明

  • 传递给监听器的参数中的事件对象将始终包含一个具有以下属性的 detail 对象
    • 当前的 x
    • 当前的 y
    • 当前的 scale
    • 如果适用,一个具有触发 panzoom 事件的原始事件的 originalEvent 属性。例如,panzoomstart 事件的 originalEvent 属性将是一个 pointerdowntouchstartmousedown 事件。
  • silent 选项设置为 true 时,可以静音事件,无论是全局设置还是传递给 pan、任何 zoom 方法或 reset
  • 避免在这些事件处理程序中放置太多逻辑,因为它可能会影响平移或缩放的性能。

"panzoomstart"

当用户在移动设备上开始移动或捏合缩放手势时触发。

"panzoomchange"

每次发生平移、缩放或重置时都会触发。请注意,直接调用 options.setTransform 不会触发此事件。

"panzoomzoom"

每次通过任何 Panzoom zoom 方法(直接或内部)更改缩放时都会触发。

"panzoompan"

每次通过 pan 方法(直接或内部)更改平移时都会触发。

"panzoomend"

当用户完成移动或完成移动设备上的捏合缩放手势时触发。

"panzoomreset"

每次调用重置时都会触发。