CSS 图片替换是一种用图像替换文本元素(通常是标题标签)的技术。例如,在页面上包含一个徽标。您可能希望为此使用<h1>
标签和文本以获得可访问性和 SEO 优势,但理想情况下,您希望显示徽标,而不是文本。
请注意,其中一些技术非常古老。2000年代初的网页设计与现在大不相同,但人们仍然非常重视可访问性。因此,这些技术中的大多数在今天仍然适用。看看人们对这个问题的思考和解决方法仍然非常有趣。另请注意,我测试了所有这些 FF2、Opera 9、Safari 3 和 IE 6,并且它们的行为完全相同(难以置信,我知道)。
成绩单包含五个主要类别
- CSS 开启 / 图片 开启
表示浏览器处于正常状态。所有技术都应该通过此测试,因为这是整个要点。 - CSS 开启 / 图片 关闭
表示使用常规样式表但图片关闭进行浏览。这种情况很少见,但有可能(带宽有限的用户……)这是最困难的测试。由于这些技术中的大多数都尽最大努力隐藏文本,当图片关闭时,这意味着什么也没有显示,这不好。在此仅显示文本被视为通过。 - CSS 关闭 / 图片 开启
表示不应用任何样式表进行浏览。大多数技术在此默认使用常规网页文本,这并不完全是失败,但由于图片可能仍然开启,因此我也不认为它通过。 - CSS 关闭 / 图片 关闭
表示图片关闭且不应用任何样式表进行浏览。在此默认使用文本被视为通过。 - 额外的无用标记
为了图片替换而添加标记并非理想之选。无法真正实现内容和设计的分离。
技巧 #1
<h1 id="technique-one">
<span>CSS-Tricks</span>
</h1>
h1#technique-one {
width: 250px;
height: 25px;
background-image: url(logo.gif);
}
h1#technique-one span {
display: none;
}
更多信息:此技术称为 FIR 或“Fahrner 图片替换”。关于此有很多文章,包括一篇关于其可访问性问题的 A List Apart 文章,以及 David Shea 的一篇文章 为其辩护。这里的前提是使用 span 来包装标题内的文本,并使用该 span 来隐藏文本。它有效,但使用 display: none 将隐藏屏幕阅读器(以及大概的搜索引擎,不好)中的文本。
技巧 #2
<h1 class="technique-two">
CSS-Tricks
</h1>
h1.technique-two {
width: 2350px; height: 75px;
background: url("images/header-image.jpg") top right;
margin: 0 0 0 -2000px;
}
更多信息:Radu Darvas 拥有此技术的功劳。基本上,此技术创建一个巨大的盒子,该盒子向左延伸到屏幕外。文本由于左对齐,因此无法看到。图像放置在此框的左上角。它有效,但它存在 CSS 开启 / 图片关闭时失败的常见问题。我还可以看到,除了总体上效率低于其他一些技术之外,此巨大的盒子在更复杂的布局中也可能存在问题。
技巧 #3
<h1 class="technique-three">
CSS-Tricks
</h1>
h1.technique-three {
width: 350px;
height: 75px;
background: url("images/header-image.jpg");
text-indent: -9999px;
}
更多信息:此技术归功于 Mike Rundle,并称为 Phark 方法。这可能是今天使用最广泛的技术。在撰写本文时,它肯定是我最常用的技术。甚至还有一件 T恤 基于此(从底部向上数第二个)。其前提非常简单:用背景图片替换块,用缩进将文本踢出页面。它有效并且让屏幕阅读器保持快乐。它仅在难以捉摸的 CSS 开启 / 图片关闭问题中失败。此技术的变体是使用 负字母间距代替,据称可以解决在某些浏览器中触发巨大不需要的滚动条的问题。
技巧 #4
<h1 class="technique-four">
<a href="#">
<img src="images/header-image.jpg" alt="CSS-Tricks" />
</a>
</h1>
h1.technique-four {
width: 350px; height: 75px;
background: url("images/header-image.jpg");
text-indent: -9999px;
}
更多信息:我不确定此技术的起源,但它基本上是 Phark 技术的扩展。您不是将文本从屏幕上弹出,而是将图像从屏幕上弹出。这具有明显的优势,即在 CSS 关闭且图片开启时仍显示图像,并且还具有 508 合规性 的 ALT 文本。此技术在 CSS 开启 / 图片关闭时仍然失败。我感谢 Volkan Görgülü 指出这是 Smashing Magazine 在其标题中使用的技术。对这种技术的一个担忧是它是否有效 SEO,具体来说,ALT 文本是否与常规网页文本一样好。此技术的扩展是在锚链接内也包含常规网页文本。文本和图像都将使用文本缩进从页面上弹出,并且它将缓解 SEO 问题,但随后您将在图片关闭和 CSS 关闭时获得“双文本”。
技巧 #5
<h1 class="technique-five">
<img src="images/blank.gif" alt="CSS-Tricks" />
<span>CSS-Tricks</span>
</h1>
h1.technique-five {
width: 350px; height: 75px;
background: url("images/header-image.jpg");
}
h1.technique-five span {
display: none;
}
更多信息:Radu Darvas 也拥有此技术的功劳。通过将单像素透明 GIF 图像包含到标记中,您可以恢复图片关闭时的 ALT 文本。这允许在 CSS 开启 / 图片关闭时显示文本(!)。非常有效,但添加 shim GIF 对语义来说打击很大。此外,在 CSS 和图片都关闭时,您会得到“双文本”,这意味着 ALT 文本和常规标题文本。
技巧 #6
<h1 class="technique-six">
CSS-Tricks
</h1>
h1.technique-six {
width: 350px;
padding: 75px 0 0 0;
height: 0;
background: url("images/header-image.jpg") no-repeat;
overflow: hidden;
}
更多信息:此技术归功于 Seamus Leahy 和 Stuart Langridge 同时发现。此技术创建一个框,该框将呈现具有仅由顶部填充生成的的高度。通过将 overflow 设置为 hidden,文本将自动隐藏,但框将正确调整为背景图像的大小。这对于可访问性友好且相当有效,但在 CSS 关闭 / 图片开启测试中失败,并且需要针对旧版 IE 进行盒模型 hack。
技巧 #7
<h1 class="technique-seven">
<span>CSS-Tricks</span>
</h1>
h1.technique-seven {
width: 350px; height: 75px;
background: url("images/header-image.jpg") no-repeat;
}
h1.technique-seven span {
display: block;
width: 0;
height: 0;
overflow: hidden;
}
更多信息:归功于 Leon Dwyer。此技术能够通过将文本放入宽度为 0px、高度为 0px 且溢出隐藏的框中来隐藏文本。因为它不使用 display 属性来隐藏文本,所以它对屏幕阅读器是安全的。
技巧 #8
<h1 class="technique-eight">
<span></span>CSS-Tricks
</h1>
h1.technique-eight {
width: 350px; height: 75px;
position: relative;
}
h1.technique-eight span {
background: url("images/header-image.jpg");
position: absolute;
width: 100%;
height: 100%;
}
更多信息: 此技巧归功于Levin Alexander。在此技巧中,背景图像并非将文本推离页面或以其他方式隐藏文本,而是**覆盖**在文本之上。除了第 5 种技巧之外,这是唯一一种通过 CSS 开启 / 图片关闭测试的技巧。此技巧的一个问题是,如果您的背景图像使用了透明度,则文本会透出来。此外,虽然在该技巧的原始撰写中未包含,但我建议隐藏溢出内容,以便如果文本大小被放大到超出框的大小,它就不会显示。
技巧 #9
<h1 class="technique-nine">
CSS-Tricks
</h1>
h1.technique-nine {
width: 350px; height: 75px;
background: url("images/header-image.jpg") no-repeat;
font-size: 1px;
color: white;
}
更多信息: 此技巧归功于Russ Weakley。使用此技巧,只需将文本设置为超小的 1px 大小并将其颜色与图像的背景颜色匹配,您甚至不需要隐藏它。虽然此技巧在可访问性方面很有意义,但它也存在自身的问题。与大多数其他技巧一样,它不适用于 CSS 开启 / 图片关闭。即使在 1px 大小下,文本仍然可见,因此此技巧仅适用于纯色背景,在这种背景下它可以完美地融合。我也有怀疑,这样做可能会对 SEO 造成一些不利影响,这既是因为字体大小非常小,也是因为背景颜色和颜色匹配。
更多信息…
- 像往常一样,还有一个javascript 解决方案。
- 有一种使用内联块而不是块来实现此目的的技术。
- 如果您使用此技术的唯一原因是更改字体,那么最好使用 @font-face。
- Google 网站管理员工具有一篇关于此的文章,其中没有特别介绍图像替换,但从字里行间可以看出,合理使用此技巧不会有任何负面影响。
还有另一种 IR 技术,比这些更好,因为它最易访问(恕我直言):http://wellstyled.com/css-replace-text-by-image.html
@Mac:那是上面第 8 种技巧。我同意这是一种非常好的技巧,但它需要额外的标记,并且在透明图像方面存在问题。
额外的标记能否用
:before
伪元素替换?类似这样:http://jsfiddle.net/xaliber/2QcuD/不错的报告!只有一点:当您打印文档时,所有这些技巧都不会呈现任何内容……
我认为将图像插入应保持可访问性的文档的最佳方法是使用元素,CSS 背景仅用于装饰性内容。
我仍然倾向于选择 JS 路线(并使用 CSS 备份)。
最终,大多数人需要的是文字而不是图像(除非我们处理的是摄影,这种情况不适用)。
很棒的总结和示例!
我将此技巧用于我的徽标
HTML
CSS
它通过了所有测试 :)
优秀的帖子。我最近一直在深入研究图像替换。Dave Shea 在Mezzoblue上有一篇内容详尽的文章,值得一看。
糟糕!我看到帖子中有这个链接。Chris,这仍然是一个优秀的帖子。涵盖了所有方面。
非常棒的技巧。喜欢这个网站!
我喜欢 #8,然后可能是 #3。另一种略有不同的方法是 sIFR 的想法,除了swf 文件的额外膨胀之外,它都很好……
怎么样
<h1><img src=”image_print.png” alt=”Image”></h1>
h1 {
background:url(image_screen.jpg);
}
h1 img {
visibility: hidden;
}
我经常使用它,它对我来说效果很好…
Mike
不错的技巧汇编,谢谢。
当然,您可以使用 Alvin 描述的技巧,但如果您想将内容与表现形式分离,那么将指向图像标题的 img 标签放在那里是不正确的,因为此图像属于表现形式,而不是内容。
此外,alt 文本永远无法表示被替换的真实文本,它可能是 strong、em、span 等的组合。您无法在 alt 文本中模拟 strong 效果。
我的结论是,目前还没有终极技巧,但最好的技巧绝对是 #8,前提是您不需要透明图像……
德语读者可能想查看我 2005/2006 年的文章,其中提供了另一个关于图像替换方法的全面概述。希望您不介意此建议,Chris,它应该意味着您文章第二部分的一些参考;)
除非我遗漏了什么,否则 #4 似乎没有在 Smashing Magazine 上使用,而且我真的看不出它的好处。我的意思是,为什么要用 CSS 背景图像替换 HTML 中的图像?:?
对于 #5,添加一个没有 alt 文本的空白图像实际上并不会影响页面的语义,因为它不会被看到或听到。
#7 在 CSS 中有一个 span,但 HTML 中缺少,所以不确定它是如何工作的。
我个人使用 Gilder-Levin 方法的修改版本,但对于公司徽标之类的东西,我会将图像放在 HTML 中,因为我相信徽标实际上是图形内容。
我还没有看到任何关于搜索引擎是否会对文本给予比 alt 文本更多权重的结论性研究,但我怀疑两者之间没有太大区别。
@John:感谢您指出 #7,我已经修复了它,应该在文本周围添加了 span。我喜欢 #4 的原因是,它在 CSS 关闭时保持图像。就像我之前提到的,即使有人关闭了 CSS,也不意味着他们也想要关闭图像,而许多这些技巧恰恰做到了这一点。您替换图像的原因可能是因为它是一个不同的图像。标记中的图像可能具有白色背景,而 CSS 替换图像可能更符合网站其余部分的上下文。
Smashing Mag 使用的是 #4 的“扩展”版本,其中还包括常规的网页文本。h1 标签用单个背景图像替换所有这些标记。如果您在他们的页面上启用 CSS,您会看到徽标仍然存在,以及所有网页文本。
<h1 class="logo"><a title="Smashing Magazine Homepage" href="http://www.smashingmagazine.com/"><img src="http://www.smashingmagazine.com/wp-content/themes/SM-theme/img/logo.gif" width="229" height="83" alt="Smashing Magazine ~ we smash you with the information that will make your life easier. really." /></a><br /><a title="Smashing Magazine Homepage" href="http://www.smashingmagazine.com/">Smashing Magazine <em>we smash you with the information that will make your life easier. really.</em></a></h1>
我已经在我的网站上放了一个我使用的示例
http://www.luminancedesign.co.uk/csstricks/index.html
如果我在这里遗漏了什么,请告诉我…
Mike
@Mike:该技巧无法通过 CSS 开启 / 图片关闭测试(没有显示任何内容)。许多技巧都无法通过此测试,但这并不意味着它不适用于您的应用程序。
谢谢!非常有用
我通常使用 Phark 方法,但我加入了“overflow: hidden;”,以避免遇到滚动条问题并将包含 div 恢复到指定宽度,以便当我使用 Firefox 开发者工具栏概述块级元素时,一切看起来都很好。
嗨,Chris,
我写了几篇关于一种技术的文章,这里没有列出。它依赖于IMG元素,我相信它通过了你的成绩单的所有要点,并且还允许图像被打印。
感谢分享
@Chris
你用什么方法测试这些的?
我使用的是XP Pro SP3和Firefox 2.0.0.14,以及Web Developer 1.1.6扩展程序。
我得到了与上面发布的结果不同的结果?!
有人尝试过其他的jQuery方法吗?
我搜索并找到了这个网站:http://www.texotela.co.uk/code/jquery/jQIR/
嗨……很棒的东西。
怎么样
print("<p id="someid">普通文本<span>必须是图片的内容</span>其余文本 </p>
");
我尝试了所有技术,但没有一个奏效。
请帮忙!!!
嗨,Chris,
这是Chris。我一直在寻找图像替换技术,这篇文章非常有帮助。我之前只在一次网站上使用过图像替换,我甚至不知道我使用的是Alexander方法。
我想要一种在关闭图像时仍然显示文本的方法,这种方法对我有用,但正如你所说,对于具有透明背景的图像,无法做到这一点。
唉因为我正在进行我的网站重新设计,并且我使用了透明背景。但无论如何,感谢这篇文章。
感谢分享!!
对不同技术的精彩分解,非常详细。我确实看到文本缩进策略最常使用,但我经常想知道谷歌对此有何看法。检测滥用的可能性似乎并不困难,尤其是在H标签的情况下。
这太棒了,我将在我的网站上使用这种CSS技术。一直以来,我都遇到过图像问题……编码文本非常简单,而图像方面我总是遇到麻烦。
感谢你的提示,并且你有一个很棒的网站,继续保持!
谢谢!非常有用
对不同技术的精彩分解,非常详细。我确实看到文本缩进策略最常使用,但我经常想知道谷歌对此有何看法。检测滥用的可能性似乎并不困难,尤其是在H标签的情况下。
Chris,
感谢你撰写这篇文章以及所有视频屏幕截图。是否有让替换后的图像成为链接的方法?我想让我的页眉中的徽标链接回主页。我尝试过方法4,但无法使其工作。也许你有什么更好的方法可以建议我实现我的目标。
问题已解决。我的代码中存在错别字。
此致,
Erick
嘿,Chris,我们可以在图像替换博物馆的每个条目上添加一些ID吗?这将使在代码文档、问题等中引用特定的图像替换技术变得更容易。
再次感谢您提供此资源!
合理的要求已批准:https://css-tricks.org.cn/examples/ImageReplacement/#fahrner
Kellum有一种新的技术,它使用一个空白的透明网络字体来隐藏文本。确实非常巧妙:http://scottkellum.com/2013/10/25/the-new-kellum-method.html
为什么不这样做呢?
HTML
<h1 class="replace">CSS Tricks</h1>
CSS
h1.replace {
display: block;
background: url("images/header-image.jpg");
width: 350px; height: 75px;
padding-top: 75px;
-moz-box-sizing: border-box;
box-sizing: border-box;
overflow: hidden;
}