<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Html Y CSS · DacaCode &lt;/&gt;</title><link>https://blog.dacadev.com/series/html-y-css/</link><description>Blog de tecnología, programación y electrónica, para compartir conocimientos, experiencias y tutoriales con este apasionante mundo.</description><generator>Hugo</generator><language>es-CO</language><copyright>Copyright © 2026 DacaDev. All rights reserved.</copyright><lastBuildDate>Thu, 18 Jun 2026 00:00:00 -0500</lastBuildDate><atom:link href="https://blog.dacadev.com/series/html-y-css/index.xml" rel="self" type="application/rss+xml"/><image><url>https://blog.dacadev.com/images/blog-logo.png</url><title>DacaCode &lt;/&gt;</title><link>https://blog.dacadev.com/</link></image><item><title>Estilos CSS: Animaciones con @keyframes</title><link>https://blog.dacadev.com/programacion/estilos-css/animaciones-keyframes/</link><pubDate>Thu, 18 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/animaciones-keyframes/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina las animaciones en CSS con @keyframes: la propiedad animation, iteraciones, direction, fill-mode, play-state, accesibilidad y rendimiento, con ejemplos en vivo.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/09-animaciones-keyframes-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#transición-vs-animación"&gt;Transición vs. animación&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-regla-keyframes"&gt;La regla @keyframes&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#múltiples-pasos-con-porcentajes"&gt;Múltiples pasos con porcentajes&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-propiedad-animation-y-sus-subpropiedades"&gt;La propiedad animation y sus subpropiedades&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#iteration-count-y-direction"&gt;iteration-count y direction&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#fill-mode-el-estado-antes-y-después"&gt;fill-mode: el estado antes y después&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#play-state-y-delay"&gt;play-state y delay&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#encadenar-varias-animaciones"&gt;Encadenar varias animaciones&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#accesibilidad-respeta-prefers-reduced-motion"&gt;Accesibilidad: respeta prefers-reduced-motion&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#rendimiento-anima-en-la-capa-de-composición"&gt;Rendimiento: anima en la capa de composición&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Una transición anima el salto entre dos estados; pero cuando necesitas movimiento continuo, varios pasos intermedios o una secuencia que se repite —un spinner de carga, un latido, un texto que aparece— necesitas algo más expresivo. Ahí entran las &lt;strong&gt;animaciones con &lt;code&gt;@keyframes&lt;/code&gt;&lt;/strong&gt;, el sistema de CSS para describir secuencias de movimiento complejas de forma declarativa, sin una sola línea de JavaScript.&lt;/p&gt;
&lt;p&gt;Esta entrega extiende la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;, retomando justo donde lo dejaron las transiciones y transformaciones. Cubriremos la regla &lt;code&gt;@keyframes&lt;/code&gt;, todas las subpropiedades de &lt;code&gt;animation&lt;/code&gt;, y las consideraciones de accesibilidad y rendimiento que separan una animación profesional de una que marea al usuario.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Aprenderás a definir secuencias con &lt;code&gt;@keyframes&lt;/code&gt;, a controlarlas con la propiedad &lt;code&gt;animation&lt;/code&gt; y sus ocho subpropiedades, y a respetar las preferencias de movimiento del usuario con &lt;code&gt;prefers-reduced-motion&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="transición-vs-animación"&gt;Transición vs. animación&lt;/h2&gt;
&lt;p&gt;Aunque ambas producen movimiento, resuelven problemas distintos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Una &lt;strong&gt;transición&lt;/strong&gt; (&lt;code&gt;transition&lt;/code&gt;) interpola entre el estado actual y uno nuevo. Necesita un disparador —un &lt;code&gt;:hover&lt;/code&gt;, un cambio de clase— y va de un punto A a un punto B.&lt;/li&gt;
&lt;li&gt;Una &lt;strong&gt;animación&lt;/strong&gt; (&lt;code&gt;animation&lt;/code&gt;) ejecuta una secuencia definida en &lt;code&gt;@keyframes&lt;/code&gt;. No necesita disparador: puede arrancar sola, repetirse indefinidamente y pasar por múltiples estados intermedios.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Regla práctica: usa &lt;code&gt;transition&lt;/code&gt; para cambios de estado provocados por interacción; usa &lt;code&gt;animation&lt;/code&gt; para movimiento autónomo, cíclico o multipaso.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="la-regla-keyframes"&gt;La regla @keyframes&lt;/h2&gt;
&lt;p&gt;Una animación se define en dos partes: la &lt;strong&gt;secuencia&lt;/strong&gt; (con &lt;code&gt;@keyframes&lt;/code&gt;) y su &lt;strong&gt;aplicación&lt;/strong&gt; (con la propiedad &lt;code&gt;animation&lt;/code&gt;). La regla &lt;code&gt;@keyframes&lt;/code&gt; recibe un nombre y describe los estados de la animación en distintos momentos, expresados como porcentajes del 0% al 100% (o con las palabras clave &lt;code&gt;from&lt;/code&gt; y &lt;code&gt;to&lt;/code&gt;).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;aparecer&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;from&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;opacity&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;translateY&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;to&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;opacity&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;translateY&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;elemento&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;aparecer&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.6&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease-out&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;style&gt;
 @keyframes csanim-aparecer {
 from { opacity:0; transform:translateY(1rem); }
 to { opacity:1; transform:translateY(0); }
 }
 .csanim-fade { display:inline-block; background:#2a9da9; color:#fff; padding:.8em 1.4em; border-radius:.4em; animation:csanim-aparecer 1.2s ease-out infinite; }
 &lt;/style&gt;
 &lt;span class="csanim-fade"&gt;Aparezco con fade + desplazamiento&lt;/span&gt;
 &lt;p style="margin:.75rem 0 0;color:#555;"&gt;La secuencia se repite para que puedas observarla.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="múltiples-pasos-con-porcentajes"&gt;Múltiples pasos con porcentajes&lt;/h3&gt;
&lt;p&gt;El verdadero poder de &lt;code&gt;@keyframes&lt;/code&gt; aparece con pasos intermedios. Cada porcentaje es una &amp;ldquo;foto&amp;rdquo; del estado en ese momento de la animación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;latido&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;0&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;15&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1.25&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;30&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;45&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1.15&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;60&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;text-align:center;"&gt;
 &lt;style&gt;
 @keyframes csanim-latido {
 0% { transform:scale(1); }
 15% { transform:scale(1.25); }
 30% { transform:scale(1); }
 45% { transform:scale(1.15); }
 60% { transform:scale(1); }
 100% { transform:scale(1); }
 }
 .csanim-heart { display:inline-block; font-size:2.5rem; color:#c0392b; animation:csanim-latido 1.5s ease-in-out infinite; }
 &lt;/style&gt;
 &lt;span class="csanim-heart"&gt;♥&lt;/span&gt;
&lt;/div&gt;
&lt;h2 id="la-propiedad-animation-y-sus-subpropiedades"&gt;La propiedad animation y sus subpropiedades&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;animation&lt;/code&gt; es una propiedad abreviada que agrupa ocho subpropiedades. Conviene conocerlas por separado para tener control fino:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Subpropiedad&lt;/th&gt;
 &lt;th&gt;Función&lt;/th&gt;
 &lt;th&gt;Ejemplo&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-name&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Nombre del &lt;code&gt;@keyframes&lt;/code&gt; a ejecutar&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;aparecer&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-duration&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Duración de un ciclo&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0.6s&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-timing-function&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Curva de progreso&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ease-in-out&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-delay&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Espera antes de iniciar&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;200ms&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-iteration-count&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Número de repeticiones&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;infinite&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-direction&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Sentido de reproducción&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;alternate&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-fill-mode&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Estilos antes/después de animar&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;forwards&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;animation-play-state&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Reproducir o pausar&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;paused&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La forma abreviada las combina en una sola declaración:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;spinner&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;girar&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;linear&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;infinite&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;/* name | duration | timing-function | iteration-count */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="iteration-count-y-direction"&gt;iteration-count y direction&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;animation-iteration-count&lt;/code&gt; define cuántas veces se ejecuta (&lt;code&gt;infinite&lt;/code&gt; para un bucle perpetuo). &lt;code&gt;animation-direction&lt;/code&gt; controla el sentido:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;normal&lt;/code&gt; — siempre de 0% a 100%.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reverse&lt;/code&gt; — siempre de 100% a 0%.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alternate&lt;/code&gt; — alterna ida y vuelta en cada ciclo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alternate-reverse&lt;/code&gt; — igual, pero empezando al revés.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El caso clásico es un &lt;strong&gt;spinner&lt;/strong&gt; de carga, que combina rotación infinita con velocidad constante:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;girar&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;to&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;rotate&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;360&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;); } }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;spinner&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;girar&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.8&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;linear&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;infinite&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;text-align:center;"&gt;
 &lt;style&gt;
 @keyframes csanim-girar { to { transform:rotate(360deg); } }
 .csanim-spinner { display:inline-block; width:2.5rem; height:2.5rem; border:.3rem solid #d6eaf0; border-top-color:#2a9da9; border-radius:50%; animation:csanim-girar .8s linear infinite; }
 &lt;/style&gt;
 &lt;span class="csanim-spinner" role="status" aria-label="Cargando"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;h3 id="fill-mode-el-estado-antes-y-después"&gt;fill-mode: el estado antes y después&lt;/h3&gt;
&lt;p&gt;Por defecto, un elemento vuelve a su estilo original en cuanto la animación termina. &lt;code&gt;animation-fill-mode&lt;/code&gt; cambia ese comportamiento:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;none&lt;/code&gt; (por defecto) — no conserva estilos fuera de la ejecución.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;forwards&lt;/code&gt; — mantiene el estado del último keyframe al terminar.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;backwards&lt;/code&gt; — aplica el primer keyframe durante el &lt;code&gt;delay&lt;/code&gt;, antes de arrancar.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;both&lt;/code&gt; — combina &lt;code&gt;forwards&lt;/code&gt; y &lt;code&gt;backwards&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;forwards&lt;/code&gt; es esencial cuando quieres que el elemento permanezca en su estado final (por ejemplo, un mensaje que aparece y se queda visible):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;toast&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;aparecer&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease-out&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;forwards&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="play-state-y-delay"&gt;play-state y delay&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;animation-play-state&lt;/code&gt; permite pausar (&lt;code&gt;paused&lt;/code&gt;) y reanudar (&lt;code&gt;running&lt;/code&gt;) una animación, típicamente al combinarla con &lt;code&gt;:hover&lt;/code&gt;. Aquí, la barra de progreso se anima sola pero se congela al pasar el cursor:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;cargar&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;from&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;width&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; } &lt;span style="color:#e06c75"&gt;to&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;width&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;100&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;; } }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;barra__relleno&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;cargar&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease-in-out&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;infinite&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;barra&lt;/span&gt;:&lt;span style="color:#61afef"&gt;hover&lt;/span&gt; .&lt;span style="color:#e5c07b"&gt;barra__relleno&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;animation-play-state&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;paused&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;style&gt;
 @keyframes csanim-cargar { 0% { width:0; } 100% { width:100%; } }
 .csanim-barra { background:#e5e8e8; border-radius:1rem; overflow:hidden; height:1rem; }
 .csanim-barra__relleno { height:100%; width:0; background:linear-gradient(to right,#2a9da9,#16828d); border-radius:1rem; animation:csanim-cargar 3s ease-in-out infinite; }
 .csanim-barra:hover .csanim-barra__relleno { animation-play-state:paused; }
 &lt;/style&gt;
 &lt;div class="csanim-barra"&gt;&lt;div class="csanim-barra__relleno"&gt;&lt;/div&gt;&lt;/div&gt;
 &lt;p style="margin:.75rem 0 0;color:#555;"&gt;Pasa el cursor sobre la barra para pausar la animación.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="encadenar-varias-animaciones"&gt;Encadenar varias animaciones&lt;/h2&gt;
&lt;p&gt;Puedes aplicar varias animaciones a un mismo elemento separándolas con comas. Cada una mantiene su propia duración, retraso y curva, lo que permite componer comportamientos independientes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;elemento&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;aparecer&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease-out&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;flotar&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease-in-out&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;infinite&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;alternate&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;text-align:center;"&gt;
 &lt;style&gt;
 @keyframes csanim-flotar { from { transform:translateY(0); } to { transform:translateY(-12px); } }
 .csanim-flota { display:inline-block; background:#f39c12; color:#fff; padding:1em 1.6em; border-radius:.5em; box-shadow:0 .4em .8em rgba(0,0,0,.2); animation:csanim-flotar 1.8s ease-in-out infinite alternate; }
 &lt;/style&gt;
 &lt;span class="csanim-flota"&gt;Floto suavemente&lt;/span&gt;
&lt;/div&gt;
&lt;h2 id="accesibilidad-respeta-prefers-reduced-motion"&gt;Accesibilidad: respeta prefers-reduced-motion&lt;/h2&gt;
&lt;p&gt;El movimiento excesivo puede causar mareos o malestar a personas con sensibilidad vestibular. Los sistemas operativos exponen una preferencia de &amp;ldquo;reducir movimiento&amp;rdquo;, y CSS la consulta con la media query &lt;code&gt;prefers-reduced-motion&lt;/code&gt;. Es una responsabilidad profesional desactivar o atenuar las animaciones no esenciales cuando el usuario lo solicita:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;prefers-reduced-motion&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;reduce&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;*,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;::&lt;span style="color:#61afef"&gt;before&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation-duration&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.01&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;ms&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;animation-iteration-count&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;transition-duration&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.01&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;ms&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Ignorar &lt;code&gt;prefers-reduced-motion&lt;/code&gt; es un fallo de accesibilidad real. Reserva las animaciones llamativas para lo decorativo y asegúrate de que la interfaz siga siendo plenamente funcional cuando el movimiento se reduce.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="rendimiento-anima-en-la-capa-de-composición"&gt;Rendimiento: anima en la capa de composición&lt;/h2&gt;
&lt;p&gt;La misma regla de oro de las transiciones aplica aquí: anima propiedades que solo afecten la etapa de &lt;strong&gt;composición&lt;/strong&gt; del navegador —&lt;code&gt;transform&lt;/code&gt; y &lt;code&gt;opacity&lt;/code&gt;— en lugar de propiedades que disparen &lt;em&gt;layout&lt;/em&gt; o &lt;em&gt;paint&lt;/em&gt; (&lt;code&gt;width&lt;/code&gt;, &lt;code&gt;height&lt;/code&gt;, &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;left&lt;/code&gt;, &lt;code&gt;margin&lt;/code&gt;).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/* ❌ Costoso: recalcula layout en cada frame */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;mover-malo&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;to&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;left&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;200&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;; } }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/* ✅ Eficiente: solo composición, fluido a 60 fps */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;keyframes&lt;/span&gt; &lt;span style="color:#e06c75"&gt;mover-bien&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;to&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;translateX&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;200&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;); } }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Si una animación se ve entrecortada, lo primero que debes revisar es qué propiedades estás animando. Reescribir un &lt;code&gt;left&lt;/code&gt;/&lt;code&gt;top&lt;/code&gt; como &lt;code&gt;transform: translate()&lt;/code&gt; suele eliminar el &lt;em&gt;jank&lt;/em&gt; de inmediato.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Las animaciones con &lt;code&gt;@keyframes&lt;/code&gt; te dan un lenguaje declarativo para describir movimiento complejo: secuencias multipaso, bucles infinitos y comportamientos compuestos, todo en CSS puro. Dominar la propiedad &lt;code&gt;animation&lt;/code&gt; y sus subpropiedades —especialmente &lt;code&gt;fill-mode&lt;/code&gt;, &lt;code&gt;iteration-count&lt;/code&gt; y &lt;code&gt;play-state&lt;/code&gt;— te permite construir spinners, indicadores de carga y microinteracciones pulidas. Y recuerda: anima &lt;code&gt;transform&lt;/code&gt; y &lt;code&gt;opacity&lt;/code&gt;, y respeta siempre &lt;code&gt;prefers-reduced-motion&lt;/code&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 Con esta entrega completas el recorrido de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;: desde la cascada y los selectores hasta el layout, el posicionamiento, los fondos, las transformaciones y, ahora, las animaciones. Tienes el repertorio completo para escribir CSS expresivo, accesible y de alto rendimiento.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Estilos CSS: Modularización y patrones de diseño</title><link>https://blog.dacadev.com/programacion/estilos-css/modularizacion-y-patrones/</link><pubDate>Tue, 16 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/modularizacion-y-patrones/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a organizar CSS a escala: estilos base, componentes modulares, la metodología BEM, clases de utilidad y la documentación con librerías de patrones.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/08-modularizacion-y-patrones-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#qué-es-la-modularización"&gt;Qué es la modularización&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#estilos-base"&gt;Estilos base&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#componentes-y-bem"&gt;Componentes y BEM&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#posicionamiento-del-componente"&gt;Posicionamiento del componente&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#estado-de-los-componentes"&gt;Estado de los componentes&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#utility-classes"&gt;Utility classes&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#metodologías-de-arquitectura-css"&gt;Metodologías de arquitectura CSS&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#librerías-de-patrones"&gt;Librerías de patrones&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;En un proyecto pequeño cualquier organización de CSS funciona. El problema aparece al escalar: hojas de estilo de miles de líneas donde tocar una regla rompe tres componentes que parecían no tener relación. La causa casi siempre es la misma: estilos acoplados que se pisan entre sí. La solución es arquitectónica —modularizar— y existen metodologías probadas para lograrlo.&lt;/p&gt;
&lt;p&gt;Esta es la octava y última entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Veremos cómo estructurar estilos en módulos independientes, la metodología &lt;strong&gt;BEM&lt;/strong&gt;, las clases de utilidad y cómo documentar tus componentes con una librería de patrones.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Aprenderás a dividir tus estilos en componentes desacoplados, a nombrar clases con BEM, a usar utility classes con criterio y a mantener una librería de patrones como fuente única de verdad del diseño.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="qué-es-la-modularización"&gt;Qué es la modularización&lt;/h2&gt;
&lt;p&gt;Modularizar CSS consiste en dividir los estilos en archivos donde cada uno representa un &lt;strong&gt;módulo&lt;/strong&gt;: un único componente con todo su estilo encapsulado. Un módulo &lt;code&gt;button.css&lt;/code&gt; contiene todo lo necesario para renderizar un botón y sus variantes, y nada más.&lt;/p&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;La regla de oro: un módulo no debe interferir con los estilos de otros. Solo se ocupa de su propio componente. Así, modificar un módulo nunca produce efectos colaterales inesperados en el resto de la página.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="estilos-base"&gt;Estilos base&lt;/h2&gt;
&lt;p&gt;Antes de los módulos conviene tener un archivo de &lt;strong&gt;estilos base&lt;/strong&gt;: no es un componente, sino la configuración inicial del documento (reset, tipografía global, &lt;code&gt;box-sizing&lt;/code&gt;).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;border-box&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;*,&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;::&lt;span style="color:#61afef"&gt;before&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;inherit&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;body&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-family&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;Helvetica&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;Arial&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;sans-serif&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Para no reinventar la rueda, paquetes como &lt;a href="https://necolas.github.io/normalize.css/"




 target="_blank"
 


&gt;Normalize.css&lt;/a&gt; homogeneizan las diferencias entre navegadores de forma sensata.&lt;/p&gt;
&lt;h2 id="componentes-y-bem"&gt;Componentes y BEM&lt;/h2&gt;
&lt;p&gt;La idea central de un módulo es que los estilos y modificadores de un componente vivan en un solo lugar. La metodología &lt;strong&gt;BEM&lt;/strong&gt; (&lt;em&gt;Block, Element, Modifier&lt;/em&gt;) propone una convención de nombres que hace explícita la estructura y evita colisiones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Block&lt;/strong&gt; — el componente raíz: &lt;code&gt;.button&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Element&lt;/strong&gt; — una parte del componente, con &lt;code&gt;__&lt;/code&gt;: &lt;code&gt;.button__icon&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modifier&lt;/strong&gt; — una variante, con &lt;code&gt;--&lt;/code&gt;: &lt;code&gt;.button--success&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;padding&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.8&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;border&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;solid&lt;/span&gt; &lt;span style="color:#d19a66"&gt;#265559&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;transparent&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button--success&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#2f5926&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;border-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#cfe8c9&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button--danger&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#a92323&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;border-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#e8c9c9&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button--small&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.8&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button--large&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1.2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;button&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;button&amp;#34;&lt;/span&gt;&amp;gt;Normal&amp;lt;/&lt;span style="color:#e06c75"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;button&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;button button--success&amp;#34;&lt;/span&gt;&amp;gt;Éxito&amp;lt;/&lt;span style="color:#e06c75"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;button&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;button button--danger&amp;#34;&lt;/span&gt;&amp;gt;Peligro&amp;lt;/&lt;span style="color:#e06c75"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;button&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;button button--large&amp;#34;&lt;/span&gt;&amp;gt;Grande&amp;lt;/&lt;span style="color:#e06c75"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;display:flex;gap:.75rem;flex-wrap:wrap;align-items:center;"&gt;
 &lt;button type="button" style="padding:.5em .8em;border:1px solid #265559;border-radius:.2em;background:transparent;font-size:1rem;color:#265559;cursor:pointer;"&gt;Normal&lt;/button&gt;
 &lt;button type="button" style="padding:.5em .8em;border:1px solid #cfe8c9;border-radius:.2em;background:#2f5926;font-size:1rem;color:#fff;cursor:pointer;"&gt;Éxito&lt;/button&gt;
 &lt;button type="button" style="padding:.5em .8em;border:1px solid #e8c9c9;border-radius:.2em;background:#a92323;font-size:1rem;color:#fff;cursor:pointer;"&gt;Peligro&lt;/button&gt;
 &lt;button type="button" style="padding:.5em .8em;border:1px solid #265559;border-radius:.2em;background:transparent;font-size:1.2rem;color:#265559;cursor:pointer;"&gt;Grande&lt;/button&gt;
&lt;/div&gt;
&lt;h3 id="posicionamiento-del-componente"&gt;Posicionamiento del componente&lt;/h3&gt;
&lt;p&gt;Por buena práctica, el bloque raíz de un componente debería declarar &lt;code&gt;position: relative&lt;/code&gt;. Así estableces un contexto de posicionamiento controlado para cualquier elemento absoluto interno (un menú desplegable, un badge, un tooltip), sin depender de ancestros externos.&lt;/p&gt;
&lt;h3 id="estado-de-los-componentes"&gt;Estado de los componentes&lt;/h3&gt;
&lt;p&gt;Es común reflejar el estado de un componente con clases, ya sea para estilizarlo o para manipularlo desde JavaScript. La convención recomendada usa verbos o estados con prefijo: &lt;code&gt;is-loading&lt;/code&gt;, &lt;code&gt;has-error&lt;/code&gt;, &lt;code&gt;is-active&lt;/code&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;No mezcles las clases de estado con los modificadores BEM. Evita nombres como &lt;code&gt;block__element--modifier-is-loading&lt;/code&gt;. El estado es una capa transversal y dinámica; mantenlo separado de la variante estática del componente.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="utility-classes"&gt;Utility classes&lt;/h2&gt;
&lt;p&gt;Las &lt;strong&gt;clases de utilidad&lt;/strong&gt; aplican un estilo único y específico. Suelen usar &lt;code&gt;!important&lt;/code&gt; para garantizar que se apliquen por encima de los estilos del componente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;text-center&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;text-align&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;center&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;float-left&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;float&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;left&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;hidden&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;none&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;before&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;content&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34; &amp;#34;&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;table&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;clear&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;both&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Son útiles para ajustes puntuales, pero abusar de ellas reintroduce el acoplamiento que la modularización busca evitar. Úsalas con criterio.&lt;/p&gt;
&lt;h2 id="metodologías-de-arquitectura-css"&gt;Metodologías de arquitectura CSS&lt;/h2&gt;
&lt;p&gt;BEM no es la única opción. Las metodologías más establecidas para organizar CSS a escala son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OOCSS&lt;/strong&gt; — &lt;em&gt;Object-Oriented CSS&lt;/em&gt;, de Nicole Sullivan: separa estructura de apariencia.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SMACSS&lt;/strong&gt; — &lt;em&gt;Scalable and Modular Architecture for CSS&lt;/em&gt;, de Jonathan Snook: categoriza las reglas en capas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BEM&lt;/strong&gt; — &lt;em&gt;Block, Element, Modifier&lt;/em&gt;, de Yandex: convención de nombres explícita.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ITCSS&lt;/strong&gt; — &lt;em&gt;Inverted Triangle CSS&lt;/em&gt;, de Harry Roberts: organiza por especificidad creciente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No son excluyentes; muchos equipos combinan ITCSS para la estructura de archivos con BEM para la nomenclatura.&lt;/p&gt;
&lt;h2 id="librerías-de-patrones"&gt;Librerías de patrones&lt;/h2&gt;
&lt;p&gt;En proyectos grandes, los componentes se documentan en una &lt;strong&gt;librería de patrones&lt;/strong&gt; (o &lt;em&gt;style guide&lt;/em&gt;): una web accesible para todo el equipo que muestra cómo se ve y se comporta cada componente. Es la fuente única de verdad del diseño y reduce las inconsistencias.&lt;/p&gt;
&lt;p&gt;Existen generadores de style guides; uno open source muy conocido es &lt;a href="https://kss-node.github.io/kss-node/"




 target="_blank"
 


&gt;KSS&lt;/a&gt;. Documenta los componentes a partir de comentarios estructurados en el propio CSS:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;Buttons
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;Botones disponibles en varios tamaños y colores.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;Markup:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;&amp;lt;button class=&amp;#34;button {{modifier_class}}&amp;#34;&amp;gt;click here&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;.button--success - Botón verde de éxito
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;.button--danger - Botón rojo de peligro
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;.button--large - Botón grande
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;Styleguide Buttons
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;button&lt;/span&gt; { &lt;span style="color:#7f848e"&gt;/* ... */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;KSS lee esos comentarios y genera automáticamente una página de documentación con el componente renderizado y todas sus variantes. El bloque incluye un título, una descripción, el &lt;code&gt;Markup&lt;/code&gt; de ejemplo (con el marcador &lt;code&gt;{{modifier_class}}&lt;/code&gt;), la lista de modificadores y una referencia &lt;code&gt;Styleguide&lt;/code&gt; para ubicarlo en la jerarquía.&lt;/p&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Mantener la documentación junto al código —en comentarios del propio CSS— reduce el riesgo de que la librería de patrones quede desactualizada respecto a la implementación real.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Escribir CSS que escale es, ante todo, un problema de arquitectura. Modularizar en componentes desacoplados, nombrar con una convención consistente como BEM, reservar las utility classes para ajustes puntuales y documentar todo en una librería de patrones es lo que mantiene una hoja de estilos sana a medida que el proyecto crece.&lt;/p&gt;
&lt;p&gt;Con esta entrega cerramos la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Recorrimos desde los fundamentos de la cascada hasta la arquitectura de estilos a gran escala, pasando por selectores, el modelo de caja, layouts, posicionamiento, fondos y animaciones. Tienes ahora un modelo mental completo para escribir CSS profesional, predecible y mantenible.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 Repasa las entregas anteriores para consolidar cada concepto: los fundamentos sostienen los selectores, el modelo de caja sostiene los layouts, y la modularización une todo en un sistema coherente.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Estilos CSS: Transiciones, transformaciones y rendimiento</title><link>https://blog.dacadev.com/programacion/estilos-css/transiciones-y-transformaciones/</link><pubDate>Sun, 14 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/transiciones-y-transformaciones/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina las transiciones y transformaciones en CSS: timing functions, las funciones transform (scale, rotate, translate, skew), perspectiva 3D y el pipeline de render.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/07-transiciones-y-transformaciones-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#transiciones"&gt;Transiciones&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#timing-functions"&gt;Timing functions&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#transformaciones"&gt;Transformaciones&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#rotación"&gt;Rotación&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#traslación"&gt;Traslación&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#escala"&gt;Escala&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#inclinación"&gt;Inclinación&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#punto-de-referencia-transform-origin"&gt;Punto de referencia: transform-origin&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#combinar-transformaciones"&gt;Combinar transformaciones&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-pipeline-de-renderizado"&gt;El pipeline de renderizado&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#transformaciones-en-3d"&gt;Transformaciones en 3D&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Las transiciones y transformaciones son la puerta de entrada a las interfaces animadas. Una transición suaviza el cambio entre dos estados; una transformación altera la geometría visual de un elemento sin afectar el layout. Bien aplicadas, mejoran la percepción de calidad y guían la atención del usuario. Mal aplicadas, generan &lt;em&gt;jank&lt;/em&gt; y consumen batería. La diferencia está en entender qué propiedades son baratas de animar y por qué.&lt;/p&gt;
&lt;p&gt;Esta es la séptima entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Cubriremos la propiedad &lt;code&gt;transition&lt;/code&gt; y sus &lt;em&gt;timing functions&lt;/em&gt;, las funciones de &lt;code&gt;transform&lt;/code&gt; en 2D y 3D, y el pipeline de renderizado que explica por qué &lt;code&gt;transform&lt;/code&gt; y &lt;code&gt;opacity&lt;/code&gt; son las propiedades óptimas para animar.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Aprenderás a construir transiciones fluidas con curvas de Bézier, a aplicar y combinar transformaciones, y a entender el pipeline layout → paint → composición para escribir animaciones eficientes.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="transiciones"&gt;Transiciones&lt;/h2&gt;
&lt;p&gt;Una transición interpola el cambio de una propiedad entre su valor inicial y final a lo largo del tiempo. Suele combinarse con pseudo-clases como &lt;code&gt;:hover&lt;/code&gt; o &lt;code&gt;:active&lt;/code&gt;. Se controla con cuatro propiedades:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;transition-property&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;background-color&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; &lt;span style="color:#e06c75"&gt;transform&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;transition-duration&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;0&lt;/span&gt;.&lt;span style="color:#e5c07b"&gt;3s&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; &lt;span style="color:#e06c75"&gt;0&lt;/span&gt;.&lt;span style="color:#e5c07b"&gt;6s&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;transition-timing-function&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;ease&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; &lt;span style="color:#e06c75"&gt;linear&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;transition-delay&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;0s&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; &lt;span style="color:#e06c75"&gt;100ms&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;transition-property&lt;/code&gt;&lt;/strong&gt; — qué propiedades se animan (usa &lt;code&gt;all&lt;/code&gt; para todas).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;transition-duration&lt;/code&gt;&lt;/strong&gt; — cuánto dura la interpolación.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;transition-timing-function&lt;/code&gt;&lt;/strong&gt; — cómo se distribuye el movimiento en el tiempo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;transition-delay&lt;/code&gt;&lt;/strong&gt; — cuánto espera antes de empezar (opcional).&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;boton&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transition&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease&lt;/span&gt;, &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;ease&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;boton&lt;/span&gt;:&lt;span style="color:#61afef"&gt;hover&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#16828d&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;translateY&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;-3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;style&gt;
 .cstrans { padding:.8em 1.6em; border:0; color:#fff; border-radius:.5em; cursor:pointer; background:#2a9da9; transition:background-color .3s ease, transform .3s ease, box-shadow .3s ease; box-shadow:0 .15em .4em rgba(0,0,0,.2); }
 .cstrans:hover { background:#16828d; transform:translateY(-4px); box-shadow:0 .4em .8em rgba(0,0,0,.3); }
 &lt;/style&gt;
 &lt;button class="cstrans" type="button"&gt;Pasa el cursor sobre mí&lt;/button&gt;
&lt;/div&gt;
&lt;h3 id="timing-functions"&gt;Timing functions&lt;/h3&gt;
&lt;p&gt;La &lt;em&gt;timing function&lt;/em&gt; define cómo se reparte el movimiento en el tiempo. Existen valores predefinidos —&lt;code&gt;linear&lt;/code&gt;, &lt;code&gt;ease&lt;/code&gt;, &lt;code&gt;ease-in&lt;/code&gt;, &lt;code&gt;ease-out&lt;/code&gt;, &lt;code&gt;ease-in-out&lt;/code&gt;— donde el eje X representa el tiempo y el eje Y el progreso del cambio.&lt;/p&gt;
&lt;p&gt;Todas son &lt;strong&gt;curvas de Bézier&lt;/strong&gt;, y puedes definir la tuya con la función &lt;code&gt;cubic-bezier()&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transition&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.6&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;cubic-bezier&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0.45&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.05&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.55&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.95&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;También puedes hacer el cambio en pasos discretos con &lt;code&gt;steps()&lt;/code&gt;, útil para animaciones tipo sprite o efectos de &amp;ldquo;tecleo&amp;rdquo;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transition&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;all&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;s&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;steps&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;3&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Existen editores visuales de curvas de Bézier que te permiten ajustar la animación y copiar el valor exacto. Experimentar con ellos es la forma más rápida de afinar la sensación de una transición.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="transformaciones"&gt;Transformaciones&lt;/h2&gt;
&lt;p&gt;La propiedad &lt;code&gt;transform&lt;/code&gt; altera la geometría visual de un elemento mediante cuatro operaciones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;scale()&lt;/code&gt;&lt;/strong&gt; — escala el tamaño.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;rotate()&lt;/code&gt;&lt;/strong&gt; — rota el elemento.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;translate()&lt;/code&gt;&lt;/strong&gt; — lo desplaza.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;skew()&lt;/code&gt;&lt;/strong&gt; — lo inclina/estira.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Las transformaciones solo alteran la representación visual del elemento, &lt;strong&gt;no su comportamiento en el layout&lt;/strong&gt;. El hueco original que ocupaba se conserva, y los elementos vecinos no se reorganizan.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="rotación"&gt;Rotación&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;rotate()&lt;/code&gt; gira el elemento. Los valores positivos giran en sentido horario; los negativos, antihorario.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;giro&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;rotate&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;15&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="traslación"&gt;Traslación&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;translate(x, y)&lt;/code&gt; mueve el elemento en ambos ejes sin afectar el flujo. Los valores positivos lo desplazan a la derecha y hacia abajo.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;mover&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;translate&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;40&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="escala"&gt;Escala&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;scale()&lt;/code&gt; redimensiona: valores entre 0 y 1 encogen, mayores que 1 agrandan.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;crecer&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;scale&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1.3&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="inclinación"&gt;Inclinación&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;skew(x, y)&lt;/code&gt; deforma el elemento inclinándolo respecto a los ejes.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;inclinar&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#61afef;font-weight:bold"&gt;skew&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;-12&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;display:flex;gap:1.5rem;flex-wrap:wrap;align-items:center;justify-content:center;"&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;transform:rotate(15deg);display:inline-block;"&gt;rotate&lt;/span&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;transform:translate(0,-8px);display:inline-block;"&gt;translate&lt;/span&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;transform:scale(1.25);display:inline-block;"&gt;scale&lt;/span&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;transform:skew(-12deg);display:inline-block;"&gt;skew&lt;/span&gt;
&lt;/div&gt;
&lt;h3 id="punto-de-referencia-transform-origin"&gt;Punto de referencia: transform-origin&lt;/h3&gt;
&lt;p&gt;Toda transformación se aplica desde un punto de referencia, que por defecto es el centro del elemento. &lt;code&gt;transform-origin&lt;/code&gt; lo reubica:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;giro&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform-origin&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;left&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;center&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* equivale a 0% 50% */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="combinar-transformaciones"&gt;Combinar transformaciones&lt;/h3&gt;
&lt;p&gt;Puedes encadenar varias funciones separándolas por espacios. &lt;strong&gt;Se aplican de derecha a izquierda&lt;/strong&gt;, lo que afecta el resultado final:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;tarjeta&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;rotate&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;15&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;) &lt;span style="color:#e5c07b"&gt;translate&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;20&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="el-pipeline-de-renderizado"&gt;El pipeline de renderizado&lt;/h2&gt;
&lt;p&gt;Para escribir animaciones eficientes hay que entender cómo el navegador dibuja una página. El proceso tiene tres etapas clave:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Layout&lt;/strong&gt; — el navegador calcula las dimensiones y posiciones de todos los elementos. Cualquier cambio de tamaño o posición dispara un recálculo completo (&lt;em&gt;reflow&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paint&lt;/strong&gt; — pinta en memoria los píxeles de cada elemento (colores, bordes, sombras), posiblemente en capas separadas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Composición&lt;/strong&gt; — combina las capas pintadas para mostrarlas en pantalla.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 A[JS / CSS] --&amp;gt; B[Layout]
 B --&amp;gt; C[Paint]
 C --&amp;gt; D[Composición]
&lt;/pre&gt;

&lt;p&gt;La clave del rendimiento: algunas propiedades, como &lt;strong&gt;&lt;code&gt;transform&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;opacity&lt;/code&gt;&lt;/strong&gt;, solo afectan la etapa de &lt;strong&gt;composición&lt;/strong&gt;. No requieren recalcular el layout ni repintar, por lo que son las propiedades óptimas para animar de forma fluida a 60 fps.&lt;/p&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Prefiere animar &lt;code&gt;transform&lt;/code&gt; y &lt;code&gt;opacity&lt;/code&gt; en lugar de &lt;code&gt;width&lt;/code&gt;, &lt;code&gt;height&lt;/code&gt;, &lt;code&gt;top&lt;/code&gt; o &lt;code&gt;left&lt;/code&gt;. Estas últimas disparan layout y paint en cada frame, lo que produce animaciones entrecortadas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="transformaciones-en-3d"&gt;Transformaciones en 3D&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;transform&lt;/code&gt; también opera en tres dimensiones. Puedes rotar sobre cualquier eje con &lt;code&gt;rotateX()&lt;/code&gt;, &lt;code&gt;rotateY()&lt;/code&gt; y &lt;code&gt;rotateZ()&lt;/code&gt;. El efecto depende de la &lt;strong&gt;perspectiva&lt;/strong&gt;: la distancia simulada entre el observador y el elemento. A menor perspectiva, más pronunciado el efecto 3D.&lt;/p&gt;
&lt;p&gt;Hay dos formas de aplicarla:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/* 1. Función dentro de transform (afecta solo a ese elemento) */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;perspective&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;200&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;) &lt;span style="color:#e5c07b"&gt;rotateX&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;30&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/* 2. Propiedad en el contenedor (perspectiva compartida) */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;row&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;perspective&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;200&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;transform&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;rotateX&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;30&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:flex;justify-content:center;gap:2rem;perspective:300px;"&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em 1em;border-radius:.4em;transform:rotateX(35deg);"&gt;rotateX(35deg)&lt;/div&gt;
 &lt;div style="background:#16828d;color:#fff;padding:1.5em 1em;border-radius:.4em;transform:rotateY(35deg);"&gt;rotateY(35deg)&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Una rotación de 180° voltea el elemento como un espejo. La propiedad &lt;code&gt;backface-visibility&lt;/code&gt; controla si la cara trasera es visible, lo que habilita efectos como las tarjetas que se voltean. Un recurso clásico para profundizar es &lt;a href="https://3dtransforms.desandro.com/card-flip"




 target="_blank"
 


&gt;Intro to CSS 3D transforms&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Las transiciones suavizan los cambios de estado y las transformaciones manipulan la geometría sin tocar el layout. La regla de oro del rendimiento es animar &lt;code&gt;transform&lt;/code&gt; y &lt;code&gt;opacity&lt;/code&gt;, que solo afectan la etapa de composición. Con curvas de Bézier afinadas y un uso consciente del pipeline, tus animaciones serán fluidas y eficientes.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 La entrega final de la serie aborda la &lt;strong&gt;modularización y los patrones de diseño&lt;/strong&gt; en CSS: cómo organizar tus estilos en componentes mantenibles con metodologías como BEM.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Estilos CSS: Fondos, gradientes y sombras</title><link>https://blog.dacadev.com/programacion/estilos-css/backgrounds-y-sombras/</link><pubDate>Fri, 12 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/backgrounds-y-sombras/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a trabajar con fondos en CSS: las propiedades background, gradientes lineales y radiales, modos de mezcla y sombras con box-shadow y text-shadow.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/06-backgrounds-y-sombras-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#la-familia-background"&gt;La familia background&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#gradientes-lineales"&gt;Gradientes lineales&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#gradientes-lineales-repetitivos"&gt;Gradientes lineales repetitivos&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#gradientes-radiales"&gt;Gradientes radiales&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#combinar-múltiples-fondos"&gt;Combinar múltiples fondos&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#texturas-con-blend-modes"&gt;Texturas con blend modes&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#sombras-box-shadow-y-text-shadow"&gt;Sombras: box-shadow y text-shadow&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#sombras-interiores-para-feedback"&gt;Sombras interiores para feedback&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Los fondos y las sombras son las herramientas con las que CSS aporta profundidad, textura y jerarquía visual sin necesidad de imágenes externas. Un gradiente bien construido reemplaza un archivo PNG; una sombra sutil comunica que un botón es interactivo. Dominar estas propiedades te permite crear interfaces ricas con código puro, ligero y escalable.&lt;/p&gt;
&lt;p&gt;Esta es la sexta entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Recorreremos la familia de propiedades &lt;code&gt;background&lt;/code&gt;, los gradientes lineales y radiales, los modos de mezcla y las sombras de caja y de texto.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Aprenderás a generar gradientes y patrones sin imágenes, a combinar varias capas de fondo y a usar &lt;code&gt;box-shadow&lt;/code&gt; y &lt;code&gt;text-shadow&lt;/code&gt; para dar realismo y feedback a tus componentes.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="la-familia-background"&gt;La familia background&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;background&lt;/code&gt; es una propiedad abreviada que agrupa ocho propiedades individuales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;background-image&lt;/code&gt; — una imagen o un gradiente generado.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-position&lt;/code&gt; — la posición inicial del fondo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-size&lt;/code&gt; — el tamaño de renderizado (&lt;code&gt;cover&lt;/code&gt;, &lt;code&gt;contain&lt;/code&gt;, valores explícitos).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-repeat&lt;/code&gt; — si la imagen se repite en mosaico.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-origin&lt;/code&gt; — respecto a qué caja se posiciona (border, padding o content).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-clip&lt;/code&gt; — hasta qué caja se extiende el fondo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-attachment&lt;/code&gt; — si el fondo se desplaza con el contenido o queda fijo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;background-color&lt;/code&gt; — un color sólido que se renderiza detrás de la imagen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gradientes-lineales"&gt;Gradientes lineales&lt;/h2&gt;
&lt;p&gt;Un gradiente es una transición de colores generada por una función de CSS, sin archivos. &lt;code&gt;linear-gradient()&lt;/code&gt; crea una transición a lo largo de una dirección.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;fade&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;linear-gradient&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;to&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;right&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="height:80px;border-radius:.4em;background-image:linear-gradient(to right,#fff,#2a9da9);"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;La función acepta una dirección (&lt;code&gt;to right&lt;/code&gt;, &lt;code&gt;90deg&lt;/code&gt;, etc.) y una lista de colores. Puedes incluir más de dos colores y fijar su posición con porcentajes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;fade&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;linear-gradient&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;90&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#c0392b&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt; &lt;span style="color:#d19a66"&gt;50&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt; &lt;span style="color:#d19a66"&gt;100&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="height:80px;border-radius:.4em;background-image:linear-gradient(90deg,#c0392b 0%,#fff 50%,#2a9da9 100%);"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="gradientes-lineales-repetitivos"&gt;Gradientes lineales repetitivos&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;repeating-linear-gradient()&lt;/code&gt; crea patrones que se repiten, útil para texturas como rayas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;rayas&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;repeating-linear-gradient&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;-45&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;deg&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#16828d&lt;/span&gt; &lt;span style="color:#d19a66"&gt;10&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#16828d&lt;/span&gt; &lt;span style="color:#d19a66"&gt;20&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="height:50px;border-radius:.4em;background-image:repeating-linear-gradient(-45deg,#2a9da9,#2a9da9 10px,#16828d 10px,#16828d 20px);"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="gradientes-radiales"&gt;Gradientes radiales&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;radial-gradient()&lt;/code&gt; genera una transición circular o elíptica que irradia desde un punto, en lugar de seguir una dirección lineal.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;brillo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;radial-gradient&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="height:120px;border-radius:.4em;background-image:radial-gradient(circle,#fff,#2a9da9);"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="combinar-múltiples-fondos"&gt;Combinar múltiples fondos&lt;/h2&gt;
&lt;p&gt;Puedes apilar varias capas de fondo separándolas con comas. La primera capa queda al frente. Esto permite, por ejemplo, superponer un gradiente sobre una imagen:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;heroe&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;linear-gradient&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;to&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;bottom&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;42&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;157&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;169&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0.6&lt;/span&gt;), &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;22&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;130&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;141&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0.9&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;url&lt;/span&gt;(&lt;span style="color:#98c379"&gt;foto.jpg&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-size&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;cover&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="height:120px;border-radius:.4em;display:flex;align-items:center;justify-content:center;color:#fff;font-family:Helvetica,Arial,sans-serif;font-weight:bold;background-image:linear-gradient(135deg,rgba(42,157,169,.85),rgba(22,130,141,.95)),repeating-linear-gradient(45deg,#888,#888 8px,#777 8px,#777 16px);"&gt;Gradiente sobre una textura de fondo&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="texturas-con-blend-modes"&gt;Texturas con blend modes&lt;/h3&gt;
&lt;p&gt;La propiedad &lt;code&gt;background-blend-mode&lt;/code&gt; mezcla las capas de fondo entre sí (con modos como &lt;code&gt;multiply&lt;/code&gt;, &lt;code&gt;soft-light&lt;/code&gt;, &lt;code&gt;overlay&lt;/code&gt;), añadiendo textura a una imagen sin editarla en un programa externo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;textura&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;url&lt;/span&gt;(&lt;span style="color:#98c379"&gt;rayones.png&lt;/span&gt;), &lt;span style="color:#e5c07b"&gt;url&lt;/span&gt;(&lt;span style="color:#98c379"&gt;foto.jpg&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-blend-mode&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;soft-light&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sombras-box-shadow-y-text-shadow"&gt;Sombras: box-shadow y text-shadow&lt;/h2&gt;
&lt;p&gt;CSS permite añadir sombras tanto a las cajas (&lt;code&gt;box-shadow&lt;/code&gt;) como al texto (&lt;code&gt;text-shadow&lt;/code&gt;). Ambas reciben los mismos parámetros básicos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Desplazamiento horizontal y vertical (&lt;code&gt;offset-x&lt;/code&gt;, &lt;code&gt;offset-y&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;El radio de difuminado (&lt;code&gt;blur&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;(opcional) El radio de expansión (&lt;code&gt;spread&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;El color de la sombra.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;tarjeta&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-shadow&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.25&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;titulo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;text-shadow&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt; &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.4&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#f4f6f7;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;display:flex;gap:1.5rem;flex-wrap:wrap;align-items:center;"&gt;
 &lt;div style="background:#fff;color:#111;padding:1.2em 1.5em;border-radius:.5em;box-shadow:0 .2em .5em rgba(0,0,0,.25);"&gt;Tarjeta con &lt;code&gt;box-shadow&lt;/code&gt;&lt;/div&gt;
 &lt;span style="font-size:1.6rem;font-weight:bold;color:#2a9da9;text-shadow:2px 2px 4px rgba(0,0,0,.4);"&gt;Texto con text-shadow&lt;/span&gt;
&lt;/div&gt;
&lt;h3 id="sombras-interiores-para-feedback"&gt;Sombras interiores para feedback&lt;/h3&gt;
&lt;p&gt;La palabra clave &lt;code&gt;inset&lt;/code&gt; convierte la sombra en interior, perfecta para simular que un botón está presionado. Combinada con pseudo-clases como &lt;code&gt;:active&lt;/code&gt;, crea componentes con feedback táctil:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;boton&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-image&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;linear-gradient&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;to&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;bottom&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;#16828d&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;box-shadow&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0.4&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;boton&lt;/span&gt;:&lt;span style="color:#61afef"&gt;active&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;box-shadow&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;inset&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;#0d4f56&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;inset&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;,&lt;span style="color:#d19a66"&gt;0.4&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1.5rem;background:#fff;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;style&gt;
 .csbtn { padding:1em 1.5em; border:0; font-size:.9rem; color:#fff; border-radius:.5em; cursor:pointer; background-image:linear-gradient(to bottom,#2a9da9,#16828d); box-shadow:.1em .1em .5em rgba(0,0,0,.4); }
 .csbtn:active { box-shadow:inset 0 0 .5em #0d4f56, inset 0 .5em 1em rgba(0,0,0,.4); }
 &lt;/style&gt;
 &lt;button class="csbtn" type="button"&gt;Mantén presionado este botón&lt;/button&gt;
 &lt;p style="margin:.75rem 0 0;color:#555;"&gt;Al pulsarlo, la sombra interior simula el hundido físico.&lt;/p&gt;
&lt;/div&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Las sombras se renderizan en la capa de composición y son baratas de animar. Una transición sutil de &lt;code&gt;box-shadow&lt;/code&gt; en &lt;code&gt;:hover&lt;/code&gt; comunica interactividad con un costo de rendimiento mínimo.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Los gradientes y las sombras te permiten construir interfaces con profundidad y textura usando solo CSS, evitando peticiones de red y archivos de imagen. Apilar capas de fondo, mezclarlas con blend modes y aplicar sombras interiores son técnicas que elevan la calidad visual de cualquier componente.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 La próxima entrega cubre &lt;strong&gt;transiciones y transformaciones&lt;/strong&gt;: cómo animar cambios de estado de forma fluida y manipular la geometría de los elementos con &lt;code&gt;transform&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Estilos CSS: Posicionamiento, z-index y diseño responsive</title><link>https://blog.dacadev.com/programacion/estilos-css/posicionamiento-y-responsive/</link><pubDate>Wed, 10 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/posicionamiento-y-responsive/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina el posicionamiento en CSS: static, relative, absolute, fixed y sticky, los contextos de apilamiento con z-index y el diseño responsive con media queries.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/05-posicionamiento-y-responsive-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#la-propiedad-position"&gt;La propiedad position&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#fixed-anclado-al-viewport"&gt;Fixed: anclado al viewport&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#absolute-relativo-al-ancestro-posicionado"&gt;Absolute: relativo al ancestro posicionado&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#relative-desplazamiento-sin-salir-del-flujo"&gt;Relative: desplazamiento sin salir del flujo&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#sticky-lo-mejor-de-relative-y-fixed"&gt;Sticky: lo mejor de relative y fixed&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#stacking-contexts-y-z-index"&gt;Stacking contexts y z-index&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#responsive-estilos-que-se-adaptan"&gt;Responsive: estilos que se adaptan&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#media-queries"&gt;Media queries&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#breakpoints-con-mobile-first"&gt;Breakpoints con mobile first&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#estilos-para-impresión"&gt;Estilos para impresión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Hasta ahora hemos trabajado con elementos que viven en el flujo normal del documento. El posicionamiento rompe ese flujo: te permite anclar una cabecera al viewport, superponer un modal, desplegar un menú o fijar una barra lateral mientras el usuario hace scroll. Combinado con &lt;code&gt;z-index&lt;/code&gt; y las media queries, el posicionamiento es la base de las interacciones dinámicas y del diseño adaptable.&lt;/p&gt;
&lt;p&gt;Esta es la quinta entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Cubriremos los cinco valores de &lt;code&gt;position&lt;/code&gt;, los contextos de apilamiento con &lt;code&gt;z-index&lt;/code&gt; y los fundamentos del diseño &lt;strong&gt;responsive&lt;/strong&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Entenderás cuándo usar cada tipo de posicionamiento, por qué &lt;code&gt;z-index&lt;/code&gt; a veces &amp;ldquo;no funciona&amp;rdquo; por culpa de los contextos de apilamiento, y cómo escribir media queries con un enfoque &lt;em&gt;mobile first&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="la-propiedad-position"&gt;La propiedad position&lt;/h2&gt;
&lt;p&gt;La propiedad &lt;code&gt;position&lt;/code&gt; acepta cinco valores que cambian cómo se ubica un elemento:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;static&lt;/code&gt; (por defecto) — el elemento permanece en el flujo normal.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;relative&lt;/code&gt; — se desplaza respecto a su posición original sin salir del flujo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;absolute&lt;/code&gt; — se extrae del flujo y se posiciona respecto a su ancestro posicionado más cercano.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fixed&lt;/code&gt; — se extrae del flujo y se posiciona respecto al viewport.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sticky&lt;/code&gt; — combina &lt;code&gt;relative&lt;/code&gt; y &lt;code&gt;fixed&lt;/code&gt; según el scroll.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Las propiedades &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;right&lt;/code&gt;, &lt;code&gt;bottom&lt;/code&gt; y &lt;code&gt;left&lt;/code&gt; controlan la ubicación (y, en algunos casos, el tamaño) de los elementos posicionados.&lt;/p&gt;
&lt;h2 id="fixed-anclado-al-viewport"&gt;Fixed: anclado al viewport&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;position: fixed&lt;/code&gt; extrae el elemento del flujo normal —los demás se reorganizan como si no existiera— y lo ancla a una posición relativa al viewport, donde permanece aunque el usuario haga scroll. Es la base de los &lt;strong&gt;modales&lt;/strong&gt;: un fondo semitransparente que cubre toda la pantalla y un cuerpo centrado encima.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;modal-backdrop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;fixed&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;right&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;bottom&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;left&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;rgba&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;modal-body&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;fixed&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;bottom&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;right&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;20&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;left&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;20&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background-color&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;white&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;overflow&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;auto&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Al posicionar no estás obligado a declarar los cuatro lados. Si omites &lt;code&gt;bottom&lt;/code&gt; y &lt;code&gt;height&lt;/code&gt;, la altura la determina el contenido de forma natural. Combinar lados con &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt; te da control total sobre el tamaño.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="absolute-relativo-al-ancestro-posicionado"&gt;Absolute: relativo al ancestro posicionado&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;position: absolute&lt;/code&gt; también extrae el elemento del flujo, pero se posiciona respecto al primer ancestro que tenga una posición distinta de &lt;code&gt;static&lt;/code&gt;. Si ningún ancestro está posicionado, usa el &lt;em&gt;bloque contenedor inicial&lt;/em&gt; (el tamaño del viewport).&lt;/p&gt;
&lt;p&gt;Este es el patrón para colocar un botón de cierre en la esquina de un modal: el padre se marca como &lt;code&gt;position: relative&lt;/code&gt; y el botón como &lt;code&gt;position: absolute&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;modal-body&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;relative&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;modal-close&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;absolute&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;right&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.3&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="position:relative;background:#eaf2f8;padding:1.5em;border-radius:.4em;min-height:4em;"&gt;
 &lt;span style="position:absolute;top:.4em;right:.4em;background:#c0392b;color:#fff;padding:.2em .5em;border-radius:.3em;font-size:.8em;cursor:pointer;"&gt;✕&lt;/span&gt;
 &lt;strong&gt;Cuerpo del modal&lt;/strong&gt;
 &lt;p style="margin:.4rem 0 0;"&gt;El botón de cierre está posicionado en la esquina con &lt;code&gt;absolute&lt;/code&gt; respecto a este contenedor &lt;code&gt;relative&lt;/code&gt;.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="relative-desplazamiento-sin-salir-del-flujo"&gt;Relative: desplazamiento sin salir del flujo&lt;/h2&gt;
&lt;p&gt;A diferencia de los anteriores, &lt;code&gt;position: relative&lt;/code&gt; &lt;strong&gt;no&lt;/strong&gt; extrae el elemento del flujo; lo traslada respecto a su posición original, dejando su hueco intacto. Tampoco permite redimensionarlo con la combinación de lados.&lt;/p&gt;
&lt;p&gt;Su uso más frecuente es establecer un &lt;strong&gt;bloque contenedor&lt;/strong&gt; para descendientes absolutos. Es la base de un menú desplegable: el contenedor es &lt;code&gt;relative&lt;/code&gt; y el menú es &lt;code&gt;absolute&lt;/code&gt;, mostrándose con &lt;code&gt;:hover&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;dropdown&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;relative&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;inline-block&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;dropdown-menu&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;absolute&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;100&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;%&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;left&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;none&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;dropdown&lt;/span&gt;:&lt;span style="color:#61afef"&gt;hover&lt;/span&gt; .&lt;span style="color:#e5c07b"&gt;dropdown-menu&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;block&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;min-height:9em;"&gt;
 &lt;style&gt;
 .csdrop { position:relative; display:inline-block; }
 .csdrop-label { padding:.5em 1.5em; border:1px solid #ccc; background:#eee; cursor:pointer; border-radius:.3em; }
 .csdrop-menu { position:absolute; top:100%; left:0; min-width:160px; background:#fff; border:1px solid #999; border-radius:.3em; display:none; margin:0; padding:0; list-style:none; box-shadow:0 4px 12px rgba(0,0,0,.15); z-index:1; }
 .csdrop:hover .csdrop-menu { display:block; }
 .csdrop-menu li a { display:block; padding:.5em 1.5em; color:#2a7ae2; text-decoration:none; }
 .csdrop-menu li a:hover { background:#f0f0f0; }
 &lt;/style&gt;
 &lt;div class="csdrop"&gt;
 &lt;div class="csdrop-label"&gt;Menú principal ▾&lt;/div&gt;
 &lt;ul class="csdrop-menu"&gt;
 &lt;li&gt;&lt;a href="#posicionamiento-y-responsive"&gt;Inicio&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#posicionamiento-y-responsive"&gt;Productos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#posicionamiento-y-responsive"&gt;Contacto&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
 &lt;/div&gt;
 &lt;p style="margin:.75rem 0 0;color:#555;"&gt;Pasa el cursor sobre el botón para desplegar el menú.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="sticky-lo-mejor-de-relative-y-fixed"&gt;Sticky: lo mejor de relative y fixed&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;position: sticky&lt;/code&gt; mantiene el elemento en su posición normal hasta que, al hacer scroll, alcanza el umbral definido por &lt;code&gt;top&lt;/code&gt;/&lt;code&gt;bottom&lt;/code&gt;; en ese momento se &amp;ldquo;pega&amp;rdquo; como si fuera &lt;code&gt;fixed&lt;/code&gt;. Cuando el contenido vuelve, recupera su comportamiento relativo. Es ideal para barras laterales y cabeceras de sección que deben permanecer visibles.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;afijo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;sticky&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="stacking-contexts-y-z-index"&gt;Stacking contexts y z-index&lt;/h2&gt;
&lt;p&gt;Cuando varios elementos posicionados se solapan, &lt;code&gt;z-index&lt;/code&gt; controla el orden de apilamiento en el eje Z. Acepta enteros positivos y negativos: a mayor valor, más al frente.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;uno&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;relative&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;z-index&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;dos&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;relative&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;z-index&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* queda por encima de .uno */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aquí está la trampa que confunde a muchos: &lt;strong&gt;cada elemento posicionado con &lt;code&gt;z-index&lt;/code&gt; crea su propio contexto de apilamiento&lt;/strong&gt;. Un hijo dentro de un contexto con &lt;code&gt;z-index: 1&lt;/code&gt; nunca podrá superar a un elemento de un contexto hermano con &lt;code&gt;z-index: 2&lt;/code&gt;, aunque el hijo tenga &lt;code&gt;z-index: 99999&lt;/code&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;code&gt;z-index&lt;/code&gt; tiene dos &amp;ldquo;gotchas&amp;rdquo;: solo funciona sobre elementos posicionados (cualquier &lt;code&gt;position&lt;/code&gt; distinto de &lt;code&gt;static&lt;/code&gt;), y al usarlo creas un nuevo contexto de apilamiento. Si un &lt;code&gt;z-index&lt;/code&gt; enorme &amp;ldquo;no funciona&amp;rdquo;, casi siempre es porque su elemento está atrapado en un contexto de apilamiento de menor prioridad.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="responsive-estilos-que-se-adaptan"&gt;Responsive: estilos que se adaptan&lt;/h2&gt;
&lt;p&gt;La enorme variedad de pantallas obliga a diseñar interfaces que respondan a distintos tamaños. La filosofía &lt;strong&gt;mobile first&lt;/strong&gt; consiste en escribir primero los estilos para móvil y luego ampliarlos progresivamente hacia tablets y escritorio.&lt;/p&gt;
&lt;h3 id="media-queries"&gt;Media queries&lt;/h3&gt;
&lt;p&gt;Una &lt;strong&gt;media query&lt;/strong&gt; aplica un bloque de CSS solo cuando se cumple una condición sobre el viewport. Conviene usar &lt;code&gt;em&lt;/code&gt; en los umbrales para que respeten el zoom y la configuración del usuario.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;35em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e5c07b"&gt;titulo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2.25&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puedes combinar condiciones con lógica:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/* AND: ambas condiciones */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;20em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; &lt;span style="color:#e06c75"&gt;and&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;max-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;35em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { &lt;span style="color:#7f848e"&gt;/* ... */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;/* OR: cualquiera de las dos */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;max-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;20em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;),&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;35em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { &lt;span style="color:#7f848e"&gt;/* ... */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Entre las características consultables están &lt;code&gt;min-width&lt;/code&gt;, &lt;code&gt;max-width&lt;/code&gt;, &lt;code&gt;min-height&lt;/code&gt;, &lt;code&gt;orientation: landscape | portrait&lt;/code&gt; y &lt;code&gt;min-resolution: 2dppx&lt;/code&gt; (para pantallas retina). El catálogo completo está en la &lt;a href="https://developer.mozilla.org/es/docs/Web/CSS/@media"




 target="_blank"
 


&gt;documentación de &lt;code&gt;@media&lt;/code&gt; en MDN&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="breakpoints-con-mobile-first"&gt;Breakpoints con mobile first&lt;/h3&gt;
&lt;p&gt;Los &lt;strong&gt;breakpoints&lt;/strong&gt; son los puntos donde el diseño cambia de un tamaño a otro. Con el enfoque mobile first, los estilos base sirven al móvil y cada media query añade ajustes para pantallas mayores:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;titulo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* móvil (base) */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;35em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { &lt;span style="color:#7f848e"&gt;/* tablet */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e5c07b"&gt;titulo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;50em&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { &lt;span style="color:#7f848e"&gt;/* escritorio */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#e5c07b"&gt;titulo&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;rem&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;style&gt;
 .csresp { font-size:1.5rem;font-weight:bold;color:#16828d;margin:0; }
 @media (min-width:35em) { .csresp { font-size:2rem; } }
 @media (min-width:50em) { .csresp { font-size:2.5rem; } }
 &lt;/style&gt;
 &lt;p class="csresp"&gt;Este título cambia de tamaño según el ancho&lt;/p&gt;
 &lt;small style="color:#555;"&gt;Redimensiona la ventana para cruzar los breakpoints de 35em y 50em.&lt;/small&gt;
&lt;/div&gt;
&lt;h3 id="estilos-para-impresión"&gt;Estilos para impresión&lt;/h3&gt;
&lt;p&gt;Las media queries también cubren el medio de impresión. &lt;code&gt;@media print&lt;/code&gt; aplica reglas cuando el usuario imprime o exporta a PDF:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#e06c75"&gt;print&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#56b6c2"&gt;*&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;black&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;background&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;none&lt;/span&gt; &lt;span style="color:#7f848e"&gt;!important&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El posicionamiento te da control fino sobre dónde vive cada elemento: &lt;code&gt;fixed&lt;/code&gt; para modales, &lt;code&gt;absolute&lt;/code&gt; para tooltips y menús, &lt;code&gt;relative&lt;/code&gt; como ancla, y &lt;code&gt;sticky&lt;/code&gt; para elementos que acompañan el scroll. Sumado a un manejo consciente de los contextos de apilamiento y a media queries con enfoque mobile first, tienes las piezas para construir interfaces dinámicas y adaptables.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 La próxima entrega explora los &lt;strong&gt;fondos y las sombras&lt;/strong&gt;: gradientes, modos de mezcla y las propiedades &lt;code&gt;box-shadow&lt;/code&gt; y &lt;code&gt;text-shadow&lt;/code&gt; para dar profundidad a tus componentes.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Estilos CSS: Layouts con Float, Flexbox y Grid</title><link>https://blog.dacadev.com/programacion/estilos-css/layouts-flexbox-grid/</link><pubDate>Mon, 08 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/layouts-flexbox-grid/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a maquetar con CSS: el legado de float y clearfix, el modelo flexible de Flexbox y el sistema bidimensional de CSS Grid, con demostraciones renderizadas.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/04-layouts-flexbox-grid-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#float-el-origen-y-el-clearfix"&gt;Float: el origen y el clearfix&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#flexbox-layout-en-una-dimensión"&gt;Flexbox: layout en una dimensión&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#alinear-ítems-con-justify-content-y-align-items"&gt;Alinear ítems con justify-content y align-items&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#controlar-el-tamaño-flex-grow-flex-shrink-y-flex-basis"&gt;Controlar el tamaño: flex-grow, flex-shrink y flex-basis&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#dirección-y-envoltura"&gt;Dirección y envoltura&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#propiedades-del-ítem"&gt;Propiedades del ítem&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#css-grid-layout-en-dos-dimensiones"&gt;CSS Grid: layout en dos dimensiones&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#una-rejilla-básica"&gt;Una rejilla básica&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#posicionar-ítems-por-líneas"&gt;Posicionar ítems por líneas&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#áreas-con-nombre"&gt;Áreas con nombre&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#rejilla-implícita-y-galerías-responsivas"&gt;Rejilla implícita y galerías responsivas&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#flexbox-y-grid-complementarios-no-rivales"&gt;Flexbox y Grid: complementarios, no rivales&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Maquetar es componer la estructura visual de una página: columnas, rejillas, barras laterales, galerías. Durante años se hizo con herramientas que no se diseñaron para ello —&lt;code&gt;float&lt;/code&gt; nació para envolver texto alrededor de imágenes— hasta que llegaron &lt;strong&gt;Flexbox&lt;/strong&gt; y &lt;strong&gt;CSS Grid&lt;/strong&gt;, dos sistemas pensados específicamente para layout. Conocer los tres te permite entender el código heredado y elegir la herramienta correcta para cada problema.&lt;/p&gt;
&lt;p&gt;Esta es la cuarta entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Recorreremos &lt;code&gt;float&lt;/code&gt; y la técnica &lt;code&gt;clearfix&lt;/code&gt;, el modelo unidimensional de Flexbox y el sistema bidimensional de Grid, con ejemplos que puedes ver renderizados.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Aprenderás cuándo sigue siendo útil &lt;code&gt;float&lt;/code&gt;, cómo controlar el tamaño de los ítems con &lt;code&gt;flex&lt;/code&gt;, y cómo posicionar elementos en una rejilla con &lt;code&gt;grid-template&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="float-el-origen-y-el-clearfix"&gt;Float: el origen y el clearfix&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;float&lt;/code&gt; extrae un elemento del flujo normal y lo desplaza hacia un lado de su contenedor; el contenido adyacente fluye a su alrededor. Ese fue su propósito original: envolver texto alrededor de una imagen.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;imagen&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;float&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;left&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;margin-right&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="float:left;width:90px;height:90px;background:#2a9da9;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;margin:0 1em .5em 0;"&gt;float&lt;/div&gt;
 &lt;p style="margin:0;"&gt;Este párrafo fluye alrededor del bloque flotado. El texto se ajusta al margen del elemento extraído del flujo, exactamente el caso de uso para el que &lt;code&gt;float&lt;/code&gt; fue concebido: envolver contenido alrededor de una figura.&lt;/p&gt;
 &lt;div style="clear:both;"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Cuando usas &lt;code&gt;float&lt;/code&gt;, necesitas &lt;strong&gt;limpiar&lt;/strong&gt; el flujo para que el contenedor vuelva a comportarse con normalidad. El patrón estándar es el &lt;strong&gt;clearfix&lt;/strong&gt;, implementado con un pseudo-elemento:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;before&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;table&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;content&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34; &amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;clearfix&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;clear&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;both&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Para layouts modernos, &lt;code&gt;float&lt;/code&gt; casi siempre se reemplaza por Flexbox o Grid. Resérvalo para su propósito original: envolver texto alrededor de un elemento.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="flexbox-layout-en-una-dimensión"&gt;Flexbox: layout en una dimensión&lt;/h2&gt;
&lt;p&gt;Al aplicar &lt;code&gt;display: flex&lt;/code&gt; a un contenedor, este se convierte en un &lt;strong&gt;flex container&lt;/strong&gt; y sus hijos en &lt;strong&gt;flex items&lt;/strong&gt;. Flexbox organiza los ítems a lo largo de un eje principal y los alinea en el eje transversal, ajustando tamaños de forma flexible.&lt;/p&gt;
&lt;p&gt;Un contenedor flex tiene dos ejes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eje principal (main)&lt;/strong&gt; — la dirección en la que se colocan los ítems (horizontal por defecto).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eje transversal (cross)&lt;/strong&gt; — perpendicular al principal.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="alinear-ítems-con-justify-content-y-align-items"&gt;Alinear ítems con justify-content y align-items&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;justify-content&lt;/code&gt; controla la distribución a lo largo del &lt;strong&gt;eje principal&lt;/strong&gt;: &lt;code&gt;flex-start&lt;/code&gt;, &lt;code&gt;flex-end&lt;/code&gt;, &lt;code&gt;center&lt;/code&gt;, &lt;code&gt;space-between&lt;/code&gt;, &lt;code&gt;space-around&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;align-items&lt;/code&gt; controla la alineación en el &lt;strong&gt;eje transversal&lt;/strong&gt;: &lt;code&gt;stretch&lt;/code&gt; (por defecto), &lt;code&gt;flex-start&lt;/code&gt;, &lt;code&gt;flex-end&lt;/code&gt;, &lt;code&gt;center&lt;/code&gt;, &lt;code&gt;baseline&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;barra&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;justify-content&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;space-between&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;align-items&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;center&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:flex;justify-content:space-between;align-items:center;background:#eaf2f8;padding:.75rem;border-radius:.4em;"&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:.5em 1em;border-radius:.3em;"&gt;Logo&lt;/span&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:.5em 1em;border-radius:.3em;"&gt;Menú&lt;/span&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:.5em 1em;border-radius:.3em;"&gt;Perfil&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="controlar-el-tamaño-flex-grow-flex-shrink-y-flex-basis"&gt;Controlar el tamaño: flex-grow, flex-shrink y flex-basis&lt;/h3&gt;
&lt;p&gt;La propiedad abreviada &lt;code&gt;flex&lt;/code&gt; agrupa tres propiedades que gobiernan el tamaño de cada ítem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;flex-basis&lt;/code&gt;&lt;/strong&gt; — el tamaño base (de partida) del ítem antes de crecer o encoger. Su valor inicial es &lt;code&gt;auto&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;flex-grow&lt;/code&gt;&lt;/strong&gt; — el factor de crecimiento para repartir el espacio sobrante. &lt;code&gt;0&lt;/code&gt; no crece.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;flex-shrink&lt;/code&gt;&lt;/strong&gt; — el factor de encogimiento cuando falta espacio.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;col-a&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;flex&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* crece para ocupar el espacio sobrante */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;col-b&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;flex&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* crece al doble que col-a */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:flex;gap:.5rem;"&gt;
 &lt;div style="flex:1;background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;text-align:center;"&gt;flex: 1&lt;/div&gt;
 &lt;div style="flex:2;background:#16828d;color:#fff;padding:1em;border-radius:.4em;text-align:center;"&gt;flex: 2 (el doble de ancho)&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="dirección-y-envoltura"&gt;Dirección y envoltura&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;flex-direction&lt;/code&gt; cambia el eje principal: &lt;code&gt;row&lt;/code&gt; (por defecto), &lt;code&gt;row-reverse&lt;/code&gt;, &lt;code&gt;column&lt;/code&gt;, &lt;code&gt;column-reverse&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flex-wrap&lt;/code&gt; permite que los ítems salten a una nueva línea cuando no caben: &lt;code&gt;nowrap&lt;/code&gt; (por defecto), &lt;code&gt;wrap&lt;/code&gt;, &lt;code&gt;wrap-reverse&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flex-flow&lt;/code&gt; es la abreviatura de ambas: &lt;code&gt;flex-flow: row wrap&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="propiedades-del-ítem"&gt;Propiedades del ítem&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;align-self&lt;/code&gt; — sobrescribe &lt;code&gt;align-items&lt;/code&gt; para un ítem concreto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;order&lt;/code&gt; — reordena los ítems sin tocar el HTML; el valor inicial es &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Flexbox crea automáticamente columnas de igual altura y es la herramienta ideal para centrar un elemento. Para un catálogo de bugs conocidos y sus soluciones, consulta &lt;a href="https://github.com/philipwalton/flexbugs"




 target="_blank"
 


&gt;flexbugs&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="css-grid-layout-en-dos-dimensiones"&gt;CSS Grid: layout en dos dimensiones&lt;/h2&gt;
&lt;p&gt;Mientras Flexbox trabaja en un solo eje, &lt;strong&gt;CSS Grid&lt;/strong&gt; organiza el contenido en &lt;strong&gt;filas y columnas&lt;/strong&gt; simultáneamente. Antes de usarlo conviene fijar su vocabulario:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grid line&lt;/strong&gt; — las líneas que forman la estructura de la rejilla.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grid track&lt;/strong&gt; — el espacio entre dos líneas adyacentes (una fila o una columna).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grid cell&lt;/strong&gt; — la intersección de una fila y una columna.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grid area&lt;/strong&gt; — un rectángulo formado por una o más celdas.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="una-rejilla-básica"&gt;Una rejilla básica&lt;/h3&gt;
&lt;p&gt;Se activa con &lt;code&gt;display: grid&lt;/code&gt; y se definen las pistas con &lt;code&gt;grid-template-columns&lt;/code&gt; y &lt;code&gt;grid-template-rows&lt;/code&gt;. La unidad &lt;code&gt;fr&lt;/code&gt; representa una fracción del espacio disponible.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;grid&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;grid&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-template-columns&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;gap&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:.5em;"&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;a&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;b&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;c&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;d&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;e&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;f&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;La función &lt;code&gt;repeat()&lt;/code&gt; evita la repetición: &lt;code&gt;grid-template-columns: repeat(3, 1fr)&lt;/code&gt; equivale a &lt;code&gt;1fr 1fr 1fr&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="posicionar-ítems-por-líneas"&gt;Posicionar ítems por líneas&lt;/h3&gt;
&lt;p&gt;Cada línea de la rejilla tiene un número. Con &lt;code&gt;grid-column&lt;/code&gt; y &lt;code&gt;grid-row&lt;/code&gt; indicas dónde empieza y termina un ítem usando la sintaxis &lt;code&gt;inicio / fin&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;destacado&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-column&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;/&lt;/span&gt; &lt;span style="color:#d19a66"&gt;3&lt;/span&gt;; &lt;span style="color:#7f848e"&gt;/* abarca de la línea 1 a la 3 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-row&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;span&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;; &lt;span style="color:#7f848e"&gt;/* abarca dos pistas verticales */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:grid;grid-template-columns:repeat(3,1fr);grid-auto-rows:60px;gap:.5em;"&gt;
 &lt;div style="grid-column:1 / 3;background:#f39c12;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;"&gt;grid-column: 1 / 3&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;"&gt;b&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;"&gt;c&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;"&gt;d&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:.4em;"&gt;e&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="áreas-con-nombre"&gt;Áreas con nombre&lt;/h3&gt;
&lt;p&gt;La forma más legible de componer un layout es nombrar las áreas con &lt;code&gt;grid-template-areas&lt;/code&gt; y asignar cada elemento con &lt;code&gt;grid-area&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;contenedor&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;grid&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-template-areas&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;titulo titulo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;nav nav&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;main aside&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-template-columns&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;gap&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;header&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;grid-area&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;titulo&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;nav&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;grid-area&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;nav&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;main&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;grid-area&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;main&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;aside&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;grid-area&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;aside&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:grid;grid-template-areas:'titulo titulo' 'nav nav' 'main aside';grid-template-columns:2fr 1fr;gap:.5em;"&gt;
 &lt;div style="grid-area:titulo;background:#16828d;color:#fff;padding:.8em;border-radius:.4em;text-align:center;"&gt;titulo&lt;/div&gt;
 &lt;div style="grid-area:nav;background:#1f6f78;color:#fff;padding:.8em;border-radius:.4em;text-align:center;"&gt;nav&lt;/div&gt;
 &lt;div style="grid-area:main;background:#2a9da9;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;main&lt;/div&gt;
 &lt;div style="grid-area:aside;background:#f39c12;color:#fff;padding:1.5em;border-radius:.4em;text-align:center;"&gt;aside&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="rejilla-implícita-y-galerías-responsivas"&gt;Rejilla implícita y galerías responsivas&lt;/h3&gt;
&lt;p&gt;Cuando no conoces de antemano la cantidad de ítems —por ejemplo, datos que vienen de una API— la &lt;strong&gt;rejilla implícita&lt;/strong&gt; crece automáticamente para acomodarlos. La combinación de &lt;code&gt;auto-fill&lt;/code&gt; con &lt;code&gt;minmax()&lt;/code&gt; produce galerías que se adaptan al ancho disponible sin media queries:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;galeria&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#c678dd"&gt;grid&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;grid-template-columns&lt;/span&gt;: &lt;span style="color:#61afef;font-weight:bold"&gt;repeat&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;auto&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;fill&lt;/span&gt;, &lt;span style="color:#61afef;font-weight:bold"&gt;minmax&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;180&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;, &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fr&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;gap&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:.5em;"&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.2em;border-radius:.4em;text-align:center;"&gt;1&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.2em;border-radius:.4em;text-align:center;"&gt;2&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.2em;border-radius:.4em;text-align:center;"&gt;3&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.2em;border-radius:.4em;text-align:center;"&gt;4&lt;/div&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1.2em;border-radius:.4em;text-align:center;"&gt;5&lt;/div&gt;
 &lt;/div&gt;
 &lt;small style="display:block;margin-top:.5rem;color:#555;"&gt;Redimensiona la ventana: las columnas se reorganizan solas.&lt;/small&gt;
&lt;/div&gt;




 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Con Grid solo puedes formar rectángulos. No se pueden crear formas en L o U directamente; se simulan dejando celdas vacías (con &lt;code&gt;.&lt;/code&gt; en &lt;code&gt;grid-template-areas&lt;/code&gt;) o combinando áreas.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="flexbox-y-grid-complementarios-no-rivales"&gt;Flexbox y Grid: complementarios, no rivales&lt;/h2&gt;
&lt;p&gt;No tienes que elegir uno. La combinación más potente es usar &lt;strong&gt;Grid&lt;/strong&gt; para la estructura macro de la página (cabecera, contenido, barra lateral, pie) y &lt;strong&gt;Flexbox&lt;/strong&gt; para alinear el contenido dentro de cada zona (una barra de navegación, una tarjeta, un grupo de botones).&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;float&lt;/code&gt; resuelve el envolvimiento de texto; Flexbox domina el layout en una dimensión y el centrado; Grid organiza estructuras bidimensionales complejas. Elegir la herramienta adecuada para cada problema —y combinarlas— es lo que distingue una maquetación robusta de una llena de parches.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 En la próxima entrega abordamos el &lt;strong&gt;posicionamiento&lt;/strong&gt; (&lt;code&gt;relative&lt;/code&gt;, &lt;code&gt;absolute&lt;/code&gt;, &lt;code&gt;fixed&lt;/code&gt;, &lt;code&gt;sticky&lt;/code&gt;), los contextos de apilamiento con &lt;code&gt;z-index&lt;/code&gt; y el diseño &lt;strong&gt;responsive&lt;/strong&gt; con media queries.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Estilos CSS: Dominando el modelo de caja</title><link>https://blog.dacadev.com/programacion/estilos-css/modelo-de-caja/</link><pubDate>Sat, 06 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/modelo-de-caja/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina el modelo de caja en CSS: content-box vs border-box, control de overflow, alturas orgánicas, centrado vertical, márgenes negativos y colapso de márgenes.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/03-modelo-de-caja-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#las-cuatro-regiones-de-una-caja"&gt;Las cuatro regiones de una caja&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#box-sizing-content-box-vs-border-box"&gt;&lt;code&gt;box-sizing&lt;/code&gt;: content-box vs border-box&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#alturas-el-flujo-normal-manda"&gt;Alturas: el flujo normal manda&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#overflow-qué-hacer-cuando-el-contenido-se-desborda"&gt;&lt;code&gt;overflow&lt;/code&gt;: qué hacer cuando el contenido se desborda&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#centrado-vertical"&gt;Centrado vertical&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#márgenes-negativos"&gt;Márgenes negativos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#colapso-de-márgenes-margin-collapsing"&gt;Colapso de márgenes (margin collapsing)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;El modelo de caja es el sistema con el que CSS calcula el tamaño y el espaciado de cada elemento. Parece trivial, pero es la fuente número uno de layouts impredecibles: un &lt;code&gt;width: 50%&lt;/code&gt; que termina midiendo más de la mitad, dos columnas que no encajan, márgenes que desaparecen sin razón aparente. Todos esos síntomas se explican entendiendo cómo el navegador compone una caja.&lt;/p&gt;
&lt;p&gt;Esta es la tercera entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Analizaremos las cuatro regiones de una caja, el cambio de comportamiento que introduce &lt;code&gt;box-sizing&lt;/code&gt;, el control de &lt;code&gt;overflow&lt;/code&gt;, el manejo de alturas, el centrado vertical y el colapso de márgenes.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Comprenderás por qué &lt;code&gt;box-sizing: border-box&lt;/code&gt; debería ser tu valor por defecto y aprenderás a resolver los problemas clásicos de altura, centrado vertical y colapso de márgenes.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="las-cuatro-regiones-de-una-caja"&gt;Las cuatro regiones de una caja&lt;/h2&gt;
&lt;p&gt;Todo elemento HTML se compone, de adentro hacia afuera, de cuatro capas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;content&lt;/strong&gt; — el área donde vive el contenido (texto, imágenes).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;padding&lt;/strong&gt; — el espacio interno entre el contenido y el borde.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;border&lt;/strong&gt; — el borde que rodea el padding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;margin&lt;/strong&gt; — el espacio externo que separa la caja de sus vecinos.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;div&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;caja&amp;#34;&lt;/span&gt;&amp;gt;content + padding + border + margin&amp;lt;/&lt;span style="color:#e06c75"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px dashed #f39c12;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;div style="background:#fdebd0;padding:1.25rem;border:3px solid #2a9da9;font-family:Helvetica,Arial,sans-serif;color:#111;"&gt;
 &lt;div style="background:#aed6f1;padding:.75rem;"&gt;content&lt;/div&gt;
 &lt;small style="display:block;margin-top:.4rem;color:#555;"&gt;El área azul es el &lt;code&gt;content&lt;/code&gt;; el beige es el &lt;code&gt;padding&lt;/code&gt;; el trazo turquesa es el &lt;code&gt;border&lt;/code&gt;; el espacio punteado exterior es el &lt;code&gt;margin&lt;/code&gt;.&lt;/small&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="box-sizing-content-box-vs-border-box"&gt;&lt;code&gt;box-sizing&lt;/code&gt;: content-box vs border-box&lt;/h2&gt;
&lt;p&gt;La propiedad &lt;code&gt;box-sizing&lt;/code&gt; decide qué incluye el &lt;code&gt;width&lt;/code&gt; y el &lt;code&gt;height&lt;/code&gt; que declaras.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;content-box&lt;/code&gt;&lt;/strong&gt; (valor por defecto) — &lt;code&gt;width&lt;/code&gt; y &lt;code&gt;height&lt;/code&gt; miden &lt;strong&gt;solo&lt;/strong&gt; el contenido. El &lt;code&gt;padding&lt;/code&gt; y el &lt;code&gt;border&lt;/code&gt; se suman &lt;em&gt;por fuera&lt;/em&gt;, agrandando el tamaño final.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;border-box&lt;/code&gt;&lt;/strong&gt; — &lt;code&gt;width&lt;/code&gt; y &lt;code&gt;height&lt;/code&gt; miden el conjunto de contenido + padding + border. El tamaño que declaras es el tamaño real renderizado.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mira dos cajas con &lt;code&gt;width: 200px&lt;/code&gt; y &lt;code&gt;padding: 20px&lt;/code&gt;, una con cada modelo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;content-box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;content-box&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* ancho real: 200 + 40 = 240px */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;border-box&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;border-box&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* ancho real: 200px */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="box-sizing:content-box;width:200px;padding:20px;border:3px solid #c0392b;background:#fdecea;margin-bottom:.75rem;color:#111;"&gt;content-box → mide 246px en total&lt;/div&gt;
 &lt;div style="box-sizing:border-box;width:200px;padding:20px;border:3px solid #27ae60;background:#eafaf1;color:#111;"&gt;border-box → mide 200px en total&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Por eso es práctica recomendada activar &lt;code&gt;border-box&lt;/code&gt; de forma global, heredándolo para no romper estilos de terceros:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;border-box&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#56b6c2"&gt;*,&lt;/span&gt; ::&lt;span style="color:#61afef"&gt;before&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;,&lt;/span&gt; ::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;box-sizing&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;inherit&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



 
 





 


&lt;div class="notice warning"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Warning&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Evita los &lt;strong&gt;números mágicos&lt;/strong&gt;: valores arbitrarios (&lt;code&gt;margin-top: 37px&lt;/code&gt;) que &amp;ldquo;cuadran&amp;rdquo; un diseño por casualidad. Haz que el contenido se adapte al contenedor, no al revés.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="alturas-el-flujo-normal-manda"&gt;Alturas: el flujo normal manda&lt;/h2&gt;
&lt;p&gt;La altura de un contenedor es &lt;strong&gt;orgánica&lt;/strong&gt; por defecto: la define su contenido, no el contenedor. Esto tiene dos consecuencias prácticas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Definir &lt;code&gt;height&lt;/code&gt; en porcentaje rara vez funciona, porque se refiere a la altura del padre, que a su vez depende de su contenido.&lt;/li&gt;
&lt;li&gt;Para que un &lt;code&gt;height: 100%&lt;/code&gt; funcione, el padre necesita una altura explícita en unidades absolutas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En lugar de fijar alturas, prefiere restringir el rango con &lt;code&gt;min-height&lt;/code&gt; y &lt;code&gt;max-height&lt;/code&gt;, dejando que el contenido fluya:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;panel&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;min-height&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;6&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;max-height&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;12&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="overflow-qué-hacer-cuando-el-contenido-se-desborda"&gt;&lt;code&gt;overflow&lt;/code&gt;: qué hacer cuando el contenido se desborda&lt;/h2&gt;
&lt;p&gt;Cuando el contenido excede el tamaño de su caja, &lt;code&gt;overflow&lt;/code&gt; define el comportamiento:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Valor&lt;/th&gt;
 &lt;th&gt;Comportamiento&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;visible&lt;/code&gt; (por defecto)&lt;/td&gt;
 &lt;td&gt;El contenido se desborda y permanece visible.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;hidden&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;El contenido que se sale se recorta.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;scroll&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Siempre añade barras de desplazamiento.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;auto&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Añade barras solo si hace falta.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;recorte&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;overflow&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;auto&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;max-height&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="overflow:auto;max-height:5em;border:1px solid #ccc;padding:.5rem;color:#111;"&gt;
 &lt;p style="margin:0 0 .5rem;"&gt;Este contenedor tiene &lt;code&gt;overflow: auto&lt;/code&gt; y una altura máxima.&lt;/p&gt;
 &lt;p style="margin:0 0 .5rem;"&gt;Cuando el contenido supera esa altura, aparece una barra de desplazamiento.&lt;/p&gt;
 &lt;p style="margin:0 0 .5rem;"&gt;Línea adicional para forzar el desbordamiento.&lt;/p&gt;
 &lt;p style="margin:0;"&gt;Y una más para asegurar el scroll.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Puedes controlar cada eje por separado con &lt;code&gt;overflow-x&lt;/code&gt; y &lt;code&gt;overflow-y&lt;/code&gt;, aunque mezclar valores distintos suele dar resultados poco predecibles.&lt;/p&gt;
&lt;h2 id="centrado-vertical"&gt;Centrado vertical&lt;/h2&gt;
&lt;p&gt;Centrar verticalmente fue durante años un dolor de cabeza en CSS. La propiedad &lt;code&gt;vertical-align&lt;/code&gt; no sirve para esto: solo aplica a elementos &lt;code&gt;inline&lt;/code&gt; y a celdas de tabla. Hoy tenemos varias soluciones según el escenario:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;¿Puedes usar la altura natural?&lt;/strong&gt; Aplica un &lt;code&gt;padding&lt;/code&gt; igual arriba y abajo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;¿Necesitas altura fija?&lt;/strong&gt; Usa &lt;code&gt;display: table-cell&lt;/code&gt; con &lt;code&gt;vertical-align: middle&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El caso general:&lt;/strong&gt; usa &lt;strong&gt;flexbox&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;¿Una sola línea de texto?&lt;/strong&gt; Usa &lt;code&gt;line-height&lt;/code&gt; igual a la altura del contenedor.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La solución moderna por excelencia es flexbox, que centra en ambos ejes con tres declaraciones:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;centro&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;display&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;align-items&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;center&lt;/span&gt;; &lt;span style="color:#7f848e"&gt;/* eje vertical */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;justify-content&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;center&lt;/span&gt;; &lt;span style="color:#7f848e"&gt;/* eje horizontal */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;min-height&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;8&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;div style="display:flex;align-items:center;justify-content:center;min-height:8em;background:#eaf2f8;border-radius:.4em;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;span style="background:#2a9da9;color:#fff;padding:.6em 1.2em;border-radius:.4em;"&gt;Centrado en ambos ejes&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="márgenes-negativos"&gt;Márgenes negativos&lt;/h2&gt;
&lt;p&gt;A diferencia de &lt;code&gt;padding&lt;/code&gt; y &lt;code&gt;border&lt;/code&gt;, los márgenes admiten valores &lt;strong&gt;negativos&lt;/strong&gt;, lo que te permite tirar de un elemento hacia afuera de su posición natural o solaparlo con su vecino.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;solapado&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;margin-top&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;-1.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;div style="background:#2a9da9;color:#fff;padding:1em;border-radius:.4em;"&gt;Bloque base&lt;/div&gt;
 &lt;div style="background:#f39c12;color:#fff;padding:1em;border-radius:.4em;margin-top:-1.5em;margin-left:2em;"&gt;Bloque con &lt;code&gt;margin-top&lt;/code&gt; negativo que se solapa&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="colapso-de-márgenes-margin-collapsing"&gt;Colapso de márgenes (margin collapsing)&lt;/h2&gt;
&lt;p&gt;Cuando dos márgenes verticales se encuentran, &lt;strong&gt;no se suman&lt;/strong&gt;: se &lt;em&gt;colapsan&lt;/em&gt;, quedando solo el de mayor valor. Si un párrafo tiene &lt;code&gt;margin-bottom: 30px&lt;/code&gt; y el siguiente &lt;code&gt;margin-top: 20px&lt;/code&gt;, la separación entre ambos será de &lt;code&gt;30px&lt;/code&gt;, no &lt;code&gt;50px&lt;/code&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;El colapso de márgenes solo ocurre con márgenes &lt;strong&gt;verticales&lt;/strong&gt; (arriba y abajo). Los márgenes horizontales (izquierda y derecha) nunca colapsan.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Hay varias formas de impedir el colapso cuando no lo deseas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Aplicar &lt;code&gt;overflow: auto&lt;/code&gt; (o cualquier valor distinto de &lt;code&gt;visible&lt;/code&gt;) al contenedor.&lt;/li&gt;
&lt;li&gt;Añadir un &lt;code&gt;border&lt;/code&gt; o un &lt;code&gt;padding&lt;/code&gt; entre los dos márgenes.&lt;/li&gt;
&lt;li&gt;Usar un contenedor flotado, &lt;code&gt;inline-block&lt;/code&gt; o con posición absoluta/fija.&lt;/li&gt;
&lt;li&gt;Usar &lt;strong&gt;flexbox&lt;/strong&gt; o &lt;strong&gt;grid&lt;/strong&gt;: los márgenes entre ítems del layout no colapsan.&lt;/li&gt;
&lt;li&gt;Los elementos con &lt;code&gt;display: table-cell&lt;/code&gt; no tienen margen, así que no colapsan.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El modelo de caja deja de ser un misterio cuando interiorizas que &lt;code&gt;box-sizing&lt;/code&gt; controla la aritmética del tamaño, que la altura es orgánica por naturaleza y que los márgenes verticales colapsan. Activar &lt;code&gt;border-box&lt;/code&gt; de forma global y apoyarte en flexbox para el centrado elimina la mayoría de los problemas clásicos de maquetación.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 La siguiente entrega cubre los sistemas de &lt;strong&gt;layout&lt;/strong&gt;: &lt;code&gt;float&lt;/code&gt;, &lt;strong&gt;flexbox&lt;/strong&gt; y &lt;strong&gt;CSS Grid&lt;/strong&gt;, las herramientas con las que componemos la estructura completa de una página.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Estilos CSS: Selectores, combinadores y pseudo-clases</title><link>https://blog.dacadev.com/programacion/estilos-css/selectores-css/</link><pubDate>Thu, 04 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/selectores-css/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a apuntar a cualquier elemento con los selectores de CSS: básicos, combinadores, pseudo-clases, pseudo-elementos y selectores de atributo, con ejemplos en vivo.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/02-selectores-css-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#selectores-básicos"&gt;Selectores básicos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#combinadores"&gt;Combinadores&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#selectores-compuestos"&gt;Selectores compuestos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#pseudo-clases"&gt;Pseudo-clases&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#posición-estructural"&gt;Posición estructural&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#estado-e-interacción"&gt;Estado e interacción&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#campos-de-formulario"&gt;Campos de formulario&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#pseudo-elementos"&gt;Pseudo-elementos&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#selectores-de-atributo"&gt;Selectores de atributo&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Un selector es el mecanismo con el que CSS apunta a los elementos que vas a estilizar. Elegir el selector correcto no es solo cuestión de que &amp;ldquo;funcione&amp;rdquo;: impacta directamente en la especificidad, en el acoplamiento de tus estilos y en la facilidad para mantenerlos. CSS ofrece un catálogo amplio de selectores, y conocerlos a fondo te evita escribir reglas frágiles.&lt;/p&gt;
&lt;p&gt;Este artículo es la segunda entrega de la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Recorreremos los selectores básicos, los combinadores, las pseudo-clases, los pseudo-elementos y los selectores de atributo, con ejemplos que puedes ver renderizados aquí mismo.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Repasaremos cada familia de selectores con su especificidad y demostraciones en vivo, para que puedas elegir siempre la opción más precisa y de menor acoplamiento.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="selectores-básicos"&gt;Selectores básicos&lt;/h2&gt;
&lt;p&gt;Son los cuatro selectores fundamentales sobre los que se construye todo lo demás:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Selector de tipo&lt;/strong&gt; (&lt;code&gt;p&lt;/code&gt;, &lt;code&gt;h1&lt;/code&gt;) — apunta por nombre de etiqueta. Especificidad &lt;code&gt;0,0,1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selector de clase&lt;/strong&gt; (&lt;code&gt;.media&lt;/code&gt;) — apunta a los elementos con esa clase. Especificidad &lt;code&gt;0,1,0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selector de ID&lt;/strong&gt; (&lt;code&gt;#sidebar&lt;/code&gt;) — apunta al elemento con ese &lt;code&gt;id&lt;/code&gt;. Especificidad &lt;code&gt;1,0,0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selector universal&lt;/strong&gt; (&lt;code&gt;*&lt;/code&gt;) — apunta a todos los elementos. Especificidad &lt;code&gt;0,0,0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="combinadores"&gt;Combinadores&lt;/h2&gt;
&lt;p&gt;Los &lt;strong&gt;combinadores&lt;/strong&gt; unen selectores simples para describir una relación entre elementos.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Combinador&lt;/th&gt;
 &lt;th&gt;Símbolo&lt;/th&gt;
 &lt;th&gt;Significado&lt;/th&gt;
 &lt;th&gt;Ejemplo&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Descendiente&lt;/td&gt;
 &lt;td&gt;(espacio)&lt;/td&gt;
 &lt;td&gt;Cualquier descendiente&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;.menu li&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Hijo directo&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Hijo inmediato&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;.lista &amp;gt; li&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Hermano adyacente&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;+&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;El elemento inmediatamente siguiente&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;p + h2&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Hermano general&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;~&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Todos los hermanos posteriores&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;li.activo ~ li&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;El combinador de hijo directo (&lt;code&gt;&amp;gt;&lt;/code&gt;) solo afecta al primer nivel de descendientes. Observa la diferencia con el descendiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;lista&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;li&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-weight&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;bold&lt;/span&gt;; } &lt;span style="color:#7f848e"&gt;/* solo hijos directos */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;ul&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;lista&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;Hijo directo (en negrita)&amp;lt;/&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;Hijo directo (en negrita)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;Nieto (sin negrita)&amp;lt;/&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#e06c75"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#e06c75"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#e06c75"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;style&gt;
 .cssel-child &gt; li { font-weight:bold; }
 .cssel-child ul li { font-weight:normal; }
 .cssel-child, .cssel-child ul { font-family:Helvetica,Arial,sans-serif; }
 &lt;/style&gt;
 &lt;ul class="cssel-child"&gt;
 &lt;li&gt;Hijo directo (en negrita)&lt;/li&gt;
 &lt;li&gt;Hijo directo (en negrita)
 &lt;ul&gt;
 &lt;li&gt;Nieto (sin negrita)&lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="selectores-compuestos"&gt;Selectores compuestos&lt;/h2&gt;
&lt;p&gt;Varios selectores simples se pueden unir &lt;strong&gt;sin espacios&lt;/strong&gt; para formar un selector compuesto que exige que el elemento cumpla &lt;em&gt;todas&lt;/em&gt; las condiciones. Por ejemplo, &lt;code&gt;.dropdown.is-active&lt;/code&gt; apunta a &lt;code&gt;&amp;lt;div class=&amp;quot;dropdown is-active&amp;quot;&amp;gt;&lt;/code&gt; pero no a &lt;code&gt;&amp;lt;div class=&amp;quot;dropdown&amp;quot;&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="pseudo-clases"&gt;Pseudo-clases&lt;/h2&gt;
&lt;p&gt;Las &lt;strong&gt;pseudo-clases&lt;/strong&gt; apuntan a elementos según un estado: interacción del usuario o posición respecto a sus hermanos. Empiezan con un solo dos puntos (&lt;code&gt;:&lt;/code&gt;) y tienen la especificidad de una clase (&lt;code&gt;0,1,0&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id="posición-estructural"&gt;Posición estructural&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:first-child&lt;/code&gt;, &lt;code&gt;:last-child&lt;/code&gt;, &lt;code&gt;:only-child&lt;/code&gt; — primero, último o único hijo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:nth-child(an + b)&lt;/code&gt; — apunta según una fórmula posicional entre sus hermanos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:nth-last-child()&lt;/code&gt; — igual, pero contando desde el final.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:first-of-type&lt;/code&gt;, &lt;code&gt;:last-of-type&lt;/code&gt;, &lt;code&gt;:nth-of-type()&lt;/code&gt; — equivalentes, pero solo cuentan elementos del mismo tipo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:not(&amp;lt;selector&amp;gt;)&lt;/code&gt; — apunta a lo que &lt;em&gt;no&lt;/em&gt; coincide con el selector interno.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:empty&lt;/code&gt; — elementos sin hijos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un patrón clásico: aplicar un fondo alterno con &lt;code&gt;:nth-child(even)&lt;/code&gt; para crear filas tipo &amp;ldquo;cebra&amp;rdquo;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;zebra&lt;/span&gt; &lt;span style="color:#e06c75"&gt;li&lt;/span&gt;:&lt;span style="color:#61afef"&gt;nth-child&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;even&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;background&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#ecf0f1&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;style&gt;
 .cssel-zebra { list-style:none;padding:0;margin:0;font-family:Helvetica,Arial,sans-serif; }
 .cssel-zebra li { padding:.5em .75em; }
 .cssel-zebra li:nth-child(even) { background:#ecf0f1; }
 &lt;/style&gt;
 &lt;ul class="cssel-zebra"&gt;
 &lt;li&gt;Fila 1&lt;/li&gt;
 &lt;li&gt;Fila 2 (resaltada)&lt;/li&gt;
 &lt;li&gt;Fila 3&lt;/li&gt;
 &lt;li&gt;Fila 4 (resaltada)&lt;/li&gt;
 &lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id="estado-e-interacción"&gt;Estado e interacción&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:hover&lt;/code&gt; — mientras el cursor está sobre el elemento.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:focus&lt;/code&gt; — cuando el elemento recibe foco (clic, toque o tabulación).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:root&lt;/code&gt; — el elemento raíz del documento.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="campos-de-formulario"&gt;Campos de formulario&lt;/h3&gt;
&lt;p&gt;Varias pseudo-clases describen el estado de los controles: &lt;code&gt;:disabled&lt;/code&gt;, &lt;code&gt;:enabled&lt;/code&gt;, &lt;code&gt;:checked&lt;/code&gt;, &lt;code&gt;:invalid&lt;/code&gt;, &lt;code&gt;:valid&lt;/code&gt;, &lt;code&gt;:required&lt;/code&gt;, &lt;code&gt;:optional&lt;/code&gt;. Aquí, &lt;code&gt;:invalid&lt;/code&gt; cambia el borde cuando el valor no es un correo válido:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;input&lt;/span&gt;:&lt;span style="color:#61afef"&gt;invalid&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;border-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#c0392b&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;input&lt;/span&gt;:&lt;span style="color:#61afef"&gt;valid&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;border-color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#27ae60&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;style&gt;
 .cssel-form input { padding:.5em;border:2px solid #ccc;border-radius:.3em;font-size:1rem;font-family:Helvetica,Arial,sans-serif; }
 .cssel-form input:invalid { border-color:#c0392b; }
 .cssel-form input:valid { border-color:#27ae60; }
 &lt;/style&gt;
 &lt;div class="cssel-form"&gt;
 &lt;label&gt;Escribe un correo: &lt;input type="email" placeholder="tu@correo.com" required&gt;&lt;/label&gt;
 &lt;/div&gt;
&lt;/div&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;La lista de pseudo-clases es extensa y evoluciona con cada nivel de la especificación. Consulta la &lt;a href="https://developer.mozilla.org/es/docs/Web/CSS/Pseudo-classes"




 target="_blank"
 


&gt;documentación de MDN sobre pseudo-clases&lt;/a&gt; para el catálogo completo y el soporte por navegador.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="pseudo-elementos"&gt;Pseudo-elementos&lt;/h2&gt;
&lt;p&gt;Los &lt;strong&gt;pseudo-elementos&lt;/strong&gt; no apuntan a un elemento existente, sino a una parte del documento que no tiene marcado propio, o inyectan contenido nuevo. Usan doble dos puntos (&lt;code&gt;::&lt;/code&gt;) y tienen la especificidad de un selector de tipo (&lt;code&gt;0,0,1&lt;/code&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;::before&lt;/code&gt; — inserta un primer hijo virtual. Requiere la propiedad &lt;code&gt;content&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;::after&lt;/code&gt; — inserta un último hijo virtual. Requiere &lt;code&gt;content&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;::first-letter&lt;/code&gt; — estiliza la primera letra del texto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;::first-line&lt;/code&gt; — estiliza la primera línea.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;::selection&lt;/code&gt; — estiliza el texto que el usuario resalta.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;nota&lt;/span&gt;::&lt;span style="color:#61afef"&gt;before&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;content&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34;★ &amp;#34;&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#f39c12&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;capitular&lt;/span&gt;::&lt;span style="color:#61afef"&gt;first-letter&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;2.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;font-weight&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;bold&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;p style="margin:.2rem 0;"&gt;&lt;span style="color:#f39c12;"&gt;★ &lt;/span&gt;Texto precedido por un pseudo-elemento &lt;code&gt;::before&lt;/code&gt;.&lt;/p&gt;
 &lt;p style="margin:.6rem 0 0;"&gt;&lt;span style="font-size:2.5em;font-weight:bold;color:#2a9da9;"&gt;L&lt;/span&gt;orem ipsum con la primera letra estilizada como capitular.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="selectores-de-atributo"&gt;Selectores de atributo&lt;/h2&gt;
&lt;p&gt;Apuntan a elementos según sus atributos HTML. Tienen la especificidad de una clase (&lt;code&gt;0,1,0&lt;/code&gt;).&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Selector&lt;/th&gt;
 &lt;th&gt;Coincide cuando el atributo&amp;hellip;&lt;/th&gt;
 &lt;th&gt;Ejemplo&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;existe&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;input[disabled]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;es exactamente igual&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;input[type=&amp;quot;radio&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr^=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;empieza con el valor&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;a[href^=&amp;quot;https&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr$=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;termina con el valor&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;a[href$=&amp;quot;.pdf&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr*=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;contiene el valor&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;[class*=&amp;quot;sprite-&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr~=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;es una lista separada por espacios que incluye el valor&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;a[rel~=&amp;quot;author&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[attr|=&amp;quot;valor&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;es igual o empieza con &lt;code&gt;valor-&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;[lang|=&amp;quot;es&amp;quot;]&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Por ejemplo, podemos marcar visualmente los enlaces externos y los que apuntan a un PDF:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;[&lt;/span&gt;&lt;span style="color:#e06c75"&gt;href&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;^=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;https&amp;#34;&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;]&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;content&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34; ↗&amp;#34;&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;[&lt;/span&gt;&lt;span style="color:#e06c75"&gt;href&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;$=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;.pdf&amp;#34;&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;]&lt;/span&gt;::&lt;span style="color:#61afef"&gt;after&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;content&lt;/span&gt;: &lt;span style="color:#98c379"&gt;&amp;#34; (PDF)&amp;#34;&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#c0392b&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;font-family:Helvetica,Arial,sans-serif;"&gt;
 &lt;p style="margin:0;"&gt;
 &lt;a href="https://developer.mozilla.org" style="color:#2a7ae2;"&gt;Enlace externo&lt;span style="color:#2a7ae2;"&gt; ↗&lt;/span&gt;&lt;/a&gt; ·
 &lt;a href="#" style="color:#2a7ae2;"&gt;Documento&lt;span style="color:#c0392b;"&gt; (PDF)&lt;/span&gt;&lt;/a&gt;
 &lt;/p&gt;
&lt;/div&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Los selectores de atributo distinguen mayúsculas y minúsculas por defecto. La especificación nivel 4 añade un modificador &lt;code&gt;i&lt;/code&gt; antes del corchete de cierre —&lt;code&gt;input[value=&amp;quot;search&amp;quot; i]&lt;/code&gt;— para hacerlos insensibles a mayúsculas. Verifica el soporte antes de usarlo en producción.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El catálogo de selectores de CSS es amplio y cada familia resuelve un problema distinto. La clave está en elegir el selector más preciso con la menor especificidad posible: eso mantiene tus estilos desacoplados y fáciles de sobrescribir cuando lo necesites.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 En la siguiente entrega abordamos el &lt;strong&gt;modelo de caja&lt;/strong&gt;: cómo &lt;code&gt;margin&lt;/code&gt;, &lt;code&gt;border&lt;/code&gt;, &lt;code&gt;padding&lt;/code&gt; y &lt;code&gt;content&lt;/code&gt; definen el tamaño real de cada elemento y cómo &lt;code&gt;box-sizing&lt;/code&gt; cambia las reglas del juego.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item><item><title>Estilos CSS: Cascada, especificidad, herencia y unidades</title><link>https://blog.dacadev.com/programacion/estilos-css/fundamentos-cascada-especificidad-herencia/</link><pubDate>Tue, 02 Jun 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estilos-css/fundamentos-cascada-especificidad-herencia/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Domina los fundamentos de CSS: cómo resuelve el navegador los conflictos de estilos con la cascada, la especificidad, la herencia y las unidades em, rem y vw.</description><media:content url="https://blog.dacadev.com/images/programming/html-and-css/css/01-fundamentos-cascada-especificidad-herencia-banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#la-cascada-cómo-el-navegador-resuelve-conflictos"&gt;La cascada: cómo el navegador resuelve conflictos&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#origen-de-los-estilos"&gt;Origen de los estilos&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#especificidad-el-peso-de-un-selector"&gt;Especificidad: el peso de un selector&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#orden-del-código-el-último-en-hablar-gana"&gt;Orden del código: el último en hablar gana&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#herencia-propiedades-que-viajan-hacia-abajo"&gt;Herencia: propiedades que viajan hacia abajo&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#valores-especiales-inherit-e-initial"&gt;Valores especiales: &lt;code&gt;inherit&lt;/code&gt; e &lt;code&gt;initial&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#unidades-absolutas-vs-relativas"&gt;Unidades absolutas vs. relativas&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#em-relativo-al-elemento"&gt;&lt;code&gt;em&lt;/code&gt;: relativo al elemento&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#rem-relativo-a-la-raíz"&gt;&lt;code&gt;rem&lt;/code&gt;: relativo a la raíz&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#unidades-relativas-al-viewport"&gt;Unidades relativas al viewport&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#calc-para-combinar-unidades"&gt;&lt;code&gt;calc()&lt;/code&gt; para combinar unidades&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#números-sin-unidad-y-line-height"&gt;Números sin unidad y &lt;code&gt;line-height&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#custom-properties-variables-css"&gt;Custom properties (variables CSS)&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#redefinir-variables-por-contexto"&gt;Redefinir variables por contexto&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#conclusión"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Cuando dos reglas de estilo compiten por el mismo elemento, el resultado no es aleatorio: el navegador aplica un algoritmo determinista para decidir cuál gana. Comprender ese algoritmo —la cascada, la especificidad y la herencia— es la diferencia entre pelear contra CSS a punta de &lt;code&gt;!important&lt;/code&gt; y escribir hojas de estilo predecibles y mantenibles.&lt;/p&gt;
&lt;p&gt;Este artículo abre la serie &lt;strong&gt;Estilos CSS&lt;/strong&gt;. Analizaremos cómo el navegador resuelve conflictos, cómo se calcula el peso de un selector y cómo aprovechar las unidades relativas para construir interfaces que escalan.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Al terminar entenderás el modelo mental que rige &lt;em&gt;toda&lt;/em&gt; hoja de estilos: origen de los estilos, especificidad, orden del código, herencia y el sistema de unidades relativas (&lt;code&gt;em&lt;/code&gt;, &lt;code&gt;rem&lt;/code&gt;, &lt;code&gt;vw&lt;/code&gt;) junto con las variables CSS.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="la-cascada-cómo-el-navegador-resuelve-conflictos"&gt;La cascada: cómo el navegador resuelve conflictos&lt;/h2&gt;
&lt;p&gt;CSS significa &lt;em&gt;Cascading Style Sheets&lt;/em&gt;. La &lt;strong&gt;cascada&lt;/strong&gt; es precisamente el conjunto de reglas que determina qué declaración prevalece cuando varias apuntan a la misma propiedad de un elemento. El navegador evalúa tres criterios en orden:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Origen de la hoja de estilos&lt;/strong&gt; — de dónde provienen los estilos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Especificidad del selector&lt;/strong&gt; — qué selector es más &amp;ldquo;específico&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Orden en el código&lt;/strong&gt; — cuál se declaró de último.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="origen-de-los-estilos"&gt;Origen de los estilos&lt;/h3&gt;
&lt;p&gt;Existen tres orígenes posibles, con prioridad creciente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;User agent styles&lt;/strong&gt; — los estilos por defecto del navegador (por ejemplo, el &lt;code&gt;margin&lt;/code&gt; de un &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; o el subrayado de un enlace).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Author styles&lt;/strong&gt; — los estilos que tú defines en tus archivos &lt;code&gt;.css&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User styles&lt;/strong&gt; — estilos configurados por el propio usuario en el navegador (accesibilidad, tamaños de fuente). Tienen prioridad sobre los anteriores.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tus estilos (&lt;em&gt;author&lt;/em&gt;) pisan a los del navegador, que es justo lo que esperas al escribir una hoja de estilos.&lt;/p&gt;
&lt;h2 id="especificidad-el-peso-de-un-selector"&gt;Especificidad: el peso de un selector&lt;/h2&gt;
&lt;p&gt;La &lt;strong&gt;especificidad&lt;/strong&gt; se representa con la notación &lt;code&gt;0,0,0,0&lt;/code&gt;, donde cada posición cuenta, de izquierda a derecha: estilos &lt;em&gt;inline&lt;/em&gt;, IDs, clases y nombres de etiqueta.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Componente&lt;/th&gt;
 &lt;th&gt;Ejemplo&lt;/th&gt;
 &lt;th&gt;Peso&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Selector de etiqueta&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;p&lt;/code&gt;, &lt;code&gt;h1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0,0,0,1&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Selector de clase&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;.nav-menu&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0,0,1,0&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Selector de ID&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;#sidebar&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0,1,0,0&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Estilo inline&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;style=&amp;quot;...&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;1,0,0,0&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Las reglas de desempate son sencillas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Una declaración con &lt;code&gt;!important&lt;/code&gt; gana por encima de todo (úsala con prudencia).&lt;/li&gt;
&lt;li&gt;Gana el selector con más IDs.&lt;/li&gt;
&lt;li&gt;Si hay empate, gana el que tenga más clases.&lt;/li&gt;
&lt;li&gt;Si persiste el empate, gana el que tenga más etiquetas.&lt;/li&gt;
&lt;/ol&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Las pseudo-clases (&lt;code&gt;:hover&lt;/code&gt;) y los selectores de atributo (&lt;code&gt;[type=&amp;quot;text&amp;quot;]&lt;/code&gt;) cuentan como una clase (&lt;code&gt;0,0,1,0&lt;/code&gt;). El selector universal &lt;code&gt;*&lt;/code&gt; y los combinadores (&lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;~&lt;/code&gt;) &lt;strong&gt;no&lt;/strong&gt; aportan especificidad.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Observa cómo dos reglas compiten por el color del párrafo. La clase &lt;code&gt;.destacado&lt;/code&gt; gana al selector de etiqueta &lt;code&gt;p&lt;/code&gt;, aunque la regla de &lt;code&gt;p&lt;/code&gt; se declare después:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;p&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#555&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;destacado&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#c0392b&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;&amp;gt;Texto con el color por defecto del selector de etiqueta.&amp;lt;/&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;p&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;destacado&amp;#34;&lt;/span&gt;&amp;gt;Este párrafo gana por especificidad de clase.&amp;lt;/&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;style&gt;
 .csfund-spec p { color:#555;margin:.25rem 0;font-family:Helvetica,Arial,sans-serif; }
 .csfund-spec .destacado { color:#c0392b;font-weight:bold; }
 &lt;/style&gt;
 &lt;div class="csfund-spec"&gt;
 &lt;p&gt;Texto con el color por defecto del selector de etiqueta.&lt;/p&gt;
 &lt;p class="destacado"&gt;Este párrafo gana por especificidad de clase.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="orden-del-código-el-último-en-hablar-gana"&gt;Orden del código: el último en hablar gana&lt;/h2&gt;
&lt;p&gt;Cuando dos declaraciones tienen el &lt;strong&gt;mismo origen y la misma especificidad&lt;/strong&gt;, el navegador aplica la que aparece de última en el código fuente. Este comportamiento es crítico al ordenar las pseudo-clases de un enlace.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;:&lt;span style="color:#61afef"&gt;link&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#2a7ae2&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;:&lt;span style="color:#61afef"&gt;visited&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#8e44ad&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;:&lt;span style="color:#61afef"&gt;hover&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;text-decoration&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;underline&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;a&lt;/span&gt;:&lt;span style="color:#61afef"&gt;active&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#c0392b&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Como las cuatro pseudo-clases tienen la misma especificidad, su orden importa. La regla mnemotécnica es &lt;strong&gt;LoVe/HAte&lt;/strong&gt; — &lt;em&gt;link, visited, hover, active&lt;/em&gt;. Si inviertes &lt;code&gt;:hover&lt;/code&gt; y &lt;code&gt;:link&lt;/code&gt;, el &lt;code&gt;:hover&lt;/code&gt; nunca se aplicaría.&lt;/p&gt;
&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;"&gt;
 &lt;style&gt;
 .csfund-links a { font-family:Helvetica,Arial,sans-serif;font-weight:bold;text-decoration:none;color:#2a7ae2; }
 .csfund-links a:hover { text-decoration:underline;color:#c0392b; }
 &lt;/style&gt;
 &lt;p class="csfund-links" style="margin:0;"&gt;&lt;a href="#fundamentos-cascada-especificidad-herencia"&gt;Pasa el cursor sobre este enlace&lt;/a&gt; para ver el efecto del orden del código.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="herencia-propiedades-que-viajan-hacia-abajo"&gt;Herencia: propiedades que viajan hacia abajo&lt;/h2&gt;
&lt;p&gt;La &lt;strong&gt;herencia&lt;/strong&gt; permite que ciertas propiedades de un elemento padre se transmitan a sus hijos. No todas las propiedades heredan: lo hacen principalmente las relacionadas con texto (&lt;code&gt;color&lt;/code&gt;, &lt;code&gt;font-family&lt;/code&gt;, &lt;code&gt;line-height&lt;/code&gt;, &lt;code&gt;text-align&lt;/code&gt;), mientras que las de caja (&lt;code&gt;margin&lt;/code&gt;, &lt;code&gt;padding&lt;/code&gt;, &lt;code&gt;border&lt;/code&gt;) no.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;tarjeta&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#1a5276&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;font-family&lt;/span&gt;: &lt;span style="color:#e06c75"&gt;Georgia&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;serif&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;div&lt;/span&gt; &lt;span style="color:#e06c75"&gt;class&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;=&lt;/span&gt;&lt;span style="color:#98c379"&gt;&amp;#34;tarjeta&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;h4&lt;/span&gt;&amp;gt;Título heredado&amp;lt;/&lt;span style="color:#e06c75"&gt;h4&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;&amp;gt;Este párrafo hereda &amp;lt;&lt;span style="color:#e06c75"&gt;em&lt;/span&gt;&amp;gt;color&amp;lt;/&lt;span style="color:#e06c75"&gt;em&lt;/span&gt;&amp;gt; y &amp;lt;&lt;span style="color:#e06c75"&gt;em&lt;/span&gt;&amp;gt;font-family&amp;lt;/&lt;span style="color:#e06c75"&gt;em&lt;/span&gt;&amp;gt; del contenedor.&amp;lt;/&lt;span style="color:#e06c75"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#e06c75"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;margin:1rem 0;"&gt;
 &lt;div style="color:#1a5276;font-family:Georgia,serif;"&gt;
 &lt;h4 style="margin:.2rem 0;"&gt;Título heredado&lt;/h4&gt;
 &lt;p style="margin:.2rem 0;"&gt;Este párrafo hereda &lt;em&gt;color&lt;/em&gt; y &lt;em&gt;font-family&lt;/em&gt; del contenedor.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="valores-especiales-inherit-e-initial"&gt;Valores especiales: &lt;code&gt;inherit&lt;/code&gt; e &lt;code&gt;initial&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Dos palabras clave te dan control explícito sobre la herencia:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;inherit&lt;/code&gt; — fuerza a una propiedad a tomar el valor del padre, incluso en propiedades que normalmente no heredan.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;initial&lt;/code&gt; — restablece la propiedad a su valor inicial según la especificación, ignorando la herencia.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="unidades-absolutas-vs-relativas"&gt;Unidades absolutas vs. relativas&lt;/h2&gt;
&lt;p&gt;El píxel (&lt;code&gt;px&lt;/code&gt;) es la unidad &lt;strong&gt;absoluta&lt;/strong&gt; más común. Existen otras (&lt;code&gt;pt&lt;/code&gt;, &lt;code&gt;cm&lt;/code&gt;, &lt;code&gt;in&lt;/code&gt;) con equivalencias fijas: &lt;code&gt;1in = 96px = 72pt&lt;/code&gt;. Sin embargo, las unidades &lt;strong&gt;relativas&lt;/strong&gt; son las que permiten construir interfaces que escalan con el contexto.&lt;/p&gt;
&lt;h3 id="em-relativo-al-elemento"&gt;&lt;code&gt;em&lt;/code&gt;: relativo al elemento&lt;/h3&gt;
&lt;p&gt;Un &lt;code&gt;em&lt;/code&gt; equivale al &lt;code&gt;font-size&lt;/code&gt; del propio elemento. Es ideal para &lt;code&gt;padding&lt;/code&gt;, &lt;code&gt;margin&lt;/code&gt; y &lt;code&gt;border-radius&lt;/code&gt;, porque estos escalan junto con el tamaño de fuente.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;caja&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;padding&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; &lt;span style="color:#c678dd"&gt;background&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#ecf0f1&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;caja--pequena&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;12&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;caja--grande&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;20&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem 1.25rem;background:#fff;color:#111;margin:1rem 0;display:flex;gap:1rem;align-items:flex-start;flex-wrap:wrap;"&gt;
 &lt;span style="font-size:12px;padding:1em;border-radius:1em;background:#ecf0f1;color:#111;"&gt;padding 1em · 12px&lt;/span&gt;
 &lt;span style="font-size:20px;padding:1em;border-radius:1em;background:#ecf0f1;color:#111;"&gt;padding 1em · 20px&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;El &lt;code&gt;padding&lt;/code&gt; de ambas cajas es &lt;code&gt;1em&lt;/code&gt;, pero al cambiar el &lt;code&gt;font-size&lt;/code&gt; el espaciado escala proporcionalmente sin tocar la propiedad &lt;code&gt;padding&lt;/code&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice info"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Info&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Para convertir un tamaño en píxeles a &lt;code&gt;em&lt;/code&gt;, divide el tamaño deseado entre el tamaño heredado: si quieres &lt;code&gt;16px&lt;/code&gt; y el padre tiene &lt;code&gt;12px&lt;/code&gt;, entonces &lt;code&gt;16 / 12 = 1.333em&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="rem-relativo-a-la-raíz"&gt;&lt;code&gt;rem&lt;/code&gt;: relativo a la raíz&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;rem&lt;/code&gt; (&lt;em&gt;root em&lt;/em&gt;) siempre toma como referencia el &lt;code&gt;font-size&lt;/code&gt; del elemento raíz (&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; o &lt;code&gt;:root&lt;/code&gt;). Esto te da un punto de control global: cambiar el tamaño de la raíz redimensiona todo el documento de forma coherente.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;0.875&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;800px&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { :&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; } }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#c678dd"&gt;media&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;(&lt;/span&gt;&lt;span style="color:#e06c75"&gt;min-width&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#e06c75"&gt;1200px&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;)&lt;/span&gt; { :&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1.125&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;; } }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Una práctica habitual: usar &lt;code&gt;rem&lt;/code&gt; para tipografía, &lt;code&gt;px&lt;/code&gt; para bordes y &lt;code&gt;em&lt;/code&gt; para &lt;code&gt;padding&lt;/code&gt;, &lt;code&gt;margin&lt;/code&gt; y &lt;code&gt;border-radius&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="unidades-relativas-al-viewport"&gt;Unidades relativas al viewport&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vw&lt;/code&gt; — 1% del ancho del viewport.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vh&lt;/code&gt; — 1% del alto del viewport.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vmin&lt;/code&gt; — 1% de la dimensión más pequeña entre ancho y alto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vmax&lt;/code&gt; — 1% de la dimensión más grande.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="calc-para-combinar-unidades"&gt;&lt;code&gt;calc()&lt;/code&gt; para combinar unidades&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;calc()&lt;/code&gt; permite operar entre unidades de distinta naturaleza, algo imposible de otra forma. Es muy útil para tipografía fluida:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;font-size&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;calc&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;0.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;vw&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="números-sin-unidad-y-line-height"&gt;Números sin unidad y &lt;code&gt;line-height&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Si declaras un número sin unidad en &lt;code&gt;line-height&lt;/code&gt;, este actúa como un &lt;strong&gt;factor multiplicador&lt;/strong&gt; del &lt;code&gt;font-size&lt;/code&gt; del elemento. Es la forma recomendada, porque cada descendiente calcula su propia altura de línea a partir de su tamaño de fuente.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;body&lt;/span&gt; { &lt;span style="color:#c678dd"&gt;line-height&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1.5&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="custom-properties-variables-css"&gt;Custom properties (variables CSS)&lt;/h2&gt;
&lt;p&gt;Las &lt;strong&gt;variables CSS&lt;/strong&gt; se declaran con el prefijo &lt;code&gt;--&lt;/code&gt; y se consumen con la función &lt;code&gt;var()&lt;/code&gt;. A diferencia de las variables de un preprocesador, son dinámicas: viven en el DOM y respetan la cascada y la herencia.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;--color-marca&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#2a9da9&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;--color-texto&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#1c2833&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;panel&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#61afef;font-weight:bold"&gt;var&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;--&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;color&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#e06c75"&gt;texto&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;border-left&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;4&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;px&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;solid&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;var&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;--&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;color&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;-&lt;/span&gt;&lt;span style="color:#e06c75"&gt;marca&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;var()&lt;/code&gt; acepta un segundo argumento como valor de respaldo: &lt;code&gt;var(--color-secundario, #888)&lt;/code&gt; usará &lt;code&gt;#888&lt;/code&gt; si la variable no está definida.&lt;/p&gt;
&lt;h3 id="redefinir-variables-por-contexto"&gt;Redefinir variables por contexto&lt;/h3&gt;
&lt;p&gt;Como las variables respetan la cascada, puedes sobrescribirlas dentro de un bloque para crear temas locales. Aquí el mismo componente &lt;code&gt;.panel&lt;/code&gt; se reconfigura dentro de &lt;code&gt;.tema-oscuro&lt;/code&gt; cambiando solo las variables:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#61afef"&gt;root&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;--fondo&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#fff&lt;/span&gt;; &lt;span style="color:#e06c75"&gt;--texto&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#111&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;tema-oscuro&lt;/span&gt; { &lt;span style="color:#e06c75"&gt;--fondo&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#2c3e50&lt;/span&gt;; &lt;span style="color:#e06c75"&gt;--texto&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;#ecf0f1&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#e5c07b"&gt;panel&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;background&lt;/span&gt;: &lt;span style="color:#61afef;font-weight:bold"&gt;var&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;--&lt;/span&gt;&lt;span style="color:#e06c75"&gt;fondo&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;color&lt;/span&gt;: &lt;span style="color:#61afef;font-weight:bold"&gt;var&lt;/span&gt;(&lt;span style="color:#56b6c2"&gt;--&lt;/span&gt;&lt;span style="color:#e06c75"&gt;texto&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;padding&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#d19a66"&gt;.5&lt;/span&gt;&lt;span style="color:#e5c07b"&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="border:1px solid #d0d0d0;border-radius:.5rem;padding:1rem;background:#fff;margin:1rem 0;display:flex;gap:1rem;flex-wrap:wrap;"&gt;
 &lt;div style="background:#fff;color:#111;padding:1em;border-radius:.5em;border:1px solid #ddd;flex:1;min-width:180px;"&gt;
 &lt;strong&gt;Panel claro&lt;/strong&gt;
 &lt;p style="margin:.4rem 0 0;"&gt;Usa las variables por defecto de &lt;code&gt;:root&lt;/code&gt;.&lt;/p&gt;
 &lt;/div&gt;
 &lt;div style="background:#2c3e50;color:#ecf0f1;padding:1em;border-radius:.5em;flex:1;min-width:180px;"&gt;
 &lt;strong&gt;Panel oscuro&lt;/strong&gt;
 &lt;p style="margin:.4rem 0 0;"&gt;Las mismas reglas, con las variables redefinidas.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;El componente no cambió ni una línea: solo redefinimos las variables en un contenedor superior. Ese es el poder de combinar herencia y &lt;em&gt;custom properties&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;La cascada, la especificidad y la herencia forman el núcleo conceptual de CSS. Dominarlos te permite predecir qué regla gana sin recurrir a parches. Sumado a un buen uso de unidades relativas y variables, tienes la base para escribir estilos escalables y mantenibles.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;🚀 Próximo en la serie: los &lt;strong&gt;selectores&lt;/strong&gt; de CSS, la herramienta con la que apuntamos con precisión a los elementos que queremos estilizar.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
</content:encoded></item></channel></rss>