更新记录

1.0.0(2026-11-02) 下载此版本

  • 首次发布
  • 支持九宫格缩略图与全屏图片预览
  • 支持从缩略图/主图位置放大、缩小回位动画
  • 支持商品规格/价格数据驱动展示
  • 支持 header / footer 插槽与作用域插槽
  • 兼容微信小程序、App-vue、H5/Web

平台兼容性

uni-app(5.34)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
√ - √ - √ - - - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
√ - - - - - - - - - - -

cs-peeview 图片九宫格放大预览

带缩略图九宫格与「从原图位置放大 / 缩小回位」动画的图片预览组件。
已验证平台:微信小程序、App-vue、H5/Web。


平台支持

平台 支持 说明
微信小程序 ✅ 条件编译 #ifdef MP
App(vue) ✅ 条件编译 #ifdef APP
H5 / Web ✅ 预览层自动挂到 document.body,避免被父级 overflow 裁切
nvue / uni-app x ❌ 暂不支持

网络图片请在对应端配置合法域名(小程序 download/request 合法域名、App 网络安全配置等)。


安装

  1. 插件市场导入,或将本插件目录放到项目:
    uni_modules/cs-peeview/
  2. 符合 easycom 规范,无需在 pages.json 注册,也无需手动 import。
  3. 页面中直接使用标签:<cs-peeview />

手动引入(可选):

import CsPeeview from '@/uni_modules/cs-peeview/components/cs-peeview/cs-peeview.vue'
export default {
  components: { CsPeeview }
}

快速开始(三端通用)

<template>
  <cs-peeview
    :list="list"
    @open="onOpen"
    @close="onClose"
    @change="onChange"
    @image="onImage"
  />
</template>

<script>
export default {
  data() {
    return {
      list: [
        { id: 1, src: 'https://example.com/1.jpg' },
        { id: 2, src: 'https://example.com/2.jpg' },
        // 也可直接传字符串 URL
        'https://example.com/3.jpg'
      ]
    }
  },
  methods: {
    onOpen(e) { console.log('打开', e.index) },
    onClose(e) { console.log('关闭', e.index) },
    onChange(e) { console.log('切换', e.index, e.current) },
    onImage(e) { console.log('点击大图', e.current.src) }
  }
}
</script>

点击九宫格缩略图即可打开预览;点击空白处关闭。


Props

属性 类型 默认值 说明
list Array [] 图片列表。元素可为字符串 URL,或对象 { id?, src/url, width?, height?, spec?, color?, price? }
showThumbs Boolean true 是否显示内置九宫格。设为 false 时仅保留预览层,配合 open() / originSelector 做主图预览
originSelector String '' 外部起始节点 CSS 选择器(如 #detail-banner)。showThumbs=false 时用于定位放大起点
showIndicator Boolean true 是否显示默认页码指示器 1/N
previewTip String 点击空白处关闭 预览提示文案(作用域插槽可拿到)
previewWidth String/Number 0.9 预览图最大宽度。0~1 为相对屏宽比例,也支持 rpx/px/%
previewHeight String/Number '' 预览图高度上限,空则按宽高比自适应
align String center 预览垂直对齐:center / top / bottom / custom
offsetTop String/Number '' align 为 top/custom 时的顶部偏移
offsetBottom String/Number '' align 为 bottom 时的底部偏移
thumbRadius String 16rpx 缩略图圆角(动画起点)
previewRadius String 0px 预览图圆角(动画终点)

list 单项字段

字段 说明
src / url 图片地址(必填其一)
id 唯一标识,可不传
width / height 原图尺寸;也可通过 @load 调用 onThumbLoad 注入
spec / color 有值时预览层自动显示规格条
price 有值时预览层自动显示价格

事件

事件回调参数统一为:

{
  index: Number,   // 当前下标
  current: Object, // 当前图片对象
  list: Array      // 规范化后的图片列表
}
事件 说明
open 打开预览动画开始时
close 关闭动画结束时
change 打开时、滑动切换时、关闭前回写下标时
image 点击预览大图时(不关闭,可做保存/分享)

方法(ref 调用)

this.$refs.pv.open(index)           // 打开指定下标
this.$refs.pv.close()               // 关闭
this.$refs.pv.isOpen()              // 是否处于预览中
this.$refs.pv.onThumbLoad(index, e) // 外部缩略图/主图 @load 时喂入真实宽高,避免变形

插槽

具名插槽

插槽 说明
header 替换顶部默认页码栏
footer 底部自定义区域

默认作用域插槽

传入默认插槽可完全自定义 UI,作用域参数包含:list、previewVisible、open、close、onThumbLoad 等。一般业务用内置 UI + header/footer 即可。


场景示例

1. 商品图(规格 / 价格)

<cs-peeview :list="goodsList" :show-indicator="true" :preview-width="0.85" />
goodsList: [
  { id: 'g1', src: '...', spec: '星空蓝 / 128GB', price: '5999' },
  { id: 'g2', src: '...', spec: '月光白 / 256GB', price: '6799' }
]

2. 自定义头部 / 底部

<cs-peeview ref="pv" :list="list" :show-indicator="false">
  <template #header>
    <view class="bar">
      <text @click="$refs.pv.close()">关闭</text>
    </view>
  </template>
  <template #footer>
    <view class="tip">长按可保存 · 点击空白关闭</view>
  </template>
</cs-peeview>

3. 主图预览(隐藏九宫格)

适用于详情页大图 + 缩略图条,从主图位置放大:

<template>
  <image
    id="detail-banner"
    :src="list[current].src"
    mode="aspectFill"
    @click="openPreview()"
    @load="onBannerLoad"
  />
  <image
    v-for="(item, i) in list"
    :key="item.id"
    :src="item.src"
    @click="openPreview(i)"
    @load="onThumbLoad(i, $event)"
  />

  <cs-peeview
    ref="pv"
    :list="list"
    :show-thumbs="false"
    origin-selector="#detail-banner"
    @close="onClose"
  />
</template>

<script>
export default {
  data() {
    return {
      current: 0,
      list: [/* ... */]
    }
  },
  methods: {
    openPreview(i) {
      const idx = typeof i === 'number' ? i : this.current
      this.current = idx
      this.$refs.pv.open(idx)
    },
    onBannerLoad(e) {
      this.$refs.pv && this.$refs.pv.onThumbLoad(this.current, e)
    },
    onThumbLoad(i, e) {
      this.$refs.pv && this.$refs.pv.onThumbLoad(i, e)
    },
    onClose(e) {
      this.current = e.index
    }
  }
}
</script>

各端注意事项

微信小程序

  1. 远程图片域名需加入小程序后台「downloadFile / request 合法域名」。
  2. origin-selector 使用页面级节点 id(如 #detail-banner),组件会用页面级 createSelectorQuery 查询。
  3. 保存到相册需自行处理 scope.writePhotosAlbum 授权(组件本身不申请权限)。

App-vue

  1. 与小程序用法相同;使用 vue 页面,勿用于 nvue。
  2. Android 访问 http 图片时注意网络安全策略(cleartext)。

H5 / Web

  1. 组件会将预览层移动到 body,避免被带 overflow/transform 的父节点裁切。
  2. 浏览器端同样支持 origin-selector(document.querySelector)。
  3. 跨域图片若需 canvas 处理/下载,请确保图片服务器 CORS 配置正确。

常见问题

Q: 预览图被压成正方形?
A: 在缩略图或主图 @load 时调用 onThumbLoad(index, e),或在 list 里带上 width/height。

Q: 主图场景打不开或起点不对?
A: 确认 show-thumbs="false"、设置了正确的 origin-selector,并在打开前节点已渲染完成。

Q: 切换 Tab 后预览层还在?
A: 切换前调用 this.$refs.pv.close(),或用 isOpen() 判断后关闭。


目录结构

uni_modules/cs-peeview/
├── components/cs-peeview/cs-peeview.vue
├── package.json
├── readme.md
└── changelog.md

隐私、权限声明

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

无

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

无

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

无

许可协议

MIT协议

暂无用户评论。