html - css悬停以更改具有同一类的多个不相关元素
问题描述
我正在制作一个具有多个八度音阶的钢琴键盘。现在,我可以将鼠标悬停在任何单个键上,让它改变颜色。我想要做的是突出显示同一音符的每个键。例如,当我将鼠标悬停在任何 C 键上时,我希望键盘上的所有 C 键都改变颜色。我想要每个八度音阶中的所有 12 个音符。
如果您需要,我会发布代码,但是适合论坛帖子有点笨拙。
单独使用 CSS 是否可行,还是需要 JS?似乎应该有一种简单的方法可以使具有相同类的每个元素在任何一个悬停时都会做出反应,但是由于我认为它们不是兄弟姐妹或父/子,我不知道如何让任何一件事激活一切。
解决方案
如果不使用javascript,则只有在不同八度音程中的同一音符的所有键都属于同一个容器,并且同一八度音程中的不同音符属于不同容器时,才能实现此目的。
您在父级上使用 :hover 选择器并为其子级设置样式。为了使不同容器的键交错,容器必须在精确的位置重叠。拦截悬停的技巧是使容器高度=0,这样前面的容器不会覆盖后面的容器,但悬停仍然被孩子们抓住。
这是一个有 7 个音符和 3 个八度音阶的例子:
.Piano {
position: relative;
height: 5cm;
width: 22cm;
}
.Note {
position: absolute;
height: 0;
}
.Note:nth-child(1) {left: 0cm;}
.Note:nth-child(2) {left: 1cm;}
.Note:nth-child(3) {left: 2cm;}
.Note:nth-child(4) {left: 3cm;}
.Note:nth-child(5) {left: 4cm;}
.Note:nth-child(6) {left: 5cm;}
.Note:nth-child(7) {left: 6cm;}
.Octave {
display: inline-block;
border: 1px solid black;
width: 1cm;
height: 5cm;
}
.Octave:not(:first-child) {
margin-left: 6cm;
}
.Note:hover .Octave {
background-color: red;
}
<div class="Piano">
<div class="Note">
<div class="Octave">C1</div>
<div class="Octave">C2</div>
<div class="Octave">C3</div>
</div>
<div class="Note">
<div class="Octave">D1</div>
<div class="Octave">D2</div>
<div class="Octave">D3</div>
</div>
<div class="Note">
<div class="Octave">E1</div>
<div class="Octave">E2</div>
<div class="Octave">E3</div>
</div>
<div class="Note">
<div class="Octave">F1</div>
<div class="Octave">F2</div>
<div class="Octave">F3</div>
</div>
<div class="Note">
<div class="Octave">G1</div>
<div class="Octave">G2</div>
<div class="Octave">G3</div>
</div>
<div class="Note">
<div class="Octave">A1</div>
<div class="Octave">A2</div>
<div class="Octave">A3</div>
</div>
<div class="Note">
<div class="Octave">B1</div>
<div class="Octave">B2</div>
<div class="Octave">B3</div>
</div>
</div>
推荐阅读
- bazel - 我可以查询一组标签吗?
- python - 如何在 python 中禁用鼠标事件?
- colors - TradingView Strategy Tester - 我可以更改图表上进入/退出箭头的颜色吗
- php - 使用 PHP/Laravel 以 Word 或 PDF 格式打开 HTML
- flutter - Listview builder不更新列表中的值
- java - 在不停止 UI 线程的情况下向 android 中的循环添加延迟
- php - 如何让 PayPal 与 Laravel PHP 一起使用?
- javascript - 为什么整数键的“映射”操作比 JavaScript (v8) 中的“对象”慢得多?
- javascript - 从 node.js 调用 python sql 函数或做出反应
- c++ - 为什么使用 malloc() free(ptr) 后输出会发生变化?我认为输出将是 NULL,因为我已经释放了内存,但它显示了一些数字