我有一张带点(标记)的地图:
.map {position: relative; width: 800px; height: 506px;}
.dot {display: block; position: absolute; width: 30px; height: 30px; background-color: gold; border-radius: 30px; cursor: pointer; text-align: center; line-height: 30px;}
.dot:hover::before {content: ""; position: absolute; top: -10px; left: -10px; width: 50px; height: 50px; border-radius: 50px; background-color: gold; animation: animate 1.5s infinite normal ease-out;
}
@keyframes animate {from {transform: scale(0); opacity: .5}to {transform: scale(2); opacity: 0;}}
.aa {top: 440px; left: 260px;}
.bb {top: 320px; left: 380px;}
.cc {top: 260px; left: 240px;}
.win {display: none; position: absolute; top: 150px; left: 200px; width: 200px; height: 50px; background: pink; border: 1px solid black; padding: 5px;}
.close {position: absolute; top: -1px; right: -1px; border: 1px solid black; padding: 5px 10px; cursor: pointer;}
<div class="map">
<img src="https://isstatic.askoverflow.dev/0lfnZ.jpg">
<span class="dot aa">A</span>
<span class="dot bb">B</span>
<span class="dot cc">C</span>
</div>
<div class="win ab">Окно AB<span class="close">X</span></div>
<div class="win ac">Окно AC<span class="close">X</span></div>
<div class="win ba">Окно BA<span class="close">X</span></div>
<div class="win bc">Окно BC<span class="close">X</span></div>
<div class="win ca">Окно CA<span class="close">X</span></div>
<div class="win cb">Окно CB<span class="close">X</span></div>
问题:选择两个点时如何显示隐藏元素?更详细地说,场景如下:
- 当您单击一个点(例如,点
A)时,它被选中。当您再次单击同一点时,我们会删除选择。⇒ 结果什么也没发生。
1.1。我们可以选择一个点并取消选择它,例如,使用javascript, 通过在单击附加类的元素时添加/删除:
let items;
let item;
window.addEventListener('load', () => {
dots = document.getElementsByClassName('dot');
for(let dot of dots) {
dot.addEventListener('click', () => {
//for(let it of dots) it.classList.remove('active');
dot.classList.toggle('active')
});
}
});
.map {position: relative; width: 800px; height: 506px;}
.dot {display: block; position: absolute; width: 30px; height: 30px; background-color: gold; border-radius: 30px; cursor: pointer; text-align: center; line-height: 30px;}
.dot:hover::before {content: ""; position: absolute; top: -10px; left: -10px; width: 50px; height: 50px; border-radius: 50px; background-color: gold; animation: animate 1.5s infinite normal ease-out;
}
@keyframes animate {from {transform: scale(0); opacity: .5}to {transform: scale(2); opacity: 0;}}
.aa {top: 440px; left: 260px;}
.bb {top: 320px; left: 380px;}
.cc {top: 260px; left: 240px;}
.active {background-color: red;}
<div class="map">
<img src="https://isstatic.askoverflow.dev/0lfnZ.jpg">
<span class="dot aa">A</span>
<span class="dot bb">B</span>
<span class="dot cc">C</span>
</div>
- 当您单击一个点(例如,点
A)时,它被选中。我们点击另一个点(例如点B),它也被选中 ⇒ 结果显示了一个隐藏元素。
2.1。选择点时:
A和B- 具有类的元素.ab
A和- 具有类C的元素和 - 具有类的元素.ac
B和- 具有类的元素和- 具有类的元素并且-显示具有类的元素A.ba
BC.bc
CA.ca
CB.cb
- 当您单击
<span class="close">X</span>每个隐藏元素中的十字 ( ) ⇒ 元素被隐藏,并且从选定的点中删除高光。
问题立即出现,“如何组织元素之间的联系”。您的关键粘合剂是类名
class="dot aa"。例如,您可以aa通过某个[...elem.classList].filter(e => e.length == 2)[0]将过滤并仅将名称为两个字母的类保留在数组中的某个类,取列表的第 [0] 个元素。但是这种对类名的操作并不是很可靠。您可以放心地忘记它们(例如,添加其他类别的 2 个字母)。因此,我将所有必要的名称放入单独的
data-属性中,但编写代码的方式是,如果需要,可以切换到具有类名的逻辑。它保留在某个数组中以收集被点击的按钮(意味着知道点击的顺序)。每次添加按钮后,检查数组的长度 == 2 ?打开一扇窗户。
根据任务的
心情,可以以非常不同的方式组织代码。变化:
* 以防万一,即使在窗口打开时,也可以通过单击按钮的任意组合来确保工作。一次只能打开一个窗口。
要切换到带有类名的选项,您可以替换 KEY 对象中的函数: