首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何管理requestAnimationFrame

如何管理requestAnimationFrame
EN

Stack Overflow用户
提问于 2021-05-08 20:27:49
回答 1查看 27关注 0票数 0

我做了一个函数,用来打乱和翻译一些文本。

只要你等到动画的末尾,然后鼠标移到其他元素上,它就可以正常工作,但如果你急于跳到下一个元素,上一个动画就会停止。

代码语言:javascript
复制
const navMenu = document.querySelectorAll("#menu li"),
  navMenuText = document.querySelectorAll("#menu li a"),
  translation = document.querySelectorAll("#translation li"),
  originalEnglish = [];
originalJapanese = [];

navMenuText.forEach((e) => {
  originalEnglish.push(e.innerHTML);
});
translation.forEach((e) => {
  originalJapanese.push(e.innerHTML);
});

let target;
let frame = 0;
let frame2 = 0;
let singleText;
let singleText2;

let callbackId;

const glitch = ["-", "+", "=", `[`, `;`, "#", "%", "^", "*", "_"];

let times;

let isRunning = false;

navMenu.forEach((e) => {
  // });
  e.addEventListener("mouseover", () => {
    target = [].slice.call(navMenu).indexOf(e);

    if (!navMenu[target].classList.contains("trasnlated")) {
      navMenu[target].classList.add("trasnlated");

      singleText = originalEnglish[target].split("");
      times = singleText.length * 2;
      frame = 0;

      function glitchTranslation() {
        if (frame < times + translation[target].innerHTML.length) {
          if (frame < times) {
            singleText[Math.floor(Math.random() * singleText.length)] =
              glitch[Math.floor(Math.random() * 10)];
            navMenuText[target].innerHTML = singleText.join("");
          } else {
            singleText[frame - times] =
              translation[target].innerHTML[frame - times];

            navMenuText[target].innerHTML = singleText
              .join("")
              .slice(0, translation[target].innerHTML.length);
          }
          isRunning = true;
          callbackId = requestAnimationFrame(glitchTranslation);
        } else if (frame === times + translation[target].innerHTML.length) {
          isRunning = false;
        }
        frame++;
      }
      glitchTranslation();
    }
  });
});
代码语言:javascript
复制
#menu {
  display: flex;
  flex-direction: column;
}

#menu li {
  margin: 20px 0;
  display: inline-block;
  width: 150px;
  border: 1px solid pink;
}
代码语言:javascript
复制
<header>
  <nav>
    <ul id="menu">
      <li id="trigger1"><a href="#">something</a></li>
      <li id="trigger3"><a href="#">earth</a><span class="bar"></span></li>
      <li id="trigger4">
        <a href="about.html">human</a><span class="bar"></span>
      </li>
      <li id="trigger6">
        <a href="#">contact</a><span class="bar"></span>
      </li>
    </ul>

    <ul id="translation" style="display: none">
      <li>なにか</li>
      <li>地球</li>
      <li>人間</li>
      <li>お問い合わせ</li>
    </ul>
  </nav>
</header>
<main></main>
<footer></footer>

EN

回答 1

Stack Overflow用户

发布于 2021-05-10 10:55:39

只需在mouseover处理程序中移动您的变量声明,以便它们被限定作用域,并且下一个事件不会覆盖它们:

代码语言:javascript
复制
const navMenu = document.querySelectorAll("#menu li"),
  navMenuText = document.querySelectorAll("#menu li a"),
  translation = document.querySelectorAll("#translation li"),
  originalEnglish = [],
  originalJapanese = [];

navMenuText.forEach((e) => {
  originalEnglish.push(e.innerHTML);
});
translation.forEach((e) => {
  originalJapanese.push(e.innerHTML);
});

const glitch = ["-", "+", "=", `[`, `;`, "#", "%", "^", "*", "_"];

navMenu.forEach((e) => {
  // });
  e.addEventListener("mouseover", () => {

    // move all the variables declarations inside the mouseover handler
    let target;
    let frame = 0;
    let frame2 = 0;
    let singleText;
    let singleText2;

    let callbackId;
    let times;

    let isRunning = false;


    target = [].slice.call(navMenu).indexOf(e);

    if (!navMenu[target].classList.contains("trasnlated")) {
      navMenu[target].classList.add("trasnlated");

      singleText = originalEnglish[target].split("");
      times = singleText.length * 2;
      frame = 0;

      function glitchTranslation() {
        if (frame < times + translation[target].innerHTML.length) {
          if (frame < times) {
            singleText[Math.floor(Math.random() * singleText.length)] =
              glitch[Math.floor(Math.random() * 10)];
            navMenuText[target].innerHTML = singleText.join("");
          } else {
            singleText[frame - times] =
              translation[target].innerHTML[frame - times];

            navMenuText[target].innerHTML = singleText
              .join("")
              .slice(0, translation[target].innerHTML.length);
          }
          isRunning = true;
          callbackId = requestAnimationFrame(glitchTranslation);
        } else if (frame === times + translation[target].innerHTML.length) {
          isRunning = false;
        }
        frame++;
      }
      glitchTranslation();
    }
  });
});
代码语言:javascript
复制
#menu {
  display: flex;
  flex-direction: column;
}

#menu li {
  margin: 20px 0;
  display: inline-block;
  width: 150px;
  border: 1px solid pink;
}
代码语言:javascript
复制
<header>
  <nav>
    <ul id="menu">
      <li id="trigger1"><a href="#">something</a></li>
      <li id="trigger3"><a href="#">earth</a><span class="bar"></span></li>
      <li id="trigger4">
        <a href="about.html">human</a><span class="bar"></span>
      </li>
      <li id="trigger6">
        <a href="#">contact</a><span class="bar"></span>
      </li>
    </ul>

    <ul id="translation" style="display: none">
      <li>なにか</li>
      <li>地球</li>
      <li>人間</li>
      <li>お問い合わせ</li>
    </ul>
  </nav>
</header>
<main></main>
<footer></footer>

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

https://stackoverflow.com/questions/67447544

复制
相关文章

相似问题

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