flujo-natural-de-cajas
Excelente pregunta! Te explico exactamente qué significa que los elementos block respetan width, height, margin y padding, mientras que los inline no lo hacen (o lo hacen parcialmente).
¿Qué significa "RESPETAR" width, height, margin y padding?
1. WIDTH (Ancho)
Elementos BLOCK (SÍ respetan width):
.block { display: block; width: 300px; /* ✅ FUNCIONA - el elemento mide exactamente 300px */ background: lightblue; }
<div class="block">Este div mide 300px exactos</div>
Elementos INLINE (NO respetan width):
.inline { display: inline; width: 300px; /* ❌ IGNORADO por completo */ background: lightcoral; }
<span class="inline">Este span ignora el width, solo mide lo que necesita el texto</span>
2. HEIGHT (Altura)
Elementos BLOCK (SÍ respetan height):
.block-altura { display: block; height: 200px; /* ✅ FUNCIONA - el elemento mide 200px */ background: lightgreen; }
Elementos INLINE (NO respetan height):
.inline-altura { display: inline; height: 200px; /* ❌ IGNORADO - la altura la da el contenido */ background: lightyellow; }
3. MARGIN (Margen externo)
Elementos BLOCK (SÍ respetan margin en TODAS direcciones):
.block-margin { display: block; margin-top: 20px; /* ✅ FUNCIONA */ margin-right: 30px; /* ✅ FUNCIONA */ margin-bottom: 40px; /* ✅ FUNCIONA */ margin-left: 50px; /* ✅ FUNCIONA */ background: lightblue; }
Elementos INLINE (respetan SOLO margin horizontal):
.inline-margin { display: inline; margin-top: 20px; /* ❌ IGNORADO */ margin-right: 30px; /* ✅ FUNCIONA */ margin-bottom: 40px; /* ❌ IGNORADO */ margin-left: 50px; /* ✅ FUNCIONA */ background: lightcoral; }
<span class="inline-margin">Solo tengo margen izquierdo y derecho</span> <span>Otro span pegado al anterior (sin margen vertical)</span>
4. PADDING (Relleno interno)
Elementos BLOCK (SÍ respetan padding en TODAS direcciones):
.block-padding { display: block; padding-top: 20px; /* ✅ FUNCIONA */ padding-right: 30px; /* ✅ FUNCIONA */ padding-bottom: 40px; /* ✅ FUNCIONA */ padding-left: 50px; /* ✅ FUNCIONA */ background: lightblue; }
Elementos INLINE (respetan padding pero con COMPORTAMIENTO EXTRAÑO):
.inline-padding { display: inline; padding-top: 20px; /* ⚠️ FUNCIONA... pero no empuja otras líneas */ padding-right: 30px; /* ✅ FUNCIONA normal */ padding-bottom: 40px; /* ⚠️ FUNCIONA... pero se superpone */ padding-left: 50px; /* ✅ FUNCIONA normal */ background: lightcoral; }
<p> Texto normal <span class="inline-padding">este span tiene padding</span> sigue el texto pero el padding vertical se puede superponer </p>
EJEMPLO PRÁCTICO COMPARATIVO
<div style="background: #f0f0f0; padding: 20px;"> <!-- ELEMENTO BLOCK --> <div style=" display: block; width: 200px; height: 100px; margin: 20px; padding: 20px; background: lightblue; border: 2px solid blue; "> ✅ BLOCK: Todo funciona width, height, margin, padding </div> <!-- ELEMENTO INLINE --> <span style=" display: inline; width: 200px; height: 100px; margin: 20px; padding: 20px; background: lightcoral; border: 2px solid red; "> ❌ INLINE: Solo funciona padding y margin horizontal </span> <span style="background: #ddd;">(texto de referencia)</span> </div>
LA EXCEPCIÓN: inline-block (lo mejor de ambos mundos)
.mejor-opcion { display: inline-block; /* 🎯 HÍBRIDO */ width: 200px; /* ✅ FUNCIONA */ height: 100px; /* ✅ FUNCIONA */ margin: 20px; /* ✅ FUNCIONA todo */ padding: 20px; /* ✅ FUNCIONA todo */ background: lightgreen; /* Se comporta como inline EN EL EXTERIOR */ /* Se comporta como block EN EL INTERIOR */ }
<p> Texto antes <span class="mejor-opcion">inline-block</span> texto después (fluye igual que inline) </p>
VISUALMENTE ¿CÓMO SE VE?
Elemento BLOCK:
↓ margin-top funciona ┌────────────────────────────────────┐ │ │ │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │ ┃ padding funciona ┃ │ │ ┃ ┃ │ │ ┃ CONTENIDO ┃ │ │ ┃ (respeta width/height) ┃ │ │ ┃ ┃ │ │ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ │ │ │ └────────────────────────────────────┘ ↓ margin-bottom funciona
Elemento INLINE:
← margin-left funciona →
INICIO [texto con padding pero...]
↑ margin-top ignorado
↓ margin-bottom ignorado
[...sigue el texto] FIN
← margin-right funciona →REGLA MNEMOTÉCNICA
BLOCK = "Caja independiente" → todo funciona
INLINE = "Letra gigante" → solo horizontal
INLINE-BLOCK = "Mezcla" → todo funciona, pero en línea
¿Te queda claro ahora? ¿Quieres que practiquemos con algún ejemplo específico
Conceptos Fundamentales del Flujo Natural
1. Display: Block vs Inline
Primero, entendamos los tipos de elementos básicos:
<div class="contenedor"> <div class="caja">Soy block → ocupo todo el ancho</div> <span class="inline">Soy inline</span> <span class="inline">→ fluyo en línea</span> <a href="#" class="inline">Los enlaces también son inline</a> </div>
.caja { background: #e3f2fd; padding: 20px; margin: 10px 0; /* Por defecto: display: block */ } .inline { background: #ffeb3b; padding: 5px 10px; margin: 0 5px; /* Por defecto en span, a, strong, etc: display: inline */ }
2. El Flujo Normal (Normal Flow)
Por defecto, los elementos se colocan así:
Block: Uno debajo del otro (apilados verticalmente)
Inline: Uno al lado del otro (horizontalmente)
/* Ejemplo de mezcla block e inline */ .articulo { background: #f5f5f5; padding: 20px; margin-bottom: 20px; } .etiqueta { display: inline-block; /* ¡Lo mejor de ambos mundos! */ background: #4caf50; color: white; padding: 5px 15px; margin: 5px; border-radius: 20px; }
🌊 Display: Inline-Block - El Primer Paso al Diseño Fluido
<div class="galeria"> <div class="tarjeta">Tarjeta 1</div> <div class="tarjeta">Tarjeta 2</div> <div class="tarjeta">Tarjeta 3</div> <div class="tarjeta">Tarjeta 4</div> </div>
.galeria { font-size: 0; /* Elimina espacios entre inline-block */ text-align: center; } .tarjeta { display: inline-block; width: 200px; margin: 10px; padding: 20px; background: #2196f3; color: white; border-radius: 8px; font-size: 16px; /* Restauramos el tamaño de fuente */ vertical-align: top; /* Transición suave */ transition: all 0.3s ease; } /* Responsive con inline-block */ @media (max-width: 768px) { .tarjeta { width: calc(50% - 20px); /* 2 columnas en tablets */ } } @media (max-width: 480px) { .tarjeta { width: calc(100% - 20px); /* 1 columna en móviles */ } }
🎯 Flexbox - El Estándar Moderno
<div class="flex-contenedor"> <div class="flex-item">1</div> <div class="flex-item">2</div> <div class="flex-item">3</div> <div class="flex-item">4</div> </div>
.flex-contenedor { display: flex; flex-wrap: wrap; /* Permite que los elementos se envuelvan */ gap: 20px; /* Espaciado moderno entre elementos */ justify-content: center; padding: 20px; background: #f0f0f0; } .flex-item { flex: 1 1 250px; /* grow | shrink | basis */ /* Significa: puede crecer, puede encogerse, base de 250px */ min-width: 200px; /* Evita que se hagan muy pequeños */ max-width: 350px; /* Límite máximo */ padding: 30px; background: #9c27b0; color: white; text-align: center; border-radius: 10px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); }
Ejemplo Práctico: Sistema de Tarjetas Responsive con Flexbox
<section class="tarjetas-sistema"> <h2>Productos Destacados</h2> <div class="flex-grid"> <article class="producto"> <img src="img1.jpg" alt="Producto"> <h3>Producto 1</h3> <p>Descripción del producto con texto que puede variar en longitud</p> <button>Comprar</button> </article> <article class="producto"> <img src="img2.jpg" alt="Producto"> <h3>Producto 2</h3> <p>Descripción más corta</p> <button>Comprar</button> </article> <article class="producto"> <img src="img3.jpg" alt="Producto"> <h3>Producto 3</h3> <p>Descripción con texto adicional para mostrar cómo se comporta</p> <button>Comprar</button> </article> <article class="producto"> <img src="img4.jpg" alt="Producto"> <h3>Producto 4</h3> <p>Descripción del producto</p> <button>Comprar</button> </article> </div> </section>
.tarjetas-sistema { max-width: 1200px; margin: 0 auto; padding: 20px; } .flex-grid { display: flex; flex-wrap: wrap; gap: 25px; margin-top: 30px; } .producto { flex: 1 1 280px; display: flex; flex-direction: column; background: white; border-radius: 12px; overflow: hidden; box-shadow: 0 5px 15px rgba(0,0,0,0.08); transition: transform 0.3s ease; } .producto:hover { transform: translateY(-5px); } .producto img { width: 100%; height: 200px; object-fit: cover; /* Mantiene proporción de imagen */ } .producto h3 { margin: 15px 15px 10px; font-size: 1.2rem; } .producto p { margin: 0 15px 15px; color: #666; flex-grow: 1; /* Empuja el botón hacia abajo */ } .producto button { margin: 0 15px 20px; padding: 10px; background: #4caf50; color: white; border: none; border-radius: 6px; cursor: pointer; transition: background 0.3s; } .producto button:hover { background: #45a049; }
🏗️ CSS Grid - El Sistema de Rejillas Definitivo
<div class="grid-contenedor"> <header class="grid-header">Header</header> <nav class="grid-nav">Navegación</nav> <main class="grid-main"> <h1>Contenido Principal</h1> <p>Este contenido fluye naturalmente en la cuadrícula</p> </main> <aside class="grid-sidebar">Sidebar</aside> <footer class="grid-footer">Footer</footer> </div>
.grid-contenedor { display: grid; grid-template-columns: 200px 1fr 250px; /* sidebar | contenido principal | sidebar derecho */ grid-template-rows: auto 1fr auto; /* header | main | footer */ gap: 20px; min-height: 100vh; padding: 20px; background: #e0e0e0; } .grid-header { grid-column: 1 / -1; /* Ocupa todas las columnas */ background: #3f51b5; color: white; padding: 20px; } .grid-nav { background: #ff9800; padding: 20px; } .grid-main { background: white; padding: 20px; } .grid-sidebar { background: #9e9e9e; padding: 20px; } .grid-footer { grid-column: 1 / -1; background: #607d8b; color: white; padding: 20px; } /* Responsive con Grid */ @media (max-width: 768px) { .grid-contenedor { grid-template-columns: 1fr; grid-template-rows: auto auto 1fr auto auto; } .grid-header, .grid-nav, .grid-main, .grid-sidebar, .grid-footer { grid-column: 1; } }
Ejemplo Avanzado: Galería de Imágenes con Grid
.galeria-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); /* auto-fit crea tantas columnas como quepan */ /* minmax asegura un tamaño mínimo y máximo */ gap: 20px; padding: 20px; } .galeria-item { position: relative; overflow: hidden; border-radius: 8px; aspect-ratio: 1; /* Mantiene proporción cuadrada */ } .galeria-item img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.5s; } .galeria-item:hover img { transform: scale(1.1); } .galeria-item::after { content: attr(data-title); position: absolute; bottom: 0; left: 0; right: 0; background: rgba(0,0,0,0.7); color: white; padding: 10px; transform: translateY(100%); transition: transform 0.3s; } .galeria-item:hover::after { transform: translateY(0); }
🎨 Técnicas Modernas y Buenas Prácticas
1. Unidades Responsivas
.moderno-contenedor { /* Usa unidades relativas, no píxeles fijos */ width: min(90%, 1200px); /* El menor entre 90% y 1200px */ margin-inline: auto; /* Margen automático horizontal */ padding: clamp(1rem, 5vw, 3rem); /* Valor mínimo, preferido, máximo */ } .texto-responsivo { font-size: clamp(1rem, 2.5vw, 1.5rem); line-height: 1.6; } .espaciado { margin-block: clamp(20px, 5vh, 60px); }
2. Sistema de Layout Completo
<body class="layout-sistema"> <header class="site-header">...</header> <main class="site-main"> <article class="contenido-principal"> <h1>Título del Artículo</h1> <p>Contenido que fluye naturalmente...</p> </article> <aside class="sidebar"> <div class="widget">Widget 1</div> <div class="widget">Widget 2</div> </aside> </main> <footer class="site-footer">...</footer> </body>
.layout-sistema { display: grid; grid-template-rows: auto 1fr auto; min-height: 100vh; } .site-main { display: grid; grid-template-columns: minmax(0, 1fr) 300px; /* minmax(0,1fr) evita desbordamientos */ gap: 30px; max-width: 1400px; width: min(100% - 40px, 1400px); margin-inline: auto; padding-block: 40px; } .contenido-principal { background: white; padding: 30px; border-radius: 12px; box-shadow: 0 5px 15px rgba(0,0,0,0.05); } .sidebar { display: flex; flex-direction: column; gap: 30px; } .widget { background: #f8f9fa; padding: 20px; border-radius: 10px; } /* Responsive */ @media (max-width: 900px) { .site-main { grid-template-columns: 1fr; } }
3. Componentes Reutilizables y Flexibles
/* Tarjeta flexible que se adapta a cualquier contenedor */ .tarjeta-flexible { display: flex; flex-direction: column; height: 100%; /* Ocupa todo el alto disponible */ background: white; border-radius: 8px; overflow: hidden; box-shadow: 0 2px 8px rgba(0,0,0,0.1); } .tarjeta-flexible__header { padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; } .tarjeta-flexible__content { flex: 1; /* Empuja el footer hacia abajo */ padding: 20px; } .tarjeta-flexible__footer { padding: 15px 20px; background: #f8f9fa; border-top: 1px solid #dee2e6; } /* Botón que se adapta al contenido */ .btn { display: inline-block; padding: 0.75em 1.5em; background: #4a90e2; color: white; text-decoration: none; border-radius: 4px; transition: background 0.3s; white-space: nowrap; /* Evita que el texto se rompa */ } .btn--full { display: block; width: 100%; text-align: center; white-space: normal; /* Permite que el texto se envuelva */ }
📱 Tips Esenciales para Diseño Responsive Natural
1. Mobile First - La Mejor Práctica
/* Primero móvil */ .contenedor { display: flex; flex-direction: column; gap: 20px; padding: 15px; } /* Luego tablet */ @media (min-width: 768px) { .contenedor { flex-direction: row; flex-wrap: wrap; } .item { flex: 1 1 calc(50% - 10px); } } /* Finalmente desktop */ @media (min-width: 1024px) { .item { flex: 1 1 calc(33.333% - 14px); } }
2. Evitar Alturas Fijas
/* ❌ Mal */ .caja-mala { height: 300px; overflow: hidden; /* ¡Peligro! el contenido puede cortarse */ } /* ✅ Bien */ .caja-buena { min-height: 300px; /* Mínimo pero puede crecer */ height: auto; /* Explícitamente automático */ padding: 20px; }
3. Imágenes Responsivas
img { max-width: 100%; /* Nunca más ancha que su contenedor */ height: auto; /* Mantiene proporción */ display: block; /* Elimina espacio inferior extra */ } .imagen-fondo { background-size: cover; background-position: center; background-repeat: no-repeat; }
4. Tipografía Fluida
:root { --min-font: 16px; --max-font: 24px; --min-screen: 320px; --max-screen: 1200px; } .texto-fluido { font-size: calc( var(--min-font) + (var(--max-font) - var(--min-font)) * ((100vw - var(--min-screen)) / (var(--max-screen) - var(--min-screen))) ); /* O más simple con clamp() */ font-size: clamp(1rem, 3vw, 2rem); }
🎯 Ejercicio Práctico Completo
Vamos a construir una página completa que fluye naturalmente:
<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Diseño Fluido Natural</title> <style> /* Reset básico */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: system-ui, -apple-system, sans-serif; line-height: 1.6; background: #fafafa; } /* Layout principal */ .app { display: grid; grid-template-rows: auto 1fr auto; min-height: 100vh; } /* Header */ .main-header { background: #2c3e50; color: white; padding: 1rem; } .nav-container { max-width: 1200px; margin: 0 auto; display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 1rem; } .logo { font-size: 1.5rem; font-weight: bold; } .nav-links { display: flex; flex-wrap: wrap; gap: 1rem; list-style: none; } .nav-links a { color: white; text-decoration: none; padding: 0.5rem; } /* Main content */ .main-content { max-width: 1200px; width: min(100% - 2rem, 1200px); margin: 2rem auto; } /* Hero section */ .hero { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; align-items: center; margin-bottom: 3rem; padding: 2rem; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 1rem; } .hero-content { display: flex; flex-direction: column; gap: 1rem; } .hero-title { font-size: clamp(2rem, 5vw, 3rem); line-height: 1.2; } .hero-cta { display: flex; flex-wrap: wrap; gap: 1rem; margin-top: 1rem; } .btn { padding: 0.75rem 1.5rem; border: none; border-radius: 0.5rem; font-weight: 600; cursor: pointer; transition: transform 0.2s, box-shadow 0.2s; } .btn:hover { transform: translateY(-2px); box-shadow: 0 5px 15px rgba(0,0,0,0.2); } .btn-primary { background: #ffd700; color: #333; } .btn-secondary { background: transparent; color: white; border: 2px solid white; } .hero-image { width: 100%; height: auto; border-radius: 0.5rem; } /* Grid de características */ .features-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1.5rem; margin: 3rem 0; } .feature-card { padding: 1.5rem; background: white; border-radius: 0.5rem; box-shadow: 0 2px 5px rgba(0,0,0,0.1); transition: transform 0.3s; } .feature-card:hover { transform: translateY(-5px); box-shadow: 0 5px 15px rgba(0,0,0,0.15); } .feature-icon { font-size: 2.5rem; margin-bottom: 1rem; } .feature-title { margin-bottom: 0.5rem; font-size: 1.25rem; } /* Sección de contenido */ .content-section { display: grid; grid-template-columns: 2fr 1fr; gap: 2rem; margin: 3rem 0; } .main-article { background: white; padding: 2rem; border-radius: 0.5rem; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } .sidebar { display: flex; flex-direction: column; gap: 1rem; } .sidebar-widget { background: white; padding: 1.5rem; border-radius: 0.5rem; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } /* Footer */ .main-footer { background: #34495e; color: white; padding: 2rem 1rem; margin-top: auto; } .footer-content { max-width: 1200px; margin: 0 auto; display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 2rem; } .footer-section { display: flex; flex-direction: column; gap: 0.5rem; } .footer-section h4 { margin-bottom: 1rem; color: #ffd700; } .footer-section a { color: #ecf0f1; text-decoration: none; } .footer-section a:hover { color: #ffd700; } /* Media Queries */ @media (max-width: 768px) { .nav-container { flex-direction: column; text-align: center; } .nav-links { justify-content: center; } .content-section { grid-template-columns: 1fr; } .hero { text-align: center; } .hero-cta { justify-content: center; } } </style> </head> <body> <div class="app"> <header class="main-header"> <nav class="nav-container"> <div class="logo">🌊 Diseño Fluido</div> <ul class="nav-links"> <li><a href="#">Inicio</a></li> <li><a href="#">Características</a></li> <li><a href="#">Blog</a></li> <li><a href="#">Contacto</a></li> </ul> </nav> </header> <main class="main-content"> <section class="hero"> <div class="hero-content"> <h1 class="hero-title">Diseño que fluye naturalmente</h1> <p>Cajas que se acomodan solas, sin posiciones forzadas. Un diseño que se adapta a cualquier pantalla de manera automática.</p> <div class="hero-cta"> <button class="btn btn-primary">Comenzar</button> <button class="btn btn-secondary">Saber más</button> </div> </div> <img src="https://via.placeholder.com/600x400" alt="Hero" class="hero-image"> </section> <section class="features-grid"> <div class="feature-card"> <div class="feature-icon">📱</div> <h3 class="feature-title">Responsive Automático</h3> <p>Las cajas se reorganizan solas según el tamaño de la pantalla.</p> </div> <div class="feature-card"> <div class="feature-icon">🔄</div> <h3 class="feature-title">Flexbox Fluido</h3> <p>Distribución inteligente del espacio disponible.</p> </div> <div class="feature-card"> <div class="feature-icon">📐</div> <h3 class="feature-title">Grid Nativo</h3> <p>Sistemas de rejilla sin frameworks externos.</p> </div> <div class="feature-card"> <div class="feature-icon">🎨</div> <h3 class="feature-title">Diseño Limpio</h3> <p>Sin hacks ni posiciones forzadas innecesarias.</p> </div> </section> <section class="content-section"> <article class="main-article"> <h2>El poder del flujo natural</h2> <p>Cuando entendemos cómo fluyen naturalmente los elementos en CSS, podemos crear diseños más robustos y mantenibles. La clave está en trabajar con el navegador, no contra él.</p> <p>Utilizando las propiedades modernas de CSS como Flexbox y Grid, conseguimos que nuestras interfaces se adapten perfectamente a cualquier dispositivo sin necesidad de media queries excesivas.</p> </article> <aside class="sidebar"> <div class="sidebar-widget"> <h3>Widget 1</h3> <p>Contenido del sidebar que fluye naturalmente.</p> </div> <div class="sidebar-widget"> <h3>Widget 2</h3> <p>Más contenido que se adapta al espacio disponible.</p> </div> </aside> </section> </main> <footer class="main-footer"> <div class="footer-content"> <div class="footer-section"> <h4>Sobre Nosotros</h4> <p>Enseñando diseño web moderno y responsivo.</p> </div> <div class="footer-section"> <h4>Enlaces Rápidos</h4> <a href="#">Inicio</a> <a href="#">Blog</a> <a href="#">Contacto</a> </div> <div class="footer-section"> <h4>Recursos</h4> <a href="#">Documentación</a> <a href="#">Ejemplos</a> <a href="#">Tutoriales</a> </div> <div class="footer-section"> <h4>Redes Sociales</h4> <a href="#">Twitter</a> <a href="#">LinkedIn</a> <a href="#">GitHub</a> </div> </div> </footer> </div> </body> </html>
📝 Principios Clave a Recordar
Trabaja con el flujo, no contra él: Usa
display: block,inline,inline-block,flexygridsegún lo que necesites.Unidades relativas: Prefiere
%,vw,vh,rem,emsobre píxeles fijos.Flexibilidad: Usa
min-width,max-width,flex-basispara dar límites sin rigidez.Mobile First: Diseña primero para móvil y luego mejora para pantallas más grandes.
Contenedores fluidos: Usa
max-widthconmargin: autopara centrar contenido.Evita alturas fijas: Deja que el contenido determine la altura.
Imágenes responsivas: Siempre
max-width: 100%yheight: auto.Espaciado consistente: Usa
gapen Flexbox y Grid para espaciado uniforme.
🎓 Resumen Final
El flujo natural en CSS se logra entendiendo y combinando:
Display adecuado (block, inline, inline-block)
Flexbox para layouts unidimensionales
Grid para layouts bidimensionales
Unidades relativas para adaptabilidad
Media queries para ajustes específicos
La clave está en dejar que el navegador haga su trabajo de posicionamiento natural, solo dándole las pautas necesarias a través de estas propiedades modernas.
Comentarios
Publicar un comentario