Comprendre com treballar amb els colors relatius CSS a JavaScript
Els colors relatius CSS ofereixen als desenvolupadors més flexibilitat d'estil, ja que els permeten modificar els colors de manera dinàmica en funció dels valors de color preexistents. Per exemple, és possible que vulgueu modificar la transparència alfa d'un color, així com els seus canals vermell i blau. Els sistemes de disseny de fluids tenen més possibilitats gràcies a aquesta tècnica.
Tanmateix, treballar amb aquestes dades generades dinàmicament en JavaScript pot ser difícil. Si intenteu utilitzar per recuperar un color calculat, pot tornar la cadena no processada en lloc de corregir els canvis CSS que heu fet. Això restringeix la manipulació programàtica i l'anàlisi del color de sortida final.
En aquesta peça, examinem el procés d'obtenció del color hexadecimal calculat complet des de CSS, independentment de si es defineix a través del sofisticat sintaxi. Estem abordant la qüestió de com obtenir el valor de color precís una vegada que les modificacions relatives als canals RGB i alfa hagin estat calculades pel motor CSS.
També examinarem altres opcions possibles, com ara biblioteques de tercers o API de navegador integrades que us puguin ajudar a extreure aquesta informació de color en un format que es pugui utilitzar al vostre codi JavaScript per modificar-lo.
Comandament | Exemple d'ús |
---|---|
getComputedStyle | Després d'haver aplicat tot el CSS, aquesta ordre obté els estils reals i calculats de l'element. És útil per obtenir valors CSS dinàmics de valors relatius, com ara el color. |
createElement('canvas') | Utilitza JavaScript per crear dinàmicament un |
getContext('2d') | Amb l'ajuda d'aquesta ordre, l'script pot dibuixar o treballar amb dades d'imatge a nivell de píxel, afegint color, etc., recuperant el context de dibuix 2D d'un |
fillStyle | Defineix el patró, el color o el degradat que s'aplicarà al llenç. En els exemples, s'utilitza per establir el color calculat del llenç abans d'extreure les dades de píxels. |
fillRect | Utilitza el fillStyle actual per omplir una àrea rectangular al llenç. Aquí, el color calculat omple una regió d'1 x 1 píxel per a un processament addicional. |
getImageData | Les dades de píxels del llenç s'extreuen amb aquesta ordre. S'utilitza per obtenir els valors RGBA del color representat en el píxel 1x1 creat per fillRect. |
chroma | Una biblioteca de tercers per a la modificació del color s'anomena Chroma.js. El mètode chroma() facilita el treball amb colors CSS calculats convertint colors entre diversos formats, com RGB i hexadecimal. |
toString(16) | Converteix un nombre enter a la seva representació en hexadecimal, la qual cosa és important quan es converteixen els valors RGB a hexadecimal. S'utilitza en aquest cas per barrejar els valors de vermell, verd i blau per crear un codi de color hexadecimal final. |
slice(1) | Elimina el caràcter inicial de la cadena. Slice(1) elimina el caràcter inicial superflu d'un nombre abans de convertir-lo a hexadecimal, garantint que el codi hexadecimal tingui el format correcte. |
JavaScript: utilitzant colors relatius CSS per extreure el color hexadecimal final
Al primer script, vam utilitzar JavaScript per obtenir i treballar amb colors calculats dinàmicament en CSS aprofitant les funcions integrades del navegador. El principal problema està en el fet que permet un ajust de canal de color variable, que no es representa a la sortida quan s'utilitzen tècniques més convencionals com . Dissenyem una solució alternativa utilitzant a element. Podem obtenir els valors RGB precisos representant el color calculat en un llenç amb unes dimensions d'1x1 píxels. La capacitat de l'API del llenç de manipular les dades d'imatge a nivell de píxel, inclòs el color, fa possible aquest procés.
Els valors RGBA de cada píxel s'extreuen mitjançant el mètode un cop el color s'ha col·locat al llenç. A continuació, utilitzant conversions de nombre a cadena i operacions bit a bit en JavaScript, aquests valors es transformen en un format hexadecimal. Aquí, les instruccions importants, tal i , s'encarreguen de generar el color i produir una superfície dibuixable. Quan necessitem el color exacte que representa el navegador d'acord amb el CSS regles, inclòs qualsevol ajust de transparència o canal de color, aquesta tècnica funciona bé. És un mètode excel·lent per resoldre el problema sense utilitzar altres biblioteques.
En el segon mètode, vam simplificar les manipulacions del color mitjançant una eina de tercers anomenada Chroma.js. Amb facilitat, els colors es poden convertir entre diversos formats mitjançant Chroma.js, que proporciona un mètode més abstracte d'interacció amb els colors. Chroma.js gestiona automàticament la conversió a hexadecimal o altres formats com RGB o HSL una vegada que el color calculat s'adquireix del DOM. Quan es treballa en projectes que requereixen ajustos de color més complexos o conversions de format, aquest enfocament és perfecte. Com a resultat, el codi es fa més senzill, més net i més fàcil de mantenir.
Tot i que des de perspectives oposades, ambdues estratègies tracten el mateix problema. Per determinar el color hexadecimal final, el primer utilitza càlculs per bits i API natives del navegador, mentre que el segon aprofita les capacitats d'un paquet especialitzat de manipulació del color. Podeu utilitzar Chroma.js per augmentar la flexibilitat i la facilitat d'ús, o podeu seguir la manera nativa per evitar afegir dependències, depenent de les necessitats del vostre projecte. JavaScript permet una manipulació addicional del color hexadecimal recuperat en ambdós escenaris, proporcionant oportunitats per a un estil dinàmic i animacions basades en colors.
Extracció del color hexadecimal final dels colors relatius CSS mitjançant JavaScript
Aquest mètode manipula els colors relatius de CSS mitjançant API de navegador integrades i JavaScript vanilla.
// 1. First, grab the element whose color you want to extract
const element = document.querySelector('.my-element');
// 2. Use getComputedStyle to get the color property
let computedColor = getComputedStyle(element).color;
// 3. Create a canvas to convert the computed color to hex format
let canvas = document.createElement('canvas');
canvas.width = 1; // Small canvas, just for color conversion
canvas.height = 1;
let ctx = canvas.getContext('2d');
// 4. Set the fill style to the computed color and fill the canvas
ctx.fillStyle = computedColor;
ctx.fillRect(0, 0, 1, 1);
// 5. Extract the color in hex format using getImageData
let pixelData = ctx.getImageData(0, 0, 1, 1).data;
let hexColor = "#" +
((1 << 24) | (pixelData[0] << 16) | (pixelData[1] << 8) | pixelData[2])
.toString(16)
.slice(1); // Convert to hex and remove the alpha
console.log(hexColor); // This will log the final hex color value
Ús d'una biblioteca de tercers (Chroma.js) per a la conversió de color hexadecimal
Aquest enfocament garanteix precisió i flexibilitat en les manipulacions del color mitjançant l'ús del paquet Chroma.js per simplificar el procés.
// 1. First, include Chroma.js in your project (e.g., via CDN or NPM)
// <script src="https://cdnjs.cloudflare.com/ajax/libs/chroma-js/2.1.0/chroma.min.js">
const element = document.querySelector('.my-element');
// 2. Retrieve the computed color using getComputedStyle
let computedColor = getComputedStyle(element).color;
// 3. Use Chroma.js to convert the computed color to hex
let chromaColor = chroma(computedColor);
let hexColor = chromaColor.hex();
console.log(hexColor); // Log the final hex color
// Chroma.js also supports other formats such as RGB or HSL
let rgbColor = chromaColor.rgb();
let hslColor = chromaColor.hsl();
console.log(rgbColor); // Logs RGB array
console.log(hslColor); // Logs HSL array
Test unitari: verificació de la sortida del color final
Aquesta prova d'unitat assegura que el color hexadecimal final retornat per les solucions de JavaScript sigui correcte.
describe('Color Extraction Tests', () => {
it('should return the correct hex color using canvas', () => {
let color = getHexColorFromCanvas('.my-element');
expect(color).toBe('#e6aabb'); // Expected final hex color
});
it('should return the correct hex color using Chroma.js', () => {
let color = getHexColorUsingChroma('.my-element');
expect(color).toBe('#e6aabb'); // Expected final hex color
});
});
// Functions used for the tests
function getHexColorFromCanvas(selector) {
const element = document.querySelector(selector);
let computedColor = getComputedStyle(element).color;
let canvas = document.createElement('canvas');
canvas.width = 1;
canvas.height = 1;
let ctx = canvas.getContext('2d');
ctx.fillStyle = computedColor;
ctx.fillRect(0, 0, 1, 1);
let pixelData = ctx.getImageData(0, 0, 1, 1).data;
return "#" + ((1 << 24) | (pixelData[0] << 16) | (pixelData[1] << 8) | pixelData[2]).toString(16).slice(1);
}
function getHexColorUsingChroma(selector) {
const element = document.querySelector(selector);
let computedColor = getComputedStyle(element).color;
return chroma(computedColor).hex();
}
Tècniques avançades per al maneig de colors relatius CSS en JavaScript
L'ús de variables per aconseguir modificacions de color dinàmiques és una característica potent, però de vegades ignorada . Per exemple, podeu utilitzar JavaScript per crear variables CSS que representen colors bàsics i canviar-les en temps real, habilitant sistemes de disseny responsius i temes dinàmics. Aquest mètode fa possible esquemes de colors escalables i que es puguin mantenir en aplicacions en línia contemporànies quan s'utilitzen amb funcions de color relatiu CSS.
L'ús del model d'objectes tipificats CSS (Typed OM) és un mètode addicional per resoldre el problema d'obtenir el color final calculat. Els desenvolupadors poden treballar de manera més programàtica i sistemàtica amb els atributs CSS gràcies a Typed OM. Ara es pot accedir als valors CSS com a objectes JavaScript gràcies a Typed OM, que elimina la necessitat de mètodes basats en cadenes. Colors relatius i altres beneficiar-se d'això, ja que ofereix un control més precís sobre la manipulació de la propietat.
Finalment, si voleu fer un seguiment dels canvis en els estils d'elements, especialment quan les variables CSS o els valors de color relatius s'alteren dinàmicament, penseu a utilitzar JavaScript. . MutationObserver pot fer un seguiment de les modificacions al DOM, com ara ajustos als estils en línia d'un element. Podeu fer que la vostra lògica de JavaScript torni a calcular el color i l'actualitzeu d'acord amb els canvis d'estil aplicables. Aquesta tècnica funciona especialment bé per a interfícies altament dinàmiques, on els canvis d'estil es produeixen regularment en resposta a les entrades de l'usuari o fonts externes.
- Com ho fa treballar quan es tracta de colors relatius?
- obté el valor final amb el qual s'ha calculat una propietat CSS; no obstant això, sovint retorna el color relatiu com una cadena en lloc del color calculat final.
- El color final es pot extreure amb a element funciona per a mi?
- Sí, és possible renderitzar el color i extreure dades de píxels per obtenir el color hexadecimal final utilitzant un petit i el enfocament.
- Quin és el paper de en aquest procés?
- Five facilita el treball amb colors en diversos formats i facilita les conversions de colors. Per exemple, podeu convertir ràpidament RGB a hexadecimal.
- Per a què s'utilitzen els colors relatius CSS?
- Els desenvolupadors poden implementar la transparència alfa per als dissenys sensibles i modificar dinàmicament els canals de color augmentant o reduint els valors RGB mitjançant colors relatius CSS.
- Puc detectar canvis d'estil mitjançant JavaScript?
- Sí, podeu tornar a calcular els colors segons sigui necessari i escoltar els canvis d'estil en temps real utilitzant el API.
Pot ser difícil determinar el color final a partir dels colors relatius CSS perquè sovint només produeix la cadena original. Aquest mètode es pot fer molt més senzill utilitzant una biblioteca com Chroma.js o a per a l'extracció de dades de píxels.
Els desenvolupadors poden extreure, alterar i aplicar aquests colors de manera eficient utilitzant eines i API de JavaScript. Tant les solucions natives com les biblioteques de tercers proporcionen mètodes escalables per gestionar les sortides de color relatius CSS de manera dinàmica, depenent de les necessitats del vostre projecte.
- S'explica l'ús del mètode per a l'extracció de propietats CSS en JavaScript. Per a més lectura, visiteu: MDN Web Docs: getComputedStyle .
- Explica l'ús de la element per extreure dades de color de píxels en JavaScript. Informació detallada disponible a: MDN Web Docs: manipulació de píxels amb llenç .
- La documentació de Chroma.js proporciona detalls sobre la conversió i la manipulació de colors en JavaScript. Més informació aquí: Documentació oficial de Chroma.js .
- Podeu trobar informació sobre els colors relatius de CSS i les seves aplicacions a les especificacions CSS: Mòdul de color CSS nivell 4 .