图片
可预览的图片。
何时使用
- 需要展示图片时使用。
- 加载显示大图或加载失败时容错处理。
代码演示
-
基本用法 ·
basic -
渐进加载 ·
placeholder -
容错处理 ·
fallback -
多张图片预览 ·
preview-group -
相册模式 ·
preview-group-visible -
自定义预览图片 ·
previewSrc -
受控的预览 ·
controlled-preview -
自定义工具栏 ·
toolbarRender -
自定义预览内容 ·
imageRender -
预览遮罩 ·
mask -
自定义语义结构的样式和类 ·
style-class -
嵌套 ·
nested
API
通用属性参考:通用属性
Image
| 参数 | 说明 | 类型 | 默认值 | 版本 | 全局配置 |
|---|---|---|---|---|---|
| alt | 图像描述 | string | - | × | |
| classNames | 用于自定义组件内部各语义化结构的 class,支持对象或函数 | Record<SemanticDOM, string> | (info: { props })=> Record<SemanticDOM, string> | - | 6.0.0 | |
| fallback | 加载失败容错地址 | string | - | 5.28.0 | |
| height | 图像高度 | string | number | - | × | |
| placeholder | 加载占位,支持 ReactNode 或配置对象 | PlaceholderType | - | × | |
| preview | 预览参数,为 false 时禁用 | boolean | PreviewType | true | preview.closeIcon: 5.14.0,preview.mask: 6.0.0,preview.mask.closable: 6.4.0 | |
| src | 图片地址 | string | - | × | |
| styles | 用于自定义组件内部各语义化结构的行内 style,支持对象或函数 | Record<SemanticDOM, CSSProperties> | (info: { props })=> Record<SemanticDOM, CSSProperties> | - | 6.0.0 | |
| width | 图像宽度 | string | number | - | × | |
| onError | 加载错误回调 | (event: Event) => void | - | × |
其他属性见 <img>
PlaceholderType
| 参数 | 说明 | 类型 | 默认值 | 版本 |
|---|---|---|---|---|
| progress | 进度配置,设置为 true 显示渐变动画,设置 { percent: number } 显示进度,render 自定义渲染 | boolean | ImageProgressConfig | - |
ImageProgressConfig
| 参数 | 说明 | 类型 | 默认值 | 版本 |
|---|---|---|---|---|
| percent | 进度值 | number | - | |
| render | 自定义渲染,接收默认的进度 UI 和百分比 | (progress: React.ReactNode, percent: number) => React.ReactNode | - |
PreviewType
| 参数 | 说明 | 类型 | 默认值 | 版本 |
|---|---|---|---|---|
| actionsRender | 自定义工具栏渲染 | (originalNode: React.ReactElement, info: ToolbarRenderInfoType) => React.ReactNode | - | |
| closeIcon | 自定义关闭 Icon | React.ReactNode | - | |
| cover | 自定义预览遮罩 | React.ReactNode | CoverConfig | - | CoverConfig v6.0 开始支持 |
| focusTrap | 预览打开时是否在预览内捕获焦点 | boolean | true | 6.4.0 |
| 关闭预览时销毁子元素,已移除,不再支持 | boolean | false | ||
| 强制渲染预览图,已移除,不再支持 | boolean | - | ||
| getContainer | 指定预览挂载的节点,但依旧为全屏展示,false 为挂载在当前位置 | string | HTMLElement | (() => HTMLElement) | false | - | |
| imageRender | 自定义预览内容 | (originalNode: React.ReactElement, info: { transform: TransformType, image: ImgInfo }) => React.ReactNode | - | |
| mask | 预览遮罩效果 | boolean | { enabled?: boolean, blur?: boolean, closable?: boolean } | true | mask.closable: 6.4.0 |
缩略图遮罩类名,请使用 classNames.cover 替换 | string | - | ||
| maxScale | 最大缩放倍数 | number | 50 | |
| minScale | 最小缩放倍数 | number | 1 | |
| movable | 预览图片大于视口时是否可拖拽移动 | boolean | true | |
| open | 是否显示预览 | boolean | - | |
| rootClassName | 预览图的根 DOM 类名,会同时作用在图片和预览层最外侧 | string | - | |
| scaleStep | 1 + scaleStep 为缩放放大的每步倍数 | number | 0.5 | |
| src | 自定义预览 src | string | - | |
| styles | 自定义语义化结构样式 | Record<SemanticDOM, CSSProperties> | - | |
| wheel | 是否启用鼠标滚轮缩放 | boolean | true | 6.6.0 |
自定义工具栏,请使用 actionsRender 替换 | (originalNode: React.ReactElement, info: Omit<ToolbarRenderInfoType, 'current' | 'total'>) => React.ReactNode | - | ||
是否显示,请使用 open 替换 | boolean | - | ||
| onOpenChange | 预览打开状态变化的回调 | (open: boolean) => void | - | |
| onTransform | 预览图 transform 变化的回调 | { transform: TransformType, action: TransformAction } | - | |
当 visible 发生改变时的回调,请使用 onOpenChange 替换 | (visible: boolean, prevVisible: boolean) => void | - |
PreviewGroup
| 参数 | 说明 | 类型 | 默认值 | 版本 |
|---|---|---|---|---|
| classNames | 用于自定义组件内部各语义化结构的 class,支持对象或函数 | Record<SemanticDOM, string> | (info: { props })=> Record<SemanticDOM, string> | - | |
| fallback | 加载失败容错地址 | string | - | |
| items | 预览数组 | string[] | { src: string, crossOrigin: string, ... }[] | - | |
| preview | 预览参数,为 false 时禁用 | boolean | PreviewGroupType | true |
PreviewGroupType
| 参数 | 说明 | 类型 | 默认值 | 版本 |
|---|---|---|---|---|
| actionsRender | 自定义工具栏渲染 | (originalNode: React.ReactElement, info: ToolbarRenderInfoType) => React.ReactNode | - | |
| closeIcon | 自定义关闭 Icon | React.ReactNode | - | |
| countRender | 自定义预览计数内容 | (current: number, total: number) => React.ReactNode | - | |
| focusTrap | 预览打开时是否在预览内捕获焦点 | boolean | true | 6.4.0 |
| current | 当前预览图的 index | number | - | |
| 强制渲染预览图,已移除,不再支持 | boolean | - | ||
| getContainer | 指定预览挂载的节点,但依旧为全屏展示,false 为挂载在当前位置 | string | HTMLElement | (() => HTMLElement) | false | - | |
| imageRender | 自定义预览内容 | (originalNode: React.ReactElement, info: { transform: TransformType, image: ImgInfo, current: number }) => React.ReactNode | - | |
| mask | 预览遮罩效果 | boolean | { enabled?: boolean, blur?: boolean, closable?: boolean } | true | mask.closable: 6.4.0 |
缩略图遮罩类名,请使用 classNames.cover 替换 | string | - | ||
| minScale | 最小缩放倍数 | number | 1 | |
| maxScale | 最大放大倍数 | number | 50 | |
| movable | 预览图片大于视口时是否可拖拽移动 | boolean | true | |
| open | 是否显示预览 | boolean | - | |
预览图的根 DOM 类名,会同时作用在图片和预览层最外侧,请使用 classNames.root 替换 | string | - | ||
| styles | 自定义语义化结构样式 | Record<SemanticDOM, CSSProperties> | - | |
| wheel | 是否启用鼠标滚轮缩放 | boolean | true | 6.6.0 |
| scaleStep | 1 + scaleStep 为缩放放大的每步倍数 | number | 0.5 | |
自定义工具栏,请使用 actionsRender 替换 | (originalNode: React.ReactElement, info: ToolbarRenderInfoType) => React.ReactNode | - | ||
是否显示,请使用 open 替换 | boolean | - | ||
| onOpenChange | 预览打开状态变化回调,额外携带当前预览图索引 | (open: boolean, info: { current: number }) => void | - | |
| onChange | 切换预览图的回调 | (current: number, prevCurrent: number) => void | - | |
| onTransform | 预览图 transform 变化的回调 | { transform: TransformType, action: TransformAction } | - | |
当 visible 发生改变时的回调,请使用 onOpenChange 替换 | (visible: boolean, prevVisible: boolean, current: number) => void | - |
Interface
TransformType
{
x: number;
y: number;
rotate: number;
scale: number;
flipX: boolean;
flipY: boolean;
}
TransformAction
type TransformAction =
| 'flipY'
| 'flipX'
| 'rotateLeft'
| 'rotateRight'
| 'zoomIn'
| 'zoomOut'
| 'close'
| 'prev'
| 'next'
| 'wheel'
| 'doubleClick'
| 'move'
| 'dragRebound'
| 'reset';
ToolbarRenderInfoType
{
icons: {
flipYIcon: React.ReactNode;
flipXIcon: React.ReactNode;
rotateLeftIcon: React.ReactNode;
rotateRightIcon: React.ReactNode;
zoomOutIcon: React.ReactNode;
zoomInIcon: React.ReactNode;
};
actions: {
onActive?: (index: number) => void; // 5.21.0 之后支持
onFlipY: () => void;
onFlipX: () => void;
onRotateLeft: () => void;
onRotateRight: () => void;
onZoomOut: () => void;
onZoomIn: () => void;
onReset: () => void; // 5.17.3 之后支持
onClose: () => void;
};
transform: TransformType,
current: number;
total: number;
image: ImgInfo
}
ImgInfo
{
url: string;
alt: string;
width: string | number;
height: string | number;
}
CoverConfig
type CoverConfig = {
coverNode?: React.ReactNode; // 自定义遮罩元素
placement?: 'top' | 'bottom' | 'center'; // 设置预览遮罩显示的位置
};
Semantic DOM
| 语义节点 | 原生说明 | 版本 |
|---|---|---|
root | 根元素,设置相对定位和行内块布局样式 | — |
image | 图片元素,设置宽度、高度和垂直对齐样式 | — |
cover | 悬浮图片显示的提示元素,设置绝对定位、背景色、透明度和过渡动画样式 | — |
popup.root | 预览根元素,设置固定定位、层级和背景遮罩样式 | — |
popup.mask | 预览遮罩元素,设置绝对定位和半透明背景样式 | — |
popup.body | 预览内容元素,设置flex布局、居中对齐和指针事件样式 | — |
popup.footer | 预览页脚元素,设置绝对定位、居中布局和底部操作区域样式 | — |
popup.actions | 预览操作组元素,设置flex布局、背景色、圆角和操作按钮样式 | — |
popup.close | 预览关闭按钮元素,设置按钮的基础样式 | 6.4.0 |
语义说明来源: vendor/components/image/demo/_semantic.tsx
主题变量(Design Token)
类型、继承关系和原生令牌声明保持固定源码原文;默认值由原生主题计算,并可能受 ConfigProvider 覆盖。本表不伪造静态默认值。
| 令牌 | 类型 | 原生说明 |
|---|---|---|
zIndexPopup | number | 预览浮层 z-index |
previewOperationSize | number | 预览操作图标大小 |
previewOperationColor | string | 预览操作图标颜色 |
previewOperationHoverColor | string | 预览操作图标悬浮颜色 |
previewOperationColorDisabled | string | 预览操作图标禁用颜色 |
progressAnimationDuration | string | 加载动画基础时长 |
声明来源: vendor/components/image/style/index.ts
import type { CSSObject } from '@ant-design/cssinjs';
import { unit } from '@ant-design/cssinjs';
import { FastColor } from '@ant-design/fast-color';
import type { FullToken, GenerateStyle, GetDefaultToken } from '../../theme/internal';
import { genStyleHooks, mergeToken } from '../../theme/internal';
import { genFocusOutline, genFocusStyle } from '../../style';
import { inkFlow1, inkFlow2, inkFlow3, progressActive } from './progressAnimation';
export interface ComponentToken {
/**
* @desc 预览浮层 z-index
* @descEN z-index of preview popup
*/
zIndexPopup: number;
/**
* @desc 预览操作图标大小
* @descEN Size of preview operation icon
*/
previewOperationSize: number;
/**
* @desc 预览操作图标颜色
* @descEN Color of preview operation icon
*/
previewOperationColor: string;
/**
* @desc 预览操作图标悬浮颜色
* @descEN Color of hovered preview operation icon
*/
previewOperationHoverColor: string;
/**
* @desc 预览操作图标禁用颜色
* @descEN Disabled color of preview operation icon
*/
previewOperationColorDisabled: string;
/**
* @desc 加载动画基础时长
* @descEN Base duration of loading animation
*/
progressAnimationDuration: string;
}
/**
* @desc Image 组件的 Token
* @descEN Token for Image component
*/
export interface ImageToken extends FullToken<'Image'> {
/**
* @desc 预览类名
* @descEN Preview class name
*/
previewCls: string;
/**
* @desc 预览切换按钮尺寸
* @descEN Size of preview switch button
*/
imagePreviewSwitchSize: number;
}
export type PositionType = 'static' | 'relative' | 'fixed' | 'absolute' | 'sticky' | undefined;
原生通用属性
Tips: 以下通用属性适用于 antd 大部分组件,不支持的组件会单独说明。
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| style | 自定义样式 | CSSProperties | - |
| className | 自定义类名 | string | - |
| rootClassName | 添加在组件最外层的 className | string | - |
| autoFocus | 自动获取焦点,仅对表单类、链接、交互容器等可聚焦元素生效 | boolean | false |
安装并复现示例
npm install antd@6.6.5 @ant-design/icons@6.3.4 dayjs@1.11.23
使用 ConfigProvider 和原生 App,并单独配置 dayjs 语言。每个示例在查看代码中列出完整源码文件和额外固定依赖。示例名称用于选择演示,不是组件通用属性。主题、语言与 SSR 初始化见资源安装指南。
原生类型参考
源码查看器包含未修改的原生实现和以下声明文件,继承类型仍位于原生包中。代码中的英文注释保留为源码参考。
vendor/components/image/PreviewGroup.tsxvendor/components/image/Progress.tsxvendor/components/image/index.tsxvendor/components/image/style/index.ts
来源与许可
https://github.com/ant-design/ant-design/tree/4a39f54842eade4e565ab336ef6097cd7e723cdd
保留原生中英文正文与可执行示例;官网专用的嵌入章节和令牌表格在本地展开。Ant Design 使用 MIT 许可,另列依赖的许可证也需保留。上传预览禁止向外发起请求,不提供后端服务。