向伪元素添加图标

Posted

技术标签:

【中文标题】向伪元素添加图标【英文标题】:Adding icons to pseudo elements 【发布时间】:2017-11-29 00:02:40 【问题描述】:

我正在尝试通过 javascript 将图标添加到我的导航(动态更改)。

这是我的代码(或JSFiddle):

var icon = document.querySelector('#icon');
icon.setAttribute('data-icon', '†');
#icon:after 
  content: attr(data-icon);
<div id="icon" data-icon="">
  Icon
</div>

但它不起作用,为什么?尝试手动编辑data-icon 属性时,会出现图标。否则只是图标的unicode。

【问题讨论】:

Insert Unicode character into JavaScript的可能重复 【参考方案1】:

html 实体在 CSS 中没有任何意义。如果您想遵循该路径,则需要先对其进行解码:

var icon = document.querySelector('#icon');
var tmp = document.createElement("span");
tmp.innerHTML = '&#x86;';
icon.setAttribute('data-icon', tmp.innerText);
#icon:after 
  content: attr(data-icon);
<div id="icon" data-icon="">
  Icon
</div>

... 或者,只需按原样键入字符(只要您的应用程序是用 UTF-8 编写的):

var icon = document.querySelector('#icon');
icon.setAttribute('data-icon', '†');
#icon:after 
  content: attr(data-icon);
<div id="icon" data-icon="">
  Icon
</div>

最后但同样重要的是,CSS 也接受转义序列,但您需要使用 appropriate syntax。但是,这种方法似乎不适用于您的特定角色:

var icon = document.querySelector('#icon');
// Brackets added for visibility, not part of the syntax
icon.setAttribute('data-icon', '(\u0086)(\u2020)');
#icon:after 
  content: attr(data-icon);
<div id="icon" data-icon="">
  Icon
</div>

我认为这与 U+2020 'DAGGER'(工作正常)是 regular character 但您使用的 U+0086 'START OF SELECTED AREA'(未显示)是 control character 这一事实有关。正如您在后续评论中提到的那样,您正在使用 FontAwesome 并且此类库提供了将某些代码点映射到显示图标的自定义字体(尽管它们通常使用 private areas 来避免冲突)。

【讨论】:

感谢阿尔瓦罗!这解决了这个问题。您的答案中最喜欢的部分是答案本身将实体转换为 unicode。仅供参考:它来自 FontAwesome。 @venkatraj 我最终弄明白了为什么我对U+0086 有问题。我已经更新了我的答案。【参考方案2】:

编码雷区

更多详情请见this *** answer。

答案已更新(请参阅 cmets 和 edits)。

简而言之,我建议使用字符而不是任何编码方法。在这种情况下,您的 HTML 文件正确编码并正确告知浏览器编码是什么是至关重要的。

var js = document.querySelectorAll( ".js" );
js[ 0 ].setAttribute( "data-icon", "\u0086" );
js[ 1 ].setAttribute( "data-icon", "†" );
.css:after 
    content: "\86";
    color: red;

.css.char:after 
    content: "†";
    color: blue;

.data:after 
    content: attr( data-icon );

.js:after 
    content: attr( data-icon );

.red:after 
    color: red;

.blue:after 
    color: blue;
<div class="css">hard coded css content</div>
<div class="css char">hard coded css content char</div>
<br>
<div class="data red" data-icon="&#x086;">hard coded data-icon</div>
<div class="data blue" data-icon="†">hard coded data-icon char</div>
<br>
<div class="js red">data-icon by js</div>
<div class="js blue">data-icon by js char</div>

【讨论】:

这应该解释一下:Insert Unicode character into JavaScript 我运行了sn-p代码,但是文本“Icon”之后没有显示图标,它只是空白。这是预期的行为吗? @shaochuancs - 在哪个浏览器中看不到图标?我用的是谷歌的 Chrome,一切都很好。 @FredGandt 我在 Mac 上使用 Chrome 版本 59.0.3071.109 也在 Firefox、Safari 和 Opera 上测试过,没有运气:( 看起来更像是 Mac 问题...【参考方案3】:

这显然是因为setAttribute 正在转义你的特殊字符......无论如何你需要使用 CSS 编码的图标而不是 HTML 实体。使用this convertor:

&amp;#x086;\0086

我建议使用有意义的名称,而不是将图标的代码硬编码到属性中。

例如:

var icon = document.querySelector('#icon');
icon.setAttribute('data-icon', 'icon-heart');

[data-icon=icon-heart]
    content:'\2764';

(最好你的所有图标元素都有一个共享属性的共享类)

【讨论】:

感谢转换器链接。

以上是关于向伪元素添加图标的主要内容,如果未能解决你的问题,请参考以下文章

伪元素和伪类

Vue.js v-bind:style 伪元素 :: 在内容图标之后

如何在带有ruby on rails的伪元素中显示来自svg sprite的图标

用于在另一个元素内插入图标的伪元素选择器

伪元素::before与::after的用法

边框只占用元素而不是伪元素