UNPKG

ivue-material-plus

Version:

A high quality UI components Library with Vue.js

1 lines 29.3 kB
{"version":3,"file":"image-preview.mjs","sources":["../../../../../src/components/ivue-image/image-preview.vue"],"sourcesContent":["<template>\r\n <teleport to=\"body\" :disabled=\"!transfer\">\r\n <!-- 蒙层 -->\r\n <transition name=\"fade\">\r\n <div\r\n :class=\"`${prefixCls}-mask`\"\r\n :style=\"maskStyles\"\r\n v-if=\"modelValue\"\r\n ></div>\r\n </transition>\r\n <!-- 内容 -->\r\n <transition name=\"fade\">\r\n <div\r\n :class=\"`${prefixCls}-wrapper`\"\r\n :style=\"maskStyles\"\r\n ref=\"wrapper\"\r\n v-if=\"modelValue\"\r\n >\r\n <div :class=\"prefixCls\" @click.stop=\"handleClickMask\">\r\n <!-- 加载中 -->\r\n <ivue-spin\r\n :class=\"`${prefixCls}-loading`\"\r\n :size=\"32\"\r\n v-if=\"data.imageStatus === 'loading'\"\r\n ></ivue-spin>\r\n <!-- 加载错误 -->\r\n <div\r\n :class=\"`${prefixCls}-error`\"\r\n v-if=\"data.imageStatus === 'error'\"\r\n >\r\n <span>加载失败</span>\r\n </div>\r\n <!-- 图片 -->\r\n <img\r\n :style=\"imageStyles\"\r\n :class=\"imageClasses\"\r\n :src=\"currentImage\"\r\n :key=\"`${data.currentIndex}`\"\r\n @click.stop\r\n @load=\"handleImageLoad\"\r\n @error=\"handleImageError\"\r\n @mousedown.stop.prevent=\"handleMousedown\"\r\n @touchstart.stop.prevent=\"handleTouchStart\"\r\n />\r\n <!-- 左按钮 -->\r\n <ivue-icon\r\n :class=\"`${prefixCls}-left`\"\r\n @click.stop=\"handleImageSwitch(false)\"\r\n >chevron_left</ivue-icon\r\n >\r\n <!-- 右按钮 -->\r\n <ivue-icon\r\n :class=\"`${prefixCls}-right`\"\r\n @click.stop=\"handleImageSwitch(true)\"\r\n >chevron_right</ivue-icon\r\n >\r\n <!-- 关闭按钮 -->\r\n <ivue-icon :class=\"`${prefixCls}-close`\" @click.stop=\"handleClose\"\r\n >close</ivue-icon\r\n >\r\n <!-- toolbar -->\r\n <div\r\n :class=\"`${prefixCls}-toolbar`\"\r\n v-if=\"toolbar && toolbar.length > 0\"\r\n @click.stop\r\n >\r\n <!-- 放大 -->\r\n <ivue-icon\r\n :class=\"`${prefixCls}-toolbar--item`\"\r\n :order=\"toolbar.indexOf('zoomIn') + 1\"\r\n @click.stop=\"handleOperation('zoomIn')\"\r\n v-if=\"toolbar.indexOf('zoomIn') > -1\"\r\n >zoom_in</ivue-icon\r\n >\r\n <!-- 缩小 -->\r\n <ivue-icon\r\n :class=\"`${prefixCls}-toolbar--item`\"\r\n :order=\"toolbar.indexOf('zoomOut') + 1\"\r\n @click.stop=\"handleOperation('zoomOut')\"\r\n v-if=\"toolbar.indexOf('zoomOut') > -1\"\r\n >zoom_out</ivue-icon\r\n >\r\n <!-- original -->\r\n <ivue-icon\r\n :class=\"`${prefixCls}-toolbar--item`\"\r\n :order=\"toolbar.indexOf('original') + 1\"\r\n @click.stop=\"handleOperation('original')\"\r\n v-if=\"toolbar.indexOf('original') > -1\"\r\n >{{ !data.original ? 'crop_free' : 'zoom_out_map' }}</ivue-icon\r\n >\r\n <!-- 左旋转 -->\r\n <ivue-icon\r\n :class=\"`${prefixCls}-toolbar--item`\"\r\n :order=\"toolbar.indexOf('rotateLeft') + 1\"\r\n @click.stop=\"handleOperation('rotateLeft')\"\r\n v-if=\"toolbar.indexOf('rotateLeft') > -1\"\r\n >rotate_left</ivue-icon\r\n >\r\n <!-- 右旋转 -->\r\n <ivue-icon\r\n :class=\"`${prefixCls}-toolbar--item`\"\r\n :order=\"toolbar.indexOf('rotateRight') + 1\"\r\n @click.stop=\"handleOperation('rotateRight')\"\r\n v-if=\"toolbar.indexOf('rotateRight') > -1\"\r\n >rotate_right</ivue-icon\r\n >\r\n <!-- 下载 -->\r\n <ivue-icon\r\n :class=\"`${prefixCls}-toolbar--item`\"\r\n :order=\"toolbar.indexOf('download') + 1\"\r\n @click.stop=\"handleOperation('download')\"\r\n v-if=\"toolbar.indexOf('download') > -1 && !data.downloading\"\r\n >save_alt</ivue-icon\r\n >\r\n <!-- 下载中 -->\r\n <ivue-icon\r\n :class=\"[\r\n `${prefixCls}-toolbar--item`,\r\n `${prefixCls}-toolbar--wait`,\r\n 'ivue-load-loop',\r\n ]\"\r\n :order=\"toolbar.indexOf('download') + 1\"\r\n @click.stop=\"handleOperation('download')\"\r\n v-if=\"toolbar.indexOf('download') > -1 && data.downloading\"\r\n >loop</ivue-icon\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n </transition>\r\n </teleport>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport {\r\n computed,\r\n defineComponent,\r\n getCurrentInstance,\r\n nextTick,\r\n reactive,\r\n ref,\r\n watch,\r\n} from 'vue';\r\nimport throttle from 'lodash.throttle';\r\n\r\n// utils\r\nimport { transferIndex, transferIncrease } from '../../utils/transfer-queue';\r\nimport { on, off } from '../../utils/dom';\r\nimport { isClient, downloadFile } from '../../utils/helpers';\r\n\r\n// components\r\nimport IvueSpin from '../ivue-spin';\r\nimport IvueIcon from '../ivue-icon';\r\n\r\n// type\r\nimport type { Props, Data } from './types/image-preview';\r\n\r\nconst prefixCls = 'ivue-image-preview';\r\n\r\nexport default defineComponent({\r\n name: prefixCls,\r\n emits: ['update:modelValue', 'on-close', 'on-switch'],\r\n props: {\r\n /**\r\n * 是否显示,可使用 v-model 双向绑定\r\n *\r\n * @type {Boolean}\r\n */\r\n modelValue: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 是否将弹层放置于 body 内\r\n *\r\n * @type {Boolean}\r\n */\r\n transfer: {\r\n type: Boolean,\r\n default() {\r\n const global = getCurrentInstance().appContext.config.globalProperties;\r\n\r\n return !global.$IVUE || global.$IVUE.transfer === ''\r\n ? false\r\n : global.$IVUE.transfer;\r\n },\r\n },\r\n /**\r\n * 打开预览的第一项\r\n *\r\n * @type {Number}\r\n */\r\n initialIndex: {\r\n type: Number,\r\n default: 0,\r\n },\r\n /**\r\n * 是否允许点击遮罩层关闭\r\n *\r\n * @type {Boolean}\r\n */\r\n maskClosable: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n /**\r\n * 图片预览列表\r\n *\r\n * @type {Array}\r\n */\r\n previewList: {\r\n type: Array,\r\n default: () => [],\r\n },\r\n /**\r\n * 是否循环切换\r\n *\r\n * @type {Boolean}\r\n */\r\n infinite: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n /**\r\n * 图片预览操作栏选项,按数组顺序排序\r\n *\r\n * @type {Array}\r\n */\r\n toolbar: {\r\n type: Array,\r\n default() {\r\n const global = getCurrentInstance().appContext.config.globalProperties;\r\n\r\n return !global.$IVUE ||\r\n !global.$IVUE.image ||\r\n global.$IVUE.image.toolbar === ''\r\n ? [\r\n 'zoomIn',\r\n 'zoomOut',\r\n 'original',\r\n 'rotateLeft',\r\n 'rotateRight',\r\n 'download',\r\n ]\r\n : global.$IVUE.image.toolbar;\r\n },\r\n },\r\n /**\r\n * 防止body滚动\r\n *\r\n * @type {Boolean}\r\n */\r\n bodyOverflow: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n },\r\n setup(props: Props, { emit }) {\r\n // dom\r\n const wrapper = ref<HTMLElement>(null);\r\n\r\n // 蒙版index\r\n const getMaskIndex = () => {\r\n transferIncrease();\r\n\r\n return transferIndex;\r\n };\r\n\r\n // data\r\n const data = reactive<Data>({\r\n /**\r\n * 蒙层zIndex\r\n *\r\n * @type {Number}\r\n */\r\n maskIndex: getMaskIndex(),\r\n /**\r\n * 图片状态\r\n *\r\n * @type {String}\r\n */\r\n imageStatus: 'loading',\r\n /**\r\n * 当前index\r\n *\r\n * @type {Number}\r\n */\r\n currentIndex: 0,\r\n /**\r\n * 图片transition\r\n *\r\n * @type {Boolean}\r\n */\r\n transition: true,\r\n /**\r\n * 按原尺寸显示\r\n *\r\n * @type {Boolean}\r\n */\r\n original: false,\r\n /**\r\n * X轴\r\n *\r\n * @type {Number}\r\n */\r\n startX: 0,\r\n /**\r\n * Y轴\r\n *\r\n * @type {Number}\r\n */\r\n startY: 0,\r\n /**\r\n * 图片移动位置\r\n *\r\n * @type {Object}\r\n */\r\n imageTranslate: {\r\n x: 0,\r\n y: 0,\r\n },\r\n /**\r\n * 图片缩放大小\r\n *\r\n * @type {Number}\r\n */\r\n imageScale: 1,\r\n /**\r\n * 图片旋转角度\r\n *\r\n * @type {NUmber}\r\n */\r\n imageRotate: 0,\r\n /**\r\n * 防止body滚动\r\n *\r\n * @type {String}\r\n */\r\n prevOverflow: '',\r\n /**\r\n * 下载中\r\n *\r\n * @type {Boolean}\r\n */\r\n downloading: false,\r\n });\r\n\r\n // computed\r\n\r\n // 蒙版样式\r\n const maskStyles = computed(() => {\r\n return {\r\n zIndex: data.maskIndex + 1000,\r\n };\r\n });\r\n\r\n // 当前选择的图片\r\n const currentImage = computed(() => {\r\n return props.previewList[data.currentIndex];\r\n });\r\n\r\n // 图片class\r\n const imageClasses = computed(() => {\r\n return [\r\n `${prefixCls}-image`,\r\n {\r\n // 抓取图片中\r\n [`${prefixCls}-grabbing`]: !data.transition,\r\n // 隐藏图片\r\n [`${prefixCls}-hidden`]: data.imageStatus === 'error',\r\n // transition\r\n [`${prefixCls}-transition`]: data.transition,\r\n // 限制图片大小\r\n [`${prefixCls}-limit`]: !data.original,\r\n },\r\n ];\r\n });\r\n\r\n // 图片style\r\n const imageStyles = computed(() => {\r\n let translateX = data.imageTranslate.x / data.imageScale;\r\n let translateY = data.imageTranslate.y / data.imageScale;\r\n\r\n const mod = data.imageRotate % 360;\r\n\r\n // 90, -270\r\n if ([90, -270].includes(mod)) {\r\n [translateX, translateY] = [translateY, -translateX];\r\n }\r\n\r\n // 180 , -180\r\n if ([180, -180].includes(mod)) {\r\n [translateX, translateY] = [-translateX, -translateY];\r\n }\r\n\r\n // 270 , -90\r\n if ([270, -90].includes(mod)) {\r\n [translateX, translateY] = [-translateY, translateX];\r\n }\r\n\r\n return {\r\n transform: `\r\n scale(${data.imageScale})\r\n rotate(${data.imageRotate}deg)\r\n translate(${translateX}px, ${translateY}px)\r\n `,\r\n };\r\n });\r\n\r\n // methods\r\n\r\n // 点击蒙层\r\n const handleClickMask = () => {\r\n // 是否允许点击遮罩层关闭\r\n if (!props.maskClosable) {\r\n return;\r\n }\r\n\r\n // 关闭\r\n handleClose();\r\n };\r\n\r\n // 关闭\r\n const handleClose = () => {\r\n emit('update:modelValue', false);\r\n emit('on-close');\r\n };\r\n\r\n // 图片加载成功\r\n const handleImageLoad = () => {\r\n data.imageStatus = 'loaded';\r\n };\r\n\r\n // 图片加载失败\r\n const handleImageError = () => {\r\n data.imageStatus = 'error';\r\n };\r\n\r\n // 鼠标按下\r\n const handleMousedown = (event: MouseEvent) => {\r\n const {\r\n pageX,\r\n pageY,\r\n // 表示被按下的按钮\r\n which,\r\n } = event;\r\n\r\n // 没有按下\r\n if (which !== 1) {\r\n return;\r\n }\r\n\r\n // 触发事件的位置\r\n data.startX = pageX;\r\n data.startY = pageY;\r\n\r\n data.transition = false;\r\n\r\n on(document, 'mousemove', handleMousemove);\r\n on(document, 'mouseup', handleMouseup);\r\n };\r\n\r\n // 鼠标移动 节流 throttle\r\n const handleMousemove = throttle((event) => {\r\n event.stopPropagation();\r\n\r\n const { pageX, pageY } = event;\r\n\r\n data.imageTranslate.x += pageX - data.startX;\r\n data.imageTranslate.y += pageY - data.startY;\r\n\r\n // 触发事件的位置\r\n data.startX = pageX;\r\n data.startY = pageY;\r\n });\r\n\r\n // 鼠标松开\r\n const handleMouseup = () => {\r\n data.transition = true;\r\n\r\n off(document, 'mousemove', handleMousemove);\r\n off(document, 'mouseup', handleMouseup);\r\n };\r\n\r\n // 手指按下\r\n const handleTouchStart = (event: TouchEvent) => {\r\n const { pageX, pageY } = event.touches[0];\r\n\r\n // 触发事件的位置\r\n data.startX = pageX;\r\n data.startY = pageY;\r\n\r\n data.transition = false;\r\n\r\n on(document, 'touchmove', handleTouchmove);\r\n on(document, 'touchend', handleTouchend);\r\n };\r\n\r\n // 手指移动\r\n const handleTouchmove = throttle((event: TouchEvent) => {\r\n event.stopPropagation();\r\n\r\n const { pageX, pageY } = event.touches[0];\r\n\r\n data.imageTranslate.x += pageX - data.startX;\r\n data.imageTranslate.y += pageY - data.startY;\r\n\r\n // 触发事件的位置\r\n data.startX = pageX;\r\n data.startY = pageY;\r\n });\r\n\r\n // 手指离开\r\n const handleTouchend = () => {\r\n data.transition = true;\r\n\r\n off(document, 'touchmove', handleTouchmove);\r\n off(document, 'touchend', handleTouchend);\r\n };\r\n\r\n // 重制样式\r\n const resetStyle = () => {\r\n data.imageScale = 1;\r\n data.imageRotate = 0;\r\n\r\n data.imageTranslate = {\r\n x: 0,\r\n y: 0,\r\n };\r\n };\r\n\r\n // 获取body样式\r\n const getBodyOverflow = () => {\r\n return isClient ? document.body.style.overflow : '';\r\n };\r\n\r\n // 设置body样式\r\n const setBodyOverflow = (value: string) => {\r\n if (!isClient) {\r\n return;\r\n }\r\n\r\n document.body.style.overflow = value;\r\n };\r\n\r\n // 鼠标滚动\r\n const handleWheel = (event) => {\r\n // 不设置防止body滚动\r\n if (!props.bodyOverflow) {\r\n event.preventDefault();\r\n }\r\n\r\n // 显示弹窗\r\n if (!props.modelValue) {\r\n return;\r\n }\r\n\r\n const { deltaY } = event;\r\n\r\n // 处理事件\r\n handleOperation(deltaY < 0 ? 'zoomIn' : 'zoomOut');\r\n };\r\n\r\n // 处理事件\r\n const handleOperation = (\r\n value:\r\n | 'zoomIn'\r\n | 'zoomOut'\r\n | 'original'\r\n | 'rotateLeft'\r\n | 'rotateRight'\r\n | 'download'\r\n ) => {\r\n // 放大\r\n if (value === 'zoomIn' && data.imageScale < 6) {\r\n data.imageScale += 0.25;\r\n }\r\n\r\n // 缩小\r\n if (value === 'zoomOut' && data.imageScale > 0.25) {\r\n data.imageScale -= 0.25;\r\n }\r\n\r\n // 按原尺寸显示\r\n if (value === 'original') {\r\n data.original = !data.original;\r\n\r\n data.transition = false;\r\n\r\n // 重制样式\r\n resetStyle();\r\n\r\n setTimeout(() => {\r\n data.transition = true;\r\n }, 0);\r\n }\r\n\r\n // 左旋转\r\n if (value === 'rotateLeft') {\r\n data.imageRotate -= 90;\r\n }\r\n\r\n // 右旋转\r\n if (value === 'rotateRight') {\r\n data.imageRotate += 90;\r\n }\r\n\r\n // 下载\r\n if (value === 'download') {\r\n data.downloading = true;\r\n\r\n downloadFile(props.previewList[data.currentIndex])\r\n .then(() => {\r\n data.downloading = false;\r\n })\r\n .catch(() => {\r\n data.downloading = false;\r\n });\r\n }\r\n };\r\n\r\n // 键盘按下\r\n const handleKeydown = (event) => {\r\n // 是否显示弹窗\r\n if (!props.modelValue) {\r\n return;\r\n }\r\n\r\n const { keyCode } = event;\r\n\r\n // 左边键盘\r\n if (keyCode === 37) {\r\n handleImageSwitch(false);\r\n }\r\n\r\n // 右边键盘\r\n if (keyCode === 39) {\r\n handleImageSwitch(true);\r\n }\r\n\r\n // 上按钮\r\n if (keyCode === 38) {\r\n handleOperation('zoomIn');\r\n }\r\n\r\n // 下按钮\r\n if (keyCode === 40) {\r\n handleOperation('zoomOut');\r\n }\r\n\r\n // 空格\r\n if (keyCode === 32) {\r\n event.preventDefault();\r\n\r\n data.original = !data.original;\r\n }\r\n };\r\n\r\n // 键盘松开\r\n const handleKeyup = (event) => {\r\n // 是否显示弹窗\r\n if (!props.modelValue) {\r\n return;\r\n }\r\n\r\n const { keyCode } = event;\r\n\r\n // 退出健\r\n if (keyCode === 27) {\r\n handleClose();\r\n }\r\n };\r\n\r\n // 切换\r\n const handleImageSwitch = (next: boolean) => {\r\n // 下一个\r\n if (next) {\r\n // 是否是最后一个图片\r\n if (data.currentIndex + 1 === props.previewList.length) {\r\n // 是否循环切换\r\n if (props.infinite) {\r\n // 重制样式\r\n resetStyle();\r\n\r\n data.currentIndex = 0;\r\n }\r\n }\r\n // 下一个\r\n else {\r\n // 重制样式\r\n resetStyle();\r\n\r\n data.currentIndex += 1;\r\n }\r\n }\r\n // 上一个\r\n else {\r\n // 第一个图片\r\n if (data.currentIndex === 0) {\r\n // 是否循环切换\r\n if (props.infinite) {\r\n // 重制样式\r\n resetStyle();\r\n\r\n // 重新设置当前图片\r\n data.currentIndex = props.previewList.length - 1;\r\n }\r\n }\r\n // 下一个\r\n else {\r\n resetStyle();\r\n\r\n data.currentIndex -= 1;\r\n }\r\n }\r\n\r\n emit('on-switch', {\r\n currentIndex: data.currentIndex,\r\n });\r\n };\r\n\r\n // watch\r\n\r\n // 监听弹窗显示\r\n watch(\r\n () => props.modelValue,\r\n (value) => {\r\n // 显示\r\n if (value) {\r\n // 设置当前index\r\n data.currentIndex = props.initialIndex;\r\n\r\n // 重制样式\r\n resetStyle();\r\n\r\n // 按原尺寸显示\r\n data.original = false;\r\n\r\n // 设置防止body滚动\r\n if (props.bodyOverflow) {\r\n // 获取body样式\r\n data.prevOverflow = getBodyOverflow();\r\n\r\n // 设置body样式\r\n setBodyOverflow('hidden');\r\n }\r\n\r\n // 蒙层zIndex\r\n data.maskIndex = getMaskIndex();\r\n\r\n nextTick(() => {\r\n // 鼠标滚动\r\n on(wrapper.value, 'wheel', handleWheel);\r\n // 键盘按下\r\n on(document, 'keydown', handleKeydown);\r\n // 键盘松开\r\n on(document, 'keyup', handleKeyup);\r\n });\r\n }\r\n // 隐藏\r\n else {\r\n // 设置防止body滚动\r\n if (props.bodyOverflow) {\r\n // 重新设置body样式\r\n setBodyOverflow(data.prevOverflow);\r\n }\r\n\r\n // 鼠标滚动\r\n off(wrapper.value, 'wheel', handleWheel);\r\n // 键盘按下\r\n off(document, 'keydown', handleKeydown);\r\n // 键盘松开\r\n off(document, 'keyup', handleKeyup);\r\n }\r\n }\r\n );\r\n\r\n // 监听当前index变化\r\n watch(\r\n () => data.currentIndex,\r\n () => {\r\n data.imageStatus = 'loading';\r\n }\r\n );\r\n\r\n return {\r\n prefixCls,\r\n // dom\r\n wrapper,\r\n\r\n // data\r\n data,\r\n\r\n // computed\r\n maskStyles,\r\n currentImage,\r\n imageClasses,\r\n imageStyles,\r\n\r\n // methods\r\n handleClickMask,\r\n handleImageLoad,\r\n handleImageError,\r\n handleMousedown,\r\n handleImageSwitch,\r\n handleOperation,\r\n handleClose,\r\n handleTouchStart,\r\n resetStyle,\r\n };\r\n },\r\n components: {\r\n IvueSpin,\r\n IvueIcon,\r\n },\r\n});\r\n</script>\r\n"],"names":["_createElementVNode","_resolveComponent","_openBlock","_createBlock","_Teleport","_createCommentVNode","_createVNode","_Transition","_withCtx","_normalizeClass","_normalizeStyle","_withModifiers"],"mappings":"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"}