Puede desplazarse horizontalmente mi página de demostración presionando Space Bar, Page Up / Page Downy Left Arrow / Right Arrowllaves. También puede ajustar el desplazamiento con un mouse o un panel táctil.
Pero solo uno u otro funciona.
¿Hay alguna manera de que los eventos de teclado y el ajuste de desplazamiento CSS puedan coexistir? ¿Qué me estoy perdiendo? Cualquier ayuda sería muy apreciada, ya que he estado luchando con este problema durante más de una semana.
Mira mi demo en CodePen
(Descomente la parte relevante del código CSS para habilitar el efecto de desplazamiento de desplazamiento para ver que los atajos de teclado dejan de funcionar).
import animate from "https://cdn.jsdelivr.net/npm/animateplus@2/animateplus.js"
const sections = Array.from(document.querySelectorAll("section")).sort(
(s1, s2) => {
return s1.getBoundingClientRect().left - s2.getBoundingClientRect().left
}
)
const getSectionInView = () => {
const halfWidth = window.innerWidth / 2
const index = sections.findIndex(
section =>
section.getBoundingClientRect().left <= halfWidth &&
section.getBoundingClientRect().right > halfWidth
)
return index
}
const getNextSection = dir => {
const sectionInViewIndex = getSectionInView()
const nextIndex = sectionInViewIndex + dir
const numSections = sections.length
const nextSectionIndex =
nextIndex < 0 || nextIndex >= numSections ? sectionInViewIndex : nextIndex
return sections[nextSectionIndex]
}
const container = document.scrollingElement
const animateScroll = dir => {
const from = container.scrollLeft
const { left } = getNextSection(dir).getBoundingClientRect()
return progress => (container.scrollLeft = from + progress * left)
}
window.onload = () => {
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
}
}
}
}
Nota: Estoy usando un módulo pequeño y elegante llamado Animate Plus para lograr la animación de desplazamiento suave.
Actualización: la solución de @ Kostja funciona en Chrome, pero no en Safari para Mac o iOS, y para mí es crucial que funcione en Safari.