Я бы переместил класс on
вверх, чтобы он был относительно родительского содержимого.
div[class^="Item"].on div.content,
div[class^="Item"].on button.close {
display: block;
}
div.content,
button.close {
display: none;
}
Тогда все, что вам нужно сделать, это получить родительский элемент целевой кнопки и переключить класс.
Если вы можете, я бы добавил дополнительный класс ко всем предметам, чтобы их было легче идентифицировать в CSS.
div.expandable-content.on div.content {
display: block;
}
<div class="expandable-content Item1">
<button class="contentButton">toggle</button>
<div class="content">loooaads of stuff goes here</div>
<button class="close">Close</button>
</div>
<!-- ...etc -->
Пример
const queryAll = (selector) => Array.from(document.querySelectorAll(selector))
const showContent = (button, visible) => {
button.parentElement.classList.toggle('on', visible)
}
queryAll(".contentButton").forEach(button => {
button.addEventListener('click', e => {
showContent(e.target, true)
})
})
queryAll(".close").forEach(closeBtn => {
closeBtn.addEventListener('click', e => {
showContent(e.target, false)
})
})
.contentButton {
background-color: #008CBA;
color: white;
text-align: center;
text-decoration: none;
font-size: 20px;
width: 200px;
height: 30px;
border-radius: 7px;
}
div[class^="Item"].on div.content {
display: block;
}
div[class^="Item"].on button.close {
display: block;
}
.close {
display: none;
}
.content {
display: none;
position: relative;
z-index: 1;
left: 0;
top: 0;
bottom: 0;
right: 0;
width: 50%;
height: 100px;
background-color: #000000;
width: 50%;
margin: 10% auto;
color: blue;
}
<h2>Item List</h2>
<div class="Item1">
<button class="contentButton">toggle</button>
<div class="content">loooaads of stuff goes here</div>
<button class="close">Close</button>
</div>
<div class="Item2">
<button class="contentButton">toggle</button>
<div class="content">stuff goes here</div>
<button class="close">Close</button>
</div>
<div class="Item3">
<button class="contentButton">toggle</button>
<div class="content">mooooreeee stuff goes here</div>
<button class="close">Close</button>
</div>
<div class="Item4">
<button class="contentButton">toggle</button>
<div class="content">stuff goes here</div>
<button class="close">Close</button>
</div>
<div class="Item5">
<button class="contentButton">toggle</button>
<div class="content">stuff goes here</div>
<button class="close">Close</button>
</div>
<div class="Item1">
<button class="contentButton">toggle</button>
<div class="content">stuff goes here</div>
<button class="close">Close</button>
</div>
Со встроенной кнопкой закрытия необходимо получить содержимое (родительский) для кнопки, прежде чем вы сможете получить упаковочный div (дедушка).
const queryAll = (selector) => Array.from(document.querySelectorAll(selector))
const showContent = (button, visible) => {
button.parentElement.classList.toggle('on', visible)
}
queryAll(".contentButton").forEach(button => {
button.addEventListener('click', e => {
showContent(e.target, true)
})
})
queryAll(".close").forEach(closeBtn => {
closeBtn.addEventListener('click', e => {
showContent(e.target.parentElement, false)
})
})
.contentButton {
background-color: #008CBA;
color: white;
text-align: center;
text-decoration: none;
font-size: 20px;
width: 200px;
height: 30px;
border-radius: 7px;
}
div[class^="Item"].on div.content {
display: block;
}
div[class^="Item"].on button.close {
display: block;
}
.close {
display: none;
}
.content {
display: none;
position: relative;
z-index: 1;
left: 0;
top: 0;
bottom: 0;
right: 0;
width: 50%;
height: 100px;
background-color: #000000;
width: 50%;
margin: 10% auto;
color: blue;
}
<h2>Item List</h2>
<div class="Item1">
<button class="contentButton">toggle</button>
<div class="content">
loooaads of stuff goes here
<button class="close">Close</button>
</div>
</div>
<div class="Item2">
<button class="contentButton">toggle</button>
<div class="content">
stuff goes here
<button class="close">Close</button>
</div>
</div>
<div class="Item3">
<button class="contentButton">toggle</button>
<div class="content">
mooooreeee stuff goes here
<button class="close">Close</button>
</div>
</div>
<div class="Item4">
<button class="contentButton">toggle</button>
<div class="content">
stuff goes here
<button class="close">Close</button>
</div>
</div>
<div class="Item5">
<button class="contentButton">toggle</button>
<div class="content">
stuff goes here
<button class="close">Close</button>
</div>
</div>
<div class="Item1">
<button class="contentButton">toggle</button>
<div class="content">
stuff goes here
<button class="close">Close</button>
</div>
</div>