Ahora que las has terminado de aplicar estilos a las tarjetas, debemos crear este scroll horizontal que se genera al navegar entre ellas.
Como desarrollador fronted vas a ocupar muchas veces frameworks para acelerar tu proceso de creación, como para crear este tipo de efectos. Sin embargo, para esta ocasión usaremos sólo código CSS con la intención de comprender cómo están construidos. ¡Vamos a nuestra hoja de estilos!
Primero, para que nuestro contenedor pueda generar el scroll entre las tarjetas estas deben tenerlo. Centramos todas las tarjetas para general un scroll con scroll-snap-align: center. Esta línea la colocamos justo debajo del position: relative del contenedor de nuestra tarjeta.
Llamamos la clase del contenedor de las tarjetas con .plans-container--slider.
display: flex ya nos genera un scroll horizontal, pero se desborda del contenedor y se genera un overflow por fuera.
Le damos una altura de 316px, mayor al contenedor de las tarjetas.
Generamos un scroll sobre el eje x con overflow-x: scrol. Esta propiedad establece lo que se muestra cuando el contenido desborda los bordes izquierdo y derecho de un elemento a nivel de bloque. Puede que no sea nada, una barra de desplazamiento o el contenido adicional.
overscroll-behabior establece lo que hace un navegador cuando alcanza el límite de un área de desplazamiento.
Para que al deslizarnos sobre las tarjetas la vista se centre en el centro de cada una de ellas como si tuviesen un iman, usamos scroll-snap-type: x proximity.
En el navegador podemos observar que las tarjetas están pegadas una a otra. En CSS hay una nueva propiedad llamada gap que nos ayuda a resolver este problema.
Actualmente gap es soportado por casi todos los navegadores, sin embargo, para usar una propiedad nueva, debemos al menos confirmar que tenga un 95% de disponibilidad para evitar que los usuarios tengan una mala experiencia.
Puedes consultar en la página Can I Use, entre otras cosas, la cantidad de navegadores en que una propiedad está disponible. En este caso para solucionarlo vamos al contenedor de las tarjetas y buscamos la propiedad de margin.
.plans-container--card {...margin: 50px auto 0;...}
Y así hemos terminado esta última sección de planes por completo. Quizás te preguntes por los íconos de navegación a los costados. Por supuesto que aún se puede hacer más usando Javascript y añadiendo interacciones al hacer clic, pero eso te lo dejamos a ti. Ya sabes construir un scroll usando únicamente CSS, eso es bastante genial.
Contribución creada por: José Miguel Veintimilla (Platzi Contributor), con aportes de John Steven Bernal Gonzalez.
La propiedad de CSS overflow-x establece lo que se muestra cuando el contenido desborda los bordes izquierdo y derecho de un elemento a nivel de bloque. Puede que no sea nada, una barra de desplazamiento o el contenido adicional.
overscroll-behavior
la propiedad de css overscroll-behabior establece lo que hace un navegador cuando alcanza el límite de un área de desplazamiento. Es una abreviatura de overscroll-behavior-x y overscroll-behavior-y.
scroll-snap-type
La propiedad CSS scroll-snap-type establece qué tan estrictamente se aplican los puntos de snap en el contenedor de desplazamiento en caso de que haya uno
Que es un snap?
gracias
Con el siguiente código pueden decorar mejor el scrollbar :)
No lo pude realizar, no sé por qué no lo está leyendo:
Bueno después de HORAS investigando y cientos de paginas de stack-overflow** he conseguido el scroll con flechitas que quería. ** Este scroll con flechitas es mi bebe así que mírenlo con amor.
/* Codigo para hacer scroll a un div horizontal por medio de flechas.
Uso el tamaño de las cajas dentro del slide para restarselo al scrollLeft y llevarme
a la posicion deseada.
Además oculto las flechas dependiendo de en que posicion me encuentre*///obtengo los dos elementos de flechavar gray_arrow_left =document.getElementById("left-gray-arrow");var gray_arrow_right =document.getElementById("right-gray-arrow");//el contenedor de los planes aka donde se hace scrollvar plans_container =document.getElementById("plans-slider");//las tarjetas de planes porque necesito saber su tamaño, y este puede variarvar plans_card =document.getElementsByClassName("plans-container--card");//averiguo el tamaño de las tarjetas, esta es la posicion central donde deberia emepezarvar size = plans_card[1].clientWidth;//Para que la cajita del centro se muestre por defaultplans_container.scrollLeft= size;gray_arrow_left.addEventListener("click",function(){ gray_arrow_right.style.display="inline-block";//Le resto el tamaño de las tarjetas a la posicion del scroll para mover a la izquierda plans_container.scrollLeft-= size;//Si se encuentra en la primera tarjeta deberia esconder la flecha izquierda,// pues porque ya no puede seguir llendo a la izquierda :Pif(plans_container.scrollLeft<= size*2){ gray_arrow_left.style.display="none";}});gray_arrow_right.addEventListener("click",function(){ gray_arrow_left.style.display="inline-block"; plans_container.scrollLeft+= size;if(plans_container.scrollLeft>= size){ gray_arrow_right.style.display="none";}});
Estilos de las flechitas
Primero agregue un div en el html para envolver toodo el slide, y ahi es que voy a poner las flechas, porque si las pongo dentro del elemento que hace scroll ellas hacian scroll con el elemento y yo no quería eso.
<div class="slider-container"><span id="left-gray-arrow"class="arrow"></span></a><span id="right-gray-arrow"class="arrow"></span>.el section con scroll va aqui
.
Ahora yo quería que cuando pasara a cada una de las cajitas de planes, esta me quedara en el centro bien bonita. Y esto lo podría hacer en teoría, agregando un padding a los lados del elemento scroll. PERO NO porque resulta que el padding-right no se aplica a el scroll horizontal
La solución que me inventé fue** crear un elemento con visibility: hidden del ancho que yo quería que tuvera el padding** y asi engañar a el navegador que me quería hacer la vida dificil
Aproveché la clase de mis otras cajitas de planes para que tengan los mismo estilos y que no me salga ninguna sorpresita por un margin o cualquier cosa rara
Y ahí esta! Seguro hay alguna otra solución mejor. Cualquier aporte es super bien recibido!
:)
Te quedo genial!
Podrías subirlo a un repo? para verlo mejor, gracias, te quedó increíble
Y yo que pensaba que necesitariamos javascript para el slide :P
Yo también lo pensé, pero para las flechas si es necesario.
yo pensaba lo mismo
Para los que esten viendo este curso en 2021 o más adelante, sepan que ya pueden usar gap. El 13 de agosto de 2021 ya es soportado en la mayoría de los navegadores.
87% de disponibilidad para usuarios el dia de hoy y solo quedan navegadores muy poco usados
Hoy ya tiene un 95.38% de disponibilidad.
Yo preferí agregar un carousel automatico :smiley:
.
HTML:
<section class="plans-container--slider"><article class='carousel__item'><div class="plans-container--card"><div class="plan-info-container"><h3 class="plan-card--title">PagoMensual</h4><p class="plan-card--price"><sup>$</sup>19</p><p class="plan-card--saving">*Ahorras $1 comparado al plan mensual.</p><button class="plan-card--ca">Escoger este <span></span></button></div></div></article><article class='carousel__item'><div class="plans-container--card"><div class="plan-info-container"><h3 class="plan-card--title">PagoTrimestral</h4><p class="plan-card--price"><sup>$</sup>39</p><p class="plan-card--saving">*Ahorras $72 comparado al plan mensual.</p><button class="plan-card--ca">Escoger este <span></span></button></div></div></article><article class='carousel__item'><div class="plans-container--card"><p class="recommended">Recomendado</p><div class="plan-info-container"><h3 class="plan-card--title">PagoAnual</h4><p class="plan-card--price"><sup>$</sup>99</p><p class="plan-card--saving">*Ahorras $129 comparado al plan mensual.</p><button class="plan-card--ca">Escoger este <span></span></button></div></div></article></section>
Aparte lleva los mismos estilos de la clase para las cards como se vio en la clase.
El carousel lo vi en un codepen y lo adapte para un proyecto pasado.
.
Espero que les sea de ayuda!:smile:
como le puedo hacer para que sea de dos elementos el carrusel, hasta el momento lo pude implementar pero tiene 3 giros el carrusel, osea que me quedo con un espacio vacio
eso no es diseño Mobile
Para el problema de margen de la ultima tarjeta me funciono este margen
Excelente aporte, tome tu concepto y lo aplique de esta manera:
.plans-container--card {margin: 50px 5px 0;/* arriba - izq/der - abajo */}.plans-container--slider {margin:0 20px;/* Márgen para complementar espaciado faltante en lados de slider */}
siempre que me toca hacer un scroll horizonatal, vengo a este video 😂, espero y sea la ultima vez y que mi cerebro lo haya entendido
Ya se puede usar el gab sin problema ya esta a un 96% de implementación
Cuidado que la propiedad que el utiliza es gap con p*.
Saludos.
Amigos, saben si existe una manera para que cuando la página cargue, siempre aparezca el scroll en medio (es decir centrado, en la tarjeta de recomendado)
Tengo la misma duda, pudiste resolverlo?
No amigo, aún no. Empece a ver frameworks y le reste importancia.
codigo del scroll horizontal
.main__card-plan{display: flex; overflow-x: scroll; overscroll-behavio-x:contain; scroll-snap-type: x proximity; padding-top: 4rem;}.main__card-content{ scroll-snap-align:center;/*cuando hagas scroll te lleve al centro del elemento*/ margin-bottom:0;margin:01.5rem;}
muy bueno
genial
No sé a ustedes pero a mi me aparecía un feo scroll vertical y lo pude quitar con:
me rompí la cabeza con tu aporte, tienes razón, yo lo solucione agregando mas espacio al height.
Llevaba varias horas luchando para quitar ese scroll, muchas gracias
para solucionar el tema del scroll de la utlima tarjeta que se corta un poco y queda en el borde lo que hice fue poner un article mas con una etiqueta br dentro, no es la solucion mas elegante pero funciona.
Juro que lo intente de muchas formas, pero no pude sino acudir a tu solucion tambien :sw
Muchas gracias! Hice algo muy parecido, fue la unica manera en que pude hacer que funcionara.
Reto cumplido, lo hice con ayuda de un span y aprovechando la position relative del contenedor de la tarjeta.
Estuve todo el curso preguntándome cómo se haría el scroll horizontal y no puedo creer lo fácil que fue. Que gran curso.
nop
El ultimo card quedo muy pegado a la derecha en esos casos como se podria separar?
¡Hola!
Podrías agregar un margin o un padding más alto al lado derecho de este card para que no suceda eso.
Un saludo.
Colócale un div que contenga a ese último card y dale un padding-right: aprox 88px para que quede centrado el ultimo card cuando sea visto🤗, ninguna otra opción me funcionó...
Chicos el Scroll vertical es sencillo de conseguir, basicamente es poner los objetos de forma vertical con flex-direction: Column; abrovechando que ya tenemos el display flex. Luego tenemos que cambiar nuestras tres propiedades de overflow que tenemos en x a y.
display:flex; flex-direction:column; overflow-y: scroll; overscroll-behavior-y: contain; scroll-snap-type: y proximity;```
Gracias crack trataré de recordar este dato para cuando lo necesite :)