1
resposta

Problema com Smooth Scroll

Galera, na minha aplicação acabei criando uma one page onde possuo a pagina principal e outras rotas da aplicação, por exemplo: HOME (principal), Como funciona (Mesma pagina da HOME), FAQ (outra pagina/rota). Criei um método de Smooth Scroll no componente NAV, dessa forma:


  scrollToElement($element: any): void {
    const el = document.getElementById($element);
    el.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' });
  }

Porém, ao entrar na FAQ que seria outra rota, e clicar no menu que possui os eventos de scrollToElement, ele estoura um erro

NavbarComponent.html:9 ERROR TypeError: Cannot read property 'scrollIntoView' of null
    at NavbarComponent.scrollToElement (navbar.component.ts:30)
    at Object.eval [as handleEvent] (NavbarComponent.html:9)
    at handleEvent (core.js:43993)
    at callWithDebugContext (core.js:45632)
    at Object.debugHandleEvent [as handleEvent] (core.js:45247)
    at dispatchEvent (core.js:29804)
    at core.js:42925
    at HTMLAnchorElement.<anonymous> (platform-browser.js:2668)
    at ZoneDelegate.invokeTask (zone-evergreen.js:391)
    at Object.onInvokeTask (core.js:39680)

Já pesquisei e não acho nenhuma solução valida.

Meu Html do component Nav:

<nav>
  <div class="nav-wrapper">
    <!-- Logo -->
    <a [routerLink]="['/home']" class="brand-logo"><img src="./assets/images/logo.png"></a>
    <!-- Fim do logo -->

    <a href="#" data-target="mobile-demo" class="sidenav-trigger"><i class="material-icons">menu</i></a>
    <ul id="nav-mobile" class="right hide-on-med-and-down">
      <li><a [routerLink]="['/home']" (click)="scrollToElement('quemSomos')">Quem somos</a></li>
      <li><a [routerLink]="['/solicitaremprestimo']">Solicitar empréstimo</a></li>
      <li><a [routerLink]="['/faq']">FAQ</a></li>
      <li><a [routerLink]="['/home']" (click)="scrollToElement('comoFunciona')">Como funciona</a></li>
      <li><a [routerLink]="['/home']" (click)="scrollToElement('contato')">Contato</a></li>
    </ul>
  </div>
  <a id="area-cliente" class="hide-on-med-and-down" [routerLink]="['/login']" target="_blank">Área do cliente</a>
</nav>

<ul class="sidenav" id="mobile-demo">
  <li><a (click)="scrollToElement('quemSomos')">Quem somos</a></li>
  <li><a routerLinkActive="active" [routerLink]="['/solicitaremprestimo']">Solicitar empréstimo</a></li>
  <li><a routerLinkActive="active" [routerLink]="['/faq']">FAQ</a></li>
  <li><a [routerLink]="['/home']" (click)="scrollToElement('comoFunciona')">Vídeos</a></li>
  <li><a #contatos>Contato</a></li>
  <li><a [routerLink]="['/home']" (click)="scrollToElement('contato')">Área do cliente</a></li>
</ul>
1 resposta

Boa noite, Gedan! Como vai?

Veja a mensagem de erro:

NavbarComponent.html:9 ERROR TypeError: Cannot read property 'scrollIntoView' of null

Isso ocorre pois quando vc está na página FAQ os elementos cujos IDs são "quemSomos", "comoFunciona" e "contato" não existem, uma vez que eles estão na página Home. Portanto, ao procurar por eles estando na página FAQ é retornado null.

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software