¿Cómo podemos elevar la complejidad de los estilos en web components?
Al desarrollar aplicaciones web modernas, aumentar la complejidad de los estilos en los web components puede parecer una tarea abrumadora. Sin embargo, la clave está en el uso efectivo de pseudoclases como :host. Esta pseudoclase nos permite definir estilos base para nuestros componentes. Imagina poder dar a cada componente un conjunto de características visuales únicas, haciendo que el diseño sea más coherente y atractivo. Exploraremos cómo utilizar :host, junto con otras técnicas, para transformar nuestros web components.
¿Qué es la pseudoclase :host?
La pseudoclase :host se utiliza principalmente para aplicar estilos al propio componente web. Esto va más allá de los estilos visuales, como el color o las imágenes. En cambio, se concentra en dar un conjunto de estilos base que definen las características fundamentales de un componente.
Ejemplo de uso básico: Queremos que nuestro componente no se comporte como un bloque por defecto, sino como un inline-block. Esto se logra al aplicar estilos directamente en :host.
La verdadera potencia de :host surge cuando personalizamos estilos basándonos en clases, atributos o el contexto del componente. Esto permite tener variantes del mismo componente con diferentes estilos.
Usando clases: Podemos aplicar un estilo específico a un componente basado en una clase particular. Por ejemplo, si al componente le añadimos la clase blue, podemos cambiar el fondo a azul:
<style>:host(.blue){background:blue;}</style>
Mediante atributos: Otra vía es emplear atributos para cambiar estilos. Así, un atributo yellow podría modificar los estilos del componente:
¿Qué ventajas ofrece :host en el contexto de los web components?
Poder aplicar estilos en función del contexto es otro aspecto clave. Supongamos que un componente está dentro de un contenedor particular, como un article con la clase cards. Podemos ajustar los estilos para esa situación exacta:
¿Cómo cambiar los estilos del contenido del componente?
Además de personalizar el propio componente, :host permite modificar estilos del contenido interno basado en condiciones específicas. Esto significa dirigir cambios hacia elementos particulares dentro del componente, como un h1 o un párrafo.
En esencia, la combinación de :host con el correcto uso de clases, atributos y contexto, nos confiere un control detallado sobre la apariencia y comportamiento de nuestros web components. Así, logramos desarrollar interfaces más interesantes y eficientes. La progresión hacia estilos más complejos y personalizados nunca ha sido más accesible, y cada nuevo proyecto es una oportunidad para experimentar y seguir aprendiendo. Atrévete a explorar estas técnicas en tus próximos proyectos de desarrollo web.
:HOST
Pseudoclase que utilizaremos para darle estilos a nuestro componente web (no se trata necesariamente de los estilos visuales).
.
Se trata de los estilos que vienen definidos por default con una etiqueta, como pueden ser display, padding y margin.
.
:host da estilos al componente
.
La pseudoclase :host se utiliza dentro del método donde escribíamos nuestro css del componente getStyles(){}
.
**:host **{estilos para el componente}
.
Teniendo varias instancias de un componente, si a una le agregamos una clase por ejemplo 'blue'
:host(.blue) {estilos para el componente con la clase blue}
Va a buscar el elemento que tenga de atributo una clase con el valor blue y le va a agregar los estilos que definimos.
.
También podemos darle estilos por atributo. Por ejemplo si a una instancia le agregamos el atributo 'yellow'
:host([yellow]) {estilos para el elemento que tenga el atributo yellow}
.
También podemos agregar cierto contexto.
Por ejemplo, si tenemos una instancia del componente dentro de un article con una clase 'card'
:host-context(article.card) {estilos}
.
Hacer cambios al contenido del componente
:host([yellow]) h1 {estilos}
Gracias por este resumen.
maravilloso, muchas gracias .
MY NOTES FOR PSEUDOCLASS :HOST
En estas clases veremos los estilos que se manejaran tanto fuera como dentro de los web components
.
:host es una pseudoclase para darle estilo que define a nuestro componente web que no quiere decir que son necesariamente visuales, si no que son los estilos que ya vienen previamente definidos en la pseudeclase host de ese elemento.
.
Nosotros podemos definir esos estilos base que nos ayudan a definir ciertas características base para poder modificar los estilos de nuestra manera.
.
La pseudoclase :host se utiliza dentro del método donde escribíamos nuestro css del componente getStyles(){} y tiene que estar dentro de las etiquetas style para que funcionen estos estilos.
.
utilizando esta pseudo clase podremos añadirle estilos base a nuestro elemento
.
host le dará estilos al componente y los que estén fuera del :host son los que le darán estilo a los elementos que están dentro de nuestro componente.
.
Aqui le decimos al pseudclase host que si encuentra un elemento con la clase blue haga lo siguiente
En este caso solo cambiaria al componente que tenga la clase blue
A los demás si le agrega los cambios que ya tenían previamente.
.
.
También podemos darle estilos por atributos, entonces lo que hacemos es indicarle un atributo a nuetro elemento
:host([atributo]){}
:host([yellow]){background:yellow;}
Tambien podremos agregar estilos por contexto, es decir le indicamos a nuestra pseudoclase el elemento donde esta nuestro componente junto con su clase y podremos agregarle estilos
Esto se ve interesante, aunque me pregunto si es recomendable cambiar muchos estilos de un componente 🤔... Es decir, un componente debe ser reutilizable, y si empezamos a darle displays, tamaños de caja y demás, es posible que dicho componente tenga problemas para adaptarse a los lugares en donde queremos reutilizarlos 🤔
.
Dejo el código de la clase:
.
Adicion de estilos a los componentes con host
Me estaba preguntando lo mismo, pero definitivamente si es necesario darle unos estilos por defecto.
Tienes razón, pero entiendo que la pseudo clase :host nos sirve para darle estilos de forma predeterminada a nuestros componentes, por lo que cualquiera que los use puede cambiarlos si así lo desea. Por ejemplo la etiqueta <p> viene con estilos como display block, nada nos impide ponerle un display inline.
Buen dia, Increible pseudoclase :host.
esta clase hice unas mejoras.
<body><my-element><span slot="title">AppleMusic</span><span slot="description">The standard chunk ofLoremIpsum used since the 1500s is reproduced below for those interested.Sections1.10.32 and 1.10.33from"de Finibus Bonorum et Malorum" by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H.Rackham.</span></my-element><my-element class="white-container"><span slot="title">AppleTV</span><span slot="description">The standard chunk ofLoremIpsum used since the 1500s is reproduced below for those interested.Sections1.10.32 and 1.10.33from"de Finibus Bonorum et Malorum" by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H.Rackham.</span></my-element><my-element orange-container><span slot="title">AppleCare</span><span slot="description">The standard chunk ofLoremIpsum used since the 1500s is reproduced below for those interested.Sections1.10.32 and 1.10.33from"de Finibus Bonorum et Malorum" by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H.Rackham.</span></my-element><article class="card"><my-element yellow-container><span slot="title">AppleCart</span><span slot="description">The standard chunk ofLoremIpsum used since the 1500s is reproduced below for those interested.Sections1.10.32 and 1.10.33from"de Finibus Bonorum et Malorum" by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H.Rackham.</span></my-element></article><script src="./my-element.js" type="module"></script></body>
como sera de ancho el compu del profe que a él le salen los tres componentes sin hacer salto de linea en el mio en cambio uno queda abajo.
necesito una laptop mas ancha? 🤨 🤔
una pantalla mas ancha
necesitas un monitor para no solo tener la pantalla de tu laptop xd
Esta extensión de VS Code nos permite ponerle higlight al css que escribimos en JS. Solo para que sea visualmente más fácil de leer: es6-string-css
Para usar el highlight solo escribimos un comentario
Les recomiendo enumerar las carpetas en el orden que fueron creadas para que no se pierda la progresividad secuencial del curso.
Cuando estén testeando si se realizó el cambio del display: in-line del componente con :host y su pantalla no es gigante como la del profesor, en la consola dev-tools pueden acceder al menú de los 3 puntos y hacer uso de "Dock side", que les permititrá mover la consola de posición. Lo más cool de esta feature es su atajo: Ctrl + Shift + D que les va a permitir intercalar rápidamente entre las dos últimos posiciones de la consola utilizadas.
Dame los puntos mas importantes de la clase Separalos por semantica humana, listas, titulos, subtitulos, negrillas, etc. Quiero que el resumen sea lo mas claro y conciso posible Omite informacion como saludo, nombre, etc
Omite la pregunta final.
El poder de :host en Web Components
La pseudoclase :host es la herramienta fundamental para definir los estilos base de tu componente web, permitiéndote controlar el elemento "contenedor" mismo, no solo su contenido interno.
Conceptos clave
Definición de estilos base: Al igual que el navegador asigna estilos por defecto a etiquetas como <h1> o <p>, :host te permite establecer las reglas iniciales (display, dimensiones, tipografía) para tu componente.
Encapsulamiento: Es una pseudoclase exclusiva para Web Components. Todo estilo definido aquí debe estar dentro de una etiqueta <style> para que el navegador lo procese correctamente.
Personalización avanzada
Por estado o atributo: Puedes aplicar estilos específicos según clases (:host(.blue)) o atributos (:host([yellow])) presentes en la instancia del componente.
Contexto del padre: Es posible alterar el estilo según el entorno donde se encuentre el componente, usando selectores como :host(article.card).
Estilos internos condicionales: Puedes modificar elementos internos (como un <h1> o <p>) basándote en el estado del host, usando la sintaxis :host([atributo]) h1 { ... }.
hola los navegadores me estan bloqueando el acceso ami archivo js ccess to script at 'file:///C:/Users/57311/Documents/vs_accesible/JSFRontEnd/WEBcomponents/custumElements/host.js' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: chrome, chrome-extension, chrome-untrusted, data, http, https, isolated-app. ¿ porque sera,qeu hago?
Diego una consulta
¿Es posible recuperar el autocompletado en las lineas de codigo del componente donde se usan backtick?
Si, yo uso la extensión es6-string-css y es6-string-html :)
yo prototypo el html en un archivo aparte, y el css con un procesador. luego ctrc ctrv
Esa nomenclatura de definir estilos con paréntesis rectos y curvos, es por los selectores de CSS? Dónde podría ver este tipo de selectores definidos?
Cuando haces seleccion de elementos por los atributos
Cuando utilizamos :host-context(article.card) en nuestro componente, estamos aplicando estilos específicos a nuestro componente solo si se encuentra dentro de un elemento <article> que tiene la clase card. Esto permite que el componente tenga un estilo diferente basado en su contexto, facilitando la personalización de presentación según el entorno en que se encuentre. Los estilos aplicados pueden incluir propiedades como display, background-color, o cualquier otra propiedad CSS que defina la apariencia del componente en ese contexto específico.
¡¿ que pasa si lo de esta clase no se hace con atributeChangedCallback en vez de slots? lo pregunto porque el cambiar el display a inline block no me funciona como en la clase, intente cambiandolo a flex y aplicando wrap y me di cuenta que reorganiza las etiquetas dentro de mi componente. para obtener algo similar a la clse tendria que enscerrar en el html tods los componentes dentro de un div y ahi aplicar el flex o inlineblock.
El host afecta a un contenedor diferente al seccion. es como si el seccion estuviera dentro de un div .¿dentro de mi codigo ademas de un titulo y un parrafo tengo una imagen encapsulada en un div y un boton. para el estilo copie y pegue el estylo del :host de la clase, peroel inline block no parece funcionar. ¿alguna idea de el porque ?
hay alguna manera pueda hacer esto con un preprocesador? se me ocurria que al crear componentes, seria mejor escribir los estilos en un preprocesador y luego tomar el codigo css que el preprocesador me da (es un codigo optimizado) para asi pegarlo en el metodo getStyles de mi componente, pero con lo que vimos en eesta clase ya no se si es viable esta estrategia.
:host-context no funciona ni en Firefox ni en Safari.
Me pase varios minutos buscando que estaba haciendo mal. Comparto por si a alguien le sucede lo mismo.
Hay una discusión en GitHub respecto a eliminar :host-context de la implementación de los web components, ya que parece que ni Firefox ni Safari tienen intención de agregar soporte:
El selector :host se utiliza para seleccionar el elemento personalizado (componente) en sí mismo al aplicar estilos CSS desde dentro del propio componente.
Cuando creas un componente web personalizado utilizando tecnologías como Custom Elements, Shadow DOM y HTML Templates, el componente encapsula su propio DOM y estilos. La pseudo-clase :host te permite definir estilos específicos para el propio componente desde dentro del Shadow DOM, donde los estilos del componente no afectarán a otros elementos fuera de su alcance.
Fascinantes estos web components, ya me vi usándolos en mis proyectos : D