Não tenho certeza da melhor maneira de fazer / pesquisar esta pergunta:
Quando você clica em um link de âncora, ele é direcionado para a seção da página com a área vinculada agora, no MUITO TOPO da página. Gostaria que o link da âncora me enviasse para essa parte da página, mas gostaria de algum espaço na parte superior. Como não quero que ele me envie para a parte vinculada a ele no MUITO TOP, eu gostaria de ter mais ou menos 100 pixels de espaço lá.
Isso faz sentido? Isso é possível?
Editado para mostrar o código - é apenas uma tag de âncora:
<a href="#anchor">Click me!</a>
<p id="anchor">I should be 100px below where I currently am!</p>
javascript
html
css
anchor
Damon
fonte
fonte
Respostas:
Isso permitirá que o navegador faça o trabalho de pular para a âncora para nós e, em seguida, usaremos essa posição para compensar.
EDIT 1:
Como foi apontado por @erb, isso só funciona se você estiver na página enquanto o hash for alterado. A entrada da página com um
#something
URL já não funciona com o código acima. Aqui está outra versão para lidar com isso:NOTA: Para usar o jQuery, você pode simplesmente substituir
window.addEventListener
com$(window).on
nos exemplos. Obrigado @Neon.EDIT 2:
Conforme apontado por alguns, o acima falhará se você clicar no mesmo link de ancoragem duas ou mais vezes seguidas porque não há
hashchange
evento para forçar o deslocamento.Esta solução é uma versão ligeiramente modificada da sugestão do @Mave e usa os seletores jQuery para simplificar
O JSFiddle para este exemplo está aqui
fonte
example.com/#anchor
deexample.com/about/
.$('a[href^="#"]').on('click', function() { offsetAnchor(); });
. Dessa forma, se ohref
de uma
elemento começar com a#
, você chamará a mesma função.$(window).on("hashchange",
comwindow.addEventListener("hashchange",
Trabalhando apenas com css, você pode adicionar um preenchimento ao elemento ancorado (como na solução acima) Para evitar espaços em branco desnecessários, você pode adicionar uma margem negativa da mesma altura:
Não tenho certeza se esta é a melhor solução em qualquer caso, mas funciona bem para mim.
fonte
position: relative
propriedade css. Então, seria comoposition: relative; top: -50px;
Solução ainda melhor:
Apenas posicione a
<a>
etiqueta com posicionamento absoluto dentro de um objeto relativamente posicionado.Funciona ao entrar na página ou através de uma alteração de hash na página.
fonte
href="#anchor"
nele aponte para lá, em vez de apontar<p>
diretamente para o elemento. Mas um aviso: utilizaçãoid
em vez dename
em HTML5, consulte: stackoverflow.com/questions/484719/html-anchors-with-name-or-idAqui está a resposta para 2020 para isso:
Porque é amplamente suportado !
fonte
Melhor solução
fonte
Isso funcionará sem jQuery e no carregamento da página.
fonte
Para vincular a um elemento e, em seguida, 'posicionar' esse elemento a uma distância arbitrária da parte superior da página, usando CSS puro, você precisaria usar
padding-top
, dessa forma, o elemento ainda está posicionado na parte superior da janela, mas parece , visivelmente, estar posicionado a alguma distância do topo da porta de visualização, por exemplo:CSS:
Demonstração JS Fiddle .
Para usar uma abordagem simples de JavaScript:
Demonstração JS Fiddle .
fonte
Isso deve funcionar:
Basta alterar o .top-49 para o que se encaixa no seu link de ancoragem.
fonte
Se você usar nomes de âncora explícitos, como,
então em css você pode simplesmente definir
Isso funcionará desde que suas tags âncora HREF também não especifiquem um atributo NAME
fonte
A resposta de Eric é ótima, mas você realmente não precisa desse tempo limite. Se você estiver usando o jQuery, aguarde o carregamento da página. Então, eu sugiro alterar o código para:
Isso também nos livra desse fator arbitrário.
fonte
tente esse código, ele já tem uma animação suave quando clicou no link.
fonte
A solução mais fácil:
CSS
HTML
fonte
Uma variante da solução de Thomas: os elementos CSS > seletores de elementos podem ser úteis aqui:
CSS
HTML
Um clique no link moverá a posição de rolagem para 100px acima de onde o elemento com uma classe de
paddedAnchor
estiver posicionado.Suportado em navegadores não-IE e no IE da versão 9. Para suporte no IE 7 e 8, um
<!DOCTYPE>
deve ser declarado.fonte
Acabei de encontrar uma solução fácil para mim. Tinha uma margem superior de 15px
HTML
CSS
fonte
Usando apenas css e sem problemas com conteúdo coberto e não clicável antes (o ponto disso são os eventos-ponteiro: nenhum):
CSS
HTML
fonte
Coloque isso em grande estilo:
e use essa classe em uma
div
tag separada antes dos links, exemplo:ou use este código php para tag de link de eco:
fonte
Sei que é um pouco tarde, mas achei algo muito importante para inserir no seu código se você estiver usando o Scrollspy do Bootstrap. ( http://getbootstrap.com/javascript/#scrollspy )
Isso estava me deixando louco por horas.
A compensação para o espião de rolagem DEVE corresponder ao window.scrollY, caso contrário você corre o risco de:
fonte
Com base na solução @Eric Olson , modifique um pouco para incluir o elemento âncora que eu quero ir especificamente
fonte
Eu apenas tenho o mesmo problema. Eu tenho uma nav postada e quero que o angkor comece sob a nav. A solução
window.addEventListener...
não funciona para mim, porque eu configurei minha página parascroll-behavior:smooth
que ela defina o deslocamento em vez de rolar para o angkor. osetTimeout()
trabalho, se houver tempo suficiente para rolar até o final, mas ainda assim não parecer bom. então minha solução foi adicionar uma div absoluta postulada no angkor, comheight:[the height of the nav]
ebottom:100%
. nesse caso, essa div terminou na parte superior do elemento angkor e comece na posição em que você deseja mover o angkor. agora tudo o que eu faço é definir o link angkor para esta div absoluta e o wor feito :)fonte
eu estava enfrentando o problema semelhante e resolvi usando o código a seguir
fonte
fonte