Conflito ao usar simultaneamente eventos do teclado para rolagem e snap à rolagem CSS

11

Você pode horizontalmente rolar minha página de demonstração, pressionando Space Bar, Page Up / Page Downe Left Arrow / Right Arrowchaves. Você também pode fazer o snap com o mouse ou o trackpad.

Mas apenas um ou outro funciona.

Existe uma maneira de coexistir eventos de teclado e snap à rolagem CSS? o que estou perdendo? Qualquer ajuda seria muito apreciada, pois estou lutando com esse problema há mais de uma semana.


Confira minha demonstração no CodePen

(Descomente a parte relevante do código CSS para ativar o efeito de encaixe da rolagem para ver se os atalhos do teclado param de funcionar.)



Nota: Estou usando um módulo pequeno e elegante chamado Animate Plus para obter a animação de rolagem suave.


Atualização: a solução da @ Kostja funciona no Chrome, mas não no Safari para Mac ou iOS, e é crucial para mim que funcione no Safari.

Czar
fonte

Respostas:

3

Eu acho que não há, o css substitui o javascript. Mas você pode simplesmente adicionar o listener de eventos do wheel como:

window.addEventListener("wheel", function() {
    if(event.deltaY > 0){
      animate({
        easing: "out-quintic",
        change: animateScroll(1)
      })      
    }
      if(event.deltaY < 0){
      animate({
        easing: "out-quintic",
        change: animateScroll(-1)
      })      
    }      
});

https://codepen.io/kostjaaa/pen/NWWVBKd

kostja
fonte
Você poderia postar um link em uma bifurcação no CodePen, porque não consigo fazer sua solução funcionar? Obrigado.
Tzar
Desculpe, mas não funciona. Tentaste?
Tzar
sim tentei com Chrome versão 78.0.3904.108 (64 bits)
kostja
O que não está funcionando do seu lado? o snap ou o pergaminho? você precisa clicar na visualização antes de usar o teclado btw. O teclado não é combinado com o cursor do mouse, como é a rolagem.
precisa
Acabei de o testar no Chrome e funciona! Mas não funciona no Safari para Mac ou iOS, o que é muito mais importante para mim neste projeto. Você sabe qual pode ser o motivo?
Tzar
0
window.onload = () => {
  window.addEventListener("wheel", () => {
    const direction = event.deltaY > 0 ? 1 : event.deltaY < 0 ? -1 : false;

    if (direction) {
      animate({
        easing: "out-quintic",
        change: animateScroll(direction)
      });
    }
  });

  document.body.onkeydown = event => {
    switch (event.key) {
      case " ": // Space Bar
      case "PageDown":
      case "ArrowRight": {
        animate({
          easing: "out-quintic",
          change: animateScroll(1)
        });
        break;
      }
      case "PageUp":
      case "ArrowLeft": {
        animate({
          easing: "out-quintic",
          change: animateScroll(-1)
        });
        break;
      }
    }
  };
};    

Isso deve funcionar.

https://codepen.io/JZ6/pen/XWWQqRK

Jay Z
fonte