CSS esadecimale RGBA?


199

So che puoi scrivere ...

background-color: #ff0000;

... se vuoi qualcosa di rosso.

E puoi scrivere ...

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

... se vuoi qualcosa di rosso e traslucido.

Esiste un modo conciso di scrivere colori parzialmente trasparenti in esadecimali? Voglio qualcosa del tipo:

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

... o ...

background-color: #ff0000 50%;

Sto ottenendo tutti i miei colori in esadecimali e doverli convertire tutti nella scala decimale 0-255 è fastidioso.


1
Potresti sperimentare con diverse notazioni, ma non ho avuto successo. rgb(0xff,\x80,#44)sorprendentemente rappresentazione ottale sembra York un po ' rgb(0100, 0200,0300)è#4080C0
yunzen

Potresti voler usare ColorPic, che mostra le cifre decimali per un colore selezionato iconico.com/colorpic
yunzen

2
Come suggerito Slomojo, in MENO puoi fare il colore di sfondo: # ff0000 + rgba (0, 0, 0, .8); che convertirà l'esagono per te e applicherà comunque la trasparenza, ma ciò non può essere fatto usando CSS nativi.
fl3x7,

1
Per completezza, come discutono Slomojo e fl3x7, questo può essere fatto facilmente in Sass : background-color: opacify(#ff0000, 0.5);oppure background-color: transparentize(#ff0000, 0.5);È possibile fornire variabili di colore esadecimale per Sass anche a quelle funzioni di Sass.
Adam Caviness,

Risposte:


112

Il CSS Color Module Level 4 probabilmente supporterà la notazione esadecimale RGBA a 4 e 8 cifre!

Tre settimane fa (18 dicembre 2014) la bozza dell'editor CSS Color Module Level 4 è stata presentata al gruppo di lavoro CSS W3C. Anche se in uno stato che è fortemente suscettibile di cambiamento, la versione corrente del documento implica che in qualche modo futuro CSS vicino sosterrà sia la notazione esadecimale RGBA 4 e 8 cifre.

Nota: la seguente citazione ha ritagli di pezzi irrilevanti e la fonte potrebbe essere stata fortemente modificata al momento della lettura (come menzionato sopra, è una bozza dell'editor e non un documento finalizzato).
Se le cose sono cambiate notevolmente, ti preghiamo di lasciare un commento che mi faccia sapere per poter aggiornare questa risposta!

§ 4.2 Notazioni esadecimali RGB: #RRGGBB

La sintassi di a <hex-color>è un <hash-token>token il cui valore è composto da 3, 4, 6 o 8 cifre esadecimali . In altre parole, un colore esadecimale viene scritto come un carattere hash, "#", seguito da un numero di cifre 0-9o lettere a-f(il caso delle lettere non ha importanza - #00ff00è identico a #00FF00).

8 cifre

Le prime 6 cifre sono interpretate in modo identico alla notazione a 6 cifre. L'ultima coppia di cifre, interpretata come un numero esadecimale, specifica il canale alfa del colore, dove 00rappresenta un colore completamente trasparente e ffrappresenta un colore completamente opaco.

Esempio 3
In altre parole, #0000ffccrappresenta lo stesso colore di rgba(0, 0, 100%, 80%)(un blu leggermente trasparente).

4 cifre

Questa è una variante più breve della notazione a 8 cifre, "espansa" allo stesso modo della notazione a 3 cifre. La prima cifra, interpretata come un numero esadecimale, specifica il canale rosso del colore, dove 0rappresenta il valore minimo e frappresenta il massimo. Le tre cifre successive rappresentano rispettivamente i canali verde, blu e alfa.

Cosa significa questo per il futuro dei colori CSS?

Ciò significa che supponendo che questo non sia completamente rimosso dal documento di Livello 4, saremo presto in grado di definire i nostri colori RGBA (o colori HSLA, se sei uno di quei ragazzi) in formato esadecimale nei browser che supportano il Colore Sintassi del Livello 4 del modulo.

Esempio

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. */
}

Quando potrò utilizzarlo nei miei prodotti rivolti al cliente?

L'erba infestante è l'unica vera risposta ...

Tutte le battute a parte: attualmente è solo l'inizio del 2015, quindi questi non saranno supportati in nessun browser ancora per un po 'di tempo - anche se il tuo prodotto è progettato per funzionare solo con i browser più aggiornati probabilmente non vederlo presto in azione in un browser di produzione.

Visualizza il supporto del browser corrente per la notazione di colore #RRGGBBAA

Tuttavia, detto ciò, il modo in cui funziona CSS significa che possiamo effettivamente iniziare a usarli oggi! Se vuoi davvero iniziare a usarli in questo momento, se aggiungi un fallback qualsiasi browser non supportante semplicemente ignorerà le nuove proprietà fino a quando non saranno ritenute valide:

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>

Finché visualizzi questa risposta su un browser che supporta le proprietà backgrounde colornei CSS, l' <figure>elemento nel risultato dello snippet sopra sarà molto simile a questo:

Immagine del risultato dello snippet di codice

Utilizzando la versione più recente di Chrome su Windows (v39.0.2171) per ispezionare il nostro <figure>elemento, vedremo quanto segue:

Esempio di ispettore elemento

Il fallback esadecimale a 6 cifre viene sovrascritto dai rgba()valori e i nostri valori esadecimali a 8 cifre vengono ignorati in quanto attualmente considerati non validi dal parser CSS di Chrome. Non appena il nostro browser supporta questi valori a 8 cifre, questi sostituiranno rgba()quelli.

AGGIORNAMENTO 2018-07-04: Firefox, Chrome e Safari supportano questa notazione ora, Edge manca ancora ma probabilmente seguirà ( https://caniuse.com/#feat=css-rrggbbaa ).


1
Ricordo di averlo visto apparire nelle mailing list un anno fa circa (l'idea di avere un esagono di 4/8 cifre non è una novità). Sono contento di vedere che è entrato in Colors 4 per ora.
BoltClock

@BoltClock speriamo che rimanga anche qui!
James Donnelly,

Firefox Nightly l' ha appena implementato :)
Florrie,

/* Fall... foward? */»Suggerisco jumpforward. Fallback e jumpforward: ^ p
Woodrow Shigeru

Basta aggiungere un link utile. Il collegamento contiene un elenco di valori di opacità in esadecimale. gist.github.com/lopspower/03fb1cc0ac9f32ef38f4
Ashish Kumar

33

Ho trovato la risposta dopo aver pubblicato il miglioramento alla domanda. Scusa!

MS Excel ha aiutato!

aggiungi semplicemente il prefisso esadecimale al valore del colore esadecimale per aggiungere un alfa che ha l'opacità equivalente come valore%.

(in rbga l'opacità percentuale è espressa come decimale come sopra indicato)

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

Non capire davvero. Vuoi dire #FF00000Cè equivalente a rgba(255,0,0,0.05)?
yunzen,

è un prefisso non un suffisso. Significato si aggiunge alla parte anteriore del valore di colore esadecimale 6 cifre #000000diventa #7F000000.
T9b,

8
@ T9b: CSS3 non supporta questa notazione. Fine della storia.
Orecchie appuntite

@Pointed Ears sbagliato su entrambi i punti. L'OP non menziona specificamente CSS3, e questa domanda che avrei pensato fosse probabilmente più correlata a problemi specifici di IE che tutti sappiamo essere difficili. Tuttavia IE utilizza sia i valori di trasparenza CSS che Hex nei suoi CSS.
T9b,

4
@ T9b Sciocchezze. L'OP ha una domanda CSS sui valori RGBA. Non esiste alcun supporto RGBA nei CSS prima dei CSS3. Se IE / MSHTML supporta la tua notazione, allora è proprietario , non compatibile e intrinsecamente inaffidabile. E sicuramente non stai suggerendo di usare gli script lato client per far funzionare quella notazione, vero? Perché ciò non sarebbe compatibile e sarebbe anche inaffidabile.
Orecchie appuntite

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+')';

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) + ')';
Orecchie appuntite

2
Se vieni da un mondo di 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

Vedi qui http://www.w3.org/TR/css3-color/#rgba-color

Non è possibile, molto probabilmente perché 0xFFFFFFFF è maggiore del valore massimo per numeri interi a 32 bit


28
#ffffff(sei cifre esadecimali) è in realtà un valore di colore a 24 bit ; 0xFFFFFFFF è in realtà 2³² − 1 e può essere rappresentato come numero intero a 32 bit senza segno . Penso che il motivo per cui #ffffffff(otto cifre esadecimali) non sia specificato sia che i colori CSS siano radicati nello spazio colore sRGB sia che una notazione di otto cifre esadecimali sarebbe ambigua con un dispositivo di visualizzazione che supporti una profondità di colore di 32 bit. Ricorda che c'è ancora #fffcosì che significa rgb(100%, 100%, 100%)- bianco - entrambi con una profondità di colore di 8 bit (256 colori) e 16 bit (65536 o 64K colori).
Orecchie appuntite

5
In realtà è esattamente ciò che è in grado di contenere numeri interi a 32 bit. 2 cifre esadecimali possono contenere un numero di valori pari a 8 cifre binarie. Oppure ... 8 cifre esadecimali possono contenere un numero di valori pari a 32 cifre binarie.
Pijusn

Sebbene non ci siano motivi importanti per cui la funzione CSS non avrebbe dovuto essere progettata in questo modo dall'inizio (così come rgba (0.0, 0.5, 1.0) galleggia per le normali in modo che corrispondano alle altre funzioni di colore). Per quanto riguarda il supporto del colore di visualizzazione a 32 bit, questo non esiste con RGB a 6 cifre per cominciare ed è davvero un caso limite. Non ho alcun problema con l'apprendimento di diversi formati, ma ci sono casi in cui potresti ottenere un colore dinamico in esadecimale e dover creare CSS da esso in fase di esecuzione. Ciò richiede il passaggio aggiuntivo di conversione da esadecimale a decimale se si desidera aggiungere alfa ad esso, che è goffo.
Beejor,

13

Chrome 52+ supporta l' alfa esadecimale:

background: #56ff0077;

4
Ero entusiasta di vedere questo, e poi l'ho provato in devtools su Chrome 55. Nessun dado, errore come valore di proprietà non valido ...¯\_(ツ)_/¯
ericsoco,

1
Sembra che abbia avuto vari problemi, ecco la pagina di stato per la funzione.
Billy,

Chrome ha rimosso il supporto, Safari e Firefox hanno il supporto. Non usare questo.
Caso

5
A partire da luglio 2019, l'84,5% di tutti i browser a livello globale supporta questa funzione. caniuse.com/#search=rrggbbaa
André Kuhlmann il

10

Utilizzare red, green, blueda convertire in RGBA:

background-color: rgba(red($color), green($color), blue($color), 0.2);

4
SASS supporta background-color: rgba ($ color, .2);
djibe,

quelli non sono metodi css validi - dovresti
dirlo

7

Temo che non sia possibile. il rgbaformato che conosci è l'unico.


1
@mdmullinax: ma chi specifica i colori esadecimali nella notazione HSL?
BoltClock

1
Associo tutto nella vita alla notazione HSLA, è una versione di sinestesia :)
MikeM

@mdmullinax: Oh, è davvero fantastico!
BoltClock

6
@mdmullinax: questo potrebbe deliziarti se non l'hai ancora visto: mothereffinghsl.com
BoltClock

@BoltClock Mi piace quel sito, vince Paul Irish
MikeM,

5

Se puoi usare MENO, c'è una funzione di dissolvenza.

@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));

e sass / scss ha una funzione equivalente:rgba(base-color, 0.5)
LocustHorde

2

Principe affascinante:

Solo Internet Explorer consente il colore esadecimale a 4 byte nel formato ARGB, dove A è il canale alfa. Può essere utilizzato nei filtri gradiente, ad esempio:

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

Dove dir può essere: 1 (orizzontale) o 0 (verticale) E le stringhe di colore possono essere esadecimali (# FFAAD3) o argb esadecimali (# 88FFAAD3).



0

Bene, è necessario imparare diverse notazioni di colore.
Kuler ti dà una migliore possibilità di trovare il colore e in più notazioni.
L'esagono non è diverso da RGB, FF = 255 e 00 = 0, ma questo è quello che sai. Quindi, in un certo senso, devi visualizzarlo.
Uso Hex, RGBA e RGB. A meno che non sia richiesta la conversione di massa, farlo manualmente ti aiuterà a ricordare alcuni strani 100 colori e i loro codici.
Per la conversione di massa scrivi qualche sceneggiatura come quella data da Alarie. Divertiti con i colori.


-2

perché non usare background-color: #ff0000; opacity: 0.5; filter: alpha(opacity=50); /* in IE */

se scegli come target un colore per un testo o probabilmente un elemento, questo dovrebbe essere molto più facile da fare.


9
-1 l'opacità influisce su tutto il contenuto, non solo sul colore di sfondo
yunzen,

quindi l'oggetto può essere raddoppiato, uno dovrebbe essere l'elemento di contenimento, l'altro dovrebbe essere quello all'interno del contenitore che ha opacità. perché dalla domanda l'utente vuole un altro metodo rispetto alla rgba convenzionale.
Incantevole principe il

1
Vuole ancora lo stesso risultato e farò meglio a usare rgba () o qualsiasi altra notazione piuttosto che modificare HTML.
FelipeAls,

questa è la risposta che stavo cercando, lasciare soli i colori esadecimali e cambiare l'opacità usando la opacityproprietà css.
qui
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.