html JavaScript中的文本随机化器动画无法正常工作

gj3fmq9x  于 2024-01-04  发布在  Java
关注(0)|答案(1)|浏览(142)

按钮内的文本应该随机改变其字母,并在一定时间后恢复为正常文本,但当我悬停按钮时,文本并没有停止随机化,按钮的宽度正在改变。如何修复宽度并阻止它随机化?
我认为getElementById部分有问题。在原始代码中,它是查询的,但似乎也不起作用
Codepen上查看
HTML

  1. <div class="nav-buttons">
  2. <div class="btn1">
  3. <button>PROJECTS</button>
  4. </div>
  5. <div class="btn2">
  6. <button>
  7. <span id="info-btn">INFO</span>
  8. </button>
  9. </div>
  10. <div class="theme-btn">
  11. <button onclick="changeClass()">Change Class</button>
  12. </div>
  13. </div>

字符串
CSS

  1. nav{
  2. width: 100%;
  3. display: flex;
  4. justify-content: space-between;
  5. align-items: center;
  6. padding: 2em 4em;
  7. }
  8. .nav-buttons{
  9. display: flex;
  10. align-items: center;
  11. gap: 2em;
  12. }
  13. button{
  14. position: relative;
  15. background: none;
  16. outline: none;
  17. border: 1px solid var(--secondary);
  18. border-radius: 0.25em;
  19. font-size: 17px;
  20. color: var(--secondary);
  21. font-family: Monorama;
  22. padding: 0.25em 0.75em;
  23. cursor: pointer;
  24. }


JavaScript

  1. //Info Randomizer
  2. const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  3. let interval = null;
  4. document.getElementById("info-btn").onmouseover = event => {
  5. let iteration = 0;
  6. clearInterval(interval);
  7. interval = setInterval(() => {
  8. event.target.innerText = event.target.innerText
  9. .split("")
  10. .map((letter, index) => {
  11. if(index < iteration) {
  12. return event.target.dataset.value[index];
  13. }
  14. return letters[Math.floor(Math.random() * 26)]
  15. })
  16. .join("");
  17. if(iteration >= event.target.dataset.value.length){
  18. clearInterval(interval);
  19. }
  20. iteration += 1;
  21. }, 30);
  22. }

6ss1mwsb

6ss1mwsb1#

据我所知,这个想法是将原始文本保存在数据集中,随机化后恢复。但是,逻辑(或语法)存在一些问题。我做了这个更正,并增加了时间来增强效果。
导致元素大小不同的原因是,当文本更改时,占用的空间也会改变。2要避免这种情况,您可以将最小尺寸设置为比预期的大,即使在所有字母都是宽的情况下也是如此(通常W是最宽的字符)。我决定保留175px的固定大小。或者,您可以使用等宽字体,以便在所有情况下都具有一致的大小,而不需要定义一种尺寸。

  1. const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  2. let interval = null
  3. document.querySelector("#info-btn").addEventListener("mouseover", event => {
  4. const targetElement = event.target
  5. let iteration = 0
  6. // stop old animation
  7. clearInterval(interval)
  8. // save the original text
  9. let originalText = targetElement.innerText
  10. targetElement.dataset.originalText = targetElement.dataset.originalText === undefined ? originalText : targetElement.dataset.originalText
  11. originalText = targetElement.dataset.originalText
  12. interval = setInterval(() => {
  13. const text = targetElement.innerText.split("").map((letter, index) => {
  14. if (index < iteration) {
  15. // restore original text
  16. return targetElement.dataset.originalText[index]
  17. }
  18. return letters[Math.floor(Math.random() * letters.length)]
  19. })
  20. targetElement.innerText = text.join("")
  21. if (iteration >= targetElement.dataset.originalText.length) {
  22. clearInterval(interval)
  23. }
  24. iteration += 1
  25. }, 150)
  26. })
  1. nav {
  2. width: 100%;
  3. display: flex;
  4. justify-content: space-between;
  5. align-items: center;
  6. padding: 2em 4em;
  7. }
  8. .nav-buttons {
  9. display: flex;
  10. align-items: center;
  11. gap: 2em;
  12. }
  13. button {
  14. position: relative;
  15. background: none;
  16. outline: none;
  17. border: 1px solid var(--secondary);
  18. border-radius: 0.25em;
  19. font-size: 17px;
  20. color: var(--secondary);
  21. font-family: Monorama;
  22. padding: 0.25em 0.75em;
  23. cursor: pointer;
  24. min-width: 175px;
  25. }
  1. <div class="nav-buttons">
  2. <div class="btn1">
  3. <button>PROJECTS</button>
  4. </div>
  5. <div class="btn2">
  6. <button>
  7. <span id="info-btn">INFORMATION</span>
  8. </button>
  9. </div>
  10. <div class="theme-btn">
  11. <button onclick="changeClass()">Change Class</button>
  12. </div>
  13. </div>

我的这个代码版本(修改)https://codepen.io/luis7lobo9b/pen/mdoypbq

展开查看全部

相关问题