首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移动式长压机上增量位置

移动式长压机上增量位置
EN

Stack Overflow用户
提问于 2018-08-18 03:35:17
回答 1查看 127关注 0票数 5

我正在尝试检测手机上的长按,并让它增加一个精灵在屏幕上的位置。目前,touchstart会在每次触摸精灵时将其移动10px的增量,而touchend将停止变换。理想情况下,我想要长按屏幕,让精灵流畅地移动到那个位置。

任何建议和指导都将不胜感激。

谢谢。

下面是我的代码:

代码语言:javascript
复制
(function() {

  var sprite = document.querySelector('.sprite'),
    touch = {
      left: false,
      right: false
    },
    trans = 0,
    property = getTransformProperty(sprite);

  function getTransformProperty(element) {
    var properties = [
      'transform',
      'WebkitTransform',
      'msTransform',
      'MozTransform',
      'OTransform'
    ];
    var p;
    while (p = properties.shift()) {
      if (typeof element.style[p] != 'undefined') {
        return p;
      }
    }
    return false;
  }

  function translate() {
    sprite.style[property] = 'translateX(' + trans + 'px)';
  }

  function walk(ev) {
    let touches = ev.touches;
    console.log(touches);

    let getClientX = Math.round(touches[0].clientX);

    let spritePos = document.querySelector('.sprite').getBoundingClientRect().right;

    if (getClientX >= spritePos) {
      console.log(`true, ${getClientX} <= ${spritePos}`);
      touch.right = true;
    } else if (getClientX <= spritePos) {
      console.log(`false, ${getClientX} >= ${spritePos}`);
      touch.left = true;
    }

    if (touch.right === true) {
      trans += 10;
      translate();
      sprite.classList.remove('left');
      sprite.classList.add('right');
      sprite.classList.add('walk-right');
    } else if (touch.left === true) {
      trans -= 10;
      translate();
      sprite.classList.remove('right');
      sprite.classList.add('left');
      sprite.classList.add('walk-left');
    }
  }


  function stop(ev) {
    let lastTouch = Math.round(ev.changedTouches[0].clientX);

    let spritePos = document.querySelector('.sprite').getBoundingClientRect().right;

    if (lastTouch >= spritePos) {
      console.log(`true, ${lastTouch} <= ${spritePos}`);
      touch.right = false;
    } else if (lastTouch <= spritePos) {
      console.log(`false, ${lastTouch} >= ${spritePos}`);
      touch.left = false;
    }
    if (touch.right === false) {
      sprite.classList.remove('walk-right');
    }
    if (touch.left === false) {
      sprite.classList.remove('walk-left');
    }
  }

  document.addEventListener('touchstart', walk, false);
  document.addEventListener('touchend', stop, false);
})();
代码语言:javascript
复制
.sprite {
  width: 105px;
  height: 238px;
  margin-top: 40px;
}

.right {
  background-image: url(http://centpourcent.us/clients/test-environment/Ubicare/v3-2/images/test/standing-right1.png);
}

.left {
  background-image: url(http://centpourcent.us/clients/test-environment/Ubicare/v3-2/images/test/standing-left1.png);
}

.walk-right {
  background-image: url(http://centpourcent.us/clients/test-environment/Ubicare/v3-2/images/test/walk-right1.png);
  -webkit-animation: walk .9s steps(6) infinite;
  -moz-animation: walk .9s steps(6) infinite;
  -ms-animation: walk .9s steps(6) infinite;
  -o-animation: walk .9s steps(6) infinite;
  animation: walk .9s steps(6) infinite;
}

.walk-left {
  background-image: url(http://centpourcent.us/clients/test-environment/Ubicare/v3-2/images/test/walk-left1.png);
  -webkit-animation: walk .9s steps(6) infinite;
  -moz-animation: walk .9s steps(6) infinite;
  -ms-animation: walk .9s steps(6) infinite;
  -o-animation: walk .9s steps(6) infinite;
  animation: walk .9s steps(6) infinite;
}

@-webkit-keyframes walk {
  from {
    background-position: 0px;
  }
  to {
    background-position: -612px;
  }
}

@-moz-keyframes walk {
  from {
    background-position: 0px;
  }
  to {
    background-position: -612px;
  }
}

@-ms-keyframes walk {
  from {
    background-position: 0px;
  }
  to {
    background-position: -612px;
  }
}

@-o-keyframes walk {
  from {
    background-position: 0px;
  }
  to {
    background-position: -612px;
  }
}

@-keyframes walk {
  from {
    background-position: 0px;
  }
  to {
    background-position: -612px;
  }
}
代码语言:javascript
复制
<div class="sprite right"></div>

JSFiddle link

EN

回答 1

Stack Overflow用户

发布于 2018-08-30 10:04:18

你可能想看看this,它向你展示了如何检测长按。然后,您可以将其用作事件侦听器,并使用clientXclientY将sprite移动到单击/按下的位置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51901855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档