index.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <template>
  2. <div class="preView">
  3. <div class="preview_box">
  4. <div class="header" v-if="closeabled">
  5. <div class="icon_close">
  6. <el-icon @click="closeHandler"><Close /></el-icon>
  7. </div>
  8. </div>
  9. <div class="content" :style="{ height: closeabled ? 'calc(100% - 50px)' : '100%' }">
  10. <img ref="imgRef" :src="props.src" />
  11. <ul class="img_tool">
  12. <li @click="zoomHandler(1)">
  13. <el-icon><ZoomIn /></el-icon>
  14. </li>
  15. <li @click="zoomHandler(-1)">
  16. <el-icon><ZoomOut /></el-icon>
  17. </li>
  18. <li @click="rotateHandler(-1)">
  19. <el-icon><RefreshLeft /></el-icon>
  20. </li>
  21. <li @click="rotateHandler(1)">
  22. <el-icon><RefreshRight /></el-icon>
  23. </li>
  24. <li @click="scaleToOriginal">
  25. <el-icon><ScaleToOriginal /></el-icon>
  26. </li>
  27. <li @click="rotateHandler(0)">
  28. <el-icon><Refresh /></el-icon>
  29. </li>
  30. </ul>
  31. </div>
  32. </div>
  33. </div>
  34. </template>
  35. <script setup lang="ts">
  36. import ImagePreview from './ImagePreview.ts'
  37. defineOptions({
  38. name: 'PreView'
  39. })
  40. const props = withDefaults(
  41. defineProps<{
  42. src: string
  43. visiable: boolean
  44. fullScreen: boolean
  45. width: number
  46. height: number
  47. title: string
  48. closeabled: boolean
  49. }>(),
  50. {
  51. visiable: true,
  52. fullScreen: false,
  53. width: 60,
  54. height: 90,
  55. title: '资源预览',
  56. closeabled: false
  57. }
  58. )
  59. const emit = defineEmits<{
  60. (e: 'close')
  61. }>()
  62. const imgRef = ref<HTMLElement>()
  63. let imagePreview: ImagePreview
  64. const zoomHandler = (num: number) => {
  65. imagePreview.zoomHandler(num)
  66. }
  67. const rotateHandler = (num: number) => {
  68. imagePreview.rotateHandler(num)
  69. }
  70. const scaleToOriginalType = ref<boolean>(false)
  71. const scaleToOriginal = () => {
  72. scaleToOriginalType.value = !scaleToOriginalType.value
  73. imagePreview.setScaleToOriginal(scaleToOriginalType.value)
  74. }
  75. const closeHandler = () => {
  76. emit('close')
  77. }
  78. onMounted(() => {
  79. imagePreview = new ImagePreview()
  80. imagePreview.bindMouseEvent(imgRef.value as HTMLElement)
  81. })
  82. </script>
  83. <style lang="scss" scoped>
  84. .preView {
  85. z-index: 99999999;
  86. position: absolute;
  87. top: 0px;
  88. bottom: 0px;
  89. left: 0px;
  90. right: 0px;
  91. background: rgba(0, 0, 0, 0.5);
  92. > .preview_box {
  93. position: absolute;
  94. left: 0px;
  95. right: 0px;
  96. top: 0px;
  97. bottom: 0px;
  98. margin: auto;
  99. padding: 20px;
  100. padding-top: 10px;
  101. > .header {
  102. height: 50px;
  103. display: flex;
  104. padding: 0px 20px;
  105. display: flex;
  106. align-items: center;
  107. justify-content: space-between;
  108. > .icon_close {
  109. font-size: 32px;
  110. right: 20px;
  111. color: #fff;
  112. font-weight: bold;
  113. cursor: pointer;
  114. opacity: 0.6;
  115. }
  116. }
  117. > .content {
  118. height: 100%;
  119. padding: 0px 20px;
  120. position: relative;
  121. text-align: center;
  122. display: flex;
  123. flex-direction: column;
  124. align-items: center;
  125. overflow: hidden;
  126. > img {
  127. display: block;
  128. cursor: pointer;
  129. user-drag: none;
  130. margin-top: 8%;
  131. user-select: none;
  132. -moz-user-select: none;
  133. -webkit-user-drag: none;
  134. -webkit-user-select: none;
  135. &.scale {
  136. transition-duration: 0.2s;
  137. }
  138. }
  139. > .img_tool {
  140. display: flex;
  141. background: rgba(0, 0, 0, 0.8);
  142. border-radius: 5px;
  143. padding: 15px 25px;
  144. position: absolute;
  145. bottom: 10px;
  146. > li {
  147. color: #fff;
  148. font-size: 26px;
  149. line-height: 26px;
  150. padding: 0px 10px;
  151. cursor: pointer;
  152. }
  153. }
  154. }
  155. }
  156. }
  157. </style>