Image

图片:加载态机(loading 骨架/自定义占位 → success → error 降级图/自定义/默认破图),success 且 preview 时 hover 蒙层 + 点击进全屏预览。预览浮层(ImagePreview)对齐 Semi:底部工具栏含上一张/页码/下一张、缩放 Slider、放大/缩小、原始尺寸↔适应页面切换、旋转、下载,支持鼠标滚轮以指针为锚缩放、超出容器拖拽平移、无限循环、预加载、无操作自动隐藏工具栏、renderHeader/renderPreviewMenu(menuItems)/renderCloseIcon/renderLeftIcon/renderRightIcon 自定义槽。ImagePreview 既可包裹多个 <Image> 做组预览,也可独立传 src 编程式控制。

设计文档

如何引入

import { Image, ImagePreview } from '@chenzy-design/svelte';

基础用法

通过 src 指定图片路径,width/height 指定宽高,默认可点击预览。

基础图片示例

加载失败占位

通过 fallback 自定义加载失败的占位图(string 降级图或默认破图)。

默认破图占位
加载失败
自定义降级图
加载失败降级

渐进加载

大图通过 placeholder 实现渐进加载,先展示模糊小图再淡入主图。

渐进加载大图

自定义预览图

缩略图与预览图分离:src 用小图,preview.src 指定高清预览图源。

缩略图

多图预览

用 ImagePreview 包裹多个 Image 即可实现多图片预览,可左右切换。

图片 1
图片 2
图片 3
图片 4

单独使用预览组件

ImagePreview 可独立使用,通过 visible/onVisibleChange 与 src 编程式控制。

渲染在指定容器

通过 getPopupContainer 指定预览浮层父级 DOM(需 position:relative)。

容器内图片 1
容器内图片 2
容器内图片 3

自定义预览底部操作区

用 renderPreviewMenu 拿到 MenuProps 完全自定义底部操作区域。

图片 1
图片 2
图片 3

基于默认按钮自定义

renderPreviewMenu 的 menuItems 为默认按钮 Snippet 数组,可自由重组。

图片 1
图片 2
图片 3

自定义预览顶部展示区

通过 renderHeader 自定义预览顶部信息,入参为当前图 previewTitle。

图片 1
图片 2

API 参考

Image

Props

属性说明类型默认值
src图片获取地址stringundefined
alt图像描述string''
width图片显示宽度,number 视为 pxnumber|stringundefined
height图片显示高度,number 视为 pxnumber|stringundefined
placeholder加载中占位内容(不传用 SkeletonImage 骨架)Snippetundefined
fallback加载失败:string=降级图 src;Snippet=自定义内容;不传=默认破图 iconstring|Snippetundefined
preview预览:false 禁用;true 开启;对象=预览参数(含 src 覆盖预览图、visible 受控等)boolean|PreviewPropstrue
crossorigin透传给原生 img 的 crossorigin'anonymous'|'use-credentials'undefined
imgCls透传给 img 节点的自定义类名(对齐 Semi imgCls)stringundefined
imgStyle透传给 img 节点的自定义内联样式(对齐 Semi imgStyle)stringundefined
setDownloadName设置预览下载文件名(src: string) => stringundefined
onClick点击图片回调(e: MouseEvent) => voidundefined
onError加载错误回调(e: Event) => voidundefined
onLoad加载成功回调(e: Event) => voidundefined
class根类名透传string''
style根内联样式透传string''

Slots

名称说明
placeholder加载中自定义占位内容
fallback加载失败自定义内容(fallback 为 Snippet 时)

ImagePreview

预览组 / 独立可编程预览:包裹多个 <Image> 做组预览可左右切换;或独立传 src=string|string[] + visible/onVisibleChange 编程式控制。

Props

属性说明类型默认值
src预览图源列表(独立用法)string|string[]undefined
visible受控:是否预览(不回写,仅 onVisibleChange)booleanundefined
defaultVisible首次是否开启预览booleanfalse
currentIndex受控:当前预览图下标(不回写,仅 onChange)numberundefined
defaultCurrentIndex首次展示图片下标number0
maskClosable点击遮罩是否可关闭booleantrue
closable是否显示关闭按钮booleantrue
closeOnEsc点击 esc 关闭预览booleantrue
infinite是否无限循环切换booleanfalse
zoomStep每次缩小/放大比例number0.1
maxZoom最大缩放比例number5
minZoom最小缩放比例number0.1
initialZoom初始缩放比例(每图首帧生效一次,受 min/maxZoom 限制)numberundefined
lazyLoad组内子图是否懒加载(IntersectionObserver)booleantrue
lazyLoadMarginobserver rootMarginstring'0px 100px 100px 0px'
preLoad是否预加载相邻图片booleantrue
preLoadGap预加载步长number2
showTooltip是否展示底部操作区 Tooltip 提示booleanfalse
disableDownload禁用下载(含右键)booleanfalse
viewerVisibleDelay隐藏操作按钮前的无操作时长(ms)number10000
zIndex预览层层级number1070
getPopupContainer指定预览浮层父级 DOM(需 position:relative)() => HTMLElementundefined
setDownloadName设置下载文件名(src: string) => stringundefined
prevTip / nextTip / zoomInTip / zoomOutTip / rotateTip / downloadTip / adaptiveTip / originTip各操作按钮 Tooltip 文案(缺省走 locale)stringlocale
renderHeader自定义预览顶部区(收到当前 title)Snippet<[title]>undefined
renderPreviewMenu自定义底部菜单(MenuProps.menuItems 为默认按钮 Snippet 数组)Snippet<[MenuProps]>undefined
renderCloseIcon / renderLeftIcon / renderRightIcon自定义关闭/左切换/右切换图标Snippetundefined
onVisibleChange预览开关变化(visible: boolean) => voidundefined
onChange切换图片(index: number) => voidundefined
onClose关闭回调() => voidundefined
onPrev / onNext向前/向后切换回调(index: number) => voidundefined
onZoomIn / onZoomOut放大/缩小回调(zoom: number) => voidundefined
onRotateLeft旋转回调(angle: number) => voidundefined
onRatioChange原始尺寸/适应切换回调(type: "adaptation"|"realSize") => voidundefined
onDownload下载回调(src, index) => voidundefined
onDownloadError下载失败回调(src) => voidundefined

Accessibility

ARIA roleimg
键盘交互EscapeArrowLeftArrowRight
  • img 必传 alt 语义;默认破图占位用 role=img + aria-label
  • 预览遮罩 role=dialog、aria-modal=true,portal 到 getPopupContainer/body;useFocusTrap 锁定焦点、Esc 关闭、useScrollLock 锁背景滚动
  • 组/独立预览左右切换:中部 ← → 按钮 + 键盘左右箭头(到边界按钮隐藏,infinite 时循环)
  • 翻页经 LiveAnnouncer polite 播报「第 m 张,共 n 张」

设计变量

变量默认值用法
--cd-image-bg var(--cd-color-fill-0)图片占位背景
--cd-image-header-close-bg rgba(0, 0, 0, 0.75)$color-image_header_close-bg:header 关闭 icon hover 背景(Semi 明暗一致)
--cd-image-mask-bg var(--cd-color-overlay-bg)$color-image_mask-bg:图片 hover 预览蒙层背景
--cd-image-mask-color var(--cd-color-white)图片操作遮罩文字颜色
--cd-image-mask-hover-bg rgba(255, 255, 255, 0.15)预览工具条/切换按钮 hover 时的浅色高亮叠层(浮在深色遮罩上)
--cd-image-mask-info-text var(--cd-color-white)$color-image_mask_info_text:蒙层「预览」文字颜色
--cd-image-placeholder-color var(--cd-color-text-3)图片占位/错误文字颜色
--cd-image-preview-bg var(--cd-color-overlay-bg)$color-image_preview-bg:预览浮层遮罩背景
--cd-image-preview-disabled-color rgba(249, 249, 249, 0.35)$color-image_preview_disabled:禁用 icon 颜色(Semi 明暗一致)
--cd-image-preview-divider-bg rgba(255, 255, 255, 0.5)$color-image-preview_divider-bg:footer 分割线颜色(Semi 明暗一致)