# zoom

# 介绍

zoom 插件为 BetterScroll 提供缩放功能。

# 安装

npm install @better-scroll/zoom --save

// or

yarn add @better-scroll/zoom

# 使用

为了开启缩放功能,你需要首先引入 zoom 插件,并通过静态方法 BScroll.use() 注册插件

import BScroll from '@better-scroll/core'
import Zoom from '@better-scroll/zoom'

BScroll.use(Zoom)

上面步骤完成后,在 BetterScroll 的基础能力上扩展了缩放的功能,但是想要缩放真正生效,还需要在 options 中传入正确的配置:

new BScroll('.bs-wrapper', {
  freeScroll: true,
  scrollX: true,
  scrollY: true,
  zoom: {
    start: 1,
    min: 0.5,
    max: 2
  }
})

以下是 zoom 插件专属以及 BetterScroll 的配置

  • zoom<插件专属>

    开启 zoom 功能。若没有该项,则插件不会生效。该配置同时也是用来设置 zoom 特性的相关配置,具体请参考 zoom 选项对象

  • freeScroll

    如果希望当放大之后,当前区域在 x 和 y 轴方向都可以滚动时,必须设置为 true。同时需要设置 scrollX 和 scrollY 均为 true。

  • scrollX

    如果希望当放大之后,当前区域在 x 轴方向可以滚动时,必须设置为 true

  • scrollY

    如果希望当放大之后,当前区域在 y 轴方向可以滚动时,必须设置为 true

# 示例

WARNING

zoom 暂不支持在 pc 端的交互操作,下方 demo 请扫码体验。

<template>
  <div class="zoom-default">
    <div class="zoom-wrapper" ref="zoom">
      <div class="zoom-items">
        <div class="grid-item" v-for="num in nums" :key="num">{{num}}</div>
      </div>
    </div>
    <div class="btn-wrap">
      <button class="zoom-half" @click="zoomTo(0.5)">zoomTo:0.5</button>
      <button class="zoom-original" @click="zoomTo(1)">zoomTo:1</button>
      <button class="zoom-double" @click="zoomTo(2)">zoomTo:2</button>
    </div>
    <div class="linkwork-wrap">
      <p>changing with zooming action</p>
      <div class="linkwork-block" :style="{transform: linkworkTransform}"></div>
    </div>
  </div>
</template>

# zoom 选项对象

# start

  • 类型number

  • 默认值1

    初始缩放比例。

# min

  • 类型number

  • 默认值1

    最小缩放比例。

# max

  • 类型number

  • 默认值4

    最大缩放比例。

# initialOrigin

  • 类型[OriginX, OriginY]

    • OriginXnumber | 'left' | 'right' | 'center'
    • OriginYnumber | 'top' | 'bottom' | 'center'
  • 默认值[0, 0]

    初始化 zoom 插件的缩放原点,当 start 不为 1 的时候有效,缩放原点都是以缩放元素为坐标系。

  • 示例

  new BScroll('.bs-wrapper', {
    // ... 其他配置项
    zoom: {
      initialOrigin: [50, 50], // 基于缩放元素的左顶点上下偏移量都是 50 px
      initialOrigin: [0, 0], // 基于缩放元素的左顶点
      initialOrigin: ['left', 'top'], // 与上面效果相同
      initialOrigin: ['center', 'center'], // 基于缩放元素的中心
      initialOrigin: ['right', 'top'], // 基于缩放元素的右顶点
    }
  })

往往你初始化 zoom 的时候只专注于以端点或者中心进行缩放,可以参考以上示例。

# minimalZoomDistance

  • 类型number

  • 默认值5

    当你双指进行缩放操作的时候,只有当缩放的距离超过 minimalZoomDistance,zoom 才生效。

# bounceTime

  • 类型number

  • 默认值800(毫秒)

    双指不断进行缩放操作并且 scale 超过 max 阈值的时候,当双指离开的时候,内部会「回弹」至 max 的形态,而 bounceTime 就是这次「回弹」行为的动画时长。

提示

当 zoom 配置为 true 的时候,插件内部使用的是默认的插件选项对象。

const bs = new BScroll('.wrapper', {
  zoom: true
})

// 相当于

const bs = new BScroll('.wrapper', {
  zoom: {
    start: 1,
    min: 1,
    max: 4,
    initialOrigin: [0, 0],
    minimalZoomDistance: 5,
    bounceTime: 800, // ms
  }
})

# 实例方法

# zoomTo(scale, x, y, [bounceTime])

  • 参数

    • {number} scale: 缩放比例
    • {OriginX} x: 缩放原点的 x 坐标,相当于缩放元素的左顶点
      • OriginX:'number | 'left' | 'right' | 'center'
    • {OriginY} y: 缩放原点的 y 坐标,相当于缩放元素的左顶点
      • OriginY:'number | 'top' | 'bottom' | 'center'
    • {number} [bounceTime]<可选>:一次缩放行为的动画时长

    [x, y] 坐标作为原点对元素进行缩放。x 与 y 不仅可以是数字,也可以是对应的字符串,因为一般的场景都是基于端点或者中心进行缩放。

  • 示例

const bs = new BScroll('.bs-wrapper', {
  freeScroll: true,
  scrollX: true,
  scrollY: true,
  zoom: {
    start: 1,
    min: 0.5,
    max: 2
  }
})

bs.zoomTo(1.8, 'left', 'bottom') // 基于缩放元素的左底点缩放至 1.8 倍
bs.zoomTo(1.8, 'left', 'bottom', 1000) // 基于缩放元素的左底点缩放,动画时长为 1s
bs.zoomTo(1.8, 100, 100) // 基于缩放元素左顶点的上下偏移量 100 为原点进行缩放
bs.zoomTo(2, 'center', 'center') // 基于缩放元素的中心进行缩放

# 事件

# beforeZoomStart

  • 参数:无
  • 触发时机:双指接触缩放元素时,不包括直接调用 zoomTo 方法

# zoomStart

  • 参数:无
  • 触发时机:双指缩放距离超过最小阈值 minimalZoomDistance,缩放即将开始。不包括直接调用 zoomTo 方法

# zooming

  • 参数{ scale }

  • 类型{ scale: number }

  • 触发时机:双指缩放行为正在进行时或者直接调用 zoomTo 进行缩放的过程

  • 示例

  const bs = new BScroll('.bs-wrapper', {
    freeScroll: true,
    scrollX: true,
    scrollY: true,
    zoom: {
      start: 1,
      min: 0.5,
      max: 2
    }
  })

  bs.on('zooming', ({ scale }) => {
    // use scale
    console.log(scale) // 当前 scale 的值
  })

# zoomEnd

  • 参数{ scale }
  • 类型{ scale: number }
  • 触发时机:双指缩放行为结束后(如果有回弹,触发时机在回弹动画结束之后)或者调用 zoomTo 完成缩放之后

WARNING

在 zoom 的场景下,你应该监听 zoomStart、zooming、zoomEnd 等等事件,而不是更底层的 scroll、scrollEnd 事件,要不然可能与你的预期不符。