6. Posicionamiento y Display
El posicionamiento y la propiedad display son fundamentales para controlar cómo se colocan y comportan los elementos en la página.
📺 Propiedad display
Section titled “📺 Propiedad display”La propiedad display define cómo se comporta un elemento en el flujo del documento.
display: block - Elementos de bloque
Section titled “display: block - Elementos de bloque”Los elementos de bloque ocupan todo el ancho disponible y comienzan en una nueva línea.
.bloque { display: block; width: 100%; /* Por defecto */ /* Ocupa toda la línea */}/* Elementos block por defecto: div, p, h1-h6, section, article, etc. */
.elemento-block { display: block;}
/* Características: ✅ Ocupa todo el ancho disponible ✅ Comienza en una nueva línea ✅ Empuja elementos siguientes hacia abajo ✅ Respeta width, height, margin, padding ✅ Se pueden centrar con margin: 0 auto*/┌────────────────────────────────┐│ Elemento Block 1 │└────────────────────────────────┘┌────────────────────────────────┐│ Elemento Block 2 │└────────────────────────────────┘┌────────────────────────────────┐│ Elemento Block 3 │└────────────────────────────────┘<span style="display: block; background: lightblue;">Span 1 (block)</span>
<span style="display: block; background: lightgreen;">Span 2 (block)</span>
<span style="display: block; background: lightcoral;">Span 3 (block)</span>
<p>Los span normalmente son inline, pero con display: block ocupan toda la línea.</p> display: inline - Elementos en línea
Section titled “display: inline - Elementos en línea”Los elementos inline fluyen con el texto y no comienzan en una nueva línea.
.en-linea { display: inline; /* Fluye con el texto */}/* Elementos inline por defecto: span, a, strong, em, img, etc. */
.elemento-inline { display: inline;}
/* Características: ✅ Fluye con el texto ✅ No comienza en nueva línea ✅ Solo ocupa el espacio de su contenido ❌ NO respeta width y height ⚠️ Solo respeta margin/padding horizontal ❌ NO se puede centrar con margin: 0 auto*/Texto normal [Elemento 1] más texto [Elemento 2] continúaen la misma línea [Elemento 3] hasta que se acaba el espacio.<p>
Texto normal
<div style="display: inline; background: lightblue;">div 1 (inline)</div>
más texto
<div style="display: inline; background: lightgreen;">div 2 (inline)</div>
continúa en la misma línea.
</p>
<p>Los div normalmente son block, pero con display: inline fluyen con el texto.</p> /* ❌ Esto NO funciona con inline */.elemento-inline { display: inline; width: 200px; /* ❌ Ignorado */ height: 100px; /* ❌ Ignorado */ margin-top: 20px; /* ❌ No funciona */ margin-bottom: 20px; /* ❌ No funciona */}
/* ✅ Esto SÍ funciona */.elemento-inline { display: inline; margin-left: 10px; /* ✅ Funciona */ margin-right: 10px; /* ✅ Funciona */ padding: 5px 10px; /* ✅ Funciona (pero puede superponerse) */}display: inline-block - Lo mejor de ambos mundos
Section titled “display: inline-block - Lo mejor de ambos mundos”Combina características de block e inline.
.inline-block { display: inline-block; /* Fluye en línea pero respeta dimensiones */}.elemento-inline-block { display: inline-block;}
/* Características: ✅ Fluye con el texto (como inline) ✅ No comienza en nueva línea ✅ Respeta width y height (como block) ✅ Respeta margin y padding completos ✅ Se puede alinear verticalmente ⚠️ Deja espacio en blanco entre elementos*/Texto [Elem 1] [Elem 2] [Elem 3] más texto └─────┘ └─────┘ └─────┘ Respetan width/height pero fluyen en línea<div style="display: inline-block; width: 100px; height: 50px; background: lightblue;">Caja 1</div>
<div style="display: inline-block; width: 100px; height: 50px; background: lightgreen;">Caja 2</div>
<div style="display: inline-block; width: 100px; height: 50px; background: lightcoral;">Caja 3</div>
<p>Los div fluyen en línea pero respetan width y height (a diferencia de inline).</p> /* ⚠️ Problema: Espacio en blanco entre elementos */.item { display: inline-block; width: 25%;}/* Los espacios en el HTML crean gaps */
/* Solución 1: Sin espacios en HTML *//* <div class="item"></div><div class="item"></div> */
/* Solución 2: Comentarios HTML *//* <div class="item"></div><!----><div class="item"></div> */
/* Solución 3: Font-size 0 en el padre */.contenedor { font-size: 0;}
.item { display: inline-block; font-size: 16px; /* Restaurar tamaño */}
/* Solución 4: Usar flexbox en su lugar */.contenedor { display: flex;}display: none - Ocultar elementos
Section titled “display: none - Ocultar elementos”Elimina completamente el elemento del flujo del documento.
.oculto { display: none; /* El elemento desaparece completamente */}.elemento-oculto { display: none;}
/* Características: ✅ Elemento completamente invisible ✅ No ocupa espacio en el layout ✅ No es accesible para lectores de pantalla ✅ Útil para mostrar/ocultar con JavaScript ⚠️ Diferente a visibility: hidden*/<div style="background: lightblue;">Elemento 1 (visible)</div>
<div style="display: none; background: lightgreen;">Elemento 2 (oculto con display: none)</div>
<div style="background: lightcoral;">Elemento 3 (visible)</div>
<p>El Elemento 2 está oculto y NO ocupa espacio. El Elemento 3 sube.</p>
<button id="btnToggle">Mostrar/Ocultar Elemento 2</button> document.getElementById('btnToggle').addEventListener('click', function() {
const elem = document.querySelectorAll('div')[1];
if (elem.style.display === 'none') {
elem.style.display = 'block';
} else {
elem.style.display = 'none';
}
}); /* display: none - No ocupa espacio */.con-display-none { display: none;}/* El elemento desaparece completamente del layout */
/* visibility: hidden - Ocupa espacio */.con-visibility-hidden { visibility: hidden;}/* El elemento es invisible pero mantiene su espacio */display: none:┌────────┐│ Elem 1 │└────────┘┌────────┐ ← Elem 2 oculto (no ocupa espacio)│ Elem 3 │└────────┘
visibility: hidden:┌────────┐│ Elem 1 │└────────┘┌────────┐ ← Elem 2 invisible (pero ocupa espacio)│ │└────────┘┌────────┐│ Elem 3 │└────────┘Otros valores de display
Section titled “Otros valores de display”/* display: flex - Flexbox */.contenedor-flex { display: flex; gap: 10px;}/* Los hijos se convierten en flex items */
/* display: grid - Grid */.contenedor-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px;}/* Los hijos se convierten en grid items *//* display: table - Comportamiento de tabla */.tabla { display: table; width: 100%;}
.fila { display: table-row;}
.celda { display: table-cell; padding: 10px; border: 1px solid #ddd;}
/* Útil para centrado vertical */.centrado-vertical { display: table-cell; vertical-align: middle; height: 200px;}/* display: list-item - Como elemento de lista */.custom-list-item { display: list-item; list-style-type: disc; margin-left: 20px;}
/* Convertir div en item de lista */div.item-lista { display: list-item; list-style-position: inside;}📍 Propiedad position
Section titled “📍 Propiedad position”La propiedad position controla cómo se posiciona un elemento en la página.
position: static (default)
Section titled “position: static (default)”Es el valor por defecto de todos los elementos. El elemento sigue el flujo normal del documento y NO responde a las propiedades top, right, bottom, left o z-index.
.estatico { position: static; /* Valor por defecto */ /* NO se puede mover con top, right, bottom, left */ /* NO responde a z-index */}.elemento-static { position: static;}
/* Características: ✅ Valor por defecto de todos los elementos ✅ Sigue el flujo normal del documento ❌ NO responde a top, right, bottom, left ❌ NO responde a z-index ✅ Se posiciona según el orden en el HTML*/<div style="background: lightblue;">Elemento 1 (static)</div>
<div style="position: static; top: 50px; left: 50px; background: lightgreen;">Elemento 2 (static con top/left - NO funciona)</div>
<div style="background: lightcoral;">Elemento 3 (static)</div>
<p>El Elemento 2 tiene top y left, pero NO se mueve porque position: static ignora esas propiedades.</p> position: relative - Relativo a su propia posición original
Section titled “position: relative - Relativo a su propia posición original”El elemento se mueve desde donde estaría normalmente (su posición original en el flujo). Mantiene su espacio reservado y otros elementos NO se mueven.
.relativo { position: relative; top: 20px; /* Se mueve 20px ABAJO desde su posición original */ left: 30px; /* Se mueve 30px DERECHA desde su posición original */ /* Se basa en SU PROPIA posición, NO en el padre ni la ventana */}.elemento-relativo { position: relative; top: 10px; left: 20px;}
/* Características: ✅ Se mueve desde su posición original ✅ Mantiene su espacio en el flujo ✅ Otros elementos no se mueven ✅ Crea contexto de posicionamiento para hijos absolute ✅ Responde a z-index*/Posición original:┌────────┐│ Elem 1 │└────────┘┌────────┐│ Elem 2 │ ← Posición original (espacio reservado)└────────┘┌────────┐│ Elem 3 │└────────┘
Con position: relative; top: 20px; left: 30px:┌────────┐│ Elem 1 │└────────┘┌────────┐ ← Espacio reservado│ │└────────┘ ┌────────┐ │ Elem 2 │ ← Movido visualmente └────────┘┌────────┐│ Elem 3 │└────────┘<h4>📍 ANTES (sin position: relative):</h4>
<div style="border: 2px solid blue; padding: 10px; margin-bottom: 20px;">
<div style="background: lightblue; padding: 10px;">Elemento 1</div>
<div style="background: lightgreen; padding: 10px; border: 2px solid red;">
Elemento 2 (posición normal)
</div>
<div style="background: lightcoral; padding: 10px;">Elemento 3</div>
</div>
<h4>📍 DESPUÉS (con position: relative; top: 20px; left: 30px):</h4>
<div style="border: 2px solid green; padding: 10px;">
<div style="background: lightblue; padding: 10px;">Elemento 1</div>
<div style="background: lightgreen; padding: 10px; position: relative; top: 20px; left: 30px; border: 2px solid red;">
Elemento 2 (relative)
<br>Se mueve 20px ABAJO y 30px DERECHA desde DONDE ESTABA arriba ↑
</div>
<div style="background: lightcoral; padding: 10px;">Elemento 3</div>
</div>
<p><strong>⚠️ Observa:</strong> El Elemento 2 se mueve desde su posición original (arriba), NO desde el padre ni la ventana.</p>
<hr>
<h4>Ejemplo con cuadros - ANTES y DESPUÉS:</h4>
<p><strong>SIN relative:</strong></p>
<div style="border: 2px solid blue; padding: 10px; display: inline-block; margin-bottom: 10px;">
<div style="width: 60px; height: 60px; background: blue; display: inline-block; margin: 5px;">1</div>
<div style="width: 60px; height: 60px; background: red; display: inline-block; margin: 5px;">2</div>
<div style="width: 60px; height: 60px; background: green; display: inline-block; margin: 5px;">3</div>
</div>
<p><strong>CON relative (left: -20px en el 2 y 3):</strong></p>
<div style="border: 2px solid green; padding: 10px; display: inline-block;">
<div style="width: 60px; height: 60px; background: blue; display: inline-block; margin: 5px;">1</div>
<div style="width: 60px; height: 60px; background: red; display: inline-block; margin: 5px; position: relative; left: -20px;">2</div>
<div style="width: 60px; height: 60px; background: green; display: inline-block; margin: 5px; position: relative; left: -20px;">3</div>
</div>
<p>Los cuadros 2 y 3 se mueven 20px a la IZQUIERDA desde donde estaban originalmente.</p> position: absolute - Relativo al padre con position
Section titled “position: absolute - Relativo al padre con position”El elemento se posiciona relativo al primer padre que tenga position (relative, absolute, fixed o sticky). Si no encuentra ningún padre con position, se posiciona relativo al <body>.
.absoluto { position: absolute; top: 0; right: 0; /* Se posiciona desde el padre con position (no static) */}
/* El padre debe tener position para ser la referencia */.padre { position: relative; /* Crea el contexto de posicionamiento */}.elemento-absoluto { position: absolute; top: 20px; right: 30px;}
/* Características: ✅ Sale del flujo normal del documento ✅ No ocupa espacio (otros elementos lo ignoran) ✅ Se posiciona relativo al ancestro con position (no static) ✅ Si no hay ancestro posicionado, se posiciona relativo al <body> ✅ Responde a z-index ⚠️ Puede superponerse a otros elementos*/Sin position: absolute:┌────────┐│ Elem 1 │└────────┘┌────────┐│ Elem 2 │└────────┘┌────────┐│ Elem 3 │└────────┘
Con position: absolute:┌────────┐│ Elem 1 │└────────┘┌────────┐ ← Elem 2 sale del flujo│ Elem 3 │ ← Elem 3 sube└────────┘ ┌────────┐ │ Elem 2 │ ← Flotando en posición absoluta └────────┘<h4>📍 Ejemplo 1: Absolute se basa en el PADRE con position:</h4>
<p><strong>SIN padre con position (se basa en el body):</strong></p>
<div style="border: 2px solid red; padding: 10px; height: 150px;">
Padre SIN position (static por defecto)
<div style="position: absolute; top: 10px; right: 10px; background: lightcoral; padding: 10px;">
❌ Absolute (se escapa al body)
</div>
</div>
<p><strong>CON padre position: relative (se basa en el padre):</strong></p>
<div style="position: relative; border: 2px solid green; padding: 10px; height: 150px;">
Padre CON position: relative
<div style="position: absolute; top: 10px; right: 10px; background: lightgreen; padding: 10px;">
✅ Absolute (top: 10px, right: 10px desde el padre)
</div>
</div>
<p><strong>⚠️ Clave:</strong> Absolute busca el primer PADRE con position (no static). Si no encuentra, usa el body.</p>
<hr>
<h4>📍 Ejemplo 2: Esquinas con absolute:</h4>
<div style="position: relative; border: 3px solid blue; padding: 20px; height: 200px; background: #f0f0f0;">
<strong>Padre (position: relative)</strong>
<div style="position: absolute; top: 10px; left: 10px; background: red; color: white; padding: 5px;">
Top-Left
</div>
<div style="position: absolute; top: 10px; right: 10px; background: blue; color: white; padding: 5px;">
Top-Right
</div>
<div style="position: absolute; bottom: 10px; left: 10px; background: green; color: white; padding: 5px;">
Bottom-Left
</div>
<div style="position: absolute; bottom: 10px; right: 10px; background: orange; color: white; padding: 5px;">
Bottom-Right
</div>
</div>
<p>Todos los elementos absolute se posicionan desde las esquinas del PADRE (no del body).</p> position: fixed - Fijo en la ventana del navegador
Section titled “position: fixed - Fijo en la ventana del navegador”El elemento se posiciona relativo a la ventana (viewport) y permanece fijo al hacer scroll. Sale del flujo del documento y no ocupa espacio.
.fijo { position: fixed; top: 0; left: 0; /* Se posiciona desde la VENTANA, NO desde el padre */ /* Permanece fijo al hacer scroll */}.elemento-fijo { position: fixed; top: 0; right: 0;}
/* Características: ✅ Sale del flujo normal ✅ Se posiciona relativo al viewport (ventana) ✅ Permanece fijo al hacer scroll ✅ No se mueve con el scroll ✅ Responde a z-index ⚠️ Puede cubrir contenido*/<div style="position: fixed; top: 0; left: 0; right: 0; background: lightblue; padding: 10px; z-index: 10;">
Header fijo (position: fixed)
</div>
<div style="margin-top: 50px;">
<p>Contenido de la página...</p>
<p>Haz scroll y verás que el header permanece fijo.</p>
<p style="margin-top: 300px;">Más contenido...</p>
<p style="margin-top: 300px;">Aún más contenido...</p>
</div>
<div style="position: fixed; bottom: 20px; right: 20px; background: lightcoral; padding: 10px; border-radius: 50%; width: 50px; height: 50px; text-align: center;">
↑
</div> position: sticky - Híbrido entre relative y fixed
Section titled “position: sticky - Híbrido entre relative y fixed”El elemento comienza como relative y se vuelve fixed cuando alcanzas el umbral definido (top, bottom, left o right) al hacer scroll. Se queda dentro de su contenedor padre.
.pegajoso { position: sticky; top: 0; /* Comienza como relative, se vuelve fixed al llegar a top: 0 */ /* Requiere especificar top, bottom, left o right */}.elemento-sticky { position: sticky; top: 20px;}
/* Características: ✅ Comienza como relative ✅ Se vuelve fixed al alcanzar el umbral (top/bottom) ✅ Se queda dentro de su contenedor padre ✅ Vuelve a relative al salir del contenedor ✅ Respeta el flujo del documento ⚠️ Requiere especificar top, bottom, left o right*/Antes del scroll:┌──────────────────┐│ Contenido │├──────────────────┤│ Sticky Element │ ← position: relative├──────────────────┤│ Más contenido │└──────────────────┘
Durante el scroll:┌──────────────────┐│ Sticky Element │ ← position: fixed (pegado arriba)├──────────────────┤│ Contenido scroll ││ │└──────────────────┘
Al final del contenedor:┌──────────────────┐│ Contenido ││ Sticky Element │ ← Vuelve a relative└──────────────────┘<div style="background: lightgray; padding: 10px;">
Contenido antes del sticky
</div>
<div style="position: sticky; top: 0; background: lightblue; padding: 10px; z-index: 10;">
📍 Sticky 1 (se pega primero)
</div>
<div>
<p>Contenido de la página...</p>
<p>Haz scroll y verás que Sticky 1 se pega arriba.</p>
<p style="margin-top: 200px;">Más contenido...</p>
</div>
<div style="position: sticky; top: 0; background: lightgreen; padding: 10px; z-index: 10;">
📍 Sticky 2 (reemplaza al Sticky 1)
</div>
<div>
<p>Sigue haciendo scroll...</p>
<p style="margin-top: 200px;">Más contenido...</p>
</div>
<div style="position: sticky; top: 0; background: lightcoral; padding: 10px; z-index: 10;">
📍 Sticky 3 (reemplaza al Sticky 2)
</div>
<div>
<p>Continúa el scroll...</p>
<p style="margin-top: 200px;">Contenido final...</p>
<p style="margin-top: 200px;">Fin del contenido.</p>
</div>
<p><strong>⚠️ Observa:</strong> Cada sticky se pega arriba, pero cuando llega el siguiente, lo reemplaza (empuja hacia arriba).</p> 🔢 Propiedad z-index
Section titled “🔢 Propiedad z-index”El z-index controla el orden de apilamiento en el eje Z (profundidad). Define qué elementos aparecen adelante o atrás cuando se superponen.
⚠️ Requisito importante: z-index solo funciona en elementos con position diferente de static (relative, absolute, fixed o sticky). El elemento padre NO necesita tener position para que z-index funcione en los hijos.
/* ✅ z-index funciona (el elemento tiene position) */.elemento { position: relative; /* Puede ser relative, absolute, fixed o sticky */ z-index: 10; /* Controla el apilamiento */}
/* ❌ z-index NO funciona (position: static) */.elemento-static { position: static; /* O sin position (static por defecto) */ z-index: 999; /* ❌ Ignorado completamente */}
/* El padre NO necesita position para que z-index funcione en los hijos */.padre { /* Sin position está bien */}
.hijo { position: relative; /* El hijo SÍ necesita position */ z-index: 5; /* ✅ Funciona aunque el padre no tenga position */}/* z-index solo funciona con elementos posicionados */.elemento-1 { position: relative; z-index: 1; /* Atrás */}
.elemento-2 { position: relative; z-index: 10; /* Adelante */}
.elemento-3 { position: relative; z-index: 5; /* En medio */}
/* Orden de apilamiento: 1 → 5 → 10 (de atrás hacia adelante) */Vista lateral (eje Z):
┌─────────┐ │ z: 10 │ ← Más adelante └─────────┘ ┌─────────┐ │ z: 5 │ └─────────┘ ┌─────────┐ │ z: 1 │ ← Más atrás └─────────┘/* Sistema de capas recomendado */:root { --z-base: 1; --z-dropdown: 100; --z-sticky: 200; --z-fixed: 300; --z-modal-backdrop: 400; --z-modal: 500; --z-popover: 600; --z-tooltip: 700; --z-notification: 800;}
/* Uso */.dropdown { position: absolute; z-index: var(--z-dropdown);}
.modal-overlay { position: fixed; z-index: var(--z-modal-backdrop);}
.modal { position: fixed; z-index: var(--z-modal);}
.tooltip { position: absolute; z-index: var(--z-tooltip);}<h4>📍 z-index controla qué elemento está adelante:</h4>
<div style="position: relative;">
<div style="position: relative; width: 150px; height: 150px; background: blue; z-index: 1;">
Caja 1 (z-index: 1)
</div>
<div style="position: relative; width: 150px; height: 150px; background: red; margin-top: -100px; margin-left: 50px; z-index: 3;">
Caja 2 (z-index: 3) ← Adelante
</div>
<div style="position: relative; width: 150px; height: 150px; background: green; margin-top: -100px; margin-left: 100px; z-index: 2;">
Caja 3 (z-index: 2)
</div>
</div>
<p><strong>⚠️ Orden:</strong> Azul (z:1) atrás → Verde (z:2) medio → Roja (z:3) adelante</p>
<hr>
<h4>📍 Sin position, z-index NO funciona:</h4>
<div style="position: relative;">
<div style="width: 150px; height: 100px; background: lightblue; z-index: 999;">
Sin position (z-index: 999 - NO funciona)
</div>
<div style="position: relative; width: 150px; height: 100px; background: lightcoral; margin-top: -50px; margin-left: 50px; z-index: 1;">
Con position: relative (z-index: 1 - SÍ funciona)
</div>
</div>
<p><strong>⚠️ Importante:</strong> z-index solo funciona con position: relative, absolute, fixed o sticky.</p> /* Contexto de apilamiento: Crea una "capa" independiente */
/* Padre con z-index crea contexto */.padre { position: relative; z-index: 1;}
.hijo { position: relative; z-index: 9999; /* ⚠️ Solo compite dentro del padre */}
/* Otro elemento fuera del padre */.otro { position: relative; z-index: 2; /* ✅ Estará encima del padre Y del hijo */}Estructura:<div class="padre" z-index: 1> <div class="hijo" z-index: 9999></div></div><div class="otro" z-index: 2></div>
Resultado visual: ┌─────────┐ │ otro │ ← z: 2 (encima de todo) └─────────┘ ┌─────────────────┐ │ padre (z: 1) │ │ ┌───────────┐ │ │ │ hijo │ │ ← z: 9999 (pero dentro del padre) │ └───────────┘ │ └─────────────────┘/* z-index puede ser negativo */.fondo { position: relative; z-index: -1; /* Detrás del contenido normal */}
.contenido { position: relative; z-index: 0; /* Encima del fondo */}
/* Útil para fondos decorativos */.decoracion::before { content: ""; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: url('patron.png'); z-index: -1; /* Detrás del contenido */}💧 Propiedad overflow
Section titled “💧 Propiedad overflow”Controla qué sucede cuando el contenido desborda su contenedor.
.contenedor { overflow: visible; /* Default */ overflow: hidden; /* Oculta el desbordamiento */ overflow: scroll; /* Siempre muestra scrollbars */ overflow: auto; /* Scrollbars solo si es necesario */}/* visible - El contenido desborda (default) */.visible { width: 200px; height: 100px; overflow: visible;}/* El contenido que no cabe se muestra fuera del contenedor */┌──────────────┐│ Contenedor ││ Contenido ││ que desborda │└──────────────┘ y continúa aquí ← Visible fuera/* hidden - Oculta el desbordamiento */.oculto { width: 200px; height: 100px; overflow: hidden;}/* El contenido que no cabe se corta */┌──────────────┐│ Contenedor ││ Contenido ││ que desbor...│ ← Cortado└──────────────┘Usos comunes:
/* Clearfix para floats */.clearfix { overflow: hidden;}
/* Ocultar contenido extra */.tarjeta { overflow: hidden; border-radius: 12px; /* Los hijos respetan el border-radius */}
/* Prevenir scroll horizontal */body { overflow-x: hidden;}/* scroll - Siempre muestra scrollbars */.con-scroll { width: 200px; height: 100px; overflow: scroll;}/* Scrollbars siempre visibles, haya o no desbordamiento */┌──────────────┐ ↕│ Contenedor │ ││ Contenido │ ││ con scroll │ │└──────────────┘ ↕←──────────────→/* auto - Scrollbars solo si es necesario (⭐ recomendado) */.con-auto { width: 200px; height: 100px; overflow: auto;}/* Scrollbars aparecen solo cuando el contenido desborda */Ejemplos prácticos:
/* Área de comentarios con scroll */.comentarios { max-height: 400px; overflow-y: auto; /* Solo scroll vertical */ padding: 15px;}
/* Tabla con scroll horizontal */.tabla-wrapper { width: 100%; overflow-x: auto; /* Solo scroll horizontal */}
/* Modal con contenido largo */.modal-contenido { max-height: 80vh; overflow-y: auto; padding: 20px;}
/* Código con scroll */pre { max-width: 100%; overflow-x: auto; padding: 15px; background: #f5f5f5;}Overflow en ejes específicos
Section titled “Overflow en ejes específicos”/* Control independiente de cada eje */.elemento { overflow-x: hidden; /* Sin scroll horizontal */ overflow-y: auto; /* Scroll vertical si es necesario */}
/* Casos comunes */.sin-scroll-horizontal { overflow-x: hidden; overflow-y: visible;}
.solo-scroll-vertical { overflow-x: hidden; overflow-y: auto;}
.scroll-ambos { overflow-x: auto; overflow-y: auto;}Estilizar scrollbars (Webkit)
Section titled “Estilizar scrollbars (Webkit)”/* Personalizar scrollbar en Chrome/Safari */.custom-scroll::-webkit-scrollbar { width: 10px; height: 10px;}
.custom-scroll::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 10px;}
.custom-scroll::-webkit-scrollbar-thumb { background: #888; border-radius: 10px;}
.custom-scroll::-webkit-scrollbar-thumb:hover { background: #555;}
/* Scrollbar delgado */.thin-scroll { scrollbar-width: thin; /* Firefox */ scrollbar-color: #888 #f1f1f1; /* thumb track */}👁️ Visibilidad y opacidad
Section titled “👁️ Visibilidad y opacidad”visibility - Controla la visibilidad
Section titled “visibility - Controla la visibilidad”.elemento { visibility: visible; /* Visible (default) */ visibility: hidden; /* Invisible pero ocupa espacio */ visibility: collapse; /* Para tablas */}/* visibility: hidden - Ocupa espacio */.invisible { visibility: hidden;}/* El elemento es invisible pero mantiene su espacio */
/* display: none - No ocupa espacio */.oculto { display: none;}/* El elemento desaparece completamente */Comparación:
visibility: hidden:┌─────┐│ A │└─────┘┌─────┐ ← B invisible (pero ocupa espacio)│ │└─────┘┌─────┐│ C │└─────┘
display: none:┌─────┐│ A │└─────┘ ← B no existe en el layout┌─────┐│ C │└─────┘/* Ocultar pero mantener layout */.placeholder { visibility: hidden; /* Mantiene el espacio para evitar saltos de layout */}
/* Toggle con JavaScript */.elemento.oculto { visibility: hidden;}
.elemento.visible { visibility: visible;}
/* Ocultar en impresión */@media print { .no-imprimir { visibility: hidden; }}
/* Accesibilidad: Ocultar visualmente pero mantener para lectores */.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0;}opacity - Controla la transparencia
Section titled “opacity - Controla la transparencia”.elemento { opacity: 1; /* 100% opaco (default) */ opacity: 0.5; /* 50% transparente */ opacity: 0; /* Completamente transparente */}.semi-transparente { opacity: 0.7; /* 70% opaco, 30% transparente */}
/* Características: ✅ Afecta al elemento Y todos sus hijos ✅ Valores de 0 (transparente) a 1 (opaco) ✅ El elemento sigue ocupando espacio ✅ Sigue siendo clickeable (incluso con opacity: 0) ✅ Se puede animar suavemente*//* Fade in/out con transición */.fade { opacity: 0; transition: opacity 0.3s ease;}
.fade.visible { opacity: 1;}
/* Hover effect */.imagen { opacity: 1; transition: opacity 0.3s;}
.imagen:hover { opacity: 0.8;}
/* Disabled state */.boton:disabled { opacity: 0.5; cursor: not-allowed;}
/* Loading overlay */.loading-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: white; opacity: 0.9; z-index: 9999;}
/* Placeholder de imagen */.imagen-placeholder { opacity: 0.3; filter: blur(5px);}
.imagen-placeholder.cargada { opacity: 1; filter: blur(0); transition: opacity 0.5s, filter 0.5s;}/* opacity - Afecta TODO el elemento */.con-opacity { background: rgb(255, 0, 0); opacity: 0.5; /* El fondo Y el texto serán transparentes */}
/* rgba - Solo afecta el color específico */.con-rgba { background: rgba(255, 0, 0, 0.5); color: black; /* Solo el fondo es transparente, el texto no */}Comparación de métodos para ocultar
Section titled “Comparación de métodos para ocultar”| Propiedad | Ocupa espacio | Clickeable | Accesible | Animable | Uso común |
|---|---|---|---|---|---|
display: none | ❌ No | ❌ No | ❌ No | ❌ No | Mostrar/ocultar con JS |
visibility: hidden | ✅ Sí | ❌ No | ❌ No | ✅ Sí | Mantener layout |
opacity: 0 | ✅ Sí | ✅ Sí | ✅ Sí | ✅ Sí | Fade in/out |
position: absolute; left: -9999px | ❌ No | ❌ No | ✅ Sí | ❌ No | Ocultar visualmente |