使用CSS内容添加HTML实体


1013

如何使用CSS content属性添加HTML实体?

使用这样的东西只会打印 到屏幕上,而不是不间断的空间:

.breadcrumbs a:before {
    content: ' ';
}

5
换句话说,使用CSS添加内容违反了关注点分离,CSS仅用于样式定义。从可访问性的角度来看,最好避免这样做,因为禁用CSS会破坏整个标记。但是,使用此技术添加图像非常好。
提问

95
这取决于。在这种情况下,仅用于演示目的。它会“违反” SoC,在HTML中添加“>”
mathieu's

2
只是一个问题,您认为作为一个有序列表会更好吗?我的意思是,这是带有订单的列表,不是吗?
alex

3
@questzen-我认为使用CSS :after设置排序列上的asc / desc排序指示符是完全可以接受的(也是一种很好的形式)。
Josh M.

9
我注意到人们已经对SoC原理感到疯狂。天哪,“>”符号对您来说是什么样的内容?怜悯!在这种情况下,它只是一个图标,一个小部件,一个项目符号,请给它命名。对我来说,内容是我希望可以被搜索到的东西。
user776686 2014年

Answers:


1063

您必须使用转义的unicode:

喜欢

.breadcrumbs a:before {
    content: '\0000a0';
}

有关更多信息:http : //www.evotech.net/blog/2007/04/named-html-entities-in-numeric-order/


57
前导零是多余的,请参阅CSS 2.1:4.3.7 Strings'>\a0'足够了。
PointedEars 2011年

18
@dlamblin此外,为了避免字符被解释为转义序列的一部分可靠地,加入标准空白:'>\a0 bc'显示> bc
PointedEars 2011年

18
我的工具amp-what.com/#q=%3E提供了“ CSS”模式。选择页面底部的“ css”。根据上面的CSS引用,如果这些内容不明确,则需要使用空格分隔。
ndp

@mathieu您可以使用“内容”代替图像吗?只是想知道
weia设计

1
@Adam,不,如果要附加图像,请使用“ background-image”并显示:inline-block; 和宽度:123px;高度:123px; (使用确切的宽度/高度)
Nathan JB 2013年

177

CSS不是HTML。  是HTML中的命名字符引用;等效于十进制数字字符引用 。160是十进制码点的的NO-BREAK SPACE在字符的Unicode(或UCS-2 ;见HTML 4.01规范)。该代码点的十六进制表示形式是U + 00A0(160 = 10×16 1 + 0×16 0)。您将在Unicode 代码表字符数据库中找到该代码

在CSS中,您需要为此类字符使用Unicode转义序列,该序列基于字符代码点的十六进制值。所以你需要写

.breadcrumbs a:before {
  content: '\a0';
}

只要转义序列最后出现在字符串值中,此方法就起作用。如果跟随字符,有两种方法可以避免误解:

a)(由其他人提到)对于转义序列,请完全使用六个十六进制数字:

.breadcrumbs a:before {
  content: '\0000a0foo';
}

b)在转义序列后添加一个空格(例如空格)字符:

.breadcrumbs a:before {
  content: '\a0 foo';
}

(因为f是十六进制数字,\a0f否则GURMUKHI LETTER EE在这里表示含义,如果具有合适的字体,则表示ਏ。)

分隔的空格将被忽略,并将显示 foo,此处显示的空格将是一个NO-BREAK SPACE字符。

'\a0 foo'与六位数方法('\0000a0foo')相比,空白方法()具有以下优点:

  • 它是更容易输入,因为前导零是没有必要的,而且并不需要数字来计算;
  • 它是更容易阅读,因为转义序列与下面的文本之间的空白,并且不需要数字来计算;
  • 需要较少的空间,因为不需要前导零;
  • 它是向上兼容的,因为将来Unicode支持的代码点超出U + 10FFFF时,将需要修改CSS规范。

因此,要在转义字符后显示一个空格,请在样式表中使用两个空格–

.breadcrumbs a:before {
  content: '\a0  foo';
}

–或明确:

.breadcrumbs a:before {
  content: '\a0\20 foo';
}

有关详细信息请参见CSS 2.1的“ 4.1.3字符和大小写”部分


+1表示“在逃脱的角色后显示一个空格”技巧,但必须提及的是,先添加nbsp然后再添加某种空格会破坏nbsp的目的;)
TWiStErRob

@TWiStErRob否,不间断空格字符与后接空格字符的组合(反之亦然)将在两个空格字符的宽度之间显示一个空格,而两个或多个逐字空格字符将仅显示一个空格除非CSS属性另行声明,否则作为布局引擎的解析器的一个空格字符的宽度会将连续的中断空格(包括换行符)折叠为一个空格字符。white-space
PointedEars

是的,我知道崩溃了,但是nbsp的意义在于它是不间断的,默认情况下单词chars也没有间断,因此在不间断的字符旁边添加一个间断的空间是没有意义的,最终结果将是打破。我在争取white-space: normal
TWiStErRob

@TWiStErRob请更仔细地阅读我的答案。这是“在转义字符后显示空格” 的示例。原始代码有一个NO-BREAK SPACE字符,因此我使用了转义序列。您可以选择任何其他转义序列;如果需要,您也可以声明white-space: nowrap
PointedEars

81

更新:PointedEars提到 在所有css情况下正确的替代立场将
'\a0 '意味着该空间是十六进制字符串的终止符,并被转义序列吸收。他进一步指出了这一权威性的描述,这似乎是我在下面描述并解决的问题的一个很好的解决方案。

您需要做的是使用转义的unicode。尽管您被告知\00a0并不是 CSS 的完美替代品;所以尝试:

content:'>\a0 ';          /* or */
content:'>\0000a0';       /* because you'll find: */
content:'No\a0 Break';    /* and */
content:'No\0000a0Break'; /* becomes No Break as opposed to below */

具体\0000a0用作 。如果尝试,如mathieu和millikin所建议:

content:'No\00a0Break'   /* becomes No਋reak */

它会将B变成十六进制的转义字符。0-9a-fA-F也会发生同样的情况。


6
您只需要在转义序列后放置一个空格,如下所示:'\a0 Break''\0000a0Break'可靠的。
PointedEars 2011年

@PointedEars有趣,那么这个空间是一个终止符,并且没有包含在字符串中吗?
dlamblin 2012年

2
参见CSS 2.1,“ 4.1.3字符和大小写”部分。这也表明,根据CSS 2.1,您的方法应该可靠。但是我发现空白方法更清洁(向上兼容)并且占用空间更小。
PointedEars 2012年

47

在CSS中,您需要使用Unicode转义序列代替HTML实体。这基于字符的十六进制值。

我发现将符号转换为等效的十六进制的最简单方法是,例如从▾(▾\25BE到使用Microsoft计算器=)

是。启用程序员模式,打开十进制系统,输入9662,然后切换到十六进制,您将得到25BE。然后只需\在开头添加反斜杠即可。


4
虽然完全有用,但它并不能真正回答问题,因此最好将其作为对该问题的评论。
dlamblin 2012年

1
黑色右小箭头(▸ \25B8 ▸ ▸)ftw。另外,请参阅en.wikipedia.org/wiki/Geometric_Shapes了解更多信息。
Joel Purra '04

2Joel Purra,更多时间阅读Wiki。您误解了符号。
netgoblin 2012年

@netgoblin:怎么样?我只是碰巧喜欢黑色的向右小箭头。
乔尔·普拉

1
我使用这个graphemica.com来获取十进制,十六进制等等
Mike

34

将十六进制代码用于不间断的空格。像这样:

.breadcrumbs a:before {
    content: '>\00a0';
}

17

有一种方法可以粘贴nbsp打开的CharMap并复制字符160。但是,在这种情况下,我可能会用填充将其隔开,如下所示:

.breadcrumbs a:before { content: '>'; padding-right: .5em; }

不过,您可能需要设置面包屑display:inline-block或其他内容。


4
我不会粘贴nbsp,而是坚持使用实体,以便将来的维护者可以清楚地知道它与空间不同。
尼克

2
另一方面,您不应该执行面包屑,即:>符号应与面包屑内联,而不仅仅是视觉样式。至少如果您想让Google查看您的面包屑并在搜索引擎中的列表中列出它们。
Dementic


0

我知道这是一篇很老的文章,但是如果您要花很多时间,为什么不简单:

.breadcrumbs a::before {
    content: '>';
    margin-left: 8px;
    margin-right: 8px;
}

我以前用过这种方法。在我的测试中,它的旁边用“>”包裹到其他行上。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.