javascript - 点击事件监听器不会改变高度
问题描述
我想要构建的是:我有两个 div,里面有两个 div。最初,内部 div 的高度为 0。我已将事件侦听器添加到外部 div,当我单击 div 时,内部的高度变为 50px。此外,我已将事件侦听器添加到内部 div,当我单击时,我希望内部潜水的高度再次变为 0,但它不起作用。每个其他 CSS 属性(如宽度或颜色)都有效。下面是代码。
const mainContainer = document.querySelectorAll(".mainContainer");
const subMenu = document.querySelectorAll(".subMenu");
mainContainer.forEach(function(element, index) {
element.addEventListener("click", function() {
subMenu[index].style.height = "50px";
})
})
subMenu.forEach(function(element, index) {
element.addEventListener("click", function() {
this.style.height = "10px";
})
})
* {
margin: 0;
padding: 0;
}
#container {
border: 1px solid red;
width: 50%;
}
#mainContainer {
border: 1px solid;
position: relative;
width: 100%;
}
.subMenu {
position: absolute;
overflow: hidden;
width: 100%;
height: 0px;
background-color: green;
top: 0;
left: 0;
transition: height 0.5s;
}
<div id="container">
<div class="mainContainer">
<p>this is the main box</p>
<p>tha provides the main categories</p>
<div class="subMenu">
<p>This is the sub menu</p>
<p>Lets build it</p>
<p>Yes we do</p>
</div>
</div>
<div class="mainContainer">
<p>this is the main box</p>
<p>tha provides the main categories</p>
<div class="subMenu">
<p>This is the sub menu</p>
<p>Lets build it</p>
<p>Yes we do</p>
</div>
</div>
</div>
解决方案
问题是您已将两个事件侦听器附加到元素并且同时触发,并且扩展处理程序覆盖了折叠处理程序:
原因是每当您单击子元素时,它会将单击事件传递给父元素,这也会再次更改属性。您可以在子点击函数中使用 stopPropagation() 来停止点击事件的传播。检查下面的更新代码。 https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagation (感谢@Himanshu Budhiraja)这个很好的解释
您没有提到预期的行为,我根据您设置的属性假设您希望它展开和折叠。使用内联样式控制样式并不是最佳实践。最好添加或删除类,例如这里,我添加了类“.expanded”,我使用classList来打开和关闭它
const mainContainer = document.querySelectorAll(".mainContainer");
const subMenu = document.querySelectorAll(".subMenu");
mainContainer.forEach(function(element, index) {
element.addEventListener("click", function() {
subMenu[index].classList.toggle("expanded");
});
});
* {
margin: 0;
padding: 0;
}
#container {
border: 1px solid red;
width: 50%;
}
#mainContainer {
border: 1px solid;
position: relative;
width: 100%;
}
.subMenu {
position: absolute;
overflow: hidden;
width: 100%;
height: 0px;
background-color: green;
top: 0;
left: 0;
transition: height 0.5s;
}
.expanded {
height: 50px;
}
<div id="container">
<div class="mainContainer">
<p>this is the main box</p>
<p>tha provides the main categories</p>
<div class="subMenu">
<p>This is the sub menu</p>
<p>Lets build it</p>
<p>Yes we do</p>
</div>
</div>
<div class="mainContainer">
<p>this is the main box</p>
<p>tha provides the main categories</p>
<div class="subMenu">
<p>This is the sub menu</p>
<p>Lets build it</p>
<p>Yes we do</p>
</div>
</div>
</div>
推荐阅读
- ruby-on-rails - Ruby on Rails haml 导航栏汉堡菜单
- python - 如何针对我的 keras 训练模型运行测试数据?
- javascript - 重新开始写入流 nodejs
- mysql - 如何在每个数据集的一行中从规范化表中检索值?
- sqlite - Delphi SqLite,firedac,卡在带有火图标的黑色加载屏幕
- r - 拆分向量和求和值
- gradle - 在以下任何来源中都找不到插件 [id: 'org.jetbrains.kotlin.jvm']
- python-3.x - 简单的函数语句没有给出任何输出
- python - 注册系统不会为我创建我需要的 .txt 文件。Tkinter Python
- python - 为什么第二个嵌套 for 循环在迭代期间跳过重复值?