diff --git a/docs/en-US/component/image.md b/docs/en-US/component/image.md index 914b0247e7..957e7cd4a8 100644 --- a/docs/en-US/component/image.md +++ b/docs/en-US/component/image.md @@ -57,7 +57,7 @@ image/image-preview ## Manually Open Preview ^(2.9.4) -:::demo allow big image preview by call `showPreview` method. +:::demo image/manually-preview diff --git a/docs/examples/image/manually-preview.vue b/docs/examples/image/manually-preview.vue index a601012bf5..a49a47aed3 100644 --- a/docs/examples/image/manually-preview.vue +++ b/docs/examples/image/manually-preview.vue @@ -1,13 +1,28 @@ @@ -28,17 +43,9 @@ const srcList = [ ] const imageRef = ref() +const showPreview = ref(false) + const handleClick = () => { imageRef.value!.showPreview() } - - diff --git a/packages/components/image-viewer/src/image-viewer.vue b/packages/components/image-viewer/src/image-viewer.vue index b0f17eb85d..4eb7a52952 100644 --- a/packages/components/image-viewer/src/image-viewer.vue +++ b/packages/components/image-viewer/src/image-viewer.vue @@ -153,6 +153,9 @@ defineOptions({ const props = defineProps(imageViewerProps) const emit = defineEmits(imageViewerEmits) +let stopWheelListener: (() => void) | undefined +let prevOverflow = '' + const { t } = useLocale() const ns = useNamespace('image-viewer') const { nextZIndex } = useZIndex() @@ -223,6 +226,8 @@ const progress = computed( function hide() { unregisterEventListener() + stopWheelListener?.() + document.body.style.overflow = prevOverflow emit('close') } @@ -390,6 +395,18 @@ function onCloseRequested() { } } +function wheelHandler(e: WheelEvent) { + if (!e.ctrlKey) return + + if (e.deltaY < 0) { + e.preventDefault() + return false + } else if (e.deltaY > 0) { + e.preventDefault() + return false + } +} + watch(currentImg, () => { nextTick(() => { const $img = imgRefs.value[0] @@ -406,6 +423,14 @@ watch(activeIndex, (val) => { onMounted(() => { registerEventListener() + + stopWheelListener = useEventListener('wheel', wheelHandler, { + passive: false, + }) + + // prevent body scroll + prevOverflow = document.body.style.overflow + document.body.style.overflow = 'hidden' }) defineExpose({ diff --git a/packages/components/image/src/image.vue b/packages/components/image/src/image.vue index 6f210203fe..b8823f1682 100644 --- a/packages/components/image/src/image.vue +++ b/packages/components/image/src/image.vue @@ -87,8 +87,6 @@ defineOptions({ const props = defineProps(imageProps) const emit = defineEmits(imageEmits) -let prevOverflow = '' - const { t } = useLocale() const ns = useNamespace('image') const rawAttrs = useRawAttrs() @@ -117,7 +115,6 @@ const _scrollContainer = ref() const supportLoading = isClient && 'loading' in HTMLImageElement.prototype let stopScrollListener: (() => void) | undefined -let stopWheelListener: (() => void) | undefined const imageKls = computed(() => [ ns.e('inner'), @@ -214,36 +211,14 @@ function removeLazyLoadListener() { _scrollContainer.value = undefined } -function wheelHandler(e: WheelEvent) { - if (!e.ctrlKey) return - - if (e.deltaY < 0) { - e.preventDefault() - return false - } else if (e.deltaY > 0) { - e.preventDefault() - return false - } -} - function clickHandler() { // don't show viewer when preview is false if (!preview.value) return - - stopWheelListener = useEventListener('wheel', wheelHandler, { - passive: false, - }) - - // prevent body scroll - prevOverflow = document.body.style.overflow - document.body.style.overflow = 'hidden' showViewer.value = true emit('show') } function closeViewer() { - stopWheelListener?.() - document.body.style.overflow = prevOverflow showViewer.value = false emit('close') }