Se eu tiver um cabeçalho sem rolagem em uma página HTML, fixo na parte superior, com uma altura definida:
Existe uma maneira de usar a âncora da URL (a #fragment
parte) para fazer o navegador rolar para um determinado ponto da página, mas ainda respeitar a altura do elemento fixo sem a ajuda do JavaScript ?
http://foo.com/#bar
ERRADO (mas o comportamento comum): CORRETO: + --------------------------------- + + -------------- ------------------- + | BAR ///////////////////// header | | //////////////////////// header | + --------------------------------- + + -------------- ------------------- + | Aqui está o resto do texto | | BAR | ... | | | ... | Aqui está o resto do texto | | ... | ... + --------------------------------- + + -------------- ------------------- +
.dislocate50px, #bar { padding: 50px 0 0; margin: -50px 0 0; -webkit-background-clip: content-box; background-clip: content-box; }
scroll-padding-top
aqui: css-tricks.com/… Resposta correspondente: stackoverflow.com/a/56467997/247696Respostas:
Eu tive o mesmo problema. Eu o resolvi adicionando uma classe ao elemento anchor com a altura da barra superior como o valor de padding-top.
E então simplesmente o css:
fonte
margin-top: -90px;
para compensar a lacuna criada pelo preenchimento..anchor:target {padding-top: 90px;}
para que ele só adicionasse o preenchimento quando eles usassem a marca de âncora. Dessa forma, nem sempre há um monte de preenchimento se a página carregar na parte superior. Somente quando ele carrega um ponto específico mais baixo na página.Se você não pode ou não deseja definir uma nova classe, adicione um
::before
pseudo-elemento de altura fixa à:target
pseudo-classe em CSS:Ou role a página em relação ao
:target
jQuery:fonte
:target
foi simplesmente brilhante!Eu uso essa abordagem:
Ele adiciona um elemento invisível antes de cada destino. Funciona com o IE8 +.
Aqui estão mais soluções: http://nicolasgallagher.com/jump-links-and-viewport-positioning/
fonte
Resposta adotada pelo Bootstrap oficial:
Créditos
Mesclar
fonte
display: flex;
oupadding-top
. Use um elemento âncora dedicado (como<a name="my_link">{leave this empty}</a>
) nesses casos.from: https://css-tricks.com/fixed-headers-on-page-links-and-overlapping-content-oh-my/
fonte
A melhor maneira que encontrei para lidar com esse problema é (substitua 65px pela altura fixa do elemento):
Se você não gosta de usar o seletor de destino, também pode fazê-lo desta maneira:
Nota: este exemplo não funcionará se o elemento de destino tiver uma cor de fundo diferente do pai. por exemplo:
nesse caso, a cor verde do elemento my-target substituirá o elemento vermelho pai em 65px. Não encontrei nenhuma solução CSS pura para lidar com esse problema, mas se você não tiver outra cor de plano de fundo, essa solução é a melhor.
fonte
Embora algumas das soluções propostas funcionem para links de fragmentos (= links de hash) na mesma página (como um link de menu que rola para baixo), descobri que nenhuma delas funcionava no Chrome atual quando você deseja usar links de fragmentos provenientes de outros sites. Páginas .
Assim, ligar para www.mydomain.com/page.html#foo do zero NÃO compensará seu destino no Chrome atual com nenhuma das soluções CSS ou JS fornecidas.
Há também um relatório de bug do jQuery descrevendo alguns detalhes do problema.
SOLUÇÃO
A única opção que encontrei até agora que realmente funciona no Chrome é o JavaScript que não é chamado onDomReady, mas com um atraso.
RESUMO
Sem um atraso de JS, as soluções provavelmente funcionarão no Firefox, IE, Safari, mas não no Chrome.
fonte
Como a especificação CSS Scroll Snap entra em jogo, é facilmente possível com a
scroll-margin-top
propriedade. Atualmente, é executado no Chrome e Opera (abril de 2019). Além disso, o Safari 11+ deve suportar isso, mas não consegui executá-lo no Safari 11. Provavelmente, temos que esperar que os caras o consertem.Exemplo de Codepen
fonte
scroll-padding-top
escroll-margin-top
?scroll-margin-top
para este caso de uso, infelizmente, não está implementado no Safari 11-13: bugs.webkit.org/show_bug.cgi?id=189265scroll-snap-margin-top
: caniuse.com/#search=scroll-margin-topNo Chrome / Safari / Firefox, você pode adicionar um
display: block
e usar uma margem negativa para compensar o deslocamento, como:Veja o exemplo http://codepen.io/swed/pen/RrZBJo
fonte
Você pode fazer isso com o jQuery:
fonte
Acabei de descobrir outra solução CSS pura que funcionou como um charme para mim!
Encontrado neste site !
fonte
Você pode tentar o seguinte:
Defina o valor do preenchimento superior para a altura real do seu cabeçalho. Isso introduzirá um pequeno espaço extra na parte superior do cabeçalho, mas só será visível quando o usuário pular para a âncora e depois rolar para cima. Eu criei essa solução para o meu site agora, mas ela mostra apenas uma pequena barra fixa na parte superior da página, nada muito alto.
fonte
Eu tenho que trabalhar facilmente com CSS e HTML, usando o método "anchor: before" mencionado acima. Eu acho que funciona melhor, porque não cria preenchimento maciço entre seus divs.
Parece não funcionar para a primeira div da página, mas você pode combater isso adicionando preenchimento à primeira div.
Aqui está um violino de trabalho: http://jsfiddle.net/FRpHE/24/
fonte
Funciona para mim:
LINK HTML para ancorar:
Âncora HTML:
CSS:
fonte
Estou usando a resposta do @ Jpsy, mas por razões de desempenho, só estou configurando o timer se o hash estiver presente no URL.
fonte
Eu tive muitos problemas com muitas das respostas aqui e em outros lugares, pois minhas âncoras marcadas eram cabeçalhos de seção em uma página de Perguntas frequentes, portanto, compensar o cabeçalho não ajudou, pois o restante do conteúdo simplesmente permaneceu onde estava. Então eu pensei em postar.
O que acabei fazendo foi um composto de algumas soluções:
O CSS:
Onde "120px" é a altura fixa do cabeçalho (talvez mais alguma margem).
O link do marcador HTML:
O conteúdo marcado como HTML:
O bom dessa solução é que o
span
elemento não está apenas oculto, é essencialmente recolhido e não preenche seu conteúdo.Não posso ter muito crédito por esta solução, pois ela provém de vários recursos diferentes, mas funcionou melhor para mim na minha situação.
Você pode ver o resultado real aqui .
fonte
<span>
com a âncora no período, juntamente com a adição de preenchimento e margem funcionou para mim. Muito obrigado por reservar um tempo para enviar esta resposta, apesar da idade do tópico!Eu não estava tendo sorte com a resposta listada acima e acabei usando esta solução que funcionou perfeitamente ...
Crie um espaço em branco onde deseja definir sua âncora.
E aplique a seguinte classe:
Esta solução funcionará mesmo se as seções tiverem fundos coloridos diferentes! Encontrei a solução neste link.
fonte
Parece um pouco hacky para minha mente purista, mas como uma solução somente em CSS, você pode adicionar preenchimento ao elemento ancorado ativo usando o
:target
seletor:fonte
Eu descobri que eu tinha que usar tanto MutttenXd 's e Badabam ' soluções CSS s juntos, como o primeiro não funcionou no Chrome eo segundo não funcionou no Firefox:
fonte
A maneira que eu acho mais limpa é a seguinte:
fonte
Uma abordagem minimamente invasiva usando jQuery:
Ligação:
Conteúdo:
Roteiro:
Ao atribuir a classe de link âncora aos links, o comportamento de outros links (como controles de acordeão ou tabulação) não é afetado.
A pergunta não quer javascript, mas a outra pergunta mais popular está encerrada por causa dessa e não pude responder lá.
fonte
Eu precisava de algo que funcione para links de entrada, links na página E que possa ser direcionado por JS, para que a página possa responder a alterações na altura do cabeçalho
HTML
CSS
Ele
z-index: -1
permite que os links na 'área de preenchimento' acima de um alvo de fragmento ainda sejam clicáveis, como comentado por @MuttenXd em sua respostaAinda não encontrei um problema no IE 11, Edge 15+, Chrome 38+, FF 52+ ou Safari 9.1+
fonte
Este código deve fazer o truque. Troque 45 px pela altura da barra de cabeçalho.
Edição: Se usando jQuery é uma opção, eu também tive sucesso usando jQuery.localScroll com um valor de deslocamento definido. A opção de deslocamento faz parte do jQuery.scrollTo, sobre o qual o jQuery.localScroll se baseia. Uma demonstração está disponível aqui: http://demos.flesler.com/jquery/scrollTo/ (segunda janela, em 'deslocamento')
fonte
Aqui está uma solução jquery completa que funcionará no IE:
Suponha que os elementos da barra de navegação sejam algo assim:
Você pode usar o seguinte snippet de jquery para deslocar a rolagem:
fonte
Implementado usando
:before
funcionou muito bem até que percebemos que o pseudo-elemento estava realmente cobrindo e bloqueando eventos de ponteiro localizados na área do pseudo-elemento. Usar algo comopointer-events: none
na:before
âncora ou mesmo diretamente na âncora não afetou.O que acabamos fazendo foi tornar o posicionamento da âncora absoluto e, em seguida, ajustar sua posição para ser o deslocamento / altura da área fixa.
Deslocar âncora sem bloquear eventos de ponteiro
O valor disso é que não estamos bloqueando nenhum elemento que possa estar dentro desses 300px. A desvantagem é que a captura da posição desse elemento do Javascript precisa levar em conta esse deslocamento, para que qualquer lógica tenha que ser ajustada.
fonte
Foi assim que finalmente cheguei ao local apropriado quando você clica na navegação. Eu adicionei um manipulador de eventos para os cliques de navegação. Então você pode simplesmente usar "scrollBy" para subir no deslocamento.
fonte
Criei uma div com algumas quebras de linha e dei esse ID, depois coloquei o código que queria mostrar por baixo. O link levaria você ao espaço acima da imagem e o cabeçalho não estaria mais no caminho:
Obviamente, você pode alterar o número de quebras de linha para atender às suas necessidades. Isso funcionou perfeitamente para mim, mas não tenho certeza se há algum problema, ainda estou aprendendo HTML.
fonte
<br>
tags antes de cada título.Utilizou este script
fonte
Eu acho que essa abordagem é mais útil:
<h2 id="bar" title="Bar">Bar</h2>
fonte
Agora você pode usar a margem de rolagem superior , que é amplamente adotada .
Basta adicionar o seguinte CSS ao elemento para o qual você deseja rolar:
fonte
scroll-margin-top
foi sugerido anteriormente neste tópico