Rueda la rueda del ratón ¿hacia dónde va el scroll? 17.5.17
Cómo convertir con puro Css el giro de la rueda del ratón en desplazamiento horizontal de la página.
Rueda la rueda del ratón ¿hacia dónde va el scroll?
On mouse wheel down ... scroll right. Pure Css
![If mouse wheel down ... scroll right. Pure Css](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYzDbK99G0T5N1jVoctDrB4JyRYlFgN-qtDq5KJkBdU1IOuhphCDjKF-4VzzcXqYvbgbPMUkRFNqnm48Drx1kOWFqk_MgUNzmB914efv7Lv7ectckvGn3eWoCACYt9RHPmNGeziPb4WHQ/s900/mouse-scroll.jpg)
Hace unas fechas y en el artículo Distribución de bloques en 1 sola fila y navegación horizontal sin anchura declarada
un lector del blog (Jaime Pascual) planteaba la cuestión del funcionamiento del scroll.
Resumiendo: si la página está diseñada con un scroll Y (navegación en horizontal) esperaba que el giro de la rueda del ratón se tradujese en un movimiento de la página también en horizontal.
Cuestión que por depender de las características del hardware y su programación (controlador) normalmente se encomienda a javascript ya que Css no puede acceder a ello.
Sin embargo, como tantas veces se ha repetido en este blog, hay cosas que Css no puede hacer pero sí simular que las hace. Y esta es una más de ellas.
Todo se reduce a invertir la página para que lo que ves como un movimiento en el eje X realmente sea un desplazamiento en la vertical (eje Y).
Pero antes de seguir, echa un vistazo a la demo sigueinte. Posiciona el cursor sobre él y haz uso de la rueda de tu ratón.
See the Pen If mouse wheel down ... scroll right by Kseso (@Kseso) on CodePen.
Antes de seguir, un par de apuntes:
- El efecto del scroll está realizado en base a al pen de @Hornebom "Head Over Heels". Yo me he limitado a corregir algunas cosillas, como que funcione igual en múltiples navegadores y no sólo Chrome.
- El cómo forzar el scroll X sin declarar medidas explicado en este artículo del blog.
Regla nº 1: El contenido lo primero
<div class="horizontal-parent">
<div class="horizontal-child">
<div class="slide">
<!--contenido-->
Me queda pendiente darle otra vuelta y ver si es posible simplificar elementos. Quizás lo sea.
Regla nº 2: ¿imposible con Css? ¡imaginación!
Ya sabes que hay una máxima que dice:
Donde no alcanza Css se llega con imaginación.
Como te comentaba al inicio, todo es cuestión, como en otras demos, de aplicar una transformación y compensarla en un elemento posterior.
En primer lugar preparamos el terreno de juego con la caja padre de todos los contenidos. El porqué de los valores negativos, tanto en las propiedades de colocación como en los tamaños de ésta y las siguientes, después.
.horizontal-parent {
position: absolute;
top: -1rem;
left: 0;
width: 100vw;
height: 100vh;
}
Ese va a ser el lienzo en blanco: una caja que ocupa todo el viewport. A continuación vamos a girar las dos cajas contenidas en la anterior:
.horizontal-child {
position: relative;
display: block;
width: 100vh;
height: 100vw;
overflow: scroll;
transform-origin: 100% 0%;
transform: rotate(-90deg) translateY(-100vh);
}
Con esta transformación lo que logramos es que el lado superior de la caja ahora sea el derecho de la pantalla y el lateral derechero pase a identificarse con el inferior del viewport.
Así que el scroll que veríamos sería el contrario. Pero también su contenido se mostraría girado esos 90º en sentido horario. Molesto y nada usable. Así que se compensa en su caja hija:
.horizontal-child .slide {
width: 100vw;
height: calc(100vh - 2rem);
padding: 3rem 1rem 2rem;
column-width: 350px;
font-size: 1.3rem;
transform-origin: 0% 0%;
transform: rotate(90deg) translateY(-100%);
}
Además del giro verás que hay una segunda transformación, translateY()
. Esto es debido a que el giro, por el punto sobre el que se hace transform-origin
, lleva aparejado un movimiento lateral que hay que compensar para que los contenidos se muestren a la izquierda y arriba del viewport.
Problemillas arreglados
Las pequeñas diferencias y pequeños fallos corregidos respecto al pen base original del que esta demo es deudora son:
- No oculto la barra de scroll que se muestra pese al
overflow
con el uso de selectores privativos (pseudoelementos) del scroll del tipo::-webkit-scrollbar-*
. Así no es necesario el aviso deVer en Chrome
- Para ello recurro a los valores negativos que mencionaba antes tanto en la propiedad
top
del primer elemento como enheight
de.slide
a la vez que corrijo cierto movimiento vertical del contenido, pequeño pero molesto. - Al usar la técnica de multicolumnas Css para forzar la navegación horizontal, frente a múltiples elementos para alojar el contenido, no es necesario calcular exprofeso y declarar las transformaciones, distintas, a cada una de ellas.
La segunda variación, tal como en el artículo de la navegación horizontal, usando en vez de un largo texto múltiples article
´s para generar las columnas:
See the Pen If mouse wheel down ... scroll right II by Kseso (@Kseso) on CodePen.
Notas finales
El efecto también se produce si utilizas el teclado para navegar, tanto las flechas de "arriba / abajo" o las teclas "inicio / Fin / avanzar o retroceder páagina" además de "convertir" el giro de la rueda del ratón.
El efecto es funcional tanto en Chrome como en Firefox e Internet Explorer 11.
Sin embargo hay un pequeño contratiempo. Si se utiliza desplazamiento por gestos (pantallas táctiles), en Chrome y FIrefox el arrastre horizontal no surte ningún efecto. Hay que desplazar el dedo en la vertical para lograr un movimiento horizontal.
Sin embargo Internet Explorer 11 sí mantiene el efecto al usar gestos. El arrastre en X desplaza los contenidos. En esto nos salió listo el jodío
.
![avatar del Editor del blog](https://2.bp.blogspot.com/-eJ5wUALABuo/Wkzjri2EpRI/AAAAAAAAOGg/TkfTUgzrPBUlN-V86d2XjDkxxGX_RCDZgCLcBGAs/s250/rec.jpg)
Kseso
the obCSServer ᛯ Ramajero Argonauta, Enredique Amanuense de CSS.#impoCSSible inside
Dicen que, en español, EsCss es el mejor blog de CSS. Posíblemente exageren.
@Kseso EsCss Kseso
magnifico post. me fue increiblemente útil
ResponderEliminarQué bueno, maestro. Como siempre. Saludos.
ResponderEliminarLo bueno es tener por aquí al Maese "Dronero" D. Mikmoro.
EliminarEspero que los vuelos bien y los aterrizajes mejor ;-)
Un saludo, Mikel
Otra actualización: en Firefox 53 para Android (al menos) arrastrando horizontalmente el dedo en la pantalla ¡el contenido se mueve igual! Un inconveniente es que si uno sigue arrastrando al terminarse ese contenido, entonces se empieza a mover el documento en vertical. Pero es lo lógico, así funcionan las scrollbars anidadas, lo que nos confunde es estar arrastrando un cuadro en una dirección y que termine moviéndose el contenedor en otra.
ResponderEliminarUn saludo.
Me gustaría implantar este efecto a mi página de prestashop. ¿Cómo lo podría hacer?
ResponderEliminarHola Rubén
EliminarCreo que para esta demos, a diferencia de otras muchas del blog, lo fundamental para lograr el efecto está explicado en detalle en el artículo. Tanto la estructura HTML como los estilos CSS necesarios.
Además de lo anterior, no conozco el CMS que utilizas (prestashop).
Por todo lo anterior, pese a no poder "darte" el código exacto que necesitas, estoy seguro que a poco que tú sí conozcas tu CMS y con un mínimo de conocimiento de CSS que tengas podrás lograrlo.
Un saludo
me gusta... muy currado... gracias.
ResponderEliminar