草庐IT

javascript - 手机长按增加位置

coder 2023-08-12 原文

我正在尝试检测移动设备上的长按并增加 Sprite 在屏幕上的位置。目前,touchstart 会在每次触摸时将 Sprite 移动 10px,touchend 会停止变换。理想情况下,我想长按屏幕并让 Sprite 流畅地移动到那个位置。

如有任何建议和指导,我们将不胜感激。

谢谢。

这是我的代码:

(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);
})();
.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;
  }
}
<div class="sprite right"></div>

JSFiddle link

最佳答案

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

关于javascript - 手机长按增加位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51901855/

有关javascript - 手机长按增加位置的更多相关文章

  1. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  2. 怎样用一台手机做自媒体? - 2

    其实做自媒体的成本并不高,入门只需要一部手机即可!在手机上找视频素材、使用手机剪辑视频、最后使用手机发布视频作品获得收益!方法并不难,今天这期内容就来给粉丝们分享一种小方法,每天稳定收益100-300,抓紧点赞收藏!1、找素材(1)使用手机拍摄自己喜欢的经典段落,使用程序把文案内容提取出来(2)也可以在豆瓣、知乎、微博等网站中找一些自己需要的文案素材(3)把文案进行润色修改,可以加入一些自己的观点(4)视频素材可以使用软件中自带的素材,也可以在素材网站中下载完整版的素材2、文案配音(1)把复制好的文案直接导入小程序中(2)调整音色、音调后一键合成音频即可(3)可以选择自己朗读配音,需要花一点时

  3. ruby - 正则表达式在哪个位置失败? - 2

    我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束

  4. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  5. ruby - 下载位置 Selenium-webdriver Cucumber Chrome - 2

    我将Cucumber与Ruby结合使用。通过Selenium-Webdriver在Chrome中运行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。我当前的chrome驱动程序是这样设置的:Capybara.default_driver=:seleniumCapybara.register_driver:seleniumdo|app|Capybara::Selenium::Driver.new(app,:browser=>:chrome,desired_capabilities:{'chromeOptions'=>{'args'=>%w{window-size=1920,1

  6. ruby - Heroku production.log 文件位置 - 2

    我想在heroku.com上查看我的应用程序日志的内容,所以我关注了thisexcellentadvice并拥有我所有的日志内容。但是我现在很想知道我的日志文件实际在哪里,因为“log/production.log”似乎是空的:C:\>herokuconsoleRubyconsoleforajpbrevx.heroku.com>>files=Dir.glob("*")=>["public","tmp","spec","Rakefile","doc","config.ru","app","config","lib","README","Gemfile.lock","vendor","sc

  7. ruby - 在 Ruby 中查找多个正则表达式匹配的模式和位置 - 2

    这应该是一个简单的问题,但我找不到任何相关信息。给定一个Ruby中的正则表达式,对于每个匹配项,我需要检索匹配的模式$1、$2,但我还需要匹配位置。我知道=~运算符为我提供了第一个匹配项的位置,而string.scan(/regex/)为我提供了所有匹配模式。如果可能,我需要在同一步骤中获得两个结果。 最佳答案 MatchDatastring.scan(regex)do$1#Patternatfirstposition$2#Patternatsecondposition$~.offset(1)#Startingandendingpo

  8. ruby-on-rails - 尝试打开 .gitignore 以在文本编辑器中对其进行编辑,但在 OS X Mountain Lion 上找不到文件位置 - 2

    我使用“newapp_name”创建了一个新的Rails应用程序,我正在尝试编辑.gitignore文件,但在我的应用程序文件夹中找不到它。我在哪里可以找到它?我安装了Git。 最佳答案 .gitignore位于项目的root中,而不是app子目录中。首先打开终端并进入您的目录。您需要使用ls-a来显示stash文件。然后使用打开.gitignore 关于ruby-on-rails-尝试打开.gitignore以在文本编辑器中对其进行编辑,但在OSXMountainLion上找不到文件位

  9. ruby-on-rails - 在 Rails 中存储(结构化)配置数据的位置 - 2

    对于我正在编写的Rails3应用程序,我正在考虑从本地文件系统上的XML、YAML或JSON文件中读取一些配置数据。重点是:我应该把这些文件放在哪里?Rails应用程序中是否有用于存储此类内容的默认位置?附带说明一下,我的应用程序部署在Heroku上。 最佳答案 我经常做的是:如果文件是通用配置文件:我在目录/config中创建一个YAML文件,每个环境有一个上层key如果我为每个环境(大项目)创建一个文件:我为每个环境创建一个YAML并将它们存储在/config/environments/然后我在加载YAML的地方创建了一个初始化

  10. Ruby:数组中的下一个/上一个值,循环数组,数组位置 - 2

    假设我有一个没有特定顺序的随机数数组。假设这些是参加马拉松比赛的人的ID#,他们按照完成的顺序添加到数组中,例如:race1=[8,102,67,58,91,16,27]race2=[51,31,7,15,99,58,22]这是一个简化且有些做作的示例,但我认为它传达了基本思想。现在有几个问题:首先,我如何获得特定条目之前和之后的ID?假设我正在查看运行者58,我想知道谁在他之前和之后完成了比赛。race1,runner58:previousfinisher=67,nextfinisher=91race2,runner58:previousfinisher=99,nextfinishe

随机推荐