如何使用跨浏览器的CSS内容将HTML文本替换为图像

How to replace HTML text with images using CSS content cross browser

提问人:Pekka 提问时间:1/17/2014 最后编辑:Mr. AlienPekka 更新时间:1/18/2014 访问量:3089

问:

所以我有一个由我的CMS生成的导航菜单:

enter image description here

菜单的 HTML 很简单(为清晰起见进行了编辑):

 <ul>
     <li><a href="...">Journal</a></li>
     <li><a href="...">Art</a></li>
     <li><a href="...">Work</a></li>
   </ul>

我希望这些项目显示为手写文本,与网站的总体主题保持一致,为每个菜单项使用单独的 PNG 文件。

为此,我使用了 CSS 属性,如下所示:content

#headerNav .nav li a[href="/_site/en/journal/"]  
 { content: url(/path/to/image.png); }

效果很好!每个项目的 HTML 文本都替换为正确的图像:

enter image description here

然而,唉,后来我了解到并不是每个浏览器都支持除 和 之外的选择器上的属性!Chrome 和 Safari 可以做到这一点,但 Firefox 可以。但是,当我使用 时,HTML 节点不会被替换,但图像会被添加:content:before:after:before

enter image description here

如何解决此问题?

什么不起作用:

  • 制作元素也删除了零件。<a>display: none:before
  • 制作元素并将其移动到其他地方也行不通。<a>position: absolute
  • 使元素搞砸了布局,因为通过添加的图像不在文档流中。<a>width: 0pxcontent

我不想做什么:

  • 当然,我可以手动输出图像,但我想使用 CMS 给我的 HTML,其中包含文本。<li>

  • 任何涉及的解决方案都要求我在样式表中指定每个项目的宽度和高度,出于这个问题的目的,我想避免这样做。background-image

  • 将手写内容转换为字体不是一种选择。

  • 使用 JavaScript 即时替换项目不是一种选择。这需要使用纯 HTML 和 CSS 工作。

HTML CSS 内容

评论

1赞 Blazemonger 1/17/2014
CSS 图像替换是一种有据可查的技术
0赞 mplungjan 1/17/2014
@Blazemonger没有一个例子都是绿色的
0赞 Pekka 1/17/2014
@Blazemonger使用它们中的任何一个,我必须在样式表中手动为每个项目指定宽度和高度,我想避免这种情况 - 这就是我首先使用的原因。(不过,这是一个公平的妥协,如果没有其他事情发生,感谢您的提醒。content
0赞 Blazemonger 1/17/2014
@mplungjan 该页面也有好几年了。当时还没有现代浏览器。这里的最后一个示例在 2012 年 12 月之前一直用于 HTML5Boilerplate。
0赞 Blazemonger 1/17/2014
我认为没有任何方法可以在不指定尺寸的情况下进行CSS图像替换,除了可能使用或。:before:after

答:

2赞 Mr. Alien 1/17/2014 #1

在 OP 添加该行之前,答案已得到回答

任何涉及的解决方案都需要我指定 每个项目在样式表中,我想 为了这个问题的目的,避免。background-imagewidthheight

因此,如果任何对解决方案感兴趣的人可以参考这个,否则可以简单地跳过。background-image


我不确定我建议的最佳解决方案如何,但可以肯定的是,您可以使用伪元素来使用每个元素,并将字体设置为透明,或者使用带有background-imageanth-colortext-indentoverflow: hidden;

所以它会是这样的

nav ul li {
   display: inline-block;
}

nav ul li:nth-of-type(1) a {
   background-image: url(#);
   display: block;
   width: /* Whatever */ ;
   color: transparent;
   text-indent: -9999px; /* Optional */
   overflow: hidden;
   font-size: 0; /* Optional, some people are really sarcastic for this */

   /* Below properties will be applicable if you are going for sprite methods */
   background-position: /* Depends */ ;
   background-size: /* If required */ ;
}

我建议你的原因是:-

优势:

  • 跨浏览器兼容
  • 你能不能用精灵方法来减少每个选项卡的 http 请求图像请求
  • 此外,您不会丢失标签之间的文本,就屏幕阅读器而言,这非常好。a

弊:

  • 为每个设置自定义width

注意:如果你要使用精灵解决方案,那么无论如何都必须使用属性,所以在选择精灵方法之前,请务必先查看支持表。background-position

enter image description here

积分 - 用于支持表

评论

0赞 Pekka 1/17/2014
我进行了编辑,更清楚地说明了为什么我想避免这种情况。不过,如果没有其他方法,这是一个公平的出路。
0赞 Pekka 1/17/2014
公平点,我没有想过喷洒。除非第二天出现其他任何事情,否则我会接受这一点。
0赞 Mr. Alien 1/17/2014
@Pekka웃 当然,慢慢来,但你在这里尝试的是,我觉得有点俗气,坚持标准方法...... :)
1赞 Pekka 1/17/2014
我认为该方法对于这种特定类型的问题非常好 - 如果所有浏览器都支持它......
1赞 DaniP 1/18/2014
如果需要并且可以管理精灵图像,我也会选择这个解决方案
0赞 RobertO 1/17/2014 #2

我会将PNG图像放入标签中,然后设置属性。imgalt

<ul>
<li><a href="..." title="Journal"><img src="journal.png" alt="Journal"/></a></li>
<li><a href="..." title="Art"><img src="art.png" alt="Art"/></a></li>
<li><a href="..." title="Work"><img src="work.png" alt="Work"/></a></li>
</ul>
5赞 DaniP 1/18/2014 #3

由于您正在导航栏中执行此操作,因此您应该有一个固定的方法来使下一个方法可能工作:height

  • 首先在元素上插入图像,并使其推送下面标签的实际文本。content:beforedisplay:blocka

    li a:before {
       content:url(http://design.jchar.com/font/h_1.gif);
       display:block;
    }
    
  • 然后用固定的标签隐藏该文本:heighta

    li a{
       height:50px;
       overflow:hidden;
    }
    

工作演示