ImagePreview
Intro
Used to zoom in and preview the picture, and it supports two methods: function call and component call.
Install
Register component globally via app.use, refer to Component Registration for more registration ways.
import { createApp } from 'vue';
import { ImagePreview } from 'vant';
const app = createApp();
app.use(ImagePreview);
Function Call
Vant provides some utility functions that can quickly evoke global ImagePreview components.
For example, calling the showImagePreview function will render a Dialog directly in the page.
import { showImagePreview } from 'vant';
showImagePreview(['https://fastly.jsdelivr.net/npm/@vant/assets/apple-1.jpeg']);
Usage
Basic Usage
When calling showImagePreview, you can directly pass an array of images to display the image preview.
import { showImagePreview } from 'vant';
showImagePreview([
'https://fastly.jsdelivr.net/npm/@vant/assets/apple-1.jpeg',
'https://fastly.jsdelivr.net/npm/@vant/assets/apple-2.jpeg',
]);
Set Start Position
showImagePreview supports passing a configuration object, and you can specify the initial position (index value) of the image through the startPosition option.
import { showImagePreview } from 'vant';
showImagePreview({
images: [
'https://fastly.jsdelivr.net/npm/@vant/assets/apple-1.jpeg',
'https://fastly.jsdelivr.net/npm/@vant/assets/apple-2.jpeg',
],
startPosition: 1,
});
Show Close Icon
When the closeable option is enabled, a close icon will be displayed in the top-right corner of the popup layer. You can customize the icon by using the close-icon option, and the icon position can be customized using the close-icon-position option.
import { showImagePreview } from 'vant';
showImagePreview({
images: [
'https://fastly.jsdelivr.net/npm/@vant/assets/apple-1.jpeg',
'https://fastly.jsdelivr.net/npm/@vant/assets/apple-2.jpeg',
],
closeable: true,
});
Close Event
You can listen to the close event of the image preview through the onClose option.
import { showToast, showImagePreview } from 'vant';
showImagePreview({
images: [
'https://fastly.jsdelivr.net/npm/@vant/assets/apple-1.jpeg',
'https://fastly.jsdelivr.net/npm/@vant/assets/apple-2.jpeg',
],
onClose() {
showToast('closed');
},
});
Before Close
You can pass a callback function through the beforeClose option to perform specific operations before closing the image preview.
import { showImagePreview } from 'vant';
const instance = showImagePreview({
images: [
'https://fastly.jsdelivr.net/npm/@vant/assets/apple-1.jpeg',
'https://fastly.jsdelivr.net/npm/@vant/assets/apple-2.jpeg',
],
beforeClose: () => false,
});
setTimeout(() => {
instance.close();
}, 2000);
Use ImagePreview Component
If you need to embed components or other custom content inside the ImagePreview, you can directly use the ImagePreview component and customize it using the index slot. Before using it, you need to register the component through app.use or other methods.
<van-image-preview v-model:show="show" :images="images" @change="onChange">
<template v-slot:index>Page: {{ index + 1 }}</template>
</van-image-preview>
import { ref } from 'vue';
export default {
setup() {
const show = ref(false);
const index = ref(0);
const images = [
'https://fastly.jsdelivr.net/npm/@vant/assets/apple-1.jpeg',
'https://fastly.jsdelivr.net/npm/@vant/assets/apple-2.jpeg',
];
const onChange = (newIndex) => {
index.value = newIndex;
};
return {
show,
index,
images,
onChange,
};
},
};
Use image slot
When using ImagePreview component, you can custom the image through the image slot, such as render a video content. In this example, you can also set close-on-click-image prop to false, so that the preview won't be accidentally closed when you click on the video.
<van-image-preview
v-model:show="show"
:images="images"
:close-on-click-image="false"
>
<template #image="{ src }">
<video style="width: 100%;" controls>
<source :src="src" />
</video>
</template>
</van-image-preview>
import { ref } from 'vue';
export default {
setup() {
const show = ref(false);
const images = [
'https://www.w3school.com.cn/i/movie.ogg',
'https://www.w3school.com.cn/i/movie.ogg',
'https://www.w3school.com.cn/i/movie.ogg',
];
return {
show,
images,
};
},
};
API
Methods
Vant exports following ImagePreview utility functions:
| Methods | Description | Attribute | Return value |
|---|---|---|---|
| showImagePreview | Display a full-screen image preview component | string[] | ImagePreviewOptions | ImagePreview Instance |
ImagePreviewOptions
| Attribute | Description | Type | Default |
|---|---|---|---|
| images | Images URL list | string[] | [] |
| startPosition | Start position | number | string | 0 |
| showIndex | Whether to show index | boolean | true |
| showIndicators | Whether to show indicators | boolean | false |
| loop | Whether to enable loop | boolean | true |
| swipeDuration | Animation duration (ms) | number | string | 300 |
| onClose | Emitted when ImagePreview is closed | Function | - |
| onChange | Emitted when current image changed | Function | - |
| onScale | Emitted when scaling current image | Function | - |
| closeOnPopstate | Whether to close when popstate | boolean | true |
doubleScale v4.7.2 |
Whether to enable double tap zoom gesture. When disabled, the image preview will be closed immediately upon clicking | boolean | true |
closeOnClickImage v4.8.3 |
Whether to close when image is clicked | boolean | true |
closeOnClickOverlay v4.6.4 |
Whether to close when overlay is clicked | boolean | true |
vertical v4.8.6 |
Whether to enable vertical gesture sliding | boolean | false |
| beforeClose | Callback function before close | (action) => boolean | Promise | - |
| className | Custom className | string | Array | object | - |
| maxZoom | Max zoom | number | string | 3 |
| minZoom | Min zoom | number | string | 1/3 |
| closeable | Whether to show close icon | boolean | false |
| closeIcon | Close icon name | string | clear |
| closeIconPosition | Close icon position, can be set to top-left bottom-left bottom-right |
string | top-right |
| transition | Transition, equivalent to name prop of transition |
string | van-fade |
| overlayClass | Custom overlay class | string | Array | object | - |
| overlayStyle | Custom overlay style | object | - |
| teleport | Specifies a target element where ImagePreview will be mounted | string | Element | - |
Props
| Attribute | Description | Type | Default |
|---|---|---|---|
| v-model:show | Whether to show ImagePreview | boolean | false |
| images | Images URL list | string[] | [] |
| start-position | Start position | number | string | 0 |
| swipe-duration | Animation duration (ms) | number | string | 300 |
| show-index | Whether to show index | boolean | true |
| show-indicators | Whether to show indicators | boolean | false |
| loop | Whether to enable loop | boolean | true |
| double-scale | Whether to enable double tap zoom gesture. When disabled, the image preview will be closed immediately upon clicking | boolean | true |
| before-close | Callback function before close | (action: number) => boolean | Promise<boolean> | - |
| close-on-popstate | Whether to close when popstate | boolean | true |
close-on-click-image v4.8.3 |
Whether to close when image is clicked | boolean | true |
close-on-click-overlay v4.6.4 |
Whether to close when overlay is clicked | boolean | true |
vertical v4.8.6 |
Whether to enable vertical gesture sliding | boolean | false |
| class-name | Custom className (apply to Popup in image preview) | string | Array | object | - |
| max-zoom | Max zoom | number | string | 3 |
| min-zoom | Min zoom | number | string | 1/3 |
| closeable | Whether to show close icon | boolean | false |
| close-icon | Close icon name | string | clear |
| close-icon-position | Close icon position, can be set to top-left bottom-left bottom-right |
string | top-right |
| transition | Transition, equivalent to name prop of transition |
string | van-fade |
| overlay-class | Custom overlay class | string | Array | object | - |
| overlay-style | Custom overlay style | object | - |
| teleport | Specifies a target element where ImagePreview will be mounted | string | Element | - |
Events
| Event | Description | Arguments |
|---|---|---|
| close | Emitted when closing ImagePreview | { index: number, url: string } |
| closed | Emitted when ImagePreview is closed | - |
| change | Emitted when current image changed | index: number |
| scale | Emitted when scaling current image | { index: number, scale: number } |
| long-press | Emitted when long press current image | { index: number } |
Methods
Use ref to get ImagePreview instance and call instance methods.
| Name | Description | Attribute | Return value |
|---|---|---|---|
resetScale 4.7.4 |
Reset the current image's zoom ratio | - | - |
| swipeTo | Swipe to target index | index: number, options?: SwipeToOptions | - |
Types
The component exports the following type definitions:
import type {
ImagePreviewProps,
ImagePreviewOptions,
ImagePreviewInstance,
ImagePreviewScaleEventParams,
} from 'vant';
ImagePreviewInstance is the type of component instance:
import { ref } from 'vue';
import type { ImagePreviewInstance } from 'vant';
const imagePreviewRef = ref<ImagePreviewInstance>();
imagePreviewRef.value?.swipeTo(1);
Slots
| Name | Description | SlotProps |
|---|---|---|
| index | Custom index | { index: index of current image } |
| cover | Custom content that covers the image preview | - |
| image | Custom image content | { src: current image src } |
onClose Parameters
| Attribute | Description | Type |
|---|---|---|
| url | URL of current image | number |
| index | Index of current image | number |
onScale Parameters
| Attribute | Description | Type |
|---|---|---|
| index | Index of current image | number |
| scale | scale of current image | number |
Theming
CSS Variables
The component provides the following CSS variables, which can be used to customize styles. Please refer to ConfigProvider component.
| Name | Default Value | Description |
|---|---|---|
| --van-image-preview-index-text-color | var(--van-white) | - |
| --van-image-preview-index-font-size | var(--van-font-size-md) | - |
| --van-image-preview-index-line-height | var(--van-line-height-md) | - |
| --van-image-preview-index-text-shadow | 0 1px 1px var(--van-gray-8) | - |
| --van-image-preview-overlay-background | rgba(0, 0, 0, 0.9) | - |
| --van-image-preview-close-icon-size | 22px | - |
| --van-image-preview-close-icon-color | var(--van-gray-5) | - |
| --van-image-preview-close-icon-margin | var(--van-padding-md) | - |
| --van-image-preview-close-icon-z-index | 1 | - |