【问题标题】:Hiding/showing multiple items when I click a button单击按钮时隐藏/显示多个项目
【发布时间】:2021-09-22 20:16:41
【问题描述】:

我有 3 个按钮,ID 为 'btn1' 'btn2' 'btn3',我希望每个按钮都隐藏一些元素:每个元素的 ID 为 'sect1' 'sect2' ... 'sect3',并属于类 'hidden'。由于某种原因,我的代码不起作用。第一个按钮完全搞砸了,第二个和第三个按钮只显示分配给它们的元素之一。我的代码是这样的:

var divs
var btn1 = document.getElementById("btn1");
var btn2 = document.getElementById("btn2");
var btn3 = document.getElementById("btn3");

btn1.onclick = function(event){
event.preventDefault();
toggleDivs("sect1",this);

toggleDivs("sect2",this);

toggleDivs("sect3",this);

toggleDivs("sect4",this);
};

btn2.onclick = function(event){
event.preventDefault();
toggleDivs("sect5",this);
};
btn2.onclick = function(event){
event.preventDefault();
toggleDivs("sect6",this);
};
btn2.onclick = function(event){
event.preventDefault();
toggleDivs("sect7",this);
};
btn2.onclick = function(event){
event.preventDefault();
toggleDivs("sect8",this);
};
btn3.onclick = function(event){
event.preventDefault();
toggleDivs("sect9",this);
};
btn3.onclick = function(event){
event.preventDefault();
toggleDivs("sect10",this);
};
btn3.onclick = function(event){
event.preventDefault();
toggleDivs("sect11",this);
};
btn3.onclick = function(event){
event.preventDefault();
toggleDivs("sect12",this);
};

function toggleDivs(s,btn){

if(btn.classList.contains("btn_active_state")){
document.getElementById(s).classList.remove("shown");
btn.classList.remove("btn_active_state");
document.getElementById(s).classList.remove("shown");
return;
}else{
btn1.classList.remove("btn_active_state");
btn2.classList.remove("btn_active_state");
btn3.classList.remove("btn_active_state");
btn.classList.add("btn_active_state");
document.getElementById("sect1").classList.remove("shown");
document.getElementById("sect2").classList.remove("shown");
document.getElementById("sect3").classList.remove("shown");
document.getElementById("sect4").classList.remove("shown");
document.getElementById("sect5").classList.remove("shown");
document.getElementById("sect6").classList.remove("shown");
document.getElementById("sect7").classList.remove("shown");
document.getElementById("sect8").classList.remove("shown");
document.getElementById("sect9").classList.remove("shown");
document.getElementById("sect10").classList.remove("shown");
document.getElementById("sect11").classList.remove("shown");
document.getElementById("sect12").classList.remove("shown");
document.getElementById(s).classList.add("shown","fade");
}

}

//force button1 state initialise, if required
btn1.focus();
btn1.click();
</script>
<style>

.elementor-editor-active .hidden{
display:block;
}
.hidden{
display:none;
}
.shown{
display: block !important;
animation: fade_in_anim 0.5s;
}
.btn_active_state{
background-color: #FFCC00 !important;
}

@keyframes fade_in_anim {
0% {
opacity: 0;
transform: translateY(-30px);
}

100% {
opacity: 1;
transform: translateY(0px);
}
}

</style>```

【问题讨论】:

  • 你的第一个按钮搞砸了,因为每次你调用toggleDivs() 时,你都会从前一个sect 中删除show 类。而其他按钮只显示一个元素,因为 onclick 属性只能引用一个函数。
  • 问题在于 toggledivs() 函数,因为它只为一个教派添加类并从所有其他教派中删除,而您已将多个教派分配给一个按钮

标签: javascript html css onclick hidden


【解决方案1】:

您可以映射按钮和部分:

const buttons = [...document.querySelectorAll("[id^='btn']")]
const mapping = [[0, 4], [4, 8], [8,12]]
const sections = [...document.querySelectorAll("[id^='sect']")]

for(let i = 0; i < 3; i++) {
  buttons[i].addEventListener('click', function(event) {
    event.preventDefault();
    toggleDivs(this)
    for(let j = mapping[i][0]; j < mapping[i][1]; j++) {
      sections[j].classList.add("shown", "fade")
    }
  })
}

function toggleDivs(btn){
  buttons.forEach(b => b.classList.remove("btn_active_state"))
  btn.classList.add("btn_active_state")
  sections.forEach(s => s.classList.remove('shown'))
}

//force button1 state initialise, if required
btn1.focus();
btn1.click();
.shown{
  display: block !important;
  animation: fade_in_anim 0.5s;
}
.btn_active_state{
  background-color: #FFCC00 !important;
}
@keyframes fade_in_anim {
  0% {
    opacity: 0;
    transform: translateY(-30px);
  }
  100% {
    opacity: 1;
    transform: translateY(0px);
  }
}
[id^='sect'] {
  display: none;
}
<button id="btn1">btn1</button>
<button id="btn2">btn2</button>
<button id="btn3">btn3</button>
<div id="sect1">sect1</div>
<div id="sect2">sect2</div>
<div id="sect3">sect3</div>
<div id="sect4">sect4</div>
<div id="sect5">sect5</div>
<div id="sect6">sect6</div>
<div id="sect7">sect7</div>
<div id="sect8">sect8</div>
<div id="sect9">sect9</div>
<div id="sect10">sect10</div>
<div id="sect11">sect11</div>
<div id="sect12">sect12</div>

【讨论】:

  • 我实现了这个并且它有效!但是在我保存更改并刷新之后,页面,代码不再工作......关于为什么的任何想法?
  • 嘿伙计,这个解决方案适用于这个 html 标记,你有不同的 id 或 btns 吗?
  • 我没有。该解决方案在我处于编辑模式时也适用于我的网站,但不适用于实际网站。
  • 对不起,伙计,除非我调试您的实时站点,否则我无法帮助您:(您可以检查 JS 是否在您的实时站点上运行,放置一些警报,console.log 并尝试调试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多