指令
适合无需复杂定制需求的简单浏览场景,同时支持动态渲染 Markdown 或 HTML 等未知图片内容。默认监听指令绑定元素内部 <img> 元素的增删和属性变化,自动更新图库。
演练场
vue
<script>
import Vue from 'vue'
import VueViewer from 'v-viewer'
Vue.use(VueViewer)
const sourceImages = [
'/images/photo-01.jpg',
'/images/photo-02.jpg',
'/images/photo-03.jpg',
'/images/photo-04.jpg',
'/images/photo-05.jpg',
'/images/photo-06.jpg',
'/images/photo-07.jpg',
'/images/photo-08.jpg',
'/images/photo-09.jpg',
'/images/photo-10.jpg',
].map((original) => ({
src: original.replace('/images/', '/images/thumbnails/'),
'data-source': original,
}))
export default {
data() {
return {
sourceImages,
images: sourceImages.slice(0, 5),
options: { toolbar: true, url: 'data-source' },
}
},
methods: {
add() {
this.images.push(this.sourceImages[this.images.length])
},
remove() {
this.images.pop()
},
show() {
this.$refs.gallery.$viewer.show()
},
onViewed(event) {
console.log(event.detail.index)
},
},
}
</script>
<template>
<main class="viewer-example">
<div class="controls">
<button :disabled="images.length === sourceImages.length" @click="add">
添加图片
</button>
<button :disabled="images.length === 0" @click="remove">删除图片</button>
<button class="open" :disabled="images.length === 0" @click="show()">
显示viewer
</button>
<div class="toolbar" role="group" aria-label="切换工具栏">
<span>切换工具栏</span>
<button
:aria-pressed="options.toolbar ? 'true' : 'false'"
@click="options.toolbar = true"
>
开启
</button>
<button
:aria-pressed="options.toolbar ? 'false' : 'true'"
@click="options.toolbar = false"
>
关闭
</button>
</div>
</div>
<div ref="gallery" v-viewer="options" @viewed="onViewed" class="gallery">
<img
v-for="(image, index) in images"
:key="image.src"
:src="image.src"
:data-source="image['data-source']"
:alt="`Landscape ${index + 1}`"
/>
</div>
</main>
</template>渲染得到的 HTML 同样适用:
vue
<article v-viewer v-html="html" />绑定值与修饰符
| 用法 | 说明 |
|---|---|
| v-viewer="options" | 接受 Viewer.js 配置,深层修改会重建实例。 |
v-viewer="{ observe: false }" | 关闭图片 DOM 自动更新。 |
v-viewer="{ observe: 100 }" | 在 100ms 窗口内合并图片 DOM 变化;默认 true 使用 50ms,0 不额外等待。 |
v-viewer="{ rebuild: true }" | 图片变化时重建实例;默认 false,支持动态切换。 |
.rebuild | rebuild: true 的简写。 |
绑定值中的 rebuild 优先于 .rebuild,显式设置 false 可关闭重建;未设置或为 undefined 时沿用修饰符。
默认监听指令绑定元素内部 <img> 元素的增删和属性变化,自动更新图库。可通过 element.$viewer 获取实例;卸载时会断开监听并销毁实例。
取值、更新时机及适用场景详见自动更新 observe。
ts
import type { ViewerElement } from 'v-viewer'
const element = document.querySelector<ViewerElement>('#gallery')
element?.$viewer?.show()配置项
直接放入 v-viewer="options" 绑定的配置对象。配置及其嵌套值变化后会重建实例。
对应 Viewer.js 配置项,点击属性名可查看原文档。可用配置和默认值以安装的 Viewer.js 版本为准。
| 属性 | 类型 | 作用 |
|---|---|---|
backdrop | boolean / string | 弹窗模式的背景遮罩;设为 static 时点击遮罩不关闭弹窗。 |
button | boolean | 显示右上角按钮。 |
className | string | 添加到查看器根元素的自定义类名。 |
container | string / Element | 弹窗模式的挂载容器,可传元素或 CSS 选择器。 |
filter | function | 筛选可查看的图片,返回 true 保留,false 忽略。 |
fullscreen | boolean / FullscreenOptions | 播放时请求浏览器全屏,可传入 Fullscreen API 配置。 |
focus | boolean | 初始化时聚焦缩略图导航的当前项,需要开启 keyboard。 |
inheritedAttributes | array | 从源图片额外继承的属性;src、alt 始终继承。 |
initialCoverage | number | 图片初始覆盖比例,取值大于 0 且不超过 1。 |
initialViewIndex | number | 初始图片下标,也作为 view() 的默认下标。 |
inline | boolean | 开启内嵌模式,在容器内显示;关闭时使用弹窗模式。 |
autoplay | boolean | 播放时自动切换图片。 |
interval | number | 播放时自动切换图片的间隔,单位毫秒。 |
keyboard | boolean | 启用键盘操作。 |
loading | boolean | 加载图片时显示加载指示器。 |
loop | boolean | 循环浏览,首尾图片之间可继续切换。 |
magnifier | boolean / object | 全屏查看时悬停显示放大镜,可设置尺寸、倍率和透明度;触屏禁用。 |
maxZoomRatio | number / function | 最大放大比例,也可由函数根据图片和图片数据计算。 |
minHeight | number | 内嵌模式下查看器的最小高度,单位像素。 |
minWidth | number | 内嵌模式下查看器的最小宽度,单位像素。 |
minZoomRatio | number / function | 最小缩放比例,也可由函数根据图片和图片数据计算。 |
movable | boolean | 允许移动图片。 |
navbar | boolean / number / string / object | 缩略图导航的显示、尺寸和位置;对象配置支持更多布局选项。 |
navigation | boolean / number / object | 查看器左右两侧的上一张、下一张按钮,可分别设置显示和尺寸。 |
preload | boolean | 提前加载上一张或下一张图片。 |
rotatable | boolean | 允许旋转图片。 |
rotateOnGesture | boolean | 通过手势事件旋转图片,例如 Mac Safari 的双指手势。 |
rotateOnTouch | boolean | 通过触屏双指手势旋转图片。 |
scalable | boolean | 允许按轴缩放图片,可用于水平或垂直翻转。 |
slideOnTouch | boolean | 通过触屏滑动切换上一张或下一张图片。 |
slideOnWheel | boolean / string | 通过滚轮切图,可指定修饰键;在缩略图导航区域或滚轮缩放未生效时可用。 |
title | boolean / number / function / array | 图片标题的显示和内容;默认使用 alt 或从 URL 提取的文件名。 |
toggleOnDblclick | boolean | 双击时在图片自然尺寸和初始尺寸之间切换。 |
toolbar | boolean / number / object | 工具栏及按钮的显示、布局、尺寸和点击行为。 |
tooltip | boolean | 缩放时显示当前图片比例的百分比提示。 |
transition | boolean / object | 启用 CSS 过渡动画,也可通过对象关闭指定操作的动画。 |
url | string / function | 原图地址来源;字符串指定图片属性名,函数返回图片 URL。 |
zIndex | number | 弹窗模式下查看器的 CSS z-index。 |
zIndexInline | number | 内嵌模式下查看器的 CSS z-index。 |
zoomOnGesture | boolean | 通过手势事件缩放图片,例如 Mac Safari 的捏合手势。 |
zoomOnTouch | boolean | 通过触屏拖动手势缩放图片。 |
zoomOnWheel | boolean / string | 通过滚轮缩放,可指定修饰键或修饰键组合。 |
zoomRatio | number | 滚轮缩放时每次变化的比例。 |
zoomable | boolean | 允许缩放图片。 |
事件
Viewer.js 会在指令绑定的原生 HTML 元素上派发 DOM 事件,可以通过 @viewed 这样的写法监听。参数为原始事件,操作数据位于 event.detail;可通过 @show.prevent 阻止打开。
vue
<div v-viewer="options" @viewed="onViewed">
<img src="/images/photo-01.jpg" />
</div>| 名称 | 触发时机 / 常用参数 |
|---|---|
ready | 查看器界面初始化完成;弹窗模式下可能在首次打开时才触发。 |
show / shown | 弹窗打开前 / 打开过渡动画完成后。 |
hide / hidden | 弹窗关闭前 / 关闭过渡动画完成后。 |
view / viewed | 图片显示前 / 显示完成后;detail.index 为从 0 开始的图片下标,image 和 originalImage 分别为预览图片与源图片元素。 |
move / moved | 移动前 / 后;detail.x、y、oldX、oldY 表示位置变化。 |
rotate / rotated | 旋转前 / 后;detail.degree、oldDegree 表示角度变化。 |
scale / scaled | 按轴缩放或翻转前 / 后;detail.scaleX、scaleY、oldScaleX、oldScaleY 表示变化。 |
zoom / zoomed | 缩放前 / 后;detail.ratio、oldRatio 表示缩放比例。 |
play / stop | 开始 / 停止幻灯片播放前。 |
playing | 幻灯片播放中显示每张图片之前。 |
回调
也可以在 options 中设置 Viewer.js 回调,名称与参数对应上面的事件:
js
const options = {
viewed(event) {
console.log(event.detail.index)
},
}同时设置 @viewed 和 options.viewed 时,两者都会执行;处理相同逻辑时选用一种即可。
旧版本迁移
旧版 .static 修饰符已移除,请替换为 { observe: false }。