Los pseudoelementos::before
y ::after
son generados por CSS, eso quiere decir que no existen en el DOM, pero hoy te mostraré un truco para manipular los estilos de dichos pseudoelementos con JavaScript.
Variables CSS
Por si no estabas enterado, las variables CSS ya son una realidad, pero, ¿qué tienen que ver en este caso? Las variables CSS, a diferencia de los pseudoelementos, sí son accesibles por JavaScript a través de la siguiente instrucción:
1/* 2* element => Elemento al que queremos acceder. En este caso el elemento que genere el pseudoelemento 3* propertyName => La propiedad que queremos cambiar. En este caso la variable css 4* value => nuevo valor por asignar 5*/ 6 7element.style.setProperty(propertyName, value) 8
Recuerda que las variables CSS son en realidad propiedades CSS, por lo tanto, son heredadas por los descendientes (hijos, nietos, etc). Además, por teoría, un elemento que genera un pseudoelemento pasa a ser padre de éste último, por lo que al declarar una variable en un elemento, sus hijos (incluyendo los pseudoelementos) tienen acceso a dicha variable. Basados en este principio, pasemos a la parte práctica:
HTML
1<button class="button center" id="button">Cambiar valor de la variable</button> 2<div class="container" id="container"></div> 3
CSS
1.container { 2 --bg-pseudo : hsl(20, 90%, 60%); /* Variable que almacena el color de fondo del pseudoelemento */ 3 display : flex; 4 justify-content : center; 5 align-items : center; 6 width : 50px; 7 height : 50px; 8 margin : 0 auto; 9 background : hsl(240, 70%, 60%); 10} 11 12.container::before { 13 content : ''; 14 display : block; 15 width : 20px; 16 height : 20px; 17 background : var(--bg-pseudo); 18} 19
Para este ejercicio declaramos la variable --bg-pseudo
que está destinada a ser el fondo del pseudoelemento. Supongamos que queremos cambian el código del color de esa variable, entonces hacemos lo siguiente:
JS
1// Obtenemos el contenedor padre y el botón para poder detectar el click 2let container = document.getElementById('container'), 3 button = document.getElementById('button') 4 5// Creamos evento click para cambiar el color 6button.addEventListener('click', () => { 7 container.style.setProperty('--bg-pseudo', 'hsl(100, 90%, 60%)') 8}) 9
Resultado
Cambiar valor de la variable
Asombroso, ¿no lo crees? Pero ahí no acaba la cosa, podemos obtener el mismo resultado reasignando el valor de la variable mediante clases en CSS y JS sólo se encargará de manipular clases y no estilos. Veamos cómo logarlo utilizando el ejemplo anterior, pero de forma más divertida que consiste en obtener colores aleatorios previamente declarados:
HTML
1 2<button class="button center" id="button">Cambiar valor de la variable</button> 3<div class="container" id="container"></div> 4
CSS
1.container { 2 --bg-pseudo : hsl(127, 100%, 50%); /* Colocamos un color por defecto */ 3 display : flex; 4 justify-content : center; 5 align-items : center; 6 width : 50px; 7 height : 50px; 8 margin : 0 auto; 9 background : hsl(240, 70%, 60%); 10} 11 12/* Clases que asignan el color a la variable */ 13.container.green { 14 --bg-pseudo : hsl(127, 100%, 50%); 15} 16 17.container.red { 18 --bg-pseudo : hsl(0, 100%, 54%); 19} 20 21.container.orange { 22 --bg-pseudo : hsl(23, 100%, 54%); 23} 24 25.container.yellow { 26 --bg-pseudo : hsl(50, 100%, 54%); 27} 28 29.container::before { 30 content : ''; 31 display : block; 32 width : 20px; 33 height : 20px; 34 background : var(--bg-pseudo); 35} 36
JS
1let container = document.getElementById('container'), 2 button = document.getElementById('button'), 3 // Arreglo que contiene el nombre de las clases que reasignan el valor de la variable CSS 4 colorClass = ['green', 'red', 'orange', 'yellow'] 5 6// Función para obtener un color aleatorio del arreglo 7const getColorClass = () => { 8 let random = Math.round(Math.random() * (colorClass.length - 1)) 9 return colorClass[random] 10} 11 12// Asignamos el color aleatorio a la viaable 13button.addEventListener('click', () => { 14 colorClass.map(color => container.classList.remove(color)) 15 container.classList.add(getColorClass()) 16}) 17
Resultado
Cambiar valor de la variable
Para este momento, manipular los estilos de un pseudoelemento no te volverá a provocar dolores de cabeza. Aprovecho para recordarte que EDteam tiene un curso de Variables CSS¡Totalmente gratis!