1

I'm using icomoon as my icon library

And I'm trying to dynamically set icons by the attribute data-icon.

But it seems the content can't be recognized as a charset using attr(data-icon).

Is there a way to make \e92c as a character rather than string literal using attr()?

#expected::before {
  content: '\e92c';
  font-family: 'icomoon';
}

[data-icon]::before {
  content: attr(data-icon);
  font-family: 'icomoon';
}
<h2>This is what I expected</h2>
<a class="button" id="expected" href="javascript: void(0)">Save</a>

<h2>This is what I get :(</h2>
<a class="button" data-icon="\e92c" href="javascript: void(0)">Save</a>
Hao Wu
  • 17,573
  • 6
  • 28
  • 60

1 Answers1

2

HTML text is escaped differently from CSS text. In the attribute, you want &#xE92C; for the equivalent hex excape (what the spec calls a "decimal character reference" or a "hexadecimal character reference;" details here).

Hexadecimal character reference (note the x after the #):

data-icon="&#xE92C;"

Decimal (no x):

data-icon="&#59692;"

Live example:

#expected::before {
  content: '\00e92c';
  font-family: 'icomoon';
}

[data-icon]::before {
  content: attr(data-icon);
  font-family: 'icomoon';
}
<h2>This is what I expected</h2>
<a class="button" id="expected" href="javascript: void(0)">Save</a>

<h2>From <code>data-icon</code></h2>
<a class="button" data-icon="&#xE92C;" href="javascript: void(0)">Save</a>
T.J. Crowder
  • 1,031,962
  • 187
  • 1,923
  • 1,875