更新记录

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),关闭时回缩;支持多图滑动、双指捏合缩放、下拉关闭。

普通授权版 源码授权版
¥19.9 ¥199

普通授权:下载即用(市场加密保护)。源码授权:完整可读源码,便于二次开发与审计。
购买 / 试用请以 DCloud 插件市场 页面为准。


为什么选它

痛点 本组件
系统预览样式不可控 自研 UI,黑底全屏,序号清晰
打开像「突然弹出」 从缩略图 位移 + 宽高渐变 飞入
关闭生硬 回缩到原位置,体验连贯
只能看不能玩 双指缩放、平移;1× 下拉跟手退出
系统返回关不干净 提供 requestClose / isOpen,配合 page-container

适用场景:商品详情轮播、活动奖品图、订单凭证、图文详情中的点击放大等。


平台兼容性

App-vue App-nvue H5 微信小程序 支付宝 百度 QQ Vue2 Vue3
×
  • 依赖:无(纯前端组件,不采集数据、无广告、无额外权限)
  • 安装:放入项目 uni_modules/image-preview-popupeasycom 自动注册,无需 import

核心能力

  1. 飞入 / 飞出:传入 originRect(缩略图视口坐标),打开与关闭均为位移动画
  2. 标题联动:传 titleOriginRect 时标题从列表位置平滑飞到预览落点;不传则逐渐淡入(关闭同理)
  3. 多图urls + current(下标或 url),落地后横向 swiper
  4. 双指缩放:以双指中点为锚点缩放(transform-origin: 0 0),可平移
  5. 下拉关闭:1× 时下拉跟手,超过阈值松手退出;缩放态不误触
  6. 系统返回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=truebeforeleave 里调用 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

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。