CSS 中的吉他和弦
在我之前的文章中,我研究了attr()
CSS 中新的改进方法。我欣喜若狂(双关语)。这次,我将继续研究该attr()
方法,展示如何制作易于阅读的组件——至少对于吉他手来说——就像这样:
<fret-board frets="4" strings="6" chord="C Major">
<string-note string="6" mute></string-note>
<string-note string="5" fret="3" finger="3"></string-note>
<string-note string="4" fret="2" finger="2"></string-note>
<string-note string="3" open></string-note>
<string-note string="2" fret="1" finger="1"></string-note>
<string-note string="1" open></string-note>
</fret-board>
... 变成这样 —完全没有 JavaScript:
让我们开始吧!
基本网格
首先,我们需要一个基本的网格。单元格和行数取决于我们在 HTML 中定义的frets
和属性——因此,让我们获取它们并设置两个自定义属性:strings
<number>
--_frets: attr(frets type(<number>), 4);
--_strings: attr(strings type(<number>), 6);
在 CSS 中,我们将琴弦数量增加一倍,这样就可以将音符放在琴弦上——在琴弦左侧一个网格单元的位置。我们还希望顶部和底部两行分别显示和弦名称以及打开/静音指示,因此我们的网格如下所示:
fret-board {
grid-template-columns: repeat(calc(var(--_strings) * 2), 1fr);
grid-template-rows:
var(--fret-board-top-row-h, 12%)
repeat(calc(var(--_frets)), 1fr)
var(--fret-board-bottom-row-h, 15%);
}
我们现在有:
琴格和琴弦
音品和琴弦作为两个线性渐变添加到伪元素中:
fret-board {
--fret-board-fret-c: light-dark(#000, #FFF);
--fret-board-fret-w: clamp(0.0625rem, 0.03125rem + 0.5cqi, 0.5rem);
--fret-board-string-c: light-dark(#0008, #FFF8);
--fret-board-string-w: clamp(0.0625rem, 0.03125rem + 0.5cqi, 0.125rem);
background-image:
/* Vertical strings */
linear-gradient(
90deg,
var(--fret-board-string-c) var(--fret-board-string-w),
transparent 0 var(--fret-board-string-w)
),
/* Horizontal frets */
linear-gradient(
180deg,
var(--fret-board-fret-c) var(--fret-board-fret-w),
transparent 0 var(--fret-board-fret-w)
);
background-position:
0 var(--fret-board-fret-w),
0 0;
background-repeat:
repeat-x,
repeat-y;
background-size:
/* Width and height for strings */
calc(100% / (var(--_strings) - 1) - (var(--fret-board-string-w) / var(--_strings)))
calc(100% - (2 * var(--fret-board-fret-w))),
/* Width and height for frets */
100%
calc(100% / var(--_frets) - (var(--fret-board-fret-w) / var(--_frets)));
}
好的,这确实有点麻烦,但我们基本上从上到下为音品创建了水平线,并为贯穿整个琴弦创建了垂直线。
添加音符和手指
让我们添加一些注释 - 但首先,让我们抓住这些属性:
--barre: attr(barre type(<number>), 1);
--fret: attr(fret type(<number>), 0);
--string: attr(string type(<number>), 0);
我们很快就会讲到--barre
,但是现在,我们使用这个公式来放置注释:
string-note {
grid-column: calc((var(--_strings) * 2) - (var(--string) * 2 - 1)) / span calc(var(--barre) * 2);
grid-row: calc(var(--fret) + 1);
}
让我们来分析一下:
-
网格列定位:
(var(--_strings) * 2)
- 从网格的最右侧开始(var(--string) * 2 - 1)
- 计算从右侧移动多远- 例如,有 6 个字符串:
- 字符串 1(最高)位于位置
12 - (1*2-1) = 11
- 弦 6(最低)位于位置
12 - (6*2-1) = 1
- 字符串 1(最高)位于位置
-
跨度计算:
span calc(var(--barre) * 2)
- 对于常规笔记,跨越 2 列- 对于封闭和弦,跨越更多列,具体取决于覆盖的弦数
-
网格行公式:
calc(var(--fret) + 1)
-+1
标题行的帐户- 开放弦(品位 = 0)放在第 1 行,第一品位放在第 2 行,等等。
这让我们:
显示手指编号
为了获得良好的指法谱,我们需要显示每个音符应该用哪个手指弹奏。我们从finger
HTML 中的属性中获取它,并使用伪元素显示它:
string-note::after {
color: var(--string-note-c, light-dark(#FFF, #222));
content: attr(finger);
font-size: var(--string-note-fs, 7cqi);
font-weight: var(--string-note-fw, 500);
text-box: cap alphabetic;
}
注意:
text-box: cap alphabetic
是一项现代 CSS 功能,用于修剪由 产生的间距line-height
。该light-dark()
功能会自动调整文本颜色以适应亮色或暗色模式。
静音弦和开放弦
吉他和弦通常涉及未按下的琴弦,而是空弦演奏或静音(未演奏):
<string-note string="6" mute></string-note> <!-- Muted string -->
<string-note string="3" open></string-note> <!-- Open string -->
对于字符串状态的视觉表示:
- 对于静音弦,我们使用 Temani Atif 的十字形状和
border-image
45° 旋转创建一个 X 符号 - 对于开放的字符串,我们使用带有径向渐变的 CSS 蒙版来创建空心圆效果
string-note[mute] {
border-image: conic-gradient(var(--fret-board-bg) 0 0) 50%/calc(50% - 0.25cqi);
rotate: 45deg;
}
string-note[open] {
border-radius: 50%;
mask: radial-gradient(circle farthest-side at center,
transparent calc(100% - 1cqi),
#000 calc(100% - 1cqi + 1px));
}
封闭和弦
“封闭和弦”是指用一根手指按住多根琴弦。让我们barre
在 HTML 中添加以下属性:
<string-note string="6" fret="1" barre="6" finger="1"></string-note>
我们已经介绍了上面的计算,但它的视觉效果如下:
品格数
有时,和弦并非从第一品开始,我们需要指明品位编号。为此,我们使用有序列表,并在第一项上<ol>
设置属性:value
<ol><li value="7"></li></ol>
您可以在最终演示中检查样式,但它看起来像这样:
其他带有琴格和琴弦的乐器
现在,通过几个属性控制 CSS 的好处在于,我们可以轻松地将其应用于其他乐器。以下是一些示例:
尤克里里 — 4 弦:
班卓琴——5 弦:
演示
以下是演示。请注意,目前仅适用于 Chrome:
我希望您像我写这篇文章一样喜欢它——现在,我要拿起吉他弹奏一些和弦。
文章来源:https://dev.to/madsstoumann/guitar-chords-in-css-3hk8