Quero fazer com que a barra de navegação fique no topo assim que rolar para ela, mas ela não está funcionando e não faço ideia do porquê. Se você puder ajudar, aqui está o meu código HTML e 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
fonte
fonte
position: sticky
pode parar de funcionar se for dentro de um flexbox a menos que você for cuidadoso e também falhará se há umoverflow: hidden
ouoverflow: auto
entre ele e tudo o que rola dentro (root corpo ou ancestral mais próximo com overflow: rolagem)overflow: hidden
eoverflow: auto
! Estou coçando a cabeça há dias tentando fazer essa porcaria funcionarRespostas:
Portanto, no seu exemplo, você deve definir a posição em que deve ficar no final usando a
top
propriedadefonte
Verifique se um elemento ancestral possui um estouro definido (por exemplo
overflow:hidden
); tente alternar. Talvez você precise subir a árvore do DOM mais alto do que o esperado =).Isso pode afetar seu
position:sticky
elemento descendente.fonte
$(stickyElement).parents().css("overflow", "visible")
no console da Web ajudaria e ajudou. Então localizei o pai distante comoverflow:hidden
. estilo que causou o problema Eu gostaria de ler esta resposta com mais cuidado.overflow:hidden
, você pode executar esse script no console do seu browser para verificar todos os pais / antepassados de um determinado elemento: gist.github.com/brandonjp/478cf6e32d90ab9cb2cd8cbb0799c7a7Eu tenho o mesmo problema e encontrei a resposta aqui .
Se o seu elemento não estiver aderindo conforme o esperado, a primeira coisa a verificar são as regras aplicadas ao contêiner.
Especificamente, procure por qualquer propriedade de estouro definida no pai. Você não pode usar :
overflow: hidden
,overflow: scroll
ouoverflow: auto
sobre o pai de umposition: sticky
elemento.fonte
Me deparei com mais algumas coisas:
Quando o seu elemento adesivo é um componente (angular, etc.)
Se o próprio elemento 'sticky' for um componente com um seletor de elemento personalizado, como um componente angular chamado,
<app-menu-bar>
você precisará adicionar o seguinte ao css do componente:ou
O Safari no iOS, em particular, parece exigir
display:block
até mesmo o elemento raizapp-root
de um aplicativo angular ou ele não ficará.Se você estiver criando um componente e definindo o css dentro do componente (DOM sombreado / estilos encapsulados), verifique se ele
position: sticky
está sendo aplicado ao seletor 'externo' (por exemplo,app-menu-bar
no devtools deve mostrar a posição de aderência) e nãodiv
no nível superior o componente. Com o Angular, isso pode ser alcançado com o:host
seletor no css do seu componente.De outros
Se o elemento que segue o elemento adesivo tiver um plano de fundo sólido, adicione o seguinte para impedir que ele deslize por baixo:
Seu elemento adesivo deve ser o primeiro (antes do seu conteúdo) se estiver usando
top
e depois se estiver usandobottom
.Existem complicações ao usar
overflow: hidden
o elemento wrapper - em geral, ele mata o elemento adesivo dentro. Melhor explicado nesta perguntaOs navegadores móveis podem desativar itens fixos / fixos quando o teclado na tela estiver visível. Não tenho certeza das regras exatas (alguém já sabe), mas quando o teclado está visível, você está olhando para uma espécie de 'janela' na janela e não poderá facilmente conseguir que as coisas atinjam o parte superior visível da tela.
Assegure-se de ter:
position: sticky;
e não
display: sticky;
Diversos problemas de usabilidade
fonte
display: block
eposition: relative
aciona o comportamento correto no Safari - parecia que apenasdisplay: block
era necessário? É claro que provavelmente não dói ter as duas especificadas #display: block
foi suficienteEsta é uma continuação das respostas de MarsAndBack e Miftah Mizwar.
Suas respostas estão corretas. No entanto, é difícil identificar o (s) ancestral (es) do problema.
Para simplificar, basta executar esse script jQuery no console do navegador e ele informará o valor da propriedade overflow em todos os ancestrais.
Onde um ancestral não tem
overflow: visible
seu CSS alterado para isso!Além disso, como declarado em outro lugar, verifique se o elemento adesivo possui isso no CSS:
fonte
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; }
Onde$0
está o último elemento selecionado nas ferramentas do desenvolvedor.position: fixed
com propriedades apropriadas com JavaScript. A pergunta não indica a necessidade de JavaScript.Eu tive que usar o seguinte CSS para fazê-lo funcionar:
Se acima não funcionar, então ...
Passe por todos os ancestrais e verifique se nenhum desses elementos possui
overflow: hidden
. Você precisa mudar isso paraoverflow: visible
fonte
Caso você se depare com isso e seu adesivo não esteja funcionando - tente configurar o pai para:
Trabalhou para mim
fonte
display: unset
, o que nem sempre é imediatamente viávelcontents
,initial
(?) Einline
Momento engraçado que não era óbvio para mim: pelo menos no Chrome 70
position: sticky
não será aplicado se você o tiver definido usando o DevTools.fonte
Parece que a barra de navegação a ser mantida não deve estar dentro de nenhuma div ou seção com outro conteúdo. Nenhuma solução estava funcionando para mim até que eu retirei a barra de navegação da div que a barra de navegação compartilhava com outra barra superior. Eu já tinha a barra superior e a barra de navegação envolvidas por uma div comum.
fonte
display: unset
, essa restrição será levantada! veja stackoverflow.com/a/60560997/2902367 Também parece funcionar comcontents
,initial
(?) einline
do meu comentário:
Há polyfill para usar em outros navegadores que não o FF e o Chrome. Esta é uma regra experimental que pode ser implementada ou não a qualquer momento através dos navegadores. O Chrome o adicionou há alguns anos e depois o soltou, parece que voltou ... mas por quanto tempo?
A posição mais próxima seria a posição: coordenadas relativas + atualizadas enquanto a rolagem atingia o ponto de aderência, se você deseja transformar isso em um script javascript
fonte
Sei que isso parece já ter sido respondido, mas me deparei com um caso específico e sinto que a maioria das respostas está errada.
o
overflow:hidden
respostas cobrem 90% dos casos. Esse é mais ou menos o cenário de "navegação atrativa".Mas o comportamento pegajoso é melhor usado dentro da altura de um contêiner. Pense em um formulário de boletim informativo na coluna direita do seu site, que rola para baixo com a página. Se o seu elemento adesivo é o único filho do contêiner, o contêiner é exatamente do mesmo tamanho e não há espaço para rolar.
Seu contêiner precisa ter a altura que você espera que seu elemento role dentro. Qual no meu cenário "coluna da direita" é a altura da coluna da esquerda. A melhor maneira de conseguir isso é usar
display:table-cell
nas colunas. Se você não puder, e estiver presofloat:right
e assim como eu, terá que adivinhar a altura da coluna esquerda para computá-la com Javascript.fonte
sticky-limit: parent
,sticky-limit: body
ousticky-limit: nth-parent(3)
... De qualquer forma: se puder, você pode aumentar essa limitação configurando o pai limitadordisplay: unset
como, conforme observado em stackoverflow.com/a/60560997/2902367 . Também parece funcionar comcontents
,initial
(?) Einline
Eu sei que este é um post antigo. Mas se há alguém como eu que recentemente começou a mexer na posição: pegajoso, isso pode ser útil.
No meu caso, eu estava usando position: sticky como um item de grade. Não estava funcionando e o problema foi um estouro-x: oculto no
html
elemento. Assim que eu removi essa propriedade, funcionou bem. Tendo overflow-x: oculto nobody
elemento parecia funcionar, ainda não sei porquê.fonte
duas respostas aqui:
remover
overflow
propriedade dabody
tagdefinido
height: 100%
comobody
para corrigir o problema comoverflow-y: auto
fonte
Eu acredito que este artigo diz muito sobre como
sticky
funcionafonte
O comportamento real de um elemento adesivo é:
Um elemento posicionado com aderência é tratado como relativamente posicionado até que seu bloco que contenha ultrapasse um limite especificado (como definir um valor superior a não ser automático) em sua raiz de fluxo (ou no contêiner em que ele rola), quando é tratado como "preso" "até encontrar a extremidade oposta do seu bloco de contenção.
O elemento é posicionado de acordo com o fluxo normal do documento e, em seguida, é deslocado em relação ao ancestral de rolagem mais próximo e contendo o bloco (ancestral do nível de bloco mais próximo), incluindo elementos relacionados à tabela, com base nos valores de superior, direito, inferior, e esquerda. O deslocamento não afeta a posição de outros elementos.
Esse valor sempre cria um novo contexto de empilhamento. Observe que um elemento adesivo "adere" ao ancestral mais próximo que possui um "mecanismo de rolagem" (criado quando o estouro está oculto, rolagem, automático ou sobreposto), mesmo que esse ancestral não seja o ancestral de rolagem mais próximo.
Este exemplo ajudará você a entender:
code
https://codepen.io/darylljann/pen/PpjwPMfonte
se a correção de danday74 não funcionar, verifique se o elemento pai tem uma altura.
No meu caso, tive dois filhos, um flutuando para a esquerda e outro flutuando para a direita. Eu queria que o flutuante certo ficasse pegajoso, mas tive que adicionar um
<div style="clear: both;"></div>
no final do pai, para dar altura.fonte
float:left
ao elemento pai (sem float, sua altura era 0) eposition:sticky
funcionou.Eu usei uma solução JS. Funciona no Firefox e Chrome. Qualquer problema, me avise.
html
css
js
fonte
z-index
também é muito importante. Às vezes funcionará, mas você simplesmente não verá. Tente configurá-lo para um número muito alto apenas para ter certeza. Também nem sempre coloque,top: 0
mas tente algo mais alto, caso esteja escondido em algum lugar (sob uma barra de ferramentas).fonte
Aqui está o que estava me provocando ... minha div pegajosa estava dentro de outra div, para que a div pai precisasse de algum conteúdo adicional DEPOIS da div pegajosa, para tornar a div pai "alta o suficiente" para que a div pegajosa "deslizasse" sobre outro conteúdo como você rola para baixo.
Então, no meu caso, logo após a div pegajosa, eu tive que adicionar:
(Meu aplicativo tem duas divs lado a lado, com uma imagem "alta" à esquerda e um pequeno formulário de entrada de dados à direita, e eu queria que o formulário de entrada de dados flutuasse ao lado da imagem à medida que você rola para baixo, para que o formulário esteja sempre na tela.Não funcionaria até que eu adicionasse o "conteúdo extra" acima, para que a div pegajosa tenha algo para "deslizar por cima"
fonte
É VERDADEIRO que as
overflow
necessidades sejam removidas ou configuradasinitial
para fazerposition: sticky
trabalhos no elemento filho. Usei o Material Design no meu aplicativo Angular e descobri que alguns componentes do Material alteravam ooverflow
valor. A correção para o meu cenário éfonte