CSS RGBA hexadécimal?

199

Je sais que tu peux écrire ...

background-color: #ff0000;

... si vous voulez quelque chose de rouge.

Et vous pouvez écrire ...

background-color: rgba(255, 0, 0, 0.5);

... si vous voulez quelque chose de rouge et de translucide.

Existe-t-il une manière concise d'écrire des couleurs partiellement transparentes en hexadécimal? Je veux quelque chose comme:

background-color: #ff000088; <--- the 88 is the alpha

... ou ...

background-color: #ff0000 50%;

Je reçois toutes mes couleurs en hexadécimal, et devoir les convertir toutes à l'échelle décimale 0-255 est ennuyeux.

Li Haoyi
la source
1
Vous pouvez expérimenter différentes notations, mais je n'ai pas réussi. rgb(0xff,\x80,#44)étonnamment la représentation octale semble york un peu rgb(0100, 0200,0300)est#4080C0
yunzen
Vous voudrez peut-être utiliser ColorPic, qui affiche les chiffres décimaux pour une couleur choisie iconico.com/colorpic
yunzen
2
Comme l'a suggéré Slomojo, dans MOINS, vous pouvez faire la couleur de fond: # ff0000 + rgba (0, 0, 0, .8); qui convertira l'hex pour vous et appliquera toujours la transparence mais cela ne peut pas être fait en utilisant du CSS natif.
fl3x7
1
Pour être complet, comme Slomojo et fl3x7 en parlent, cela peut être fait facilement dans Sass : background-color: opacify(#ff0000, 0.5);ou background-color: transparentize(#ff0000, 0.5);Vous pouvez également fournir des variables de couleur hexadécimales Sass à ces fonctions Sass.
Adam Caviness

Réponses:

112

Le module CSS Color Level 4 prendra probablement en charge la notation RGBA hexadécimale à 4 et 8 chiffres!

Il y a trois semaines (18 décembre 2014), le projet de l'éditeur de CSS Color Module Level 4 a été soumis au groupe de travail CSS W3C. Bien que dans un état qui soit fortement susceptible de changer, la version actuelle du document implique que dans un futur assez proche, CSS supportera à la fois la notation RGBA hexadécimale à 4 et 8 chiffres.

Remarque: la citation suivante a des morceaux non pertinents et la source peut avoir été fortement modifiée au moment où vous lisez ceci (comme mentionné ci-dessus, c'est un brouillon de l'éditeur et non un document finalisé).
Si les choses ont beaucoup changé, laissez-moi un commentaire pour que je puisse mettre à jour cette réponse!

§ 4.2. Les notations hexadécimales RVB: #RRGGBB

La syntaxe de a <hex-color>est un <hash-token>jeton dont la valeur se compose de 3, 4, 6 ou 8 chiffres hexadécimaux . En d'autres termes, une couleur hexadécimale est écrite sous la forme d'un caractère de hachage, "#", suivi d'un certain nombre de chiffres 0-9ou de lettres a-f(la casse des lettres n'a pas d'importance - #00ff00est identique à #00FF00).

8 chiffres

Les 6 premiers chiffres sont interprétés de manière identique à la notation à 6 chiffres. La dernière paire de chiffres, interprétée comme un nombre hexadécimal, spécifie le canal alpha de la couleur, où 00représente une couleur entièrement transparente et ffreprésente une couleur entièrement opaque.

Exemple 3
En d'autres termes, #0000ffccreprésente la même couleur que rgba(0, 0, 100%, 80%)(un bleu légèrement transparent).

4 chiffres

Il s'agit d'une variante plus courte de la notation à 8 chiffres, "développée" de la même manière que la notation à 3 chiffres. Le premier chiffre, interprété comme un nombre hexadécimal, spécifie le canal rouge de la couleur, où 0représente la valeur minimale et freprésente le maximum. Les trois chiffres suivants représentent respectivement les canaux vert, bleu et alpha.

Qu'est-ce que cela signifie pour l'avenir des couleurs CSS?

Cela signifie qu'en supposant que cela ne soit pas complètement supprimé du document de niveau 4, nous serons bientôt en mesure de définir nos couleurs RGBA (ou couleurs HSLA, si vous êtes l'un de ces types) au format hexadécimal dans les navigateurs qui prennent en charge la couleur Syntaxe du module niveau 4.

Exemple

elem {
    background: rgb(0, 0, 0);           /* RGB notation (no alpha). */
    background: #000;                   /* 3-digit hexadecimal notation (no alpha). */
    background: #000000;                /* 6-digit hexadecimal notation (no alpha). */
    background: rgba(0, 0, 0, 1.0);     /* RGBA notation. */

    /* The new 4 and 8-digit hexadecimal notation. */
    background: #0000;                  /* 4-digit hexadecimal notation. */
    background: #00000000;              /* 8-digit hexadecimal notation. */
}

Quand pourrai-je l'utiliser dans mes produits destinés aux clients?

Tumble weed est la seule vraie réponse ...

Toutes les blagues à part: ce n'est actuellement que le début de 2015, donc elles ne seront pas prises en charge dans aucun navigateur pendant un certain temps encore - même si votre produit n'est conçu que pour fonctionner sur les navigateurs les plus à jour, vous aurez probablement ne pas voir cela en action dans un navigateur de production de sitôt.

Afficher la prise en charge actuelle du navigateur pour la notation des couleurs #RRGGBBAA

Cependant, cela dit, la façon dont CSS fonctionne signifie que nous pouvons réellement commencer à les utiliser dès aujourd'hui! Si vous voulez vraiment commencer à les utiliser dès maintenant, tant que vous ajoutez une solution de repli, tous les navigateurs non pris en charge ignoreront simplement les nouvelles propriétés jusqu'à ce qu'elles soient jugées valides:

figure {
  margin: 0;
  padding: 4px;
  
  /* Fall back (...to browsers which don't support alpha transparency). */
  background: #FEFE7F;
  color: #3F3FFE;
  
  /* Current 'modern' browser support. */
  background: rgba(255, 255, 0, 0.5);
  color: rgba(0, 0, 255, 0.75);
  
  /* Fall... foward? */
  background: #ffff007F; /* Or, less accurately, #ff08 */
  color: #0000ffbe;      /* Or #00fc */
}
<figure>Hello, world!</figure>

Tant que vous visualisez cette réponse sur un navigateur qui prend en charge les propriétés backgroundet coloren CSS, l' <figure>élément résultant de l'extrait ci-dessus sera très similaire à ceci:

Image de résultat d'extrait de code

En utilisant la version la plus récente de Chrome sur Windows (v39.0.2171) pour inspecter notre <figure>élément, nous verrons ce qui suit:

Exemple d'inspecteur d'élément

La valeur de repli hexadécimal à 6 chiffres est remplacée par les rgba()valeurs, et nos valeurs hexadécimales à 8 chiffres sont ignorées car elles sont actuellement considérées comme invalides par l'analyseur CSS de Chrome. Dès que notre navigateur prend en charge ces valeurs à 8 chiffres, celles-ci remplacent rgba()celles.

MISE À JOUR 2018-07-04: Firefox, Chrome et Safari prennent désormais en charge cette notation, Edge est toujours manquant mais suivra probablement ( https://caniuse.com/#feat=css-rrggbbaa ).

James Donnelly
la source
1
Je me souviens avoir vu cela apparaître dans les listes de diffusion il y a un an au plus tard (l'idée d'avoir un hex de 4 à 8 chiffres n'est pas nouveau). Heureux de voir qu'il est entré Couleurs 4 pour l'instant.
BoltClock
@BoltClock j'espère que ça va rester ici aussi!
James Donnelly
Firefox Nightly vient juste de l'implémenter :)
Florrie
/* Fall... foward? */»Je suggère d'aller de l'avant. Fallback et Jumpforward: ^ p
WoodrowShigeru
Il suffit d'ajouter un lien utile. Le lien contient la liste des valeurs d'opacité en hexadécimal. gist.github.com/lopspower/03fb1cc0ac9f32ef38f4
Ashish Kumar
33

J'ai trouvé la réponse après avoir publié l'amélioration de la question. Désolé!

MS Excel a aidé!

ajoutez simplement le préfixe Hex à la valeur de la couleur hexadécimale pour ajouter un alpha qui a l'opacité équivalente à la valeur%.

(en rbga, le pourcentage d'opacité est exprimé en décimal comme mentionné ci-dessus)

Opacity %   255 Step        2 digit HEX prefix
0%          0.00            00
5%          12.75           0C
10%         25.50           19
15%         38.25           26
20%         51.00           33
25%         63.75           3F
30%         76.50           4C
35%         89.25           59
40%         102.00          66
45%         114.75          72
50%         127.50          7F
55%         140.25          8C
60%         153.00          99
65%         165.75          A5
70%         178.50          B2
75%         191.25          BF
80%         204.00          CC
85%         216.75          D8
90%         229.50          E5
95%         242.25          F2
100%        255.00          FF
T9b
la source
Ne comprends pas vraiment. Voulez-vous dire #FF00000Cest équivalent à rgba(255,0,0,0.05)?
2011
c'est un préfixe pas un suffixe. Cela signifie que vous ajoutez à l'avant de votre valeur de couleur hexadécimal à 6 chiffres #000000devient #7F000000.
T9b
8
@ T9b: CSS3 ne prend pas en charge cette notation. Fin de l'histoire.
PointedEars
@PointedEars mal sur les deux points. L'OP ne mentionne pas spécifiquement CSS3, et cette question, j'aurais pensé, serait probablement plus liée à des problèmes spécifiques à IE que nous savons tous difficiles. Néanmoins, IE utilise les valeurs de transparence CSS et Hex dans son CSS.
T9b
4
@ T9b Nonsense. L'OP a une question CSS sur les valeurs RGBA. Il n'y a pas de support RGBA en CSS avant CSS3. Si IE / MSHTML prend en charge votre notation, cela est propriétaire , non compatible et intrinsèquement peu fiable. Et vous ne proposez certainement pas d'utiliser des scripts côté client pour faire fonctionner cette notation, n'est-ce pas? Car cela ne serait pas compatible et ne serait pas fiable non plus.
PointedEars
22
RGB='#ffabcd';
A='0.5';
RGBA='('+parseInt(RGB.substring(1,3),16)+','+parseInt(RGB.substring(3,5),16)+','+parseInt(RGB.substring(5,7),16)+','+A+')';
James Alarie
la source
var rgb = '#ffabcd'; var a = '0.5'; var matches = rgb.match(/#([\da-f]{2})([\da-f]{2})([\da-f]{2})/i); var rgba = 'rgba(' + matches.slice(1).map(function(m) { return parseInt(m, 16); }).concat(a) + ')';
PointedEars
2
Si vous venez d'un monde de React:<div style={ { backgroundColor: `rgba(${ parseInt(color.substring(1,3),16) }, ${ parseInt(color.substring(3,5),16) }, ${ parseInt(color.substring(5,7),16) }, 0.5)` } }></div>
Atul Yadav
14

Voir ici http://www.w3.org/TR/css3-color/#rgba-color

Ce n'est pas possible, probablement parce que 0xFFFFFFFF est supérieur à la valeur maximale pour les entiers 32 bits

Griffon
la source
28
#ffffff(six chiffres hexadécimaux) est en fait une valeur de couleur de 24 bits ; 0xFFFFFFFF est en fait 2³² − 1, et peut être représenté comme un entier 32 bits non signé . Je pense que la raison pour laquelle #ffffffff(huit chiffres hexadécimaux) n'est pas spécifié est à la fois que les couleurs CSS sont enracinées dans l'espace colorimétrique sRGB et qu'une notation à huit chiffres hexadécimaux serait ambiguë avec un périphérique d'affichage qui prend en charge une profondeur de couleur de 32 bits. N'oubliez pas qu'il y en a toujours #fffpour que cela signifie rgb(100%, 100%, 100%)- blanc - à la fois avec une profondeur de couleur de 8 bits (256 couleurs) et 16 bits (65536 ou 64K couleurs).
PointedEars
5
En fait, c'est exactement ce que l'entier 32 bits est capable de contenir. 2 chiffres hexadécimaux peuvent contenir autant de valeurs que 8 chiffres binaires. Ou ... 8 chiffres hexadécimaux peuvent contenir autant de valeurs que 32 chiffres binaires.
Pijusn
Bien qu'il n'y ait aucune raison majeure pour laquelle la fonction CSS n'aurait pas dû être conçue de cette façon dès le début (ainsi que les flotteurs rgba (0.0, 0.5, 1.0) pour que les normales correspondent aux autres fonctions de couleur). Quant à la prise en charge des couleurs d'affichage 32 bits, cela n'existe pas avec RVB à 6 chiffres pour commencer et c'est vraiment un cas de bord. Je n'ai pas de problème avec l'apprentissage de différents formats, mais il y a des cas où vous pouvez obtenir une couleur dynamique en hexadécimal et avoir besoin de créer du CSS à partir de celle-ci lors de l'exécution. Cela nécessite l'étape supplémentaire de conversion de l'hex en décimal si vous souhaitez y ajouter de l'alpha, ce qui est maladroit.
Beejor
13

Chrome 52+ prend en charge l' alpha hex:

background: #56ff0077;
Breed Oded
la source
4
J'étais ravi de voir cela, puis je l'ai essayé dans devtools sur Chrome 55. Pas de dés, cela ¯\_(ツ)_/¯
génère
1
Il semble qu'il y ait eu divers problèmes, voici la page d'état de la fonctionnalité.
Billy
Chrome a supprimé le support, Safari et Firefox ont un support. Ne l'utilisez pas.
Affaire
5
En juillet 2019, 84,5% de tous les navigateurs prenaient en charge cette fonctionnalité dans le monde. caniuse.com/#search=rrggbbaa
André Kuhlmann
10

Utiliser red,green , bluepour convertir en RGBA:

background-color: rgba(red($color), green($color), blue($color), 0.2);
Jeremy Lynch
la source
4
SASS prend en charge la couleur de fond: rgba ($ color, .2);
djibe
ce ne sont pas des méthodes css valides - vous devez le mentionner
Piotr Karbownik
7

J'ai bien peur que ce ne soit pas possible. le rgbaformat que vous connaissez est le seul.

Le fantôme de Madara
la source
1
@mdmullinax: Mais qui spécifie les couleurs hexadécimales en notation HSL?
BoltClock
1
J'associe
@mdmullinax: Oh, c'est en fait assez génial!
BoltClock
6
@mdmullinax: Cela peut vous ravir si vous ne l'avez pas encore vu: mothereffinghsl.com
BoltClock
@BoltClock J'aime ce site, Paul Irish est gagnant
MikeM
5

Si vous pouvez utiliser MOINS, il existe une fonction de fondu.

@my-opaque-color: #a438ab;
@my-semitransparent-color: fade(@my-opaque-color, 50%);

background-color:linear-gradient(to right,@my-opaque-color, @my-semitransparent-color); 

// result: 
background-color: linear-gradient(to right, #a438ab, rgba(164, 56, 171, 0.5));
Julian Mann
la source
et sass / scss a une fonction équivalente:rgba(base-color, 0.5)
LocustHorde
2

Prince charmant:

Seul Internet Explorer autorise la couleur hexadécimale de 4 octets au format ARGB, où A est le canal Alpha. Il peut être utilisé dans les filtres dégradés par exemple:

filter  : ~"progid:DXImageTransform.Microsoft.Gradient(GradientType=@{dir},startColorstr=@{color1},endColorstr=@{color2})";

Où dir peut être: 1 (horizontal) ou 0 (vertical) Et les chaînes de couleurs peuvent être des couleurs hexadécimales (# FFAAD3) ou des couleurs hexadécimales argb (# 88FFAAD3).

Lajos Meszaros
la source
0

Eh bien, vous devrez apprendre différentes notations de couleur.
Kuler vous donne une meilleure chance de trouver la couleur et en plusieurs notations.
Hex n'est pas différent de RGB, FF = 255 et 00 = 0, mais c'est ce que vous savez. Donc, d'une certaine manière, vous devez le visualiser.
J'utilise Hex, RGBA et RGB. Sauf si une conversion de masse est requise, cette opération manuelle vous aidera à vous souvenir de quelques 100 couleurs et de leurs codes.
Pour la conversion de masse, écrivez un script comme celui donné par Alarie. Amusez-vous avec les couleurs.


la source
-2

pourquoi ne pas utiliser background-color: #ff0000; opacity: 0.5; filter: alpha(opacity=50); /* in IE */

si vous ciblez une couleur pour un texte ou probablement un élément, cela devrait être beaucoup plus facile à faire.

Prince charmant
la source
9
-1 opacité affecte tout le contenu, pas seulement la couleur de fond
yunzen
alors l'objet peut être doublé, l'un doit être l'élément contenant, l'autre doit être celui à l'intérieur du conteneur qui a l'opacité. car de la question l'utilisateur veut une autre méthode que la rgba conventionnelle.
Charming Prince
1
Il veut toujours le même résultat, et je ferais mieux d'utiliser rgba () ou toute autre notation que de modifier HTML.
FelipeAls
c'est la réponse que je cherchais, laissez les couleurs hexadécimales et changez l'opacité en utilisant la opacitypropriété css.
ici