При выборе блока по id, должен открыть другой блок
Всем привет, при клике на любую букву, появляется подсказка только для буквы Н, у первого списка есть id, это где буквы, у второго списка id нету, если добавить id, то как их потом сравнивать, чтобы при выборе появлялась правильная подсказка!
js
const listGroup = document.querySelector('.list-group');
const hiddenWord = document.querySelector('.hidden-word');
const visibleItemLi = document.querySelector('.li-item');
const task = document.querySelector('.task');
listGroup.addEventListener('click', function (e) {
e.target.closest('.task').classList.add('hidden-word');
visibleItemLi.classList.add('visible-li-item');
});
function close() {
task.classList.remove('hidden-word');
visibleItemLi.classList.remove('visible-li-item');
}
Ответы (2 шт):
Автор решения: Александр Сычёв
→ Ссылка
Исходя из вашей структуры html можно сделать как-то так: Id сделал с нуля. Вроде все просто, если не понятно - пишите
const listGroup = document.querySelector('.list-group');
const visibleItemLi = document.querySelectorAll('.li-item');
listGroup.addEventListener('click', ({
target
}) => {
if (target.classList.contains('task')) { // проверяем что клик был именно на task
target.classList.add('hidden-word') // добавляем класс
visibleItemLi[target.id].classList.add('visible-li-item') // скрываем букву
}
})
function closes(event) {
const item = event.target.closest('.li-item') // находим родителя
item.classList.remove('visible-li-item') // удаляем класс
const list = listGroup.querySelector('.hidden-word') // находим по классы скрытую букву
list.classList.remove('hidden-word') // удаляем класс
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: Roboto;
list-style: none;
}
.list-group {
display: flex;
}
.list-group-item {
background-color: #EEE;
cursor: pointer;
width: 30px;
height: 30px;
text-align: center;
border: 1px solid #CCC;
line-height: 30px;
margin: 2px;
}
.list-group-item:hover {
background-color: #FFF;
}
.hidden-word {
visibility: hidden;
}
.visible-word {
visibility: visible;
}
.li-item {
display: flex;
background-color: #EEE;
width: 300px;
height: 30px;
text-align: center;
border: 1px solid #CCC;
line-height: 30px;
}
.hidden-li-item {
visibility: hidden;
}
.visible-li-item {
visibility: visible;
}
.closed {
margin-top: -7px;
margin-left: 20px;
padding: 5px;
cursor: pointer;
color: #ff0000;
}
<ul class="list-group">
<li class="list-group-item task" id="0">Н</li>
<li class="list-group-item task" id="1">А</li>
<li class="list-group-item task" id="2">З</li>
<li class="list-group-item task" id="3">В</li>
<li class="list-group-item task" id="4">А</li>
<li class="list-group-item task" id="5">Н</li>
<li class="list-group-item task" id="6">И</li>
<li class="list-group-item task" id="7">Я</li>
</li>
<ul>
<li class="li-item hidden-li-item">Опа открылась буква Н
<div class="closed" onclick="closes(event)">x</div>
</li>
<li class="li-item hidden-li-item">Опа открылась буква А
<div class="closed" onclick="closes(event)">x</div>
</li>
<li class="li-item hidden-li-item">Опа открылась буква З
<div class="closed" onclick="closes(event)">x</div>
</li>
<li class="li-item hidden-li-item">Опа открылась буква В
<div class="closed" onclick="closes(event)">x</div>
</li>
<li class="li-item hidden-li-item">Опа открылась буква А
<div class="closed" onclick="closes(event)">x</div>
</li>
<li class="li-item hidden-li-item">Опа открылась буква Н
<div class="closed" onclick="closes(event)">x</div>
</li>
<li class="li-item hidden-li-item">Опа открылась буква И
<div class="closed" onclick="closes(event)">x</div>
</li>
<li class="li-item hidden-li-item">Опа открылась буква Я
<div class="closed" onclick="closes(event)">x</div>
</li>
</ul>
</ul>
Чтобы найти несколько элементов, нужно использовать querySelectorAll
P.S: не учитывая id
Пример прокомментировал - должно быть понятно:
Момент data-letter делайте уникальным при выведение данных на страницу
const listGroup = document.querySelector('.list-group')
const list = [...listGroup.querySelectorAll('.task')]
const out = document.querySelector('.out')
function popap(text, data) {
const str = `<div class="li-item hidden-li-item visible-li-item" data-popap='${data}'>Опа открылась буква ${text}
<p class="closed" onclick="closes(event)">x</p>
</div>` // составляем шаблон подсказки
out.insertAdjacentHTML('beforeend', str) // вставляем в DOM
}
listGroup.addEventListener('click', ({
target
}) => {
if (target.classList.contains('task')) { // проверяем что клик был именно на task
target.classList.add('hidden-word') // добавляем класс
const text = target.textContent // запиываем букву
const dataset = target.dataset.letter // запиываем dataset
popap(text, dataset) // вызываем функцию
}
})
function closes(event) {
const item = event.target.closest('.li-item') // находим родителя
const itemPopap = item.dataset.popap // запиываем dataset
item.remove() // удаляем элемент из DOM
const search = list.find(item => item.dataset.letter === itemPopap) // ищем одинаковый dataset
search.classList.remove('hidden-word') // удаляем класс
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: Roboto;
list-style: none;
}
.list-group,
.wrapper {
display: flex;
}
.list-group-item {
background-color: #EEE;
cursor: pointer;
width: 30px;
height: 30px;
text-align: center;
border: 1px solid #CCC;
line-height: 30px;
margin: 2px;
}
.list-group-item:hover {
background-color: #FFF;
}
.hidden-word {
visibility: hidden;
}
.visible-word {
visibility: visible;
}
.li-item {
display: flex;
background-color: #EEE;
width: 300px;
height: 30px;
text-align: center;
border: 1px solid #CCC;
line-height: 30px;
}
.hidden-li-item {
visibility: hidden;
}
.visible-li-item {
visibility: visible;
}
.closed {
margin-top: -7px;
margin-left: 20px;
padding: 5px;
cursor: pointer;
color: #ff0000;
}
<div class="wrapper">
<ul class="list-group">
<li class="list-group-item task" data-letter="1">Н</li>
<li class="list-group-item task" data-letter="2">А</li>
<li class="list-group-item task" data-letter="3">З</li>
<li class="list-group-item task" data-letter="4">В</li>
<li class="list-group-item task" data-letter="5">А</li>
<li class="list-group-item task" data-letter="6">Н</li>
<li class="list-group-item task" data-letter="7">И</li>
<li class="list-group-item task" data-letter="8">Я</li>
</ul>
<div class="out"> </div>
</div>
Автор решения: Andrei
→ Ссылка
Можно сделать вот так что-бы не ломать голову с множеством id:
const LG = document.querySelector("#list-group");
const LInfo = document.querySelector("#list-info");
LG.addEventListener('click', e => {
if (document.querySelector('#li-info'))
closes();
const LI = document.createElement('LI');
LI.setAttribute('class', 'edit-task');
LI.setAttribute('id', 'li-info');
const DV = document.createElement('DIV');
DV.setAttribute('class', 'edit-task');
const DVC = document.createElement('DIV');
DVC.setAttribute('class', 'closed');
DVC.setAttribute('onclick', 'closes()');
DVC.append('x');
DV.append(`Опа открылась буква ${e.target.textContent}`);
DV.append(DVC);
LI.append(DV);
LInfo.append(LI);
});
function closes() {
document.querySelector('#li-info').remove();
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: Roboto;
list-style: none;
}
.list-group {
display: flex;
}
.list-group-item {
background-color: #EEE;
cursor: pointer;
width: 30px;
height: 30px;
text-align: center;
border: 1px solid #CCC;
line-height: 30px;
margin: 2px;
}
.list-group-item:hover {
background-color: #FFF;
}
.hidden-word {
visibility: hidden;
}
.visible-word {
visibility: visible;
}
.edit-task {
display: flex;
background-color: #EEE;
width: 300px;
height: 30px;
text-align: center;
border: 1px solid #CCC;
line-height: 30px;
}
.hidden-li-item {
visibility: hidden;
}
.visible-li-item {
visibility: visible;
}
.closed {
margin-top: -7px;
margin-left: 20px;
padding: 5px;
cursor: pointer;
color: #ff0000;
}
<ul class="list-group" id="list-group">
<li class="list-group-item task">Н</li>
<li class="list-group-item task">А</li>
<li class="list-group-item task">З</li>
</ul>
<ul id="list-info"></ul>