【问题标题】:JS animation only effects one element and it barely worksJS 动画只影响一个元素,几乎没有效果
【发布时间】:2022-01-23 14:53:57
【问题描述】:

我正在尝试为我的下拉式大型菜单制作动画,但我遇到了一个问题,即只有当我将鼠标悬停在定制器按钮上时它才有效,缓慢。我不知道为什么。有更多 JavaScript 经验的人可以帮助我吗? 这是我的 JavaScript 代码,完整代码(html,scss)可以在here(codepen 链接)找到:

const button = document.querySelector(".dropdown");
button.addEventListener("mouseenter", (e) => {
  document
    .querySelector(".dropdown-content")
    .classList.toggle("scale-up-ver-top");
});

【问题讨论】:

  • 您希望它有什么作用?您希望它适用于每个按钮吗?
  • 请将您的代码添加为minimal reproducible example,而不是作为外部站点的链接 - 第三方链接会随着时间的推移而改变/中断。

标签: javascript html css sass


【解决方案1】:

你可以做两件事来让它发挥作用。

首先,document.querySelector() 只返回一个元素,这就解释了为什么只有自定义按钮有效。要解决此问题,您需要使用document.querySelectorAll(".dropdown")

其次,在事件侦听器中,我知道您要选择悬停的下拉列表的".dropdown-content"。但是document.querySelector(".dropdown-content") 只会简单地选择 DOM 中的所有下拉内容。要解决此问题,您需要将 document 替换为当前的下拉元素。

这是我从你的 codepen 重写的完整脚本:

// select all dropdown buttons
const buttons = document.querySelectorAll(".dropdown");

// loop through each button
buttons.forEach(button => {
  button.addEventListener("mouseenter", e => {

    // e.target => the one that you're hovering
    e.target
      .querySelector(".dropdown-content")
      .classList.toggle("scale-up-ver-top");
  });
});

查看codepen,我还添加了一个 mouseleave 事件。

【讨论】:

    【解决方案2】:

    document.querySelector(".dropdown") 仅返回使用dropdown 类找到的第一个元素。你需要querySelectorAll,然后你需要遍历所有元素并为每个元素添加一个mouseenter监听器。

    【讨论】:

    • 他的问题不在于向所有按钮显示功能,他的问题在于动画
    • 谢谢,我忘了。
    【解决方案3】:

    如果你提到你必须切换两次,它会起作用,因为你设置了classList.toggle,这意味着第一次它会将"scale-up-ver-top"类添加到元素中,第二次它会找到旧的"scale-up-ver-top",它将删除它一个可能的解决方案是添加(toggle, true),这意味着它只会向元素添加类。

    const button = document.querySelector(".dropdown");
    button.addEventListener("mouseenter", (e) => {
    document
        .querySelector(".dropdown-content")
        .classList.toggle("scale-up-ver-top", true);
    
    

    如果你是指问题,你想分配所有的按钮,使用:

    const button = document.querySelectorAll(".dropdown");
    button.forEach(item =>{
    item.addEventListener("mouseenter", (e) => {
    document
        .querySelector(".dropdown-content")
        .classList.toggle("scale-up-ver-top");
      document
        .querySelector(".dropdown-content")
        .classList.toggle("scale-up-ver-top");
    });
    })
    

    【讨论】:

    • 第二个函数就像数学中的乘数一样,它什么也不做。正如我在回答中所说,他只需要删除 JS 并在 HTML 中手动添加函数...
    • @Saout 我想你可以,但话说回来,当涉及到这些事情时,有一百万种方法可以解决问题。
    • @James 谢谢。
    【解决方案4】:

    如果你意识到这一点,你必须去 2 次所以类切换,我认为这个类应该只在悬停时,不是吗?

    所以去掉这个js,直接在HTML中将scale-up-ver-top添加到.dropdown-content

    编辑mouseenter 添加此函数,以便在鼠标离开元素时删除该类,所以它会像:

    const button = document.querySelector(".dropdown");
    button.addEventListener("mouseenter", (e) => {
      document
        .querySelector(".dropdown-content")
        .classList.toggle("scale-up-ver-top");
    });
    button.addEventListener("mouseleave", (e) => {
      document
        .querySelector(".dropdown-content")
        .classList.toggle("scale-up-ver-top");
    });
    

    【讨论】:

    • 我不是反对你的人,但我不得不说 hover 与 mousenter 完全不同,就你对我的回答的评论而言,op 表示 op 只询问为什么只使用 JS 动画影响一个元素,它几乎不工作
    • 不好意思,我基本上都试过了,我会在mouseenter里解决的
    • 但是您提供的代码与用户已经执行的代码相同。切换也不起作用,因为我的回答表明它将每两次删除一次课程
    • 我说的是添加代码而不是替换,请关注
    • 无论如何我添加了完整的代码应该是什么样的
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2012-07-10
    相关资源
    最近更新 更多