javascript实现鼠标移动两个小人的动画效果

动画效果

https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw
效果说明:鼠标按住其中一个小人拖动,可以实现屏幕上两个小人的移动

实现

1.HTML中的代码

<div class="background" @mousemove="movezzhhMove($event)" @mouseup="movezzhhUp($event)">
    </div>
    <div class="zz-img" @mousedown="movezzhhDown($event)" @mousemove="movezzhhMove($event)" @mouseup="movezzhhUp($event)">
      <img src="../assets/index/zz.png" alt="按下鼠标,移动我们试试看(^U^)">
    </div>
    <div class="hh-img" @mousedown="movezzhhDown($event)" @mousemove="movezzhhMove($event)" @mouseup="movezzhhUp($event)">
      <img src="../assets/index/hh.png" alt="按下鼠标,移动我们试试看(^U^)">
    </div>

我们定义了两个div标签用来装两个小人的图片

2.css样式代码

.zz-img{
    position: absolute;
    top: 30vh;
    left: 30vw;
    width: 300px;
  }
  .hh-img{
    position: absolute;
    top: 30vh;
    right: 30vw;
    width: 300px;
    margin-top: -38px;
  }
  .zz-img,.hh-img{
    cursor: pointer;
    z-index: 0;
  }

两个小人的图片我们用绝对定位,其中有一张图片用了margin-top,原因是为了让两张图片的手位于同一水平面上,所以我们做了微调

3.javascript代码

说明:

  • click
  • dblclick
  • mousedown
  • mouseenter 不冒泡 ❌
  • mouseleave 不冒泡 ❌
  • mousemove
  • mouseout
  • mouseover
  • mouseup
    其余的均为冒泡事件
data () {
    return {
      ifMouseDown: false,
      zzorhh: 0,
      elementzz: Object,
      elementhh: Object,
      zzLeft: Number,
      hhRight: Number,
      zzImgWidth: Number,
      hhImgWidth: Number,
      screenWidth: Number,
      xCurrent: Number,
    }
  },
  methods: {
    stop: function (ev) { //阻止事件冒泡和事件默认行为
      ev.stopPropagation()
      ev.preventDefault()
    },
    movezzhhDown: function (ev) {
      this.stop(ev)
      this.ifMouseDown = true
      let elementClass = (ev.target || ev.srcElement).parentNode.className
      if (elementClass.indexOf('hh') != -1) {
        this.zzorhh = 1
      } else {
        this.zzorhh = 0
      }
      this.xCurrent = ev.pageX
    },
     movezzhhMove: function (ev) { 
      if (this.ifMouseDown) {
        let xNext = ev.pageX
        let differ = (xNext - this.xCurrent)/3  //图片移动的速度,要是图片移动的速度过快会有mouseMove触发频率的问题,给人一种
        this.xCurrent = xNext
        let elementzzLeft = parseInt(this.elementzz.css('left'))
        let elementhhRight = parseInt(this.elementhh.css('right'))
        if (this.zzorhh) {
          let hhRight = elementhhRight + differ
          let zzLeft = elementzzLeft + differ
          let allLength = hhRight + zzLeft + this.zzImgWidth + this.hhImgWidth
          if ((allLength - this.screenWidth) > 31) {
            zzLeft = elementzzLeft
            hhRight = elementhhRight
          } else {
            if (hhRight < 20) {
              hhRight = 20
            }
            if (zzLeft < 20) {
              zzLeft = 20
            }
          }
          this.elementhh.css({ 'right': hhRight + 'px' })
          this.elementzz.css({ 'left': zzLeft + 'px' })
        } else {
          let hhRight = elementhhRight - differ
          let zzLeft = elementzzLeft - differ
          let allLength = hhRight + zzLeft + this.zzImgWidth + this.hhImgWidth
          if ((allLength - this.screenWidth) > 31) {
            zzLeft = elementzzLeft
            hhRight = elementhhRight
          } else {
            if (hhRight < 20) {
              hhRight = 20
            }
            if (zzLeft < 20) {
              zzLeft = 20
            }
          }
          this.elementhh.css({ 'right': hhRight + 'px' })
          this.elementzz.css({ 'left': zzLeft + 'px' })
        }
      } else {}
    },
    movezzhhUp: function () {
      if (this.ifMouseDown) {
        this.ifMouseDown = 0
        this.elementzz.css({ 'left': this.zzLeft + 'px' })
        this.elementhh.css({ 'right': this.hhRight + 'px' })
      } else {}
    }
  },
  mounted: function () {
    let that = this
    setTimeout(function () {
      that.elementzz = $('.zz-img')
      that.elementhh = $('.hh-img')
      that.zzLeft = parseInt(that.elementzz.css('left'))
      that.hhRight = parseInt(that.elementhh.css('right'))
      that.hhImgWidth = parseFloat(that.elementhh.css('width'))
      that.zzImgWidth = parseFloat(that.elementhh.css('width'))
      that.screenWidth = $(document).width()
    }, 50)

初始化函数中我们获取了两张图片的宽度
that.hhImgWidth = parseFloat(that.elementhh.css('width'))
that.zzImgWidth = parseFloat(that.elementhh.css('width'))
左右间隙
that.zzLeft = parseInt(that.elementzz.css('left'))
that.hhRight = parseInt(that.elementhh.css('right'))
屏幕宽度信息
that.screenWidth = $(document).width()

movezzhhDown函数中我们主要做的工作是把ifMouseDown设定为true,以及判断那张图片被点击了

movezzhhMove函数中我们主要是移动两张小人的图片

 if ((allLength - this.screenWidth) > 31) {
            zzLeft = elementzzLeft
            hhRight = elementhhRight
          } 

这个的作用是判断两个小人会不会重合

  if (hhRight < 20) {
              hhRight = 20
            }
            if (zzLeft < 20) {
              zzLeft = 20
            }

这个的作用是判断两个小人会不会跑到屏幕外面去

movezzhhUp函数中我们主要做的工作是当鼠标松开的时候恢复两张图片原来的位置

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的示例代码,可以实现鼠标点击、松开和移动时的效果: ```html <!DOCTYPE html> <html> <head> <title>鼠标事件示例</title> <style> #box { width: 100px; height: 100px; background-color: red; position: absolute; left: 0; top: 0; } </style> </head> <body> <div id="box"></div> <script> // 获取元素 var box = document.getElementById("box"); // 定义变量,记录鼠标是否按下 var isMouseDown = false; // 添加鼠标按下事件 box.addEventListener("mousedown", function(event) { // 将变量设置为 true isMouseDown = true; // 记录鼠标按下时的位置 var x = event.clientX; var y = event.clientY; // 添加鼠标移动事件 document.addEventListener("mousemove", moveHandler); // 添加鼠标松开事件 document.addEventListener("mouseup", function() { // 将变量设置为 false isMouseDown = false; // 移除鼠标移动事件 document.removeEventListener("mousemove", moveHandler); }); // 鼠标移动事件处理函数 function moveHandler(event) { if (isMouseDown) { // 计算鼠标移动的距离 var deltaX = event.clientX - x; var deltaY = event.clientY - y; // 更新盒子的位置 box.style.left = parseInt(box.style.left) + deltaX + "px"; box.style.top = parseInt(box.style.top) + deltaY + "px"; // 更新 x 和 y 的值 x = event.clientX; y = event.clientY; } } }); </script> </body> </html> ``` 这段代码定义了一个红色的正方形盒子(100px × 100px),当鼠标按下该盒子并移动时,盒子会跟随鼠标移动。当鼠标松开时,盒子停止跟随移动

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值