诀窍在于:通过结合土耳其语字母“ı”和句号“.”,我们可以创建一个看起来像字母“i”的东西,但它由两个独立的元素组成。 这为我们提供了一些有趣的选项,可以独立于字母的主干来设置字母点的样式或对其进行动画处理。 担心可访问性? 不用担心,我们会尽我们所能解决这个问题。
让我们看看如何创建和设置这些独立的“字母”的样式,并了解何时可以使用它们,以及何时应避免使用它们。
查看一些示例
以下是一些我们可以使用此想法实现的不同样式和动画
查看 CodePen 上 Ali C (@alichur) 编写的笔
样式和动画。
在 CodePen 上。
由于字母的两个部分都是常规的 Unicode 字符,因此它们将像任何其他文本一样尊重字体更改并进行页面缩放。 以下是一些不同字体、样式和缩放级别的示例
查看 CodePen 上 Ali C (@alichur) 编写的笔
不同的字体和缩放。
在 CodePen 上。
逐步了解该技术
让我们分解一下此技术的工作原理。
选择要组合的 Unicode 字符
我们使用的是无点“i”字符 (ı) 和句号。 而且,是的,我们也可以使用其他字符,例如无点“j”字符 (ȷ) 或甚至“ñ”(~) 或“è”(`) 等字符上的重音符号。
通过将它们包装在 span 中并将 display
属性设置为 block
,将字符堆叠在一起。
<span class="character">.</span>
<span class="character">ı</span>
.character {
display: block;
}
对齐字符
它们需要彼此靠近。 我们可以通过调整行高并删除它们的边距来做到这一点。
.character {
display: block;
line-height: 0.5;
margin-top: 0;
margin-bottom: 0;
}
向点元素添加 CSS 动画
类似于这种弹跳动画
@keyframes bounce {
from {
transform: translate3d(0, 0, 0);
}
to {
transform: translate3d(0, -10px, 0);
}
}
.bounce {
animation: bounce 0.4s infinite alternate;
}
在 CSS-Tricks 年鉴中 还有更多关于 CSS 动画的信息。
检查一下,到目前为止我们已经完成了哪些工作
查看 CodePen 上 Ali C (@alichur) 编写的笔
创建字母。
在 CodePen 上。
添加单词中剩余的任何字母
可以单独为“i”添加动画,但它可能只是一个单词中的一个字母,例如“Ping”。 我们将把动画字符包装在一个 span 中,以确保所有内容都保持在同一行上。
<p>
P
<span>
<span class="character">.</span>
<span class="character>ı</span>
</span>
ng
</p>
内联块元素之间存在 自动间隙,因此如果间距看起来不对,请确保将其删除。
最后阶段
查看 CodePen 上 Ali C (@alichur) 编写的笔
在单词中添加字母。
在 CodePen 上。
SVG 怎么样?
通过从两个或多个 SVG 元素创建字母,可以实现相同的效果。 这是一个示例,其中圆形元素与矩形元素独立地进行动画处理。
查看 CodePen 上 Ali C (@alichur) 编写的笔
SVG 动画 i。
在 CodePen 上。
虽然 SVG 字母不会响应字体更改,但它为对 Unicode 字符未表示的字母部分和任何字体中都不存在的字母样式进行动画处理提供了更多可能性。
您会在哪里使用它?
您想在哪里使用这样的东西? 我的意思是,它不是正文内容或任何长篇内容的理想用例。 这不仅会影响可读性(想象一下,如果这篇文章中的每个“i”都带有动画?),而且还会对辅助技术(如屏幕阅读器)产生负面影响,我们将在后面讨论。
相反,最好在内容旨在用于装饰的地方使用此技术。 徽标就是一个很好的例子。 或者可能是在图标中,该图标旨在进行描述,但辅助技术不会将其解释为文本。
让我们谈谈可访问性
回到我们的“Ping”示例,屏幕阅读器会将其读作 P . ı ng
。 这不是我们想要的读音,对于任何聆听它的人来说都绝对令人困惑。
根据使用情况,可以添加不同的 ARIA 属性以使文本以不同的方式读取。 例如,我们可以将整个元素描述为图像并添加文本作为其标签
<div role=img aria-label="Ping">
<p>P<span>.</span><span>ı</span>ng</p>
</div>
这样,外部 div 元素描述了屏幕阅读器读取的文本的含义。 但是,我们也希望辅助技术跳过内部元素。 我们可以向它们添加 aria-hidden="true"
或 role="presentation"
,以便它们也不会被解释为文本
<div role=img aria-label="Ping">
<p role="presentation">P
<span>.</span>
<span>ı</span>
ng</p>
</div>
这仅在使用 Safari 中的 VoiceOver 的 Mac 上进行了测试。 如果在其他辅助技术中存在问题,请在评论中告知我们。
更多 Unicode!
通过组合 Unicode 字符,我们可以创建更多“字母”。 这里有一个 常用字形的完整概述,或者您可以使用以下内容进行一些有趣的尝试,并在评论中分享您的创作。 但请记住:没有任何炫酷的效果值得在生产网站上损害可访问性!
第一个字形 | 第二个字形 | 组合 |
---|---|---|
ı | . | i |
ȷ | . | j |
n | ~ | ñ |
a | e | æ |
a | ` | à |
您忘记了所有变音符字符,这里有很多可能性
a + ¨ = ä
u + ¨ = ü
o + ¨ = ö
a + ° = å
o + / = Ø (有点像)
但这些在英语中并不常用,因此它们的使用案例在一个已经非常有限的使用案例的效果中更加有限。
我想,一种更有弹性且更符合语义的方法是
A. 完全删除图像语义,
B. 从视觉上隐藏未设置样式的完整字符串副本,以免让有视力的人看到
C. 使用 aria-hidden 隐藏屏幕阅读器用户看到的碎片字符串,如本文所示
我正好也在考虑这个问题。使用屏幕阅读器的人可能会非常困惑,但我想重点只是展示新的闪亮功能。
Neil 提供了隐藏屏幕阅读器用户内容的更好方法。请使用他的示例。
请允许我解释一下原因。在
<div>
或<span>
上使用aria-label
的 支持度较差,并且作为 ARIA 1.2 中的一个选项将 被弃用。将其作为图像使用role="img"
只会使问题更加复杂(并且 某些用户)因为它不是图像。请注意,aria-label
会覆盖某个元素的文本节点,因此在该示例中,role="presentation"
或aria-hidden="true"
将没有必要。如果您的用户是非英语母语使用者,则此覆盖也是一个因素,因为它 可能不会自动翻译。通常,VoiceOver 有很多怪癖,需要另一个屏幕阅读器来确认结果。我建议 从 NVDA 或 JAWS 开始。
此外,由于这是一个循环动画而不是单个微动画,我建议将其包装在一个
prefers-reduced-motion
功能查询 中,以便为不想使用动画的用户禁用动画。看起来很有趣:—)
受 CSS Tricks 上此处发现的渐变文本颜色的启发,我隐藏了点(使其透明),然后添加了一个伪类,其内容为“.”。无需额外的字符,也无需 ARIA 属性。如果选择文本,您将在跳动点后面看到原始点。
<p class="text">P<span>i</span>ng</p>
span {
display: inline-block;
background: linear-gradient(rgba(0, 0, 0, 0) 30%, #ff8a00 30%);
background-clip: border-box;
-webkit-background-clip: text;
-webkit-text-fill-color: rgba(0, 0, 0, 0);
position: relative;
}
span::before {
content: ".";
-webkit-background-clip: none;
-webkit-text-fill-color: gba(0, 0, 0, 0);
-webkit-background-clip: text;
-webkit-text-fill-color: #ff8a00;
position: absolute;
top: -44%;
left: 7%;
z-index: 10;
}
此处使用了一些用于定位和渐变颜色停止的魔法数字。它们取决于字体系列、大小以及其他一些属性,因此请注意。这只是一个概念证明。
使用伪元素创建点不是更容易吗?
我认为这将提供一个更简单的参考点来定位它
例如 https://codepen.io/schoenwaldnils/pen/jOOppxa
仅供参考:i(和 j)上的点称为顶点。
为什么 HTML 中的注释会删除空格?