JGuang

Image

Image · Ant Design

Preview
npm install antd@6.6.5 @ant-design/icons@6.3.4 dayjs@1.11.23

Image

Preview-able image.

When To Use

  • When you need to display pictures.
  • Display when loading a large image or fault tolerant handling when loading fail.

Examples

  • Basic Usage · basic

  • Progressive Loading · placeholder

  • Fault tolerant · fallback

  • Multiple image preview · preview-group

  • Preview from one image · preview-group-visible

  • Custom preview image · previewSrc

  • Controlled Preview · controlled-preview

  • Custom toolbar render · toolbarRender

  • Custom preview render · imageRender

  • preview mask · mask

  • Custom semantic dom styling · style-class

  • nested · nested

API

Common props ref:Common props

Image

PropertyDescriptionTypeDefaultVersionGlobal Config
altImage descriptionstring-×
classNamesCustomize class for each semantic structure inside the component. Supports object or function.Record<SemanticDOM, string> | (info: { props })=> Record<SemanticDOM, string>-6.0.0
fallbackFallback URL when load failsstring-5.28.0
heightImage heightstring | number-×
placeholderLoading placeholder, supports ReactNode or config objectPlaceholderType-×
previewPreview configuration; set to false to disableboolean | PreviewTypetruepreview.closeIcon: 5.14.0, preview.mask: 6.0.0, preview.mask.closable: 6.4.0
srcImage URLstring-×
stylesCustomize inline style for each semantic structure inside the component. Supports object or function.Record<SemanticDOM, CSSProperties> | (info: { props })=> Record<SemanticDOM, CSSProperties>-6.0.0
widthImage widthstring | number-×
onErrorCallback when loading error occurs(event: Event) => void-×

Other Property ref <img>

PlaceholderType

PropertyDescriptionTypeDefaultVersion
progressProgress config, set to true to show gradient animation, set { percent: number } to show progress, render for custom renderingboolean | ImageProgressConfig-

ImageProgressConfig

PropertyDescriptionTypeDefaultVersion
percentProgress valuenumber-
renderCustom rendering, receives default progress UI and percentage(progress: React.ReactNode, percent: number) => React.ReactNode-

PreviewType

PropertyDescriptionTypeDefaultVersion
actionsRenderCustom toolbar render(originalNode: React.ReactElement, info: ToolbarRenderInfoType) => React.ReactNode-
closeIconCustom close iconReact.ReactNode-
coverCustom preview maskReact.ReactNode | CoverConfig-CoverConfig support after v6.0
focusTrapWhether to trap focus within the preview when openbooleantrue6.4.0
destroyOnCloseDestroy child elements on preview close (removed, no longer supported)booleanfalse
forceRenderForce render preview image (removed, no longer supported)boolean-
getContainerSpecify container for preview mounting; still full screen; false mounts at current locationstring | HTMLElement | (() => HTMLElement) | false-
imageRenderCustom preview content(originalNode: React.ReactElement, info: { transform: TransformType, image: ImgInfo }) => React.ReactNode-
maskpreview mask effectboolean | { enabled?: boolean, blur?: boolean, closable?: boolean }truemask.closable: 6.4.0
maskClassNameThumbnail mask class name; please use 'classNames.cover' insteadstring-
maxScaleMaximum zoom scalenumber50
minScaleMinimum zoom scalenumber1
movableWhether the preview image can be dragged when it is larger than the viewportbooleantrue
openWhether to display previewboolean-
rootClassNameRoot DOM class name for preview; applies to both image and preview wrapperstring-
scaleStepEach step's zoom multiplier is 1 + scaleStepnumber0.5
srcCustom preview srcstring-
stylesCustom semantic structure stylesRecord<SemanticDOM, CSSProperties>-
wheelWhether to enable mouse wheel zoombooleantrue6.6.0
toolbarRenderCustom toolbar; please use 'actionsRender' instead(originalNode: React.ReactElement, info: Omit<ToolbarRenderInfoType, 'current' | 'total'>) => React.ReactNode-
visibleWhether to show; please use 'open' insteadboolean-
onOpenChangeCallback when preview open state changes(open: boolean) => void-
onTransformCallback for preview transform changes{ transform: TransformType, action: TransformAction }-
onVisibleChangeCallback when 'visible' changes; please use 'onOpenChange' instead(visible: boolean, prevVisible: boolean) => void-

PreviewGroup

PropertyDescriptionTypeDefaultVersion
classNamesCustomize class for each semantic structure inside the component. Supports object or function.Record<SemanticDOM, string> | (info: { props })=> Record<SemanticDOM, string>-
fallbackFallback URL for load errorstring-
itemsArray of preview itemsstring[] | { src: string, crossOrigin: string, ... }[]-
previewPreview configuration; disable by setting to falseboolean | PreviewGroupTypetrue

PreviewGroupType

PropertyDescriptionTypeDefaultVersion
actionsRenderCustom toolbar render(originalNode: React.ReactElement, info: ToolbarRenderInfoType) => React.ReactNode-
closeIconCustom close iconReact.ReactNode-
countRenderCustom preview count render(current: number, total: number) => React.ReactNode-
focusTrapWhether to trap focus within the preview when openbooleantrue6.4.0
currentIndex of the current preview imagenumber-
forceRenderForce render preview image (removed, no longer supported)boolean-
getContainerSpecify container for preview mounting; still full screen; false mounts at current locationstring | HTMLElement | (() => HTMLElement) | false-
imageRenderCustom preview content(originalNode: React.ReactElement, info: { transform: TransformType, image: ImgInfo, current: number }) => React.ReactNode-
maskpreview mask effectboolean | { enabled?: boolean, blur?: boolean, closable?: boolean }truemask.closable: 6.4.0
maskClassNameThumbnail mask class name; please use 'classNames.cover' insteadstring-
minScaleMinimum zoom scalenumber1
maxScaleMaximum zoom scalenumber50
movableWhether the preview image can be dragged when it is larger than the viewportbooleantrue
openWhether to display previewboolean-
rootClassNameRoot DOM class name for preview; applies to both image and preview wrapper. Use 'classNames.root' insteadstring-
stylesCustom semantic structure stylesRecord<SemanticDOM, CSSProperties>-
wheelWhether to enable mouse wheel zoombooleantrue6.6.0
scaleStepEach step's zoom multiplier is 1 + scaleStepnumber0.5
toolbarRenderCustom toolbar; please use 'actionsRender' instead(originalNode: React.ReactElement, info: ToolbarRenderInfoType) => React.ReactNode-
visibleWhether to show; please use 'open' insteadboolean-
onOpenChangeCallback when preview open state changes, includes current preview index(open: boolean, info: { current: number }) => void-
onChangeCallback when changing preview image(current: number, prevCurrent: number) => void-
onTransformCallback for preview transform changes{ transform: TransformType, action: TransformAction }-
onVisibleChangeCallback when 'visible' changes; please use 'onOpenChange' instead(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; // support after 5.21.0
    onFlipY: () => void;
    onFlipX: () => void;
    onRotateLeft: () => void;
    onRotateRight: () => void;
    onZoomOut: () => void;
    onZoomIn: () => void;
    onReset: () => void; // support after 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; // The custom node of preview mask
  placement?: 'top' | 'bottom' | 'center'; // Set the position of the preview mask display.
};

Semantic DOM

Semantic nodeNative descriptionVersion
rootRoot element, sets relative positioning and inline-block layout styles—
imageImage element, sets width, height and vertical alignment styles—
coverImage hover display prompt element, sets absolute positioning, background color, opacity and transition animation styles—
popup.rootPreview root element, sets fixed positioning, z-index and background mask styles—
popup.maskPreview mask element, sets absolute positioning and semi-transparent background styles—
popup.bodyPreview body element, sets flex layout, center alignment and pointer event styles—
popup.footerPreview footer element, sets absolute positioning, center layout and bottom operation area styles—
popup.actionsPreview actions group element, sets flex layout, background color, border radius and action button styles—
popup.closePreview close button element, sets basic button styles6.4.0

Semantic description source: vendor/components/image/demo/_semantic.tsx

Design Token

Types, inheritance and declarations retain the pinned native source. Defaults are computed by the native theme and may be overridden by ConfigProvider; this table does not invent static defaults.

TokenTypeNative description
zIndexPopupnumberz-index of preview popup
previewOperationSizenumberSize of preview operation icon
previewOperationColorstringColor of preview operation icon
previewOperationHoverColorstringColor of hovered preview operation icon
previewOperationColorDisabledstringDisabled color of preview operation icon
progressAnimationDurationstringBase duration of loading animation

Declaration source: 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;

Shared native props

Tips: The following generic properties apply to most antd components; those not supported are described separately.

PropertyDescriptionTypeDefault
styleThe additional styleCSSProperties-
classNameThe additional css classstring-
rootClassNameClassName on the root elementstring-
autoFocusAuto focus when component mounted, only effective for focusable elements like forms, links, etc.booleanfalse

Install and reproduce an example

npm install antd@6.6.5 @ant-design/icons@6.3.4 dayjs@1.11.23

Use ConfigProvider and native App; configure dayjs locale separately. Each example lists its complete source files and additional pinned dependencies in View code. Example names select demos, not universal component props. See the resource setup guide for theme, locale and SSR.

Native type references

The source viewer includes unchanged native implementations and the following source declarations. Inherited types remain in their native packages. English source comments are preserved as code reference.

  • vendor/components/image/PreviewGroup.tsx
  • vendor/components/image/Progress.tsx
  • vendor/components/image/index.tsx
  • vendor/components/image/style/index.ts

Source and license

https://github.com/ant-design/ant-design/tree/4a39f54842eade4e565ab336ef6097cd7e723cdd

Original bilingual prose and executable examples are retained. Website-only embeds and token tables are expanded locally. Ant Design is MIT; separately listed dependency notices also apply. Upload previews block outbound requests and do not provide a backend.