经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
vue实现图片预览放大以及缩小问题
来源:jb51  时间:2023/1/16 9:16:20  对本文有异议

vue图片预览放大以及缩小

1.在vue的环境下实现图片放大缩小,可以使用viewerjs

效果图:

关于 viewerjs的使用

1)首先安装依赖

  1. npm i v-viewer --save

2)全局注册(在main.js)以及引用css

  1. //导入图片预览viewer组件以及css
  2. import Viewer from 'v-viewer'
  3. import 'viewerjs/dist/viewer.css'
  4. Vue.use(Viewer);
  5. Viewer.setDefaults({
  6. Options: { "inline": true, "button": true, "navbar": true, "title": true, "toolbar": true, "tooltip": true, "movable": true, "zoomable": true, "rotatable": true, "scalable": true, "transition": true, "fullscreen": true, "keyboard": true, "url": "data-source" }
  7. });

关于viewerjs中setDeafaults的配置下面有一张表,大家可以参考一下

这些工作都做完以后,然后可以在components(公共组件)文件下新建一个文件夹,命名看个人习惯,再新建一个以xxx.vue文件(同上,命名不做具体要求看个人习惯)。

在xxx.vue中写入

  1. <template>
  2. <div class="content">
  3. <!-- <h1>Viewer图片预览插件</h1> -->
  4. <viewer :images="viewerList">
  5. <img
  6. v-for="src in viewerList"
  7. :src="src.icon"
  8. :key="src.id"
  9. style="width: 50px; height: 50px; margin-right: 5px"
  10. />
  11. </viewer>
  12. </div>
  13. </template>
  14. <script>
  15. export default {
  16. props: {
  17. viewerList: {
  18. type: Array,
  19. default: [],
  20. },
  21. },
  22. mounted() {},
  23. data() {
  24. return {};
  25. },
  26. };
  27. </script>
  28. <style>
  29. </style>

因为已经全局注册过了,可以直接使用<viewer>标签 然后这个作为子组件。viewer绑定的一定要为数组,不然是会报错的(避坑)。

当这些都准备好的就可以在“父页面”使用了。

在父页面不要忘了引用以及注册

  1. import viewer from "../../../components/viewer/viewer-preview.vue";
  2. export default {
  3. name: "business",
  4. components: { viewer },
  5. }

仅展示了关键代码,其他的data(){ return{   }   }等等按需写入。

注册完以后在需要用到的地方直接写入,数据的都是通过父传子props的方式

  1. <Table :columns="figurenHeader" :data="figurenData">
  2. <template slot-scope="{ row }" slot="img">
  3. <div style="margin-top: 10px">
  4. <viewer :viewerList="row.iconUrlList"></viewer>
  5. </div>
  6. </template>
  7. </Table>

因为使用的是table里面的插槽,所以传入的数据为row.iconUrlList.  这样整个工作就算是结束了。

vue实现图片预览(放大缩小拖拽)纯手写

这张图是显示的图片放大的一个预览情况,这里是参考预览操作实现的一个背景为黑色的部分,上层的图片可实现滚轮放大或者点击上部的放大镜图标进行放大,代码是基于Ant Design Vue框架的基础上

这里先分解部分,后面有全部代码

1.需要有黑色背景用于预览背景:

这里的背景要占满整个屏幕(这里的一般是参考其他插件预览的样式进行模拟设计的),样式在后方代码内

2.展示图片并且把图片展示到背景板最中间。

3.最重要的下方的两部分:

滚轮放大缩小图片

  1. bbimg() {
  2. let e = e || window.event
  3. this.params.zoomVal += e.wheelDelta / 1200
  4. if (this.params.zoomVal >= 0.2) {
  5. this.test = `transform:scale(${this.params.zoomVal});`
  6. } else {
  7. this.params.zoomVal = 0.2
  8. this.test = `transform:scale(${this.params.zoomVal});`
  9. return false
  10. }
  11. },

图片拖拽

  1. imgMove(e) {
  2. console.log('e', e)
  3. let oImg = e.target
  4. let disX = e.clientX - oImg.offsetLeft
  5. let disY = e.clientY - oImg.offsetTop
  6. console.log('disX', disX)
  7. document.onmousemove = (e) => {
  8. e.preventDefault()
  9. let left = e.clientX - disX
  10. let top = e.clientY - disY
  11. this.test = this.test + `left: ${left}px;top: ${top}px;`
  12. }
  13. document.onmouseup = (e) => {
  14. document.onmousemove = null
  15. document.onmouseup = null
  16. }
  17. },

这里的test和classStyle是作为图片的动态样式,虽然名字起得着急,但是不影响使用

整体实现的功能

  • 点击图片,可以进行滚轮放大及缩小,
  • 点击后按压左键可进行拖拽查看图片
  • 点击上方的放大及缩小图标也可以进行放大等操作,
  • 点击 x 可关于预览
  • 点击关闭后,恢复大小,避免点击其他照片影响大小

下面是全部实现代码:

  1. <template>
  2. <a-card style="width: 100%">
  3. <div>
  4. <img
  5. :src="file"
  6. alt=""
  7. @click="handlePhotoShow(file)"
  8. />
  9. <!-- preview="0"
  10. preview-text="图片" -->
  11. </div>
  12. <div class="showImg" v-if="pictShow" @mousewheel="bbimg(this)">
  13. <div class="setting_box">
  14. <a-icon
  15. class="setting_zoom"
  16. v-if="zoomInShow == false"
  17. type="zoom-in"
  18. @click="handleZoomIn"
  19. />
  20. <a-icon
  21. color="#fff"
  22. class="setting_zoom"
  23. v-if="zoomInShow == true"
  24. type="zoom-out"
  25. @click="handleZoomOut"
  26. />
  27. <a-icon color="#fff" class="setting_close" type="close" @click="handleClose" />
  28. </div>
  29. <img :src="file" alt="" :class="classStyle" :style="test" @mousedown="imgMove" />
  30. </div>
  31. </a-card>
  32. </template>
  33. <script>
  34. export default {
  35. data() {
  36. return {
  37. test: '',
  38. pictShow: false,
  39. zoomInShow: false,
  40. params: {
  41. zoomVal: 1,
  42. left: 0,
  43. top: 0,
  44. currentX: 0,
  45. currentY: 0,
  46. flag: false,
  47. },
  48. file: '',
  49. }
  50. },
  51. computed: {
  52. classStyle() {
  53. return this.zoomInShow ? 'a1' : 'a2'
  54. },
  55. },
  56. methods: {
  57. // 实现图片放大缩小
  58. bbimg() {
  59. let e = e || window.event
  60. this.params.zoomVal += e.wheelDelta / 1200
  61. if (this.params.zoomVal >= 0.2) {
  62. this.test = `transform:scale(${this.params.zoomVal});`
  63. } else {
  64. this.params.zoomVal = 0.2
  65. this.test = `transform:scale(${this.params.zoomVal});`
  66. return false
  67. }
  68. },
  69. // 实现图片拖拽
  70. imgMove(e) {
  71. console.log('e', e)
  72. let oImg = e.target
  73. let disX = e.clientX - oImg.offsetLeft
  74. let disY = e.clientY - oImg.offsetTop
  75. console.log('disX', disX)
  76. document.onmousemove = (e) => {
  77. e.preventDefault()
  78. let left = e.clientX - disX
  79. let top = e.clientY - disY
  80. this.test = this.test + `left: ${left}px;top: ${top}px;`
  81. }
  82. document.onmouseup = (e) => {
  83. document.onmousemove = null
  84. document.onmouseup = null
  85. }
  86. },
  87. handleZoomIn() {
  88. this.zoomInShow = true
  89. },
  90. handleZoomOut() {
  91. this.zoomInShow = false
  92. },
  93. handlePhotoShow(file) {
  94. console.log('file', file)
  95. this.file = file
  96. this.pictShow = true
  97. },
  98. handleClose() {
  99. this.pictShow = false
  100. this.test = `transform:scale(1)`
  101. },
  102. },
  103. }
  104. </script>
  105. <style scoped lang="less">
  106. .showImg {
  107. width: 100%;
  108. height: 100vh;
  109. background-color: rgba(0, 0, 0, 1);
  110. position: fixed;
  111. *position: absolute;
  112. z-index: 20;
  113. margin: 0 auto;
  114. top: 0;
  115. left: 0;
  116. display: flex;
  117. justify-content: center;
  118. align-items: center;
  119. .setting_box {
  120. width: 100%;
  121. height: 50px;
  122. line-height: 50px;
  123. font-size: 20px;
  124. background-color: rgba(0, 0, 0, 0.3);
  125. position: absolute;
  126. top: 0;
  127. z-index: 999;
  128. .setting_zoom,
  129. .setting_close {
  130. position: absolute;
  131. z-index: 1000;
  132. top: 20px;
  133. color: #fff;
  134. opacity: 1;
  135. }
  136. .setting_zoom {
  137. right: 50px;
  138. }
  139. .setting_close {
  140. right: 10px;
  141. }
  142. }
  143. }
  144. .a1 {
  145. max-width: 200vw;
  146. max-height: 180vh;
  147. position: absolute;
  148. z-index: 22;
  149. margin-top: 40px;
  150. cursor: move;
  151. }
  152. .a2 {
  153. max-width: 95vw;
  154. max-height: 90vh;
  155. position: absolute;
  156. z-index: 22;
  157. margin-top: 40px;
  158. cursor: move;
  159. }
  160. .zoom-box {
  161. cursor: zoom-in;
  162. }
  163. .photo_box {
  164. margin: 0 5px 5px 0;
  165. }
  166. </style>

因为具体也是查看了很多博客等资源最后完成的。

其实在代码内有一部分代码:

  1. <img
  2. :src="file"
  3. preview="0"
  4. preview-text="图片"
  5. alt=""
  6. @click="handlePhotoShow(file)"
  7. />

其实有  preview="0" preview-text="图片" 这两行实现图片的预览,但是找了资料没找到具体实现的部分,但是这个属性确实实现了

这里手写预览的原因是这个插件在数量大的情况下是没有反应的。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号