更新记录
1.1.0(2026-08-03)
新增
- 标题动画:
titleOriginRect 有值时从源位置平滑飞到预览底栏落点,关闭时飞回
- 未提供
titleOriginRect 时标题仅透明度逐渐出现 / 消失(不位移)
平台兼容性
uni-app(5.01)
| Vue2 |
Vue2插件版本 |
Vue3 |
Vue3插件版本 |
Chrome |
Chrome插件版本 |
Safari |
Safari插件版本 |
app-vue |
app-vue插件版本 |
app-nvue |
Android |
iOS |
鸿蒙 |
鸿蒙插件版本 |
| √ |
1.1.0 |
√ |
1.1.0 |
√ |
1.1.0 |
√ |
1.1.0 |
√ |
1.1.0 |
- |
- |
- |
√ |
1.1.0 |
| 微信小程序 |
微信小程序插件版本 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
1.1.0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
uni-app x(5.08)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| - |
- |
- |
- |
- |
- |
自定义大图预览 · Image Preview Popup
替代 uni.previewImage:从点击位置飞入全屏,宽高同步渐变(不用 CSS scale),关闭时回缩;支持多图滑动、双指捏合缩放、下拉关闭。
普通授权:下载即用(市场加密保护)。源码授权:完整可读源码,便于二次开发与审计。
购买 / 试用请以 DCloud 插件市场 页面为准。
为什么选它
| 痛点 |
本组件 |
| 系统预览样式不可控 |
自研 UI,黑底全屏,序号清晰 |
| 打开像「突然弹出」 |
从缩略图 位移 + 宽高渐变 飞入 |
| 关闭生硬 |
回缩到原位置,体验连贯 |
| 只能看不能玩 |
双指缩放、平移;1× 下拉跟手退出 |
| 系统返回关不干净 |
提供 requestClose / isOpen,配合 page-container |
适用场景:商品详情轮播、活动奖品图、订单凭证、图文详情中的点击放大等。
平台兼容性
| App-vue |
App-nvue |
H5 |
微信小程序 |
支付宝 |
百度 |
QQ |
Vue2 |
Vue3 |
| √ |
× |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
- 依赖:无(纯前端组件,不采集数据、无广告、无额外权限)
- 安装:放入项目
uni_modules/image-preview-popup,easycom 自动注册,无需 import
核心能力
- 飞入 / 飞出:传入
originRect(缩略图视口坐标),打开与关闭均为位移动画
- 标题联动:传
titleOriginRect 时标题从列表位置平滑飞到预览落点;不传则逐渐淡入(关闭同理)
- 多图:
urls + current(下标或 url),落地后横向 swiper
- 双指缩放:以双指中点为锚点缩放(
transform-origin: 0 0),可平移
- 下拉关闭:1× 时下拉跟手,超过阈值松手退出;缩放态不误触
- 系统返回:
requestClose() 走关闭动画;isOpen() 判断是否拦截返回
快速上手(30 秒)
<template>
<view>
<image
id="thumb"
:src="urls[0]"
mode="aspectFill"
style="width:200rpx;height:200rpx"
@click="openPreview"
/>
<!-- 量 titleOriginRect 用;不需要标题飞入可去掉本节点并不传 title-origin-rect -->
<text id="title" class="demo-title">{{ title }}</text>
<image-preview-popup
ref="preview"
:visible="visible"
:urls="urls"
:current="current"
:title="title"
:origin-rect="originRect"
:title-origin-rect="titleOriginRect"
@close="visible = false"
/>
</view>
</template>
<script>
export default {
data() {
return {
visible: false,
urls: [
'https://via.placeholder.com/800',
'https://via.placeholder.com/801'
],
current: 0,
title: '示例商品名',
originRect: null,
titleOriginRect: null
}
},
methods: {
openPreview() {
const q = uni.createSelectorQuery().in(this)
q.select('#thumb').boundingClientRect()
q.select('#title').boundingClientRect()
q.exec((res) => {
const img = res && res[0]
const tit = res && res[1]
this.originRect =
img && img.width > 0
? {
left: img.left,
top: img.top,
width: img.width,
height: img.height
}
: null
// 有标题源位置 → 飞入;不传 / null → 标题仅淡入
this.titleOriginRect =
tit && tit.width > 0
? {
left: tit.left,
top: tit.top,
width: tit.width,
height: tit.height
}
: null
this.current = 0
this.visible = true
})
},
/** 系统返回时调用 */
closePreview() {
const p = this.$refs.preview
if (p && typeof p.requestClose === 'function') p.requestClose()
else this.visible = false
}
}
}
</script>
无动画也能开
- 不传
originRect:图片淡入全屏
- 不传
titleOriginRect:标题逐渐出现(不位移)
适合浮层内量点困难的场景。
系统返回拦截(强烈建议)
微信小程序
页面根层用单一 page-container:预览打开时 show=true,beforeleave 里调用 requestClose(),不要为预览再挂第二个 page-container。
App
onBackPress() {
const p = this.$refs.preview
if (p && p.isOpen && p.isOpen()) {
p.requestClose()
return true
}
return false
}
API
Props
| 属性 |
类型 |
默认 |
说明 |
| visible |
Boolean |
false |
是否显示 |
| urls |
Array |
[] |
图片 URL 列表 |
| current |
Number / String |
0 |
当前下标,或当前 url 字符串 |
| title |
String |
'' |
单图标题(未配 titles 时) |
| titles |
Array |
[] |
与 urls 对齐的标题 |
| originRect |
Object |
null |
图片源 { left, top, width, height };有则图片飞入 |
| titleOriginRect |
Object |
null |
标题源区域(同上);有则标题飞入落点,无则淡入 |
Events
| 事件 |
说明 |
| close |
关闭动画结束后触发(请把 visible 置为 false) |
Methods(ref)
| 方法 |
说明 |
| requestClose() |
播放关闭动画后触发 close(返回键请用这个) |
| isOpen() |
是否处于打开过程 / 已打开 |
授权说明
| 版本 |
价格 |
你得到什么 |
| 普通授权版 |
¥19.9 |
可在项目中使用组件;按插件市场规则加密保护 |
| 源码授权版 |
¥199 |
完整源码可读、可二次开发、便于安全审计 |
常见问题
Q:飞入起点不对?
A:在 visible = true 之前设好 originRect;用 createSelectorQuery().in(this) 量缩略图。量不到可传 null 走淡入。
Q:和页内全屏浮层一起用预览被挡住?
A:预览建议挂在页面上、在打开时再挂 root-portal(后创建压上层),避免嵌在已被裁切的浮层里。
Q:支持 Vue3 吗?
A:支持。easycom 引入即可;Options API 示例可直接用。
更新日志
见 changelog.md
版本
1.1.0 · 2026-08-03