图片预览插件简洁版

93 阅读1分钟

1.废话不多说先上代码 ( ImgPreviewer.vue)

<template>
  <transition enter-active-class="animate__animated animate__fadeIn" :duration='{enter:1000,leaver:200}'>

    <div class="fullimg" v-show="url" @mousewheel="zoomImg($event)">
      <img :src="url" alt="" ref="viewImg" @drag="drag($event)">
      <-- —<el-button type="primary" class="el-icon-close" circle @click="closeViewImg"></el-button>-->
       <button class="el-icon-close" @click="closeViewImg">关闭</button>
    </div>
  </transition>
</template>

<script>
export default {
  props: {
    url: {
      type: String,
      default: ''
    }
  },
  created() {

  },
  mounted(){
      var imgView = this.$refs.viewImg
            imgView.onmousedown = function (e) {
              //鼠标和元素左上右上
              var offsetX = e.offsetX;
              var offsetY = e.offsetY;
          var translateX=this.offsetWidth/2
          var translateY=this.offsetHeight/2
                e.preventDefault()
              //添加onmousemove
              document.onmousemove = function (e) {
                e = e || window.event;
                //视口
                var clientX = e.clientX;
                var clientY = e.clientY;
                imgView.style.top = (clientY-offsetY+translateY ) + 'px'
                imgView.style.left = (clientX-offsetX+translateX)+ 'px'
              }
            };
            imgView.onmouseup = function () {
              //鼠标松开,停
              document.onmousemove = null;
            }
              imgView.onmouseleave = function () {
              document.onmousemove = null;
              }
    }

  },
  methods: {
    closeViewImg() {
      this.$emit("update:url", "")
      this.$emit("onclose")
      document.onmousemove = null;
      var imgView = this.$refs.viewImg
      imgView.style.left='50%'
      imgView.style.top='50%'
      imgView.removeAttribute("height")
    },
    zoomImg(e) {
      console.log(e);
      if (e.wheelDelta > 0) {
        e.target.height = e.target.height + 100
      } else {
        e.target.height = e.target.height - 100 < 100 ? 100 : e.target.height - 100
      }
      e.cancelBubble = true,
        e.preventDefault();

    },
        drag(e) {
      var img = this.$refs.viewImg
      console.log(e.clientX, e.offsetX)
      e.x > 0 && (img.style.left = e.clientX - e.offsetX + "px")
      e.y > 0 && (img.style.top = e.clientY - e.offsetY + "px")
      e.preventDefault()
    },
    
  },
   ,beforeDistroy(){
    var imgView = this.$refs.viewImg
    imgView.onmousedown =null
    imgView.onmouseup =  null;
    document.onmousemove = null;
  }
}
</script>

<style lang=scss>
.fullimg {
  position: fixed;
  top: 0px;
  bottom: 0;
  left: 0;
  right: 0;
  background-color: rgba(10, 10, 10, 0.452);
  z-index: 1000;
  overflow: hidden;
  img {
    position: absolute;
    left: 50%;
    top: 50%;
    box-shadow: 0 0 10px gray;
    transform: translate(-50%, -50%);
    cursor: pointer;
    &:active {
      cursor: move;
    }
  }
  .el-icon-close {
    position: absolute;
    right: 20px;
    top: 20px;
    font-size: 20px;
  }
}
</style>

2.使用:

<img-previewer :url.sync="viewImgurl" />     
//有url时就展示

3.亮点

可实现单张图片的预览放大、拖拽 简单好用