6.1 position: sticky
El posicionamiento sticky (position: sticky) en CSS combina las propiedades del posicionamiento relativo y fijo. Los elementos con posicionamiento sticky se comportan como posicionados relativamente hasta que alcanzan un umbral de desplazamiento específico, momento en el cual se vuelven fijos.
Características del posicionamiento sticky:
- Un elemento con
position: stickyse comporta como si estuviera posicionado relativamente hasta que alcanza una determinada posición de desplazamiento. - Una vez alcanzado el umbral, el elemento se vuelve fijo y permanece en su lugar hasta que se supera otro umbral de desplazamiento.
- El posicionamiento sticky solo funciona dentro de un contenedor padre. Cuando el contenedor padre sale de los límites del área de visualización, el elemento sticky pierde sus propiedades fijas.
Sintaxis del posicionamiento sticky
Para aplicar el posicionamiento sticky, se utilizan las propiedades position: sticky y las coordenadas top, right, bottom o left para definir el umbral de desplazamiento.
.element {
position: sticky;
top: value;
right: value;
bottom: value;
left: value;
}
Dónde:
top: distancia desde el borde superior de la ventana del navegador hasta el borde superior del elementoright: distancia desde el borde derecho de la ventana del navegador hasta el borde derecho del elementobottom: distancia desde el borde inferior de la ventana del navegador hasta el borde inferior del elementoleft: distancia desde el borde izquierdo de la ventana del navegador hasta el borde izquierdo del elemento
Ejemplo:
.wrapper {
height: 200px;
overflow: auto;
}
.header {
position: sticky;
top: 0;
background-color: deepskyblue;
padding: 10px;
font-size: 24px;
color: white;
}
.content {
margin-top: 25px;
background-color: lightgrey;
padding: 20px;
}
<div class="wrapper">
<div class="header">Sticky Header</div>
<div class="content">
Suspendisse tellus sem, sollicitudin ac sapien vitae, consectetur molestie nunc. Suspendisse gravida efficitur est, quis sagittis lectus tincidunt ut. Vestibulum ut tortor vel ligula laoreet fermentum ut quis orci. Nulla facilisi. Cras a vehicula ante. Nullam auctor magna sed justo fringilla condimentum. Aenean lacinia mauris ac neque rhoncus iaculis. Sed iaculis mattis ipsum sed facilisis. Ut non elit mi. Vestibulum tempus lectus eget turpis bibendum, id venenatis urna eleifend.
Fusce at augue at tellus vehicula condimentum quis vitae massa. Vivamus faucibus lectus ut diam pharetra sollicitudin. Sed eu pretium lectus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed vitae venenatis purus. Nullam sed porttitor elit. Praesent condimentum sem sit amet odio tempus, at finibus ante feugiat.
Morbi fringilla magna vitae tellus ultrices convallis. Donec pharetra mollis velit et elementum. Ut aliquam odio quis pellentesque eleifend. Nullam vel auctor magna. Sed mollis vitae odio non bibendum. Suspendisse ornare, tellus vitae vehicula mattis, justo lorem ullamcorper orci, elementum pretium augue justo ut ante. Nulla volutpat finibus porta.
Suspendisse tellus sem, sollicitudin ac sapien vitae, consectetur molestie nunc. Suspendisse gravida efficitur est, quis sagittis lectus tincidunt ut. Vestibulum ut tortor vel ligula laoreet fermentum ut quis orci. Nulla facilisi. Cras a vehicula ante. Nullam auctor magna sed justo fringilla condimentum. Aenean lacinia mauris ac neque rhoncus iaculis. Sed iaculis mattis ipsum sed facilisis. Ut non elit mi. Vestibulum tempus lectus eget turpis bibendum, id venenatis urna eleifend.
Fusce at augue at tellus vehicula condimentum quis vitae massa. Vivamus faucibus lectus ut diam pharetra sollicitudin. Sed eu pretium lectus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed vitae venenatis purus. Nullam sed porttitor elit. Praesent condimentum sem sit amet odio tempus, at finibus ante feugiat.
Morbi fringilla magna vitae tellus ultrices convallis. Donec pharetra mollis velit et elementum. Ut aliquam odio quis pellentesque eleifend. Nullam vel auctor magna. Sed mollis vitae odio non bibendum. Suspendisse ornare, tellus vitae vehicula mattis, justo lorem ullamcorper orci, elementum pretium augue justo ut ante. Nulla volutpat finibus porta.
</div>
</div>
En este ejemplo, el encabezado con la clase .header permanecerá en su lugar cuando se desplace la página, hasta que su borde superior alcance el borde superior de la ventana de visualización.
6.2 Ventajas y desventajas del posicionamiento sticky
Ventajas del posicionamiento sticky
- Mejora de la interfaz de usuario:
- Los elementos sticky, como encabezados, barras de navegación y paneles laterales, mejoran la navegación y la accesibilidad del contenido en páginas largas, permaneciendo visibles para el usuario.
- Combinación de las ventajas del posicionamiento relativo y fijo:
- El posicionamiento sticky permite a los elementos permanecer en el flujo del documento, manteniendo su posición relativa, hasta que se alcance el umbral de desplazamiento. Esto proporciona un comportamiento más natural de los elementos.
- Facilidad de implementación:
- El posicionamiento sticky es fácil de implementar con un mínimo de código y sin necesidad de utilizar JavaScript.
Desventajas del posicionamiento sticky
- Soporte limitado en navegadores antiguos:
- El posicionamiento sticky es compatible con la mayoría de los navegadores modernos, pero puede no funcionar en versiones antiguas de navegadores, lo que podría requerir soluciones adicionales para la compatibilidad.
- Dependencia de los contenedores padres:
- El posicionamiento sticky solo funciona dentro de los contenedores padres. Si el contenedor padre sale de los límites del área de visualización, el elemento sticky pierde sus propiedades fijas.
- Problemas de superposición de contenido:
- Los elementos sticky pueden superponerse a otros elementos en la página si su altura o ancho no se tienen en cuenta al diseñar el diseño.
6.3 Ejemplos de uso del posicionamiento sticky
1. Panel lateral sticky
Crear un panel lateral sticky que permanezca visible al desplazarse por el contenido.
.wrapper {
height: 200px;
overflow: auto;
}
.container {
display: flex;
}
.sidebar {
position: sticky;
top: 0;
left: 0;
width: 200px;
height: 100px;
background-color: lightgreen;
padding: 10px;
}
.content {
background-color: lightgrey;
padding: 20px;
}
<div class="wrapper">
<div class="container">
<div class="sidebar">Sticky Sidebar</div>
<div class="content">
Suspendisse tellus sem, sollicitudin ac sapien vitae, consectetur molestie nunc. Suspendisse gravida efficitur est, quis sagittis lectus tincidunt ut. Vestibulum ut tortor vel ligula laoreet fermentum ut quis orci. Nulla facilisi. Cras a vehicula ante. Nullam auctor magna sed justo fringilla condimentum. Aenean lacinia mauris ac neque rhoncus iaculis. Sed iaculis mattis ipsum sed facilisis. Ut non elit mi. Vestibulum tempus lectus eget turpis bibendum, id venenatis urna eleifend.
Fusce at augue at tellus vehicula condimentum quis vitae massa. Vivamus faucibus lectus ut diam pharetra sollicitudin. Sed eu pretium lectus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed vitae venenatis purus. Nullam sed porttitor elit. Praesent condimentum sem sit amet odio tempus, at finibus ante feugiat.
Morbi fringilla magna vitae tellus ultrices convallis. Donec pharetra mollis velit et elementum. Ut aliquam odio quis pellentesque eleifend. Nullam vel auctor magna. Sed mollis vitae odio non bibendum. Suspendisse ornare, tellus vitae vehicula mattis, justo lorem ullamcorper orci, elementum pretium augue justo ut ante. Nulla volutpat finibus porta.
Suspendisse tellus sem, sollicitudin ac sapien vitae, consectetur molestie nunc. Suspendisse gravida efficitur est, quis sagittis lectus tincidunt ut. Vestibulum ut tortor vel ligula laoreet fermentum ut quis orci. Nulla facilisi. Cras a vehicula ante. Nullam auctor magna sed justo fringilla condimentum. Aenean lacinia mauris ac neque rhoncus iaculis. Sed iaculis mattis ipsum sed facilisis. Ut non elit mi. Vestibulum tempus lectus eget turpis bibendum, id venenatis urna eleifend.
Fusce at augue at tellus vehicula condimentum quis vitae massa. Vivamus faucibus lectus ut diam pharetra sollicitudin. Sed eu pretium lectus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed vitae venenatis purus. Nullam sed porttitor elit. Praesent condimentum sem sit amet odio tempus, at finibus ante feugiat.
Morbi fringilla magna vitae tellus ultrices convallis. Donec pharetra mollis velit et elementum. Ut aliquam odio quis pellentesque eleifend. Nullam vel auctor magna. Sed mollis vitae odio non bibendum. Suspendisse ornare, tellus vitae vehicula mattis, justo lorem ullamcorper orci, elementum pretium augue justo ut ante. Nulla volutpat finibus porta.
</div>
</div>
</div>
En este ejemplo, el panel lateral con la clase .sidebar permanecerá en su lugar al desplazarse por el contenido.
2. Encabezado de tabla sticky
Crear un encabezado de tabla sticky que permanezca visible al desplazarse por una gran cantidad de datos.
.wrapper {
height: 200px;
overflow: auto;
}
table {
width: 100%;
border-collapse: collapse;
}
th, td {
padding: 10px;
border: 1px solid #ddd;
}
th {
position: sticky;
top: 0;
background-color: deepskyblue;
color: white;
}
tbody {
min-height: 300px;
display: block;
}
tbody tr {
display: table;
width: 100%;
table-layout: fixed;
}
<div class="wrapper">
<table>
<thead>
<tr>
<th>Header</th>
</tr>
</thead>
<tbody>
<tr><td>Data 1</td><td>Data 2</td><td>Data 3</td></tr>
<tr><td>Data 1</td><td>Data 2</td><td>Data 3</td></tr>
<tr><td>Data 1</td><td>Data 2</td><td>Data 3</td></tr>
<tr><td>Data 1</td><td>Data 2</td><td>Data 3</td></tr>
<tr><td>Data 1</td><td>Data 2</td><td>Data 3</td></tr>
<tr><td>Data 1</td><td>Data 2</td><td>Data 3</td></tr>
<tr><td>Data 1</td><td>Data 2</td><td>Data 3</td></tr>
<tr><td>Data 1</td><td>Data 2</td><td>Data 3</td></tr>
<tr><td>Data 1</td><td>Data 2</td><td>Data 3</td></tr>
<tr><td>Data 1</td><td>Data 2</td><td>Data 3</td></tr>
<tr><td>Data 1</td><td>Data 2</td><td>Data 3</td></tr>
<tr><td>Data 1</td><td>Data 2</td><td>Data 3</td></tr>
</tbody>
</table>
</div>
En este ejemplo, el encabezado de la tabla permanecerá en su lugar al desplazarse por el contenido de la tabla.
GO TO FULL VERSION