How do I convert a hexadecimal color to rgba with the Less compiler?
Asked Answered
K

4

138

I have the following code:

@color : #d14836;

.stripes span {
    -webkit-background-size: 30px 30px;
    -moz-background-size: 30px 30px;
    background-size: 30px 30px;
    background-image: -webkit-gradient(linear, left top, right bottom,
        color-stop(.25, rgba(209, 72, 54, 1)), color-stop(.25, transparent),
        color-stop(.5, transparent), color-stop(.5, rgba(209, 72, 54, 1)),
        color-stop(.75, rgba(209, 72, 54, 1)), color-stop(.75, transparent),
        to(transparent));

I need to convert @color to rgba(209, 72, 54, 1).

So I need to replace rgba(209, 72, 54, 1) in my code with a Less function that generates an rgba() value from my @color variable.

How can I do this with Less?

Killjoy answered 13/2, 2013 at 18:54 Comment(1)
Do the fadein/fadeout/fade functions not do what you need? lesscss.org/#referenceFrontwards
R
370

Actually, the Less language comes with an embedded function called fade. You pass a color object and the absolute opacity % (higher value means less transparent):

fade(@color, 50%);   // Return @color with 50% opacity in rgba
Ronna answered 25/11, 2013 at 21:32 Comment(8)
@Soc answered the OP's question, but you gave us the answer EVERYONE ELSE came here to find! Thank you!Modestia
I think the amount parameter is not the transparency level but in contrary designates the opacity level?Emphatic
@Emphatic Actually, by picking exactly 50%, it's correctly both transparency and opacity. :)Elul
@Emphatic If you want to get really technical, I believe it's more accurately the proportion of the "translucent" color to blend with the color of each pixel which the element overlays -- see en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending :) But in practical terms, of course you're right; the percentage or decimal value represents the opacity level, not the transparency level!Bloodfin
@DemPilafian Actually, I think it depends whether the glass is 50% empty, or 50% full.Bloodfin
For the record this is a flaw in the API. I have to look it up every time I want to use it. It would be wise of them to sugar up the existing RGBA into a LESS call like SASS does -- rgba(@colorValue, .5) such that it would output the same exact hing as an actual CSS rgba declaration. But hey, that's me being whiney. :)Wold
Just in case someone is using SASS, the equivalent is rgba( $base-color, .7 ). LinkSpohr
Thanks it worked for me ;) Just a little update : it seems that the fade functions has been replaced by fadein/fadeout : lesscss.org/functions.Baking
A
108

If you don't need an alpha key, you can simply use the hexadecimal representation of the color. An rgba color with a alpha of '1' is the same as the hexadecimal value.

Here are some examples to demonstrate that:

@baseColor: #d14836;

html {
    color: @baseColor;
    /* color:#d14836; */
}

body {
    color: rgba(red(@baseColor), green(@baseColor), blue(@baseColor), 1);
    /* color:#d14836; */
}

div {
    color: rgba(red(@baseColor), green(@baseColor), blue(@baseColor), 0.5);
    /* rgba(209, 72, 54, 0.5); */
}

span {
    color: fade(@baseColor, 50%);
    /* rgba(209, 72, 54, 0.5); */
}

h3 {
    color: fade(@baseColor, 100%)
    /* color:#d14836; */
}

Test this code online: http://lesstester.com/

Arrack answered 13/2, 2013 at 22:0 Comment(5)
How about this error I got? error evaluating function 'red': Cannot read property '0' of undefinedPercuss
This hasn't been updated for a while but with Less PHP I am getting the following error - @colorGold: color('#C6AF87'); .box { background-color: rgba(red(@colorGold),green(@colorGold),blue(@colorGold),0.3); } Error is - Could not compile CSS file (screen.less): color expected for red(): failed at `background-color: rgba(red(@colorGold),green(@colorGold),blue(@colorGold),0.3);Uvula
@Uvula you can assign the color directly to make this work with Less PHP it seem also work with the current less version so i adapted the example. @colorGold: #C6AF87;Arrack
@Soc this was my eventual solution and I found it shortly after I don't know what gave me the impression I needed to wrap it in colour tags!Uvula
Check out my less function, #14861374Saphena
S
12

My Less mixin:

.background-opacity(@color, @opacity) {
    @rgba-color: rgba(red(@color), green(@color), blue(@color), @opacity);

    background-color: @rgba-color;

    // Hack for IE8:
    background: none\9; // Only Internet Explorer 8
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d')", argb(@rgba-color),argb(@rgba-color))); // Internet Explorer 9 and down
    // Problem: Filter gets applied twice in Internet Explorer 9.
    // Solution:
    &:not([dummy]) {
      filter: progid:DXImageTransform.Microsoft.gradient(enabled='false'); // Only IE9
    }
}

Try it.

EDITED: As seen on rgba background with IE filter alternative: IE9 renders both!, I added some lines to the mixin.

Saphena answered 18/9, 2013 at 18:1 Comment(0)
A
3

It seems that with the recent Less update 3.81, you can use just two arguments in the rgba() function.

rgba(white, 0.3) or rgba(white, 30%) => rgba(255, 255, 255, 0.3)

It works for me, but I can't find it in the official documentation.

Anse answered 11/10, 2018 at 5:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.