VUE图片预览及放大缩小

<template>

    <hd-dialog title="图片预览" v-dialogDrag  ref="showImg" :visible.sync="dialogShow" v-bind="$attrs" style="text-align: center;" width="60%" @close="close" class="my-info-dialog">

        <el-image v-loading="busy" ref="img"

         @mousewheel.prevent='gunlun'

        :src="file.url"  fit="contain">

            <div slot="error" class="image-slot" style="text-align: center;">

                未找到图片

            </div>

        </el-image>

        <div>{{ file.fileName }}</div>

    </hd-dialog>

</template>

<script>

import '@/api/utils/DialogDrag'

import defaultSculpture from '@/assets/defaultSculpture.jpeg'

    export default {

        data(){

            return{

                defaultSculpture:defaultSculpture,//默认图片

                dialogShow:false,

                busy:false,

                file:{

                    id:'',

                    url:'',

                    fileName:'',

                }

            }

        },

        updated(){

        },

        methods: {

            async open(data){

                this.dialogShow = true;

                this.busy = true;

                this.file = data;

                if(this.file.id){

                    this.dialogShow = true;

                    const url = `/core/getImgStream`;

                    let param = {};

                    param.id = this.file.id;

                    this.axios({

                        method:'post',

                        url: url,

                        data: param,

                        responseType:'blob',

                    })

                    .then((res) => {

                        if(res.data.size > 0){

                            this.file.url =  window.URL.createObjectURL(res.data);

                        }

                        this.busy = false;

                    });

                } else {

                    this.file.url = this.defaultSculpture;

                    this.busy = false;

                }

            },

            close(){

                this.dialogShow = false;

                this.file = {

                    id:'',

                    url:'',

                    fileName:'',

                }

            },

            // 滚轮滑动

            gunlun(e) {

                let direction = e.deltaY > 0 ? 'down' : 'up'

                var i = this.$refs.img.$el.firstChild;

                if (direction === 'up') {

                    // 滑轮向上滚动

                    i.style.width = i.offsetWidth * 1.2 + "px";

                } else {

                // 滑轮向下滚动

                    i.style.width = i.offsetWidth * 0.8 + "px";

                }

            },

        }

    }

</script>

import Vue from 'vue'

/*

 *  定义公共js里,在入口文件main.js中import;

 *  给elementUI的dialog上加上 v-dialogDrag 指令就可以实现弹窗的全屏和拉伸了。

 */

// v-dialogDrag: 弹窗拖拽+水平方向伸缩

Vue.directive('dialogDrag', {

    bind(el, binding, vnode, oldVnode) {

      //弹框可拉伸最小宽高

      let minWidth = 400;

      let minHeight = 300;

      //初始非全屏

      let isFullScreen = false;

      //当前宽高

      let nowWidth = 0;

      let nowHight = 0;

      //当前顶部高度

      let nowMarginTop = 0;

      //获取弹框头部(这部分可双击全屏)

      const dialogHeaderEl = el.querySelector('.el-dialog__header');

      //弹窗

      const dragDom = el.querySelector('.el-dialog');

      //给弹窗加上overflow auto;不然缩小时框内的标签可能超出dialog;

      dragDom.style.overflow = "auto";

      //清除选择头部文字效果

      dialogHeaderEl.onselectstart = new Function("return false");  

      //头部加上可拖动cursor

      dialogHeaderEl.style.cursor = 'move';

      // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);

      const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null);

      let moveDown = (e) => {

        // 鼠标按下,计算当前元素距离可视区的距离

        const disX = e.clientX - dialogHeaderEl.offsetLeft;

        const disY = e.clientY - dialogHeaderEl.offsetTop;

        // 获取到的值带px 正则匹配替换

        let styL, styT;

        // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px

        if (sty.left.includes('%')) {

          styL = +document.body.clientWidth * (+sty.left.replace(/%/g, '') / 100);

          styT = +document.body.clientHeight * (+sty.top.replace(/%/g, '') / 100);

        } else {

          styL = +sty.left.replace(/px/g, '');

          styT = +sty.top.replace(/px/g, '');

        };

        document.onmousemove = function (e) {

          // 通过事件委托,计算移动的距离

          const l = e.clientX - disX;

          const t = e.clientY - disY;

          // 移动当前元素  

          dragDom.style.left = `${l + styL}px`;

          dragDom.style.top = `${t + styT}px`;

          //将此时的位置传出去

          //binding.value({x:e.pageX,y:e.pageY})

        };

        document.onmouseup = function (e) {

          document.onmousemove = null;

          document.onmouseup = null;

        };

      }

      dialogHeaderEl.onmousedown = moveDown;

      //双击头部效果

      dialogHeaderEl.ondblclick = (e) => {

        if (isFullScreen == false) {

          nowHight = dragDom.clientHeight;

          nowWidth = dragDom.clientWidth;

          nowMarginTop = dragDom.style.marginTop;

          dragDom.style.left = 0;

          dragDom.style.top = 0;

          dragDom.style.height = "100VH";

          dragDom.style.width = "100VW";

          dragDom.style.marginTop = 0;

          isFullScreen = true;

          dialogHeaderEl.style.cursor = 'initial';

          dialogHeaderEl.onmousedown = null;

        } else {

          dragDom.style.height = "auto";

          dragDom.style.width = nowWidth + 'px';

          dragDom.style.marginTop = nowMarginTop;

          isFullScreen = false;

          dialogHeaderEl.style.cursor = 'move';

          dialogHeaderEl.onmousedown = moveDown;

        }

      }

     

      //拉伸(右下方)

      let resizeEl=document.createElement("div");

      dragDom.appendChild(resizeEl);

      //在弹窗右下角加上一个10-10px的控制块

      resizeEl.style.cursor = 'se-resize';

      resizeEl.style.position = 'absolute';

      resizeEl.style.height = '10px';

      resizeEl.style.width = '10px';

      resizeEl.style.right = '0px';

      resizeEl.style.bottom = '0px';

      resizeEl.style.zIndex = '99';

      //鼠标拉伸弹窗

      resizeEl.onmousedown = (e) => {

        // 记录初始x位置

        let clientX = e.clientX;

        // 鼠标按下,计算当前元素距离可视区的距离

        let disX = e.clientX - resizeEl.offsetLeft;

        let disY = e.clientY - resizeEl.offsetTop;

        document.onmousemove = function (e) {

          e.preventDefault(); // 移动时禁用默认事件

         

          // 通过事件委托,计算移动的距离

          let x = e.clientX - disX + (e.clientX - clientX);//这里 由于elementUI的dialog控制居中的,所以水平拉伸效果是双倍

          let y = e.clientY - disY;

          //比较是否小于最小宽高

          dragDom.style.width = x > minWidth ? `${x}px` : minWidth + 'px';

          dragDom.style.height = y > minHeight ? `${y}px` : minHeight + 'px';

          };

        //拉伸结束

        document.onmouseup = function (e) {

          document.onmousemove = null;

          document.onmouseup = null;

        };

      }

     

      //拉伸(右边)

      let resizeElR=document.createElement("div");

      dragDom.appendChild(resizeElR);

      //在弹窗右下角加上一个10-10px的控制块

      resizeElR.style.cursor = 'w-resize';

      resizeElR.style.position = 'absolute';

      resizeElR.style.height = '100%';

      resizeElR.style.width = '10px';

      resizeElR.style.right = '0px';

      resizeElR.style.top = '0px';

      //鼠标拉伸弹窗

      resizeElR.onmousedown = (e) => {

        let elW = dragDom.clientWidth;

        let EloffsetLeft = dragDom.offsetLeft;

        // 记录初始x位置

        let clientX = e.clientX;

        document.onmousemove = function (e) {

          e.preventDefault(); // 移动时禁用默认事件

          //右侧鼠标拖拽位置

          if (clientX > EloffsetLeft + elW - 10 && clientX < EloffsetLeft + elW) {

              //往左拖拽

              if (clientX > e.clientX) {

                  if (dragDom.clientWidth < minWidth) {

                  } else {

                      dragDom.style.width = elW - (clientX - e.clientX) * 2 + 'px';

                  }

              }

              //往右拖拽

              if (clientX < e.clientX) {

                  dragDom.style.width = elW + (e.clientX - clientX) * 2 + 'px';

              }

          }

         

        };

        //拉伸结束

        document.onmouseup = function (e) {

          document.onmousemove = null;

          document.onmouseup = null;

        };

      }

     

      //拉伸(左边)

      let resizeElL=document.createElement("div");

      dragDom.appendChild(resizeElL);

      //在弹窗右下角加上一个10-10px的控制块

      resizeElL.style.cursor = 'w-resize';

      resizeElL.style.position = 'absolute';

      resizeElL.style.height = '100%';

      resizeElL.style.width = '10px';

      resizeElL.style.left = '0px';

      resizeElL.style.top = '0px';

      //鼠标拉伸弹窗

      resizeElL.onmousedown = (e) => {

        let elW = dragDom.clientWidth;

        let EloffsetLeft = dragDom.offsetLeft;

        // 记录初始x位置

        let clientX = e.clientX;

        document.onmousemove = function (e) {

          e.preventDefault(); // 移动时禁用默认事件

          //左侧鼠标拖拽位置

          if (clientX > EloffsetLeft && clientX < EloffsetLeft + 10) {

              //往左拖拽

              if (clientX > e.clientX) {

                  dragDom.style.width = elW + (clientX - e.clientX) * 2 + 'px';

              }

              //往右拖拽

              if (clientX < e.clientX) {

                  if (dragDom.clientWidth < minWidth) {

                  } else {

                      dragDom.style.width = elW - (e.clientX - clientX) * 2 + 'px';

         

                  }

              }

          }

         

        };

        //拉伸结束

        document.onmouseup = function (e) {

          document.onmousemove = null;

          document.onmouseup = null;

        };

      }

     

      // 拉伸(下边)

      let resizeElB=document.createElement("div");

      dragDom.appendChild(resizeElB);

      //在弹窗右下角加上一个10-10px的控制块

      resizeElB.style.cursor = 'n-resize';

      resizeElB.style.position = 'absolute';

      resizeElB.style.height = '10px';

      resizeElB.style.width = '100%';

      resizeElB.style.left = '0px';

      resizeElB.style.bottom = '0px';

      //鼠标拉伸弹窗

      resizeElB.onmousedown = (e) => {

       let EloffsetTop = dragDom.offsetTop;

       let ELscrollTop = el.scrollTop;

        let clientY = e.clientY;

        let elH = dragDom.clientHeight;

        document.onmousemove = function (e) {

          e.preventDefault(); // 移动时禁用默认事件

          //底部鼠标拖拽位置

          if (ELscrollTop + clientY > EloffsetTop + elH - 20 && ELscrollTop + clientY < EloffsetTop + elH) {

              //往上拖拽

              if (clientY > e.clientY) {

                  if (dragDom.clientHeight < minHeight) {

                  } else {

                      dragDom.style.height = elH - (clientY - e.clientY) * 2 + 'px';

                  }

              }

              //往下拖拽

              if (clientY < e.clientY) {

                  dragDom.style.height = elH + (e.clientY - clientY) * 2 + 'px';

              }

          }

        };

        //拉伸结束

        document.onmouseup = function (e) {

          document.onmousemove = null;

          document.onmouseup = null;

        };

      }

    }

  })

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值