当被问及用于构建 CSS 动画的新工具(例如 Edge)时,我最近说:
在 CSS 动画出现之前,用于样式的空 div 是非语义的,是一个坏主意,现在仍然是一个坏主意。
我坚持这一点。 我觉得我们作为行业已经走得很远,让每个人都接受了语义标记。 做到这一点,您将收获速度、可访问性、可维护性和 SEO 等方面的巨大回报。
然后,一种新的闪亮事物出现了,我们所做的第一件事就是开始放弃我们自己的规则。 “哦,我可以让一只鸟飞过屏幕‽” 给我再订几块空 div! 我当然对此有罪。 当您这样做时,它感觉不像是一件大事,尤其是在适度的情况下。
但是 CSS 动画将继续存在。 关于我们应该使用它们做什么类型的事情、太多是多少、如何以语义的方式处理它们、如何提供备用内容等方面,将出现一般的最佳实践。 我想我会分享一个我想到的小想法。
让我们考虑一下动画对设计的贡献。 它们可以赋予它情绪。 它们可以赋予它态度。 与设计的其他方面一样,它们会影响用户对该页面的感受。 但它们只对有视力的人做这些事情。 空 div 对无视力用户没有任何作用。 它只是一堆无用的东西。
<div class="moon">
<!-- I offer nothing to non-sighted users -->
</div>
如果我们将这个空 div 替换掉,尝试为无视力用户实现我们为有视力用户实现的相同效果,会怎样? 只需将描述性文本放入这些 div 中,我们就可以做到。 类似于图像的 alt 标签,但实际的内联内容旨在以与动画被看到/享受相同的方式被读取/享受。
也许我们的动画是关于月亮升起,随着它升起,天空和地面变成黑色。 我们需要两个元素来完成我们的动画,所以它们可能包含 CCR 的 Bad Moon Rising 的歌词
<div class="moon">
I see a bad moon rising
I see trouble on the way
</div>
<div class="ground">
I see earthquakes and lightnin’
I see bad times today
</div>
CSS 将此文本隐藏起来,并调用 关键帧动画
.ground, .moon {
text-indent: -9999px;
overflow: hidden; /* text-indent without this can cause choppy animation */
}
.ground {
-webkit-animation: ground-to-black 5s ease;
-moz-animation: ground-to-black 5s ease;
-o-animation: ground-to-black 5s ease;
animation: ground-to-black 5s ease;
}
.moon {
-webkit-animation: rising-moon 5s ease;
-moz-animation: rising-moon 5s ease;
-o-animation: rising-moon 5s ease;
animation: rising-moon 5s ease;
}
/* Plus various keyframe declarations */
请注意那些关键帧动画的名称。 这是“语义动画”中需要讨论的另一个话题。 下次再说。
这段文本可以是与动画相关的任何内容。 它可以字面地描述动画。 它可以是一首能激发与动画相同情感的诗歌。 它可以是一个 <audio> 元素。
哇,别太花哨了,设计师小子。
我不使用屏幕阅读器,所以我不能决定这是否是一个好主意。 我想,已经有足够多的东西要处理了,尽管有好的意图,但这可能只是通往“真实内容”道路上的另一个障碍。
我想这就像世界上其他所有事情一样:取决于情况。
观点很好,我完全同意。
不久前,我参加了 Andy Clarke 的 Hardboiled 演讲,他谈到了同样的主题。 他建议在一个列表中(可能是有序列表)描述场景,这为无视力用户提供了完全可理解的体验。
而且感觉也很对!
给我无限的伪元素自由,或者给我死亡!
同意!
如果有人想知道 Ryan 说的什么,我认为他指的是能够使用类似
body:after(2)的东西,并将任意元素添加到页面中以进行动画,而不必担心影响语义。我梦想着伪元素无限的一天。
我梦想着只为支持伪元素的网站构建网站的一天。
我梦想着所有浏览器都支持伪元素上的过渡的一天。
我梦想着伪元素。
我多么渴望。
@Larry… 俳句和对偶的完美结合。 写得很好!
…梦想着 – 啊,这就是问题所在。
文章很好,虽然我同意你的观点,但我一直不太习惯用“text-indent”隐藏文本。 如果我的屏幕宽度为 9999 像素会怎样? 听起来很愚蠢,不太可能发生,但我从没把它视为优雅的解决方案,因为存在这种情况。 而且,它可能对 SEO 也不利。
用 JS 删除它怎么样? 盲人使用的浏览器是否启用了 JS?
是的,它绝对是 hacky,但它有效,我需要更新 9999 像素屏幕的代码的那一天将会是美好的一天。
据我所知,通常情况下,是的。
我必须同意 Chris 的观点。 在标记中添加额外的 div 不会使它在语义上出错,但它会破坏内容和设计的分离,并会鼓励杂乱的标记。
这就像在想要将 HTML 保持在它应有的位置(标记)的人和想要将其变成某种用于脚本和设计工作的数据库的人之间总是存在着战争。 HTML 的构建目的不是为了创建复杂的动画。
从我的个人观点来看,动画应该用视频或 canvas 元素完成——这就是它被创建的原因之一,我很惊讶没有人提到它。 事实上,我很惊讶 Edge 没有使用它;它会生成更简洁的 HTML,并保持标记和编程的分离。
通过
text-indent隐藏文本的更好的解决方案是使用 -9999em,因为它会随着文本和缩放进行缩放。听起来你在使用广泛接受但大多错误的 HTML 语义定义。
DIV 和 SPAN 元素没有语义值。 它们是完全中性的(除了偶尔使用 lang 属性),并且在 HTML 规范中被定义为样式和脚本挂钩。 在一个已经具有语义的文档中添加一千个 DIV 不会对文档的语义增加或减少任何东西。 使用空元素(特别是 DIV 或 SPAN)用于装饰目的不是语义错误。 限制您对这些元素的使用会使您的代码更简洁,但不会更具语义性。
话虽如此,批判我们对这些样式挂钩的使用是一个好主意。 一些与 HTML 语义相关的基本问题
– 当另一个元素更合适时,我是否在使用 DIV 或 SPAN?(但要保守。 将每个 DIV 容器序列替换为无序列表不是更好的语义,而是更嘈杂的语义。 如果我们对“列表”的定义过于宽泛,那么一切都是列表。)
– 我是否在使用带有 CSS 背景、CSS 生成的内容或脚本的空 DIV 或 SPAN 来传达意义? 我能将部分或全部意义作为文本放入 HTML 文档中吗?
我们应该避免对 HTML 语义进行教条主义或完全错误的定义。 你的文章在示例方面有很好的论点,但像“用于样式的空 div [很糟糕]”这样的笼统说法是错误的。
完全同意。 人们可能会过分宣称空 div 是“错误的”,许多人确实如此。
此外,有人亲眼目睹过或听说过神话般的盲人冲浪者吗?
我理解你的观点,但我坚持我的观点。 也许存在一个我正在打破的语义官方定义,但就像网络本身一样,定义是灵活的,可以改变以适应新的用途和含义。
无论何时何地使用空或额外的包装 div,我都称之为非语义。
嗯……我之前的评论发布到了错误的主题。 对不起。
实际上,我不确定你的示例是否好。 我对尝试用文本转录“情绪”信息的尝试持谨慎态度。 我也可以对企业标识价值观和其他设计试图传达的所有信息说同样的话。
我的意思是,如果你想在一个页面中有一个很棒的情绪动画,并将其转录成诗歌,很好。 但是大多数设计师不会费心,而能够获得文本版本的用户可能不关心甚至认为它很烦人(干扰他们实现页面目标的噪音文本,他们的目标可能是获得一些有用的信息或填写和发送表单)。 对于个人/诗歌网站来说可能很好,但对于我们所做的大部分实际工作来说毫无用处。
随机想法:如果你认为某些设计/动画部分确实是内容,也应该作为文本提供,那就加倍努力,为所有用户提供这些文本。
最后,当应用 CSS 样式时,您的文本内容将不会对用户可用,但 a) 浏览器不支持动画,或者 b) 图片由于某些原因(例如网络问题)未加载。这是使用负
text-indent技术的常见陷阱之一,它比使用display:none更好,但仍然存在可访问性问题。不幸的是,HTML 几乎没有回退机制。(alt属性是一个,但它非常有限,object元素本应提供一个,但它在 HTML4 中定义不佳,浏览器中的实现也存在缺陷;最后,HTML5 继续这种糟糕的回退机制传统,即使在预期媒体资源不可用时也不公开audio和video元素的回退内容。)我倾向于同意 fvsch 关于情绪的观点:很少有益于为屏幕阅读器“语义化”它。通常会很烦人。我认为这更多的是关于设计师的极客认同,而不是帮助用户。
……我认为你是对的:它是 *非语义* 的。但我不会称之为 *无语义* 的。我建议的定义
语义标记: 标记,它对 HTML 元素做出了良好的选择,以向文档添加(机器可读)意义
无语义标记: 标记,它对 HTML 元素做出了糟糕的选择,从而创建了一个意义较小的文档(甚至是一个误导性的文档)
非语义标记: 标记,它对文档的意义没有影响
很好的定义。我将来可能会使用它们。您对“语义标记”的定义与 HTML5 定义 一致。另外两个定义非常合乎逻辑,并做出了重要的区分。
我们在 HTML 语义讨论中遇到的问题是,每个人都认为语义 HTML 是一种好的做法,但存在一些混淆
1. 我们倾向于认为,由于语义标记是好的,那么非语义标记就一定是坏的。不完全是。无语义标记是坏的,非语义标记是中性的。(我想极端的非语义标记是混乱中立?)
2. 我们倾向于将“语义 HTML 很好”的原则应用于任何可以任意称为“语义”的东西。例如,我们有时将 HTML 类名称为“语义”,当它们描述内容时,但这只是一种命名约定,并且有一些论点认为,至少在某些情况下,描述内容的类名是一种不好的做法(参见 OOCSS 和“模块化 CSS”原则)。
非语义标记在某些地方绝对是合适的,CSS 动画就是一个很好的例子!是的,让大家团结起来在网络上使用语义花了很长时间,但这样做,我们几乎完全吓坏了人们,让他们不敢使用非语义元素。
这是一个至关重要的区别,我在我的博客上借此机会强调了这一点。我们不能抛弃非语义标记的想法;网页确实有意义,但也有美学方面的考虑。
那里有一些美丽的散文;)
关于 keyframe CSS 代码片段上面的拼写错误“keygrame”而不是“keyframe”的说明。
除非你了解我们不知道的关于 keygrame 的事情?无论如何,它们听起来很不错。
隐藏文本,包括 `text-indent:-9999px`,会损害您的搜索排名,最终 Google 会对您进行处罚。
Google 网页管理员工具帮助 - 隐藏文本和链接 http://www.google.com/support/webmasters/bin/answer.py?answer=66353
Google I/O 2009 年会议,在 0:35:46 http://www.youtube.com/watch_popup?v=-SLcruwnkLk&vq=medium#t=1851
我并不完全相信 Chris 在这里建议的内容会立即被 Google 标记为垃圾邮件。根据您引用的 Google 网页管理员链接,它说
添加粗体。在这种情况下,使空元素更语义化并不“具有欺骗性”,因此不会被处罚。
此外,关于隐藏文本以及 Google 如何看待它这个问题已经针对图像替换技术问题进行了讨论。例如,请参阅 David Shea 的这篇文章,他总结了 Google 对隐藏文本的看法
图像替换 + Google
尽管图像替换技术在今天已不再那么相关,但相同的原则适用。Shea 总结说
现在,如果 Google 的观点自那时起发生了变化,我想看看证据。否则,我认为同样的规则也适用于这里。因此,您可以将该引述改为
但再说一次,如果有其他证据表明 Chris 的技术会导致问题,那么我很乐意看到它。但我认为只要意图不是恶意的或垃圾邮件,那么使用 CSS 隐藏文本就是安全的。
这很有趣。当他们的网站上有一个 JAWS 演示,以及 Fang(一个将网页翻译成文本的 Firefox 附加组件)时,我们总是假设屏幕阅读器。当我刚读到关于屏幕阅读器的内容时,它们听起来非常机械,据称,用户习惯于非常快地听到内容。因此,我不确定他们是否真的想听到 R2D2 朗读拜伦关于甲基苯丙胺的诗歌!
我认为对于我们这些在网络上经营自己生意的用户来说,`text-indent:-9999px` 令人恐惧。
它会损害 SEO 吗?
Google 会对我们进行处罚吗?
在大多数情况下,Google 会处罚使用 CSS 隐藏文本的行为,如果隐藏的文本是关键词列表。但是,在 Google 方面,您永远不会太安全。
我最近有一个网站,它的排名从第 3 位下降到第 112 位,一夜之间一个主要的收入来源消失了。因此,如果我必须在语义和金钱之间做出选择,我每次都会选择金钱。
@nick, @Binyamin… 看到你们如此害怕 Google(经常反复无常的)系统,实际上认为文本替换的图像是一种可接受的做法,并且实际上得到了 Google 的认可,我按照“Binyamin”上面提供的链接进行了操作。
坦率地说,我并没有看到 Google 的立场中任何暗示他们会因为使用图像替换而对网站进行处罚 - 只要没有链接或意图为了 SEO 目的而隐藏关键词。事实上,恰恰相反。Google 的措辞在我看来似乎是提供“额外分数”以改善可访问性体验。
此外,我并没有看到任何地方 Google 会为使用隐藏文本而“扣分”。他们威胁的是“从排名中删除”!从第 3 位下降到第 112 位会让我考虑“某人”已经发现了我的收入来源,现在正在使用他们能使用的一切技巧来夺走它。这就是我会去寻求答案的地方,而不是仅仅归咎于 Google 的图像替换策略。(当然,这仍然不意味着 Google 的算法,它将搅乱的、死脑筋的博客内容放在完整权威内容页面的 12 个结果页之前,不会糟透了!)
我看到 Google 提供了一个“反驳”,如果你真的觉得你的网站仅仅因为图像替换而被不公平地针对:提交您的网站以供重新考虑。
我只是想表达我对“嘿,别在那里瞎搞,花哨的设计师小子”观点的支持,尽管我也不是屏幕阅读器用户。似乎一个好的测试是,是否需要替代内容,就是确定动画是否试图传达任何信息,或者它是否仅仅是作为装饰。
例如
– 动画条形图或折线图以说明数据随时间的变化:对替代文本内容的支持。
– 动画一只鸟飞过屏幕,仅仅因为你做得到:对替代文本内容不支持。
作为一名有视力的人,我能理解想传达设计的氛围。但我认为目前没有人用非动画设计元素来做到这一点,而且我听到的所有建议都认为不要这样做。如果你有一张鸟飞过天空的静态图像,alt 文本不应该为“一张鸟飞过天空的图片”。alt 文本应该是空字符串:“”。
以下是使这(或其他任何事情)对可访问性不好的原因
text-indent: -9999px;
砰!就在那里,你正在破坏那些有部分视力障碍并且使用屏幕阅读器的人的体验。
DK
我非常喜欢重新设计。干得好,伙计们!
语义化的概念并不意味着提供内容。语义在技术上和字面上都意味着“强调”,因为它来自希腊语“sēmantikos”,意思是“重要的”。现在,当我们在网站的标题中使用标题标签时,这与“标题”一词的含义无关。相反,我们强调这是我们网站的标题。
我认为,Chris,您在这篇文章中描述的内容的更好名称应该是可访问动画,而不是语义动画。在您的动画中,您并没有通过向空 div 提供内容来强调任何内容。您只是为有视觉障碍的人提供了一些东西。
所有这些都是理论。它就像 ARIA 兼容性。
在哪里可以找到工具来真正用不同的残疾集测试网页?我相信只使用音频或盲文浏览网站会提供更好的反馈。就像我们测试 IEx 网站一样,在我们的工具箱中拥有这些东西会很不错。
如果内容有意义,它不应该放在空 div 中,而应该放在带有 alt 属性的 img 标签中。img 标签告诉“嘿,这是一个对我的内容有意义的插图”。
如果内容毫无意义(因此可以放在空 div 中),则不应将其提供给屏幕阅读器。
语义学是关于意义的,而不是在页面上伪造每个细节。
少即是多 ;)
在我看来,CSS 动画是房间里的大象。
动画对我来说并不等同于演示,而且我几乎相信 CSS 动画是一种时尚。就像不久前充斥网络的每一个动画 GIF 一样。
这也并不现实。根据你的标准,你应该描述页面上的每一个事件和效果(悬停、聚焦、颜色变化等等),而不仅仅是 CSS“特殊效果”。而且这很快就会变得非常混乱。
我只能想象过了一段时间后它会变得多么令人讨厌,以及它有多么完全无用。无论如何,根据我迄今为止的经验(HI),这就是想法:少即是多。
我不会说 CSS3 动画是一种时尚。现在有许多常用的 JS/Flash 动画可以用 CSS3 动画来代替。在低端计算机和手机浏览器中,CSS3 动画也比 JS/Flash 动画提供更好的性能。
我认为 CSS3 动画将成为简单动画的标准。
我理解一些新的 CSS 实现(例如动画)的方式是,它们是吸引注意力的方式。
我说的并不一定是用户关注,而是开发人员关注,竞争规格和竞争的浏览器制造商也会寻求关注。
我之所以这么说,是因为规格创建者只想把闪亮的东西扔给制造商和开发人员以获得更多关注。
因为浏览器制造商会接受这些规范,并放弃*正确地*实现一些基本且重要的 CSS 内容,而转而支持最新的 CSS 时尚,以避免失去用户(甚至获得更多用户)。
我真的很想先有一个可靠的 CSS 基础,并得到正确的实现。我想能够享受我的布局,而不是担心它。我想对使用相对尺寸充满信心。
还有其他一些我想修复的问题,在一个 UA 或另一个 UA 中,因为没有一个是完美的。
在这些修复之后,是的,CSS 动画可以作为*实验*接受。但在此之前不行。我仍然相信 CSS 动画并不是真正的演示。
除了某些修饰(滑动、鼠标悬停、视差)之外,CSS 动画现在很笨拙。没有像 Flash 那样的高级 IDE 工具可以流畅地完成它。而且动画在不同的浏览器中经常是断断续续且不可预测的。我的意思是,一些动画比从 A 点到 B 点的直线移动更复杂。
我只想指出我对这篇文章以及这里对它的评论感到多么高兴。这就是网络社区的意义所在,大家聚在一起讨论或争论做事的最佳方式,以及分享资源和技巧。我认为我学到了很多东西,很棒的内容!