Quiero que la barra de navegación se pegue a la parte superior una vez que me desplazo hacia ella, pero no funciona y no tengo idea de por qué. Si puede ayudar, aquí está mi código HTML y CSS:
.nav-selections {
text-transform: uppercase;
letter-spacing: 5px;
font: 18px "lato",sans-serif;
display: inline-block;
text-decoration: none;
color: white;
padding: 18px;
float: right;
margin-left: 50px;
transition: 1.5s;
}
.nav-selections:hover{
transition: 1.5s;
color: black;
}
ul {
background-color: #B79b58;
overflow: auto;
}
li {
list-style-type: none;
}
<nav style="position: sticky; position: -webkit-sticky;">
<ul align="left">
<li><a href="#/contact" class="nav-selections" style="margin-right:35px;">Contact</a></li>
<li><a href="#/about" class="nav-selections">About</a></li>
<li><a href="#/products" class="nav-selections">Products</a></li>
<li><a href="#" class="nav-selections">Home</a></li>
</ul>
</nav>
html
css
css-position
Harleyoc1
fuente
fuente
position: sticky
puede dejar de funcionar si está dentro de un FlexBox a menos que seas cuidadoso y también fallará si hay unaoverflow: hidden
ooverflow: auto
entre éste y lo que se desplaza hacia el interior (de la raíz del cuerpo o antepasado más cercano con overflow: scroll)overflow: hidden
yoverflow: auto
! He estado rascándome la cabeza durante días tratando de hacer que esta basura funcioneRespuestas:
Entonces, en su ejemplo, debe definir la posición en la que debería quedarse al final utilizando la
top
propiedad.fuente
Compruebe si un elemento ancestro tiene un conjunto de desbordamiento (p
overflow:hidden
. Ej. ); intenta alternarlo. Puede que tengas que subir el árbol DOM más alto de lo que esperas =).Esto puede afectar su
position:sticky
elemento descendiente.fuente
$(stickyElement).parents().css("overflow", "visible")
a la consola web sería útil. el padre lejano conoverflow:hidden
estilo que causó el problema. Ojalá leyera esta respuesta con más atención.overflow:hidden
, puede ejecutar este script en la consola de su navegador para verificar todos los padres / antepasados de un elemento dado: gist.github.com/brandonjp/478cf6e32d90ab9cb2cd8cbb0799c7a7Tengo el mismo problema, y encontré la respuesta aquí .
Si su elemento no se pega como se esperaba, lo primero que debe verificar son las reglas aplicadas al contenedor.
Específicamente, busque cualquier propiedad de desbordamiento establecida en el padre. No se puede utilizar :
overflow: hidden
,overflow: scroll
ooverflow: auto
en el padre de unposition: sticky
elemento.fuente
Pocas cosas más me he encontrado:
Cuando su elemento adhesivo es un componente (angular, etc.)
Si el elemento 'adhesivo' en sí mismo es un componente con un selector de elementos personalizado, como un componente angular llamado
<app-menu-bar>
, deberá agregar lo siguiente al CSS del componente:o
Safari en iOS en particular parece requerir
display:block
incluso en el elemento raízapp-root
de una aplicación angular o no se pegará.Si está creando un componente y está definiendo el CSS dentro del componente (DOM sombra / estilos encapsulados), asegúrese de que
position: sticky
se esté aplicando al selector 'externo' (por ejemplo,app-menu-bar
en devtools debe mostrar la posición fija) y no un nivel superiordiv
dentro el componente. Con Angular, esto se puede lograr con el:host
selector en el CSS para su componente.Otro
Si el elemento que sigue a su elemento adhesivo tiene un fondo sólido, debe agregar lo siguiente para evitar que se deslice debajo:
Su elemento adhesivo debe ser el primero (antes de su contenido) si lo usa
top
y después si lo usabottom
.Hay complicaciones cuando se usa
overflow: hidden
en su elemento de envoltura; en general, matará el elemento adhesivo en el interior. Mejor explicado en esta preguntaLos navegadores móviles pueden deshabilitar elementos fijos / fijos cuando el teclado en pantalla está visible. No estoy seguro de las reglas exactas (¿alguien lo sabe?) Pero cuando el teclado está visible, estás viendo una especie de 'ventana' en la ventana y no podrás hacer que las cosas se adhieran fácilmente parte superior visible real de la pantalla.
Asegúrate de tener:
position: sticky;
y no
display: sticky;
Diversas preocupaciones de usabilidad
fuente
display: block
yposition: relative
desencadena el comportamiento correcto en Safari, ¿parecía que solodisplay: block
era necesario? Por supuesto, probablemente no está de más haber especificado ambosdisplay: block
fue suficienteEsta es una continuación de las respuestas de MarsAndBack y Miftah Mizwar.
Sus respuestas son correctas. Sin embargo, es difícil identificar los antepasados problemáticos.
Para simplificar esto, simplemente ejecute este script jQuery en la consola de su navegador y le indicará el valor de la propiedad de desbordamiento en cada antepasado.
¡Donde un antepasado no tiene que
overflow: visible
cambiar su CSS para que lo haga!Además, como se indicó en otra parte, asegúrese de que su elemento adhesivo tenga esto en el CSS:
fuente
overflow: invisible
.(async function() { let response = await fetch('https://code.jquery.com/jquery-3.3.1.min.js'); let script = await response.text(); eval(script); })();
var p = $0.parentElement; while(p != null) { var ov = getComputedStyle(p).overflow; if(ov !== 'visible') console.warn(ov, p); else console.log(ov, p); p = p.parentElement; }
¿Dónde$0
está el último elemento seleccionado en las herramientas de desarrollador?position: fixed
y propiedades apropiadas con JavaScript. La pregunta no indica la necesidad de JavaScript.Tuve que usar el siguiente CSS para que funcionara:
Si lo anterior no funciona, entonces ...
Revisa todos los ancestros y asegúrate de que ninguno de estos elementos tenga
overflow: hidden
. Tienes que cambiar esto aoverflow: visible
fuente
En caso de que te hayas encontrado con esto y tu pegajoso no funcione, intenta configurar el padre para que:
Trabajó para mi
fuente
display: unset
, lo que no siempre es viable de inmediatocontents
,initial
(?) Yinline
Momento divertido que no era obvio para mí: al menos en Chrome 70
position: sticky
no se aplica si lo ha configurado con DevTools.fuente
Parece que la barra de navegación a pegar no debe estar dentro de ningún div o sección con otro contenido. Ninguna de las soluciones funcionó para mí hasta que saqué la barra de navegación del div que la barra de navegación compartía con otra barra superior. Anteriormente tenía la barra superior y la barra de navegación envueltas con un div común.
fuente
display: unset
, ¡esta restricción se levanta! ver stackoverflow.com/a/60560997/2902367 también parece trabajar concontents
,initial
y (?)inline
de mi comentario:
Hay polyfill para usar en otros navegadores que no sean FF y Chrome. Esta es una regla experimental que se puede implementar o no en cualquier momento a través de los navegadores. Chrome lo agregó hace un par de años y luego lo dejó caer, parece que regresó ... ¿pero por cuánto tiempo?
La posición más cercana sería: relativa + coordinadas actualizadas mientras el desplazamiento una vez alcanzado el punto fijo, si desea convertir esto en un script javascript
fuente
Sé que esto parece estar ya respondido, pero me encontré con un caso específico y siento que la mayoría de las respuestas pierden el punto.
Las
overflow:hidden
respuestas cubren el 90% de los casos. Ese es más o menos el escenario de "navegación fija".Pero el comportamiento pegajoso se usa mejor dentro de la altura de un contenedor. Piense en un formulario de boletín informativo en la columna derecha de su sitio web que se desplaza hacia abajo con la página. Si su elemento adhesivo es el único elemento secundario del contenedor, el contenedor tiene exactamente el mismo tamaño y no hay espacio para desplazarse.
Su contenedor debe tener la altura a la que espera que se desplace su elemento. Que en mi escenario de "columna derecha" es la altura de la columna izquierda. La mejor manera de lograr esto es usarlo
display:table-cell
en las columnas. Si no puede, y está atrapado confloat:right
cosas como yo, tendrá que adivinar la altura de la columna izquierda para calcularlo con Javascript.fuente
sticky-limit: parent
,sticky-limit: body
osticky-limit: nth-parent(3)
... De todos modos: si puede, puede levantar esta limitación configurando el padre limitador endisplay: unset
, como se indica en stackoverflow.com/a/60560997/2902367 . También parece funcionar concontents
,initial
(?) Yinline
Sé que esta es una publicación anterior. Pero si hay alguien como yo que recientemente comenzó a jugar con la posición: esto puede ser útil.
En mi caso, estaba usando position: sticky como elemento de cuadrícula. No funcionaba y el problema era un overflow-x: oculto en el
html
elemento. Tan pronto como eliminé esa propiedad, funcionó bien. Tener overflow-x: oculto en elbody
elemento parecía funcionar, aunque todavía no tengo idea de por qué.fuente
dos responden aquí:
eliminar
overflow
propiedad de labody
etiquetaconfigurado
height: 100%
parabody
solucionar el problema conoverflow-y: auto
fuente
Creo que este artículo dice mucho sobre cómo
sticky
funcionafuente
El comportamiento real de un elemento adhesivo es:
Un elemento posicionado de forma fija se trata como relativamente posicionado hasta que su bloque que contiene cruza un umbral específico (como establecer la parte superior en un valor distinto de auto) dentro de su raíz de flujo (o el contenedor en el que se desplaza), en cuyo punto se trata como "atascado" "hasta encontrar el borde opuesto de su bloque contenedor.
El elemento se posiciona de acuerdo con el flujo normal del documento y luego se desplaza en relación con su ancestro de desplazamiento más cercano y el bloque que contiene (ancestro de nivel de bloque más cercano), incluidos los elementos relacionados con la tabla, basados en los valores de arriba, derecha, abajo, E izquierda. El desplazamiento no afecta la posición de ningún otro elemento.
Este valor siempre crea un nuevo contexto de apilamiento. Tenga en cuenta que un elemento adhesivo "se adhiere" a su antepasado más cercano que tiene un "mecanismo de desplazamiento" (creado cuando el desbordamiento está oculto, desplazarse, auto o superposición), incluso si ese antepasado no es el ancestro desplazable más cercano.
Este ejemplo te ayudará a entender:
code
https://codepen.io/darylljann/pen/PpjwPMfuente
Si el arreglo de danday74 no funciona, verifique que el elemento padre tenga una altura.
En mi caso tuve dos hijos, uno flotando a la izquierda y otro flotando a la derecha. Quería que la flotante derecha se volviera pegajosa, pero tuve que agregar una
<div style="clear: both;"></div>
al final del padre, para darle altura.fuente
float:left
al elemento padre (sin flotante, su altura era 0) yposition:sticky
funcionó.Usé una solución JS. Funciona en Firefox y Chrome. Cualquier problema, házmelo saber.
html
css
js
fuente
z-index
También es muy importante. A veces funcionará pero simplemente no lo verás. Intente configurarlo en un número muy alto solo para estar seguro. Además, no siempre ponestop: 0
pero prueba algo más alto en caso de que esté oculto en algún lugar (debajo de una barra de herramientas).fuente
Esto es lo que me estaba haciendo tropezar ... mi div. Adhesivo estaba dentro de otro div, de modo que el div principal necesitaba algún contenido adicional DESPUÉS del div. te desplazas hacia abajo.
Entonces, en mi caso, justo después del div pegajoso, tuve que agregar:
(Mi aplicación tiene dos divisiones de lado a lado, con una imagen "alta" a la izquierda y un formulario de entrada de datos corto a la derecha, y quería que el formulario de entrada de datos flotara junto a la imagen a medida que se desplaza hacia abajo, por lo que el formulario siempre está en la pantalla. No funcionaría hasta que agregue el "contenido adicional" anterior para que el elemento adhesivo tenga algo para "deslizarse"
fuente
Es VERDADERO que
overflow
debe eliminarse o configurarseinitial
para queposition: sticky
funcione en el elemento secundario. Usé Material Design en mi aplicación Angular y descubrí que algunos componentes de Material cambiaron eloverflow
valor. La solución para mi escenario esfuente