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
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.
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:
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)
.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;}
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.
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;```
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