Tengo un objeto de datos que contiene datos para encontrar un elemento específico que existe dentro de un árbol DOM y después de encontrar ese elemento, quiero cambiarlo agregando css en línea.
{ outerHtml: '<a class="btn btn-pill">\n <svg xmlns="http://www.w3.org/2000/svg" class="icon" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path>', selector: ".col-auto.ml-auto.d-print-none>.d-flex>.btn.btn-pill", style: `background-color: #206bc4; color: white; svg { color: white }`, }Estoy utilizando estos datos e inyectando los datos de estilo en el elemento una vez que lo encuentro. Como puede ver en mi HTML externo, el elemento principal también tiene un elemento secundario y, en mi estilo, también tengo el css para cambiar el color de svg. Pero cuando uso mi código a continuación. Solo cambia el estilo de la etiqueta a en comparación con el svg también.
Nota: el HTML externo y el selector son solo para encontrar el elemento correcto para cambiar. Algo así como identificadores únicos
Todo lo que hago en el siguiente código es usar mis selectores para encontrar el elemento correcto y luego agregar el CSS al nodo final.
export function findAndInject(remove) { const data = getData(); let selector = data.selector.split(','); let select; for (const prop in selector) { if (prop == 0) { select = document.querySelector(selector[prop]); } else { select = select.querySelector(selector[prop]); } } if (remove) { select.style.cssText = null; } else { select.style.cssText = data.style; } } Sé que el problema es probablemente que estoy haciendo style.cssText pero ¿hay alguna otra forma en que pueda agregar un estilo en línea que también se pueda agregar al elemento secundario sin crear una hoja de estilo o usar etiquetas de estilo?
El ícono Más debe ser blanco.
La respuesta corta es: No, no es posible agregar estilos en línea que también se puedan aplicar al niño. Para obtener una buena explicación de por qué "por qué", puede consultar esta publicación ( https://stackoverflow.com/a/5293299/3180489 ) que explica sucintamente (con referencias):
No se permiten selectores (incluidos los pseudoelementos), ni reglas at, ni ninguna otra construcción de CSS.
Piense en los estilos en línea como los estilos aplicados a algún selector de ID superespecífico anónimo: esos estilos solo se aplican a ese mismo elemento con el atributo de estilo. (También tienen prioridad sobre un selector de ID en una hoja de estilo, si ese elemento tiene esa ID). Técnicamente, no funciona así; esto es solo para ayudarlo a comprender por qué el atributo no admite estilos de pseudoclase o pseudoelemento (tiene más que ver con cómo las pseudoclases y los pseudoelementos proporcionan abstracciones del árbol del documento que no se pueden expresar en el idioma del documento).
Dicho esto, para este caso particular, es posible que pueda modificar sus iconos SVG para "heredar" el color del elemento principal, si elige seguir esa ruta.
Supongo que el problema es su código svg, al menos su fragmento de ejemplo no funcionará.
Aquí hay un ejemplo de trabajo:
.icon { display: inline-block; height: 1em; font-size: 1em; position: relative; bottom: -0.1em; } .btn { padding: 0.3em; } <p> <a class="btn btn-pill" style="background-color: #206bc4; color: white;"> <svg class="icon icon-plus" id="icon-plus" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <line x1="12" y1="5" x2="12" y2="19" class="icon-inner-stroke"></line> <line x1="5" y1="12" x2="19" y2="12" class="icon-inner-stroke"></line> </svg> New Campaign </a> </p> <p> <a class="btn btn-pill" style="background-color: #206bc4; color: white;"> <svg class="icon icon-square-plus" viewBox="0 0 448 512"> <path fill="currentColor" d="M319.1 232h-72V160c0-13.25-10.74-24-23.1-24S199.1 146.7 199.1 160v72H127.1C114.7 232 103.1 242.7 103.1 256S114.7 280 127.1 280h71.1V352c0 13.25 10.75 24 24 24s23.1-10.75 23.1-24V280h72c13.25 0 23.1-10.75 23.1-24S333.3 232 319.1 232zM384 32H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h320c35.35 0 64-28.65 64-64V96C448 60.65 419.3 32 384 32zM400 416c0 8.822-7.178 16-16 16H64c-8.822 0-16-7.178-16-16V96c0-8.822 7.178-16 16-16h320c8.822 0 16 7.178 16 16V416z"></path> </svg> New Campaign </a> </p> En su ejemplo, el elemento <path> tenía atributos de trazo y relleno establecidos explícitamente en ninguno.
Por lo tanto, se omitió la regla de relleno currentColor .
Otro enfoque podría ser el uso de una propiedad personalizada/variable css :
<a class="btn btn-pill" style="background-color: #eee; --iconColor: green;"> <svg class="icon icon-plus" id="icon-plus" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round" style="stroke:var(--iconColor)"> <line x1="12" y1="5" x2="12" y2="19" class="icon-inner-stroke"></line> <line x1="5" y1="12" x2="19" y2="12" class="icon-inner-stroke"></line> </svg> New Campaign </a>