使用原生dom及js实现类似vben-admin图片裁剪效果

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
body>div{
  float: left;
}
#box{
  width: 330px;
  height: 240px;
  overflow: hidden;
  position: relative;
}
#box::after{
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  display: inline-block;
  width: 100%;
  height: 100%;
  background-color: #444444;
  opacity: 0.6;
  z-index: 2;
}
.absolut-div{
  position: absolute;
  left: 0;
  top: 0;
  width: 100px;
  height: 100px;
  border: 1px solid teal;
  box-shadow: 0 2px 2px teal;
  transform: translate3d(20px,20px,0);
  cursor: move;
  z-index: 3;
}
#box img{
  display: block;
  width: 100%;
  height: 100%;
}
.option-btn{
  display: flex;
  margin-top: 0.625rem;
  cursor: pointer;
  flex-wrap: wrap;
}
#cutimg{
  width: 200px;
  height: 200px;
  border-radius: 50%;
  border: 1px solid #778899;
}
</style>
</head>
<body>
  <div style="width: 50%;" class="left-div">
    <div id="box">
      <img src="" alt="图片裁剪">
      <div class="absolut-div" onmousedown="mousedown(event)"></div>
    </div>
    <input type="file" files="fileList" name="" id="file1" value="" onchange="fn1(event)" />
    <div class="option-btn">
      <button type="button" onclick="leftrotate()">左旋转</button>
      <button type="button" onclick="rightrotate()">右旋转</button>
      <button type="button" onclick="horflip()">水平翻转</button>
      <button type="button" onclick="verflip()">垂直翻转</button>
      <button type="button" onclick="boostit()">放大</button>
      <button type="button" onclick="shrinkit()">缩小</button>
      <button type="button" onclick="showorigin()">还原</button>
    </div>
  </div>
  <div style="width: 50%;" class="right-div">
    <div id="cutimg"></div>
  </div>
<script>
  let img1 = document.getElementById("box").children[0]
  let dragdom = document.getElementById("box")
  let targetdom = document.getElementsByClassName("absolut-div")[0]
  let largeImg = document.getElementById("cutimg")
  let transformcss = ''
  let num = 0
  let rox = 0
  let roy = 0
  let mul = 1
  let imgUrl = ''
  function fn1(event){
    targetdom.style.transform = 'translate3d(20px,20px,0)'
    let file = event.target.files[0]
    if(file.type.indexOf("image") == 0) {
      var reader = new FileReader();
      reader.readAsDataURL(file);
      reader.onload = function(e) {
        console.log(this)
        // 图片base64化
        imgUrl = this.result;
        img1.setAttribute("src",imgUrl)
        targetdom.style.backgroundImage = `url(${imgUrl})`
        targetdom.style.backgroundSize = '330px 240px'
        targetdom.style.backgroundPosition = '-20px -20px'
        targetdom.style.backgroundRepeat = 'no-repeat'
        largeImg.style.backgroundImage = `url(${imgUrl})`
        largeImg.style.backgroundSize = '660px 480px'
        largeImg.style.backgroundPosition = '-40px -40px'
        largeImg.style.backgroundRepeat = 'no-repeat'
      };
    }
  }
  function mousedown(event){
    let offsetx = event.offsetX
    let offsety = event.offsetY
    dragdom.onmousemove = function(event){
      let clientx = event.clientX
      let clienty = event.clientY
      let left = clientx-offsetx
      let top = clienty-offsety
      if(clientx-offsetx<0){
        left = 0
      }else if(clientx-offsetx>dragdom.offsetWidth-targetdom.offsetWidth){
        left = dragdom.offsetWidth-targetdom.offsetWidth
      }
      if(clienty-offsety<0){
        top = 0
      }else if(clienty-offsety>dragdom.offsetHeight-targetdom.offsetHeight){
        top = dragdom.offsetHeight-targetdom.offsetHeight
      }
      targetdom.style.transform = `translate3d(${left}px,${top}px,0)`
      targetdom.style.backgroundPosition = `-${left}px -${top}px`
      largeImg.style.backgroundPosition = `-${left*2}px -${top*2}px`
    }
    document.onmouseup = function(){
      dragdom.onmousemove =false
    }
  }
  function leftrotate(){
    num -= 45
    img1.style.transform = `rotate(${num}deg)`
  }
  function rightrotate(){
    num += 45
    img1.style.transform = `rotate(${num}deg)`
  }
  function horflip(){
    roy += 180
    img1.style.transform = `rotateY(${roy}deg)`
  }
  function verflip(){
    rox += 180
    img1.style.transform = `rotateX(${rox}deg)`
  }
  function boostit(){
    mul += 0.1
    img1.style.transform = `scale(${mul})`
  }
  function shrinkit(){
    mul -= 0.1
    img1.style.transform = `scale(${mul})`
  }
  function showorigin(){
    num = 0
    rox = 0
    roy = 0
    mul = 1
    img1.style.transform = 'none'
  }
</script>
</body>
</html>

  

posted @ 2021-11-27 14:17  李昂唐  阅读(80)  评论(0)    收藏  举报