In the following SCSS, I would like to use the fg-color
variable within the url
background-image
attribute.
$fg-color: #ff6464;
i.icon-back {
background-image: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 20'><path d='M10,0l2,2l-8,8l8,8l-2,2L0,10L10,0z' fill='%23ff6464'/></svg>");
}
At the moment the value, of the variable in simply repeated within the SVG string, like so:
fill='%23ff6464'
I would like this to be automatically updated whenever the fg-color
variable is updated.
How can I do this?
UPDATE:
This input SCSS:
i.icon-back {
background-image: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 20'><path d='M10,0l2,2l-8,8l8,8l-2,2L0,10L10,0z' fill='$fg-color'/></svg>");
}
Outputs this CSS:
i.icon-back {
background-image: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 20'><path d='M10,0l2,2l-8,8l8,8l-2,2L0,10L10,0z' fill='$fg-color'/></svg>");
}
... it is exactly the same - the variable is not processed.
NOTE:
I have reviewed these questions, that appear to be similar, but are not the same:
SVG must have attribute xmlns like this: xmlns='http: //www.w3.org/2000/svg' . If it doesn't exist, it will be added automagically. Encoded SVG can be used in background , in border-image or in mask (live demo).
The SVG background is used to draw any kind of shape, set any color you want by the set property. The below examples illustrates the concept of SVG set background-color more specifically. The SVG allowed the CSS background sizing, position, and much more complex property.
Not an answer to your question, but an alternative way to achieve a similar result in many cases (think simple mono-color icons). You can use CSS mask-image like so:
i.icon-back {
background-color: $fg-color;
mask-image: url('data:image/svgâ¦');
}
Browser support for CSS masks is missing Edge/IE at the time of this writing.
First, create a SASS function.
This (ab)uses string interpolation to convert the colour to a string,
and then strips the first character (should always be '#
'),
and puts '%23
' in its place (URL encoded form of '#
').
@function url-friendly-colour($colour) {
@return '%23' + str-slice('#{$colour}', 2, -1)
}
Then use the function - but in order for it to work within the string, it must be interpolated, using #{}
i.icon-back {
background-image: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 20'><path d='M10,0l2,2l-8,8l8,8l-2,2L0,10L10,0z' fill='#{url-friendly-colour($fg-color)}'/></svg>");
}
The caveat with this approach, of course, is that it will not work with colours that are specified by colour name instead of their hexadecimal colour.
E.g. #f00
works but red
will not.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With