Eu tenho uma página onde uma barra de rolagem contendo linhas de tabela com divs é gerada dinamicamente a partir do banco de dados. Cada linha da tabela age como um link, como você veria em uma lista de reprodução do YouTube ao lado do player de vídeo.
Quando um usuário visita a página, a opção em que ele está deve ir para o topo da div de rolagem. Esta funcionalidade está funcionando. O problema é que isso vai longe demais. Por exemplo, a opção em que estão ativados é cerca de 10 px muito alta. Assim, a página é visitada, a url é usada para identificar qual opção foi selecionada e então rola essa opção para o topo da div de rolagem. Nota: Esta não é a barra de rolagem da janela, é um div com uma barra de rolagem.
Estou usando este código para mover a opção selecionada para o topo do div:
var pathArray = window.location.pathname.split( '/' );
var el = document.getElementById(pathArray[5]);
el.scrollIntoView(true);
Ele o move para o topo do div, mas cerca de 10 pixels acima. Alguém sabe como consertar isso?
fonte
scrollIntoView
é preocupante.Respostas:
Se for cerca de 10 px, então eu acho que você poderia simplesmente ajustar manualmente o
div
deslocamento de rolagem de contendo assim:fonte
scrollIntoView
?scrollIntoView
função DOM simples não causa animação. Você está falando sobre o plugin scrollIntoView jQuery?el.scrollIntoView({ behavior: 'smooth' });
. O suporte não é muito bom!Role suavemente para uma posição adequada
Obtenha a
y
coordenada correta e usewindow.scrollTo({top: y, behavior: 'smooth'})
fonte
jQuery('#el').offset().top
e usarwindow.scrollTo
scroll={el => { const yCoordinate = el.getBoundingClientRect().top + window.pageYOffset; const yOffset = -80; window.scrollTo({ top: yCoordinate + yOffset, behavior: 'smooth' }); }}
- onde o deslocamento é 10-15 pixels a mais do que o tamanho de seu cabeçalho apenas para melhor espaçamentoVocê pode fazer isso em duas etapas:
fonte
scrollIntoView()
rolagem não tiver terminado antes dascrollBy()
execução, a última rolagem cancelará a anterior. Pelo menos no Chrome 71.scrollIntoView({adjustment:y})
, eu acho que deveria ser possível com um código customizado no finalPosicione a âncora pelo método absoluto
Outra maneira de fazer isso é posicionar suas âncoras exatamente onde você deseja na página, em vez de depender da rolagem por deslocamento. Acho que permite um melhor controle para cada elemento (por exemplo, se você quiser um deslocamento diferente para certos elementos) e também pode ser mais resistente a alterações / diferenças de API do navegador.
Agora, o deslocamento é especificado como -100px em relação ao elemento. Crie uma função para criar esta âncora para reutilização de código ou, se estiver usando uma estrutura JS moderna, como React, faça isso criando um componente que renderiza sua âncora e passe o nome da âncora e o alinhamento de cada elemento, que pode ou pode não ser o mesmo.
Depois é só usar:
Para uma rolagem suave com um deslocamento de 100 px.
fonte
Resolvi esse problema usando,
Isso faz com que o elemento apareça
center
após a rolagem, então não preciso calcularyOffset
.Espero que ajude...
fonte
scrollTo
não em,element
mas emwindow
Isso funciona para mim no Chrome (com rolagem suave e sem hacks de tempo)
Ele apenas move o elemento, inicia a rolagem e o move de volta.
Não há "popping" visível se o elemento já estiver na tela.
fonte
Com base em uma resposta anterior, estou fazendo isso em um projeto Angular5.
Começou com:
Mas isso deu alguns problemas e precisava setTimeout para scrollBy () como este:
E funciona perfeitamente no MSIE11 e no Chrome 68+. Não testei no FF. 500ms era o menor atraso que eu arriscaria. Ir mais baixo às vezes falhava porque a rolagem suave ainda não havia sido concluída. Ajuste conforme necessário para seu próprio projeto.
+1 para Fred727 por esta solução simples, mas eficaz.
fonte
Supondo que você deseja rolar para os divs que estão todos no mesmo nível no DOM e têm o nome de classe "scroll-with-offset", então este CSS resolverá o problema:
O deslocamento do topo da página é 100px. Só funcionará como pretendido com o bloco: 'start':
O que está acontecendo é que o ponto superior dos divs está no local normal, mas seu conteúdo interno começa 100px abaixo do local normal. É para isso que serve o padding-top: 100px. margin-bottom: -100px é para compensar a margem extra do div abaixo. Para tornar a solução completa, também adicione este CSS para compensar as margens / preenchimentos dos divs mais altos e mais baixos:
fonte
Esta solução pertence a @ Arseniy-II , acabei de simplificá-la em uma função.
Uso (você pode abrir o console aqui mesmo no StackOverflow e testá-lo):
fonte
Você também pode usar as
element.scrollIntoView()
opçõesque a maioria dos navegadores suporta
fonte
Eu tenho isso e funciona perfeitamente para mim:
Espero que ajude.
fonte
Outra solução é usar "offsetTop", assim:
fonte
Então, talvez isso seja um pouco desajeitado, mas até agora tudo bem. Estou trabalhando no angular 9.
Arquivo
.ts
Arquivo
.html
Eu ajusto o deslocamento com margem e tampo de enchimento.
Saludos!
fonte
Encontrou uma solução alternativa. Digamos que você queira rolar para um div, Elemento aqui, por exemplo, e deseja ter um espaçamento de 20px acima dele. Defina o ref como um div criado acima dele:
<div ref={yourRef} style={{position: 'relative', bottom: 20}}/> <Element />
Isso criará o espaçamento que você deseja.
Se você tiver um cabeçalho, crie um div vazio também atrás do cabeçalho e atribua a ele uma altura igual à altura do cabeçalho e faça referência a ele.
fonte
Minha idéia principal é criar um tempDiv acima da vista que nós queremos para ir até. Funcionou bem sem atrasos no meu projeto.
Exemplo usando
Espero que ajude
fonte
Com base na resposta de Arseniy-II: Eu tinha o Caso de Uso em que a entidade de rolagem não era a própria janela, mas um Template interno (neste caso, um div). Neste cenário, precisamos definir um ID para o contêiner de rolagem e acessá-lo
getElementById
para usar sua função de rolagem:Deixando aqui para o caso de alguém enfrentar situação semelhante!
fonte
Aqui estão meus 2 centavos.
Também tive o problema de scrollIntoView rolar um pouco além do elemento, então criei um script (javascript nativo) que precede um elemento para o destino, posicionei-o um pouco no topo com css e rolei até aquele. Depois de rolar, removo os elementos criados novamente.
HTML:
Arquivo Javascript:
CSS:
Espero que isso ajude alguém!
fonte
Eu adiciono essas dicas de css para aqueles que não resolveram esse problema com as soluções acima:
fonte
UPD: criei um pacote npm que funciona melhor do que a solução a seguir e mais fácil de usar.
Minha função smoothScroll
Peguei a solução maravilhosa de Steve Banton e escrevi uma função que a torna mais conveniente de usar. Seria mais fácil de usar
window.scroll()
ou até mesmowindow.scrollBy()
, como já tentei antes, mas esses dois têm alguns problemas:Aqui está o código
Basta copiá-lo e bagunçar como quiser.
Para fazer um elemento de link, basta adicionar o seguinte atributo de dados:
Além disso, você pode definir outro atributo como um complemento
Representa a
block
opção dascrollIntoView()
função. Por padrão, éstart
. Leia mais sobre MDN .Finalmente
Ajuste a função smoothScroll às suas necessidades.
Por exemplo, se você tem algum cabeçalho fixo (ou eu o chamo com a palavra
masthead
), pode fazer algo assim:Se você não tiver esse caso, basta excluí-lo, por que não :-D.
fonte
Para um elemento em uma linha de tabela, use JQuery para obter a linha acima da que você deseja e simplesmente role até essa linha.
Suponha que eu tenha várias linhas em uma tabela, algumas das quais devem ser revisadas por e pelo administrador. Cada linha que requer revisão tem uma seta para cima e para baixo para levá-lo ao item anterior ou seguinte para revisão.
Aqui está um exemplo completo que deve ser executado se você criar um novo documento HTML no bloco de notas e salvá-lo. Há um código extra para detectar a parte superior e inferior de nossos itens para revisão, para que não ocorram erros.
fonte
Solução simples para rolar um elemento específico para baixo
fonte