No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

12 Días
11 Hrs
39 Min
34 Seg

Scroll horizontal con CSS

27/32
Recursos

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.

.plans-container--card {
    position: relative;
    scroll-snap-align: center;
    ...
}

Cómo hacer un scroll

  • 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.
.plans-container--slider {
    display: flex;
    height: 316px;
    overflow-x: scroll;
    overscroll-behavior-x: contain;
    scroll-snap-type: x proximity;
}
image(228).png

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;
    ...
 }

Cambiamos el atributo auto por 15px.

.plans-container--card {
    ...
    margin: 50px 15px 0;
    ...
 }

Y ya tendríamos este resultado:
image(229).png

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.

Aportes 127

Preguntas 32

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

overflow-x

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

Con el siguiente código pueden decorar mejor el scrollbar 😃

.planes-container--slider::-webkit-scrollbar {
  background-color: var(--soft-orange);
  height: 3px;
}
.planes-container--slider::-webkit-scrollbar-thumb {
  background-color: var(--bitcoin-orange);
}

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.

Aqui esta un gif del resultado:
https://i.imgur.com/tnxPZBX.gif

Código en JS

/* 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 flecha
var 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 scroll
var plans_container = document.getElementById("plans-slider");
//las tarjetas de planes porque necesito saber su tamaño, y este puede variar
var plans_card = document.getElementsByClassName("plans-container--card");
//averiguo el tamaño de las tarjetas, esta es la posicion central donde deberia emepezar
var size = plans_card[1].clientWidth;

//Para que la cajita del centro se muestre por default
plans_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 :P
    if(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
		.

Y en css

.slider-container{
    width: 100%;
    position: relative;
}
.slider-container .arrow{
    position: absolute;
    bottom: calc(50% - 20px);
    z-index: 1;
    display: inline-block;
    background-repeat: no-repeat;
    width: 12px;
    height: 12px;
}
.slider-container #left-gray-arrow{
    left: calc(100% - 80%);
    background-image: url(./assets/icons/arrow-gray-left.svg);
}
.slider-container #right-gray-arrow{
    right:  calc(100% - 80%);
    background-image: url(./assets/icons/arrow-gray-right.svg);
}

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

     <article class="plans-container--card" id="dummy"></article>

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

#dummy{
    min-width: calc(100% - 70%);
    visibility: hidden;
}

Y ahí esta! Seguro hay alguna otra solución mejor. Cualquier aporte es super bien recibido!
😃

Y yo que pensaba que necesitariamos javascript para el slide 😛

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 😃

.
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">Pago Mensual</h3>
        <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">Pago Trimestral</h3>
        <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">Pago Anual</h3>
          <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>

.
CSS:

.plans-container--slider {
  position: relative;
  display: flex;
  justify-content: center;
  width: 100%;
  /* gap: 8%; */
  height: 316px;
  overflow-x: hidden;
}

/* Carousel */

.carousel__item {
  display: flex;
  justify-content: center;
  position: absolute;
  opacity: 0;
  /* filter: drop-shadow(0 2px 2px #555); */
  will-change: transform, opacity;
  animation: carousel-animate-vertical 15s linear infinite;
}

.carousel__item:nth-child(1) {
  animation-delay: calc(5s * -1);
}

.carousel__item:nth-child(2) {
  animation-delay: calc(5s * 0);
}

.carousel__item:last-child {
  animation-delay: calc(-5s * 2);
}

@keyframes carousel-animate-vertical {
  0% {
    transform: translateX(70%) scale(0.5);
    opacity: 0;
    visibility: hidden;
  }
  3%, 33.3333333333% {
    transform: translateX(70%) scale(0.7);
    opacity: 0.4;
    visibility: visible;
  }
  36.3333333333%, 66.6666666667% {
    transform: translateX(0) scale(1);
    opacity: 1;
    visibility: visible;
  }
  69.6666666667%, 100% {
    transform: translateX(-70%) scale(0.7);
    opacity: 0.4;
    visibility: visible;
  }
  103% {
    transform: translateX(-70%) scale(0.5);
    opacity: 0;
    visibility: visible;
  }
  /* 100% {
    transform: translateX(-100%) scale(0.5);
    opacity: 0;
    visibility: hidden;
  } */
}

/* Fin carousel */

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!😄

Para el problema de margen de la ultima tarjeta me funciono este margen

Así quedo mi repo, espero les guste : https://amaurysg.github.io/mobile-first-batatabit/

Ya se puede usar el gab sin problema ya esta a un 96% de implementación

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

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: 0 1.5rem;
}

No sé a ustedes pero a mi me aparecía un feo scroll vertical y lo pude quitar con:

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.

Cuando no lo lograstes:

Reto cumplido, lo hice con ayuda de un span y aprovechando la position relative del contenedor de la tarjeta.

.plans--container--card .small--right--arrow {
    position: absolute;
    left: 15px;
    top: 50%;
    width: 24px;
    height: 24px;
    background-image: url("../assets/icons/right-arrow.svg");
    background-repeat: no-repeat;
    color: #BABABA;
}

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.

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;```

¿Cómo hacer que un elemento contenedor tenga un scroll horizontal para poder visualizar los elementos interiores?

Primero hacemos que el contenido no se desborde, que solo sea visible dentro del contenedor aplicándole la siguiente propiedad css al elemneto contenedor:

.container{
display:  flex; /*Esto hace que los elementos hijos se acomoden uno a lado del otro, generando un scroll*/
overflow: scroll;/*Con esta propiedad hacemos que el comportamiento del contenedor contenga sus elementos haciendo que el scroll solo afecte al contenedor  */
overscroll-behavior-x: contain; /*Establece lo que hace un navegador cuando alcanza el límite de un área de desplazamiento*/
}

También le agregamos una regla a los elementos hijos para darle un efecto al deplazmiento, el navegador nos ayuda a centrar el elemento al hacer scroll.

item{
   scroll-snap-type: center;
}

Typo: a typographical error.
Hasta ahora me anime a buscar que significa 😅

Ya esta en 70% 😃

F por Internet Explorer

✅Slide mejorado con scroll-sanp y margins calculados para que este centrada cada tarjeta (primer avance):

  • Ahora falta agregar el función a las flechas con JS >:)
  • En este comentario explico como hice lo mismo para las tablas de las clases pasadas, complementando el aporte de otro compañero (:
  • Estos son algunos de los estilos que usé (aquí estan todos):
    :root {
    	--margin-center-plan: calc(50% - (190px / 2));
    }
    
    .plans-container__slider {
      width: 100%;
      height: 280px;
    
      padding-top: 18px;
    
      display: flex;
      overflow-x: scroll;
      overscroll-behavior: contain;
      scroll-snap-type: x proximity;
    }
    
    .plans-container__card {
      width: 190px;
      min-width: 190px;
      max-height: 247px;
      margin: 0 8px;
      padding: 31px 16px 24px;
    
      position: relative;
      scroll-snap-align: center;
    
      text-align: center;
      background-color: var(--white);
      border-radius: 8px;
      box-shadow: 0px 4px 8px rgba(89, 73, 30, 0.16);
    }
    
    .plans-container__slider::-webkit-scrollbar {
      display: none; /* Ocultar el scroll */
    }
    
    .monthly { /* Esta clase esta en la 1ra tarjeta */
      margin-left: var(--margin-center-plan);
      margin-right: calc(var(--margin-center-plan) / 5);
    }
    
    .always { /* Esta clase esta en la 3ra tarjeta */
      margin-left: calc(var(--margin-center-plan) / 5);
      margin-right: var(--margin-center-plan);
    }
    
  • El contenido de las tarjetas estaba en Ajustes + Breakpoints al lado izquierdo en Figma

Gap 2023 al 93%

Creo que otro punto importante, es que al hacer el scroll las tarjetas laterales quedan muy juntas al borde de la pantalla. Para eso se puede aplicar un margin al slider

.plans-container--slider {
   	display: flex;
	overflow-x: scroll;
	overscroll-behavior-x:contain;
	scroll-snap-type: x proximity;
   margin: 0 30px;
}

Les comparto este artículo de css-trick que habla sobre este tema. Implemente el código de un ejemplo y quedo genial.

“Por internet explorer no se preocupen Microsoft comento que ya lo va matar” De Granda siempre metiendo un poco de humor de vez cuando si de por si sus cursos ya son buenos 😃

En la escuela de javascript, tienen un curso sobre frontend. Enseñan a crear otro slider.

Una posible solución al tema de los márgenes:

.plans-container--slider {
        display: flex;
        height: 316px;
        overflow-x: scroll;
        overscroll-behavior-x: contain;
        scroll-snap-type: x proximity;
        margin-right: 15px;
        margin-left: 10px;
    }


Hay personas que dicen css3 es facil de aprender, que un día se aprende jeje

Css es otro mundo :3

Ya podemos usar la propiedad

gap

puesto que ha sido implementada en todos los navegadores a excepción de IE pero ese no importa en teoría

Jijiji RIP IE, ya lo mató. Año 2023

Con esto lo puedes decorar y alinear mejor

/*/////////////////Cajas contenedoras del scroll2//////////////////*/
.plans-container--sider
{
    display: flex;
    overflow-x:scroll;
    overscroll-behavior-x: contain;
    scroll-snap-align: center;
    scroll-snap-type: x mandatory;
    padding: 18px 70px;
}
.plans-container--card
{
    display: flex;
    scroll-snap-align: center;
    min-width: 211.2px;
    max-width: 450px;
    height: 270px;
    min-height: 220px;
    margin: 0 20px;
}

el profesor confunde con esa forma de nombrar las clases. En el container del medio coloca plan info container y los otros plan card, al momento de acomodar los estilos, los dos contenedores restantes no lo toman porque está todo con nombres distintos. Esta vaina que es dificil y lo dejan más confundido a uno.

Aca mi aporte despues de muchas horas de buscar e investigar, quedo asi: 😁😁

Si alguien tiene problemas con:

  • Scroll Horizontal
  • Scrollbar (la barrita que desliza el contenido)
  • Acomodar bloques
    Les dejo mi código. Espero les ayude!
.plans-container--slider {
    display: flex;
    gap: 50px;
    height: 316px;
    overflow-x: scroll;
    overscroll-behavior-x: contain;
    scroll-snap-type: x proximity;
}
.plans-container--slider::-webkit-scrollbar {
    background-color: var(--soft-orange);
    height: 3px;
}
.plans-container--slider::-webkit-scrollbar-thumb {
    background-color: var(--bitcoin-orange);
}
.plans-container--card {
    position: relative;
    scroll-snap-align: center;
    width: 70%;
    min-width: 230px;
    max-width: 300px;
    height: 250px;
    margin-left: auto;
    margin-right: auto;
    margin-top: 25px;
    padding: 0 15px;
    background-color: var(--just-white);
    border-radius: 15px;
    box-shadow: 0 4px 8px rgba(89,73,30,0.16);
}

Le agregaron una nueva parte al figma y asi quedo implementada.

Con flechas:

Yo copio el codigo igual pero me sigue apareciendo en columna 😦

Actualmente la mayoría de navegadores aceptan la propiedad gap. Así que yo considero que es factible usarla en nuestro slider.

Use el gap ya que es esta en un 69%

Increíble. Hasta ahora había estado trabajando los slides con bootstrap cuando no quería tocar JavaScript directamente.
De seguro es algo que voy a estar utilizando es muchas ocasiones.

Excelente curso 😄

Diciembre del 2021 y gap ya funciona en la mayoria de los navegadores😎

“Can I Use” del Gap de Flex al 26/01/2022 - 87.78%

Pues ya falta poco para poder usar gap 😄

Excelente, pensé que utilizaríamos javascript para el slider, pero no!

overflow-x

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

Solución definitiva margen de ultima card:

Solo agreguen este after al ultimo hijo, es decir, a la ultima tarjeta. Automaticamente se soluciona el problema que es generado por la misma propiedad de Overflow que solo dimensiona el contenido visible del elemento e ignora margin y padding.

.slider__card:last-child:after {
    content: "";
    width: 70px;
    height: 1px;
    position: absolute;
    left: 100%;
    top: 0px;
}

Me encanto la clase. el javascrip lo agregare despues… quizas

aqui el reto!![](https://static.platzi.com/media/user_upload/tarjetas2-f2102490-f79f-42f2-b495-44c39fc36f16.jpg)

Genial!

Ya que estamos en esto del Scroll quiero enseñarles algo que esta super bien, y ya es nativo de CSS. Resulta que se estandarizaron dos propiedades para la barra de scroll, los cuales son `scrollbar-width` y**** `scrollbar-color`**.** Tienen la documentación resumida hecha por [Google](https://developer.chrome.com/docs/css-ui/scrollbar-styling?hl=es-419), o su desean pueden buscar en MDN.
veo que el curso ya tiene su tiempo, hoy 8 diciembre del 2023 ya esta disponible en la mayoria y las versiones de los navegadores ya son muy avanzadas a las de la clase. Ya es recomendable usarlo supongo.
Clase 27: Ahora que las has terminado de [aplicar estilos a las tarjetas](https://platzi.com/clases/2030-mobile-first/32325-detallando-estilos-en-tarjetas-de-planes/), 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. `.plans-container--card` { ` position`: relative; ` scroll-snap-align`: center; ... } ## Cómo hacer un scroll * 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***. `.plans-container--slider` { ` display`: flex; ` height: 316px`; ` overflow-x`: scroll; ` overscroll-behavior-x`: contain; ` scroll-snap-type`: x proximity; } ![image(228).png](https://static.platzi.com/media/user_upload/image%28228%29-c3539218-8fc2-4197-bf5b-0844a7e76283.jpg) 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](https://caniuse.com/), 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`; ... } Cambiamos el atributo auto por 15px. `.plans-container--card` { ... ` margin: 50px 15px 0`; ... } Y ya tendríamos este resultado: ![image(229).png](https://static.platzi.com/media/user_upload/image%28229%29-6f8a8125-db51-4400-9d26-474179ebd207.jpg) 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.

Logré el resultado, y para darle funcionalidad a las flechas, por ahora las hice con un id así como lo hicimos en la parte de arriba:

Para quienes estén viendo el curso para 2023 - desde agosto, se puede utilizar gap, puesto que esta implementado a nivel global en un 93.94%

El avance, emocionado por terminar, y degustado por que tengo que arreglar algunas cosas:

El html:

<section id="plans" class="main-plans-container">
        <div class="plans--title">
            <h2>Escoge el plan que mejor se ajuste a ti.</h2>
            <p>Cualquier plan te da acceso completo a nuestra plataforma.</p>
        </div>
        <section class="plans-container--slider">

            <article class="plans-container--card basic">

                <p class="recomended plan-basicó">Básico</p>

                <div class="plan-info-container">

                    <h3 class="plan-card--title">Pago mensual</h3>

                    <p class="plan-card--price"><sup>$</sup> 129</p>

                    <p class="plan-card--saving">Plan basicó, renovación automatica.</p>

                    <button class="plan-card--ca">Escoge este <img src="assets/icons/orange-right-arrow.svg" alt="arrow right orange"></img></button>
                </div>
            </article>

            <article class="plans-container--card">

              <p class="recomended">Recomendado</p>

              <div class="plan-info-container">

                  <h3 class="plan-card--title">Pago Anual</h3>

                  <p class="plan-card--price"><sup>$</sup> 99</p>

                  <p class="plan-card--saving">*Ahorras <b>$129</b> comparado al plan mensual.</p>

                  <button class="plan-card--ca">Escoge este <img src="assets/icons/orange-right-arrow.svg" alt="arrow right orange"></img></button>
              </div>
          </article>

          <article class="plans-container--card plus">

            <p class="recomended">+Plus</p>

            <div class="plan-info-container">

                <h3 class="plan-card--title">Pago Anual</h3>

                <p class="plan-card--price"><sup>$</sup> 150</p>

                <p class="plan-card--saving">Ahora tendra ecceso tu, y un amigo.</p>

                <button class="plan-card--ca">Escoge este <img src="assets/icons/orange-right-arrow.svg" alt="arrow right orange"></img></button>
            </div>
        </article>
        </section>
    </section>

El css:

image-women-bitcoin h2 {
  position: absolute;
  font-weight: bold;
  font-size: 2.8rem;
  color: #fff;
}
.image-women-bitcoin .image-women-bitcoin {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  justify-content: center;
  align-content: center;
  align-items: center;
  overflow: hidden;
  width: 100%;
}
.image-women-bitcoin .image-women-bitcoin .image-women {
  width: min(280px, 100%);
  -o-object-fit: cover;
     object-fit: cover;
}

.main-plans-container {
  display: grid;
  place-content: center;
  justify-items: center;
  overflow-x: hidden;
}
.main-plans-container h2 {
  margin-block: 16px;
  margin-inline: 4%;
  font-size: 2.8rem;
}
.main-plans-container p {
  margin-inline: 4%;
}
.main-plans-container .plans-container--slider {
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  justify-content: space-between;
  align-content: center;
  align-items: center;
  width: 72%;
  min-width: 280px;
  max-width: 450px;
  height: 100%;
  overflow-x: scroll;
  scroll-snap-type: x mandatory;
}
.main-plans-container .plans-container--slider .plans-container--card {
  display: flex;
  flex-direction: column;
  flex-wrap: nowrap;
  justify-content: center;
  align-content: center;
  align-items: center;
  width: 100%;
  min-width: 280px;
  max-width: 350px;
  margin-block: 4%;
  scroll-snap-align: center;
}
.main-plans-container .plans-container--slider .plans-container--card .recomended {
  position: relative;
  bottom: -24px;
  width: 160px;
  padding-block: 12px;
  border-radius: 16px;
  font-weight: 700;
  font-size: 1.6rem;
  color: #ffe8d5;
  background-color: #f7931a;
}
.main-plans-container .plans-container--slider .plans-container--card .plan-info-container {
  padding: 24px;
  height: 48vh;
  width: 80%;
  margin: 0 auto;
  border-radius: 12px;
  background-color: #fff;
  box-shadow: 0 5px 20px -7px;
}
.main-plans-container .plans-container--slider .plans-container--card .plan-info-container .plan-card--title {
  font-weight: bold;
  font-size: 1.6rem;
  color: #201e1c;
}
.main-plans-container .plans-container--slider .plans-container--card .plan-info-container .plan-card--price {
  font-size: 8rem;
  color: #201e1c;
}
.main-plans-container .plans-container--slider .plans-container--card .plan-info-container .plan-card--price sup {
  position: relative;
  right: -2rem;
  font-size: 1.6rem;
}
.main-plans-container .plans-container--slider .plans-container--card .plan-info-container .plan-card--price {
  margin-block: 0;
}
.main-plans-container .plans-container--slider .plans-container--card .plan-info-container .plan-card--ca {
  border: 1px solid #f7931a;
  border-radius: 4px;
  padding: 20px;
  font-size: 1.6rem;
  font-weight: 480;
  background-color: #fff;
}
.main-plans-container .plans-container--slider .plans-container--card .plan-info-container .plan-card--ca img {
  vertical-align: middle;
  font-size: 1.6rem;
}
.main-plans-container .plans-container--slider .basic .recomended {
  color: #201e1c;
  border: 1px solid #f7931a;
  background-color: #fff;
}
.main-plans-container .plans-container--slider .plus .recomended {
  background-color: #53a8f8;
}
.main-plans-container .plans-container--slider::-webkit-scrollbar {
  height: 5px;
  background-color: #bababa;
}
.main-plans-container .plans-container--slider::-webkit-scrollbar-thumb {
  background-color: #f7931a;
}

yo no use javascript para irme a otras tarjetas, use el id similar a cuando damos click en “conoce nuestros planes”

Hubo un aporte que me ayudó mucho. No me estaba generando el scroll y tenía las mismas líneas del vídeo.

Al parecer necesitaba agregarse un width para que el scroll se ajuste a esta medida. Yo agregué un width:100% a mi contenedor slider y todo bien.

Se puede crear un scroll desde css sin necesidad de usar frameworks para no cargar de tantos archivos el proyecto. Overflow sirve para indicar al navegador qué es lo que debe hacer con el contenido que no cabe dentro de un contenedor, según las dimensiones que se le han asignado overflow-x:scroll,, Permite mostrar unas barras de desplazamiento para que el usuario pueda desplazarse sobre el contenido y ver áreas que quedarían fuera del contenedor.

se puede también hacer eso con scroll-snap-type: online mandatory; y las tarjetas su snap-aling: center; normal

Yo le agregue un padding 0 40px para centrar las tarjetas de los extremos en la vista 320 ✌🏻 y repeti el proceso del video en la sección de las tablas para dar el mismo resultado de scroll. Solo que en este caso, agregue una segunda clase en ambas tablas para agregar la linea de codigo

CSS

.main__tables--container{
    display: flex;
    gap: 15px;
    height: auto;
    padding: 0 40px;
    overflow-x: scroll;
    overscroll-behavior-x: contain;
    scroll-snap-type: x proximity;
}
.main__table{
    scroll-snap-align: center;
}

![](

HTML

![](

En mi slider, no empieza centrado si no que con el primer elemento 😦

Les comparto unos ajustes que les ayudara en las vistas más grandes:
con el overflow en auto van a lograr que cuando incremente la pantalla y no necesiten el overflow este desaparezca.
El max-width tambien les va ayudar a organizar los elementos en vistas con más de 770px y el margin 0 auto ayuda a posicionar el slider-container una vez deja de crecer.
Espero les sirva

<code> 
.plans-container--slider {
    display: flex;
    gap: 20px;
    justify-content: start;
    overflow-x: auto;
    overscroll-behavior-x: contain;
    scroll-snap-type: x proximity;
    overflow-y: hidden;
    height: 316px;
    width: 100%;
    max-width: 770px;
    margin: 0 auto; 
    padding: 0 20px;
}

Vengo del futuro, ya se puede usar GAP.

Está en el 93.6% de los navegadores, solamente falta Internet Explorer.

hola

¿Quieres obtener el siguiente resultado? Mira los respectivos tutoriales y encontrarás el paso a paso 👞👞👞🚶‍♀️🚶‍♂️

genial aprendí como hacer un slider!!!

CSS para darle Scroll horizontal a la sección Monedas y Comisión

.main-tables-container {
    display: flex;
    overflow-x: scroll;
    overscroll-behavior-x: contain;
    scroll-snap-type: x proximity;
}

.main-currency-table, 
.main-commissions-table {
    scroll-snap-align: center;
    width: 70%;
    min-width: 235px;
    max-width: 500px;
    height: 360px;
    margin: 0 auto;

    font-family: "Inter", sans-serif;
}

Hola les hablo desde el futuro para informar que IE fallecio el 15 de junio 2022.
F en el chat,

GAP, en el
Año 2022, ya están en todos los navegadores

Muy interesante este tema!

/* Se genera el scroll horizontal solo en este contenedor sin afectar los demás elementos */
overscroll-behavior-x: contain;

scroll-snap-type: x proximity;

proximity
La ventana gráfica de este contenedor de desplazamiento puede descansar en un punto de ajuste si no se desplaza actualmente teniendo en cuenta los parámetros de desplazamiento del agente de usuario. Si se agrega, mueve, elimina o cambia el tamaño del contenido, el desplazamiento de desplazamiento se puede ajustar para mantener el descanso en ese punto de ajuste.

Casi que no me funciona!! me tocaba colocarle un width para que me funcionara

Dios ni siquiera viendo las clases me toma los códigos no se que estoy haciendo mal por ahora voy a continuar porque esto me esta frustrando

Creacion de scroll horizontal, especial para evitar usar carruseles.

Método alternativo del scroll de los planes con flechas (solo con HTML y CSS)

Ver resultado

https://imgur.com/gallery/SebTXfn

Cada flecha fue creado como un enlace (<a></a>), de tal manera que al darle click lo dirija al siguiente plan. En el primer plan, el botón izquierdo lo enlace al tercer plan y el botón derecho lo enlace al segundo plan, en el segundo plan el botón izquierdo lo enlace al primer plan y el botón derecho lo enlace al tercer plan, y de la misma manera con el tercer plan.

HTML

<section id="plans" class="main-plans-container">
    <div class="plans-container__title">
        <h2>Escoge el plan que mejor se ajuste a ti.</h2>
        <p>Cualquier plan te da acceso completo a nuestra plataforma.</p>
    </div>

    <div class="plans-container__slider">
        <article class="plans-container__card" id="plan1">
            <div class="plan-card"> 
                <h3 class="plan-card__title">Pago Anual</h3>
                <p class="plan-card__price"><span>$</span>99</p>
                <p class="plan-card__saving">*Ahorras $129 comparado al plan mensual.</p>
                <button class="plan-card__button">Escoger este <span></span></button>
            </div>
            <a href="#plan3" class="left-arrow">
                <img src="assets/icons/plan-left-arrow.svg" alt="Botón para ir al plan 3">
            </a>
            <a href="#plan2" class="right-arrow">
                <img src="assets/icons/plan-right-arrow.svg" alt="Botón para ir al plan 2">
            </a>
        </article>

        <article class="plans-container__card" id="plan2">
            <p class="recommended">Recomendado</p>
            <div class="plan-card"> 
                <h3 class="plan-card__title">Pago Anual</h3>
                <p class="plan-card__price"><span>$</span>99</p>
                <p class="plan-card__saving">*Ahorras $129 comparado al plan mensual.</p>
                <button class="plan-card__button">Escoger este <span></span></button>
            </div>
            <a href="#plan1" class="left-arrow">
                <img src="assets/icons/plan-left-arrow.svg" alt="Botón para ir al plan 1">
            </a>
            <a href="#plan3" class="right-arrow">
                <img src="assets/icons/plan-right-arrow.svg" alt="Botón para ir al plan 3">
            </a>
        </article>

        <article class="plans-container__card" id="plan3">
            <div class="plan-card"> 
                <h3 class="plan-card__title">Pago Anual</h3>
                <p class="plan-card__price"><span>$</span>99</p>
                <p class="plan-card__saving">*Ahorras $129 comparado al plan mensual.</p>
                <button class="plan-card__button">Escoger este <span></span></button>
            </div>
            <a href="#plan2" class="left-arrow">
                <img src="assets/icons/plan-left-arrow.svg" alt="Botón para ir al plan 2">
            </a>
            <a href="#plan1" class="right-arrow">
                <img src="assets/icons/plan-right-arrow.svg" alt="Botón para ir al plan 1">
            </a>
        </article>
    </div>
</section>

CSS

/* Contenedor general */
.main-plans-container{
    width: 100%;
    min-height: 320px;
    text-align: center;
    padding-bottom: 50px;
}

.plans-container__title{
    min-width: 288px;
    width: 90%;
    margin: 0 auto;
    margin-top: 64px;
}

.plans-container__title h2{
    font-size: 2.4rem;
    line-height: 2.6rem;
    color: var(--warm-dark-color);
}

.plans-container__title p{
    margin-top: 24px;
    font-size: 1.4rem;
    line-height: 1.8rem;
    color: #757575;
    font-weight: 500;
}

/*Contenedor mayor de todos los planes*/
.plans-container__slider{
    display: flex;
    height: 325px;
    overflow-x: scroll;
    scroll-behavior: smooth;
    overscroll-behavior-x: contain;
    scroll-snap-type: x proximity; 
}


/*Contenedor de todos los planes ARTICLE*/
.plans-container__card{
    position: relative;
    scroll-snap-align: center;
    width: 70%;
    min-width: 230px;
    max-width: 300px;
    height: 258px;
    margin: 50px 40px 0;
    padding: 0 15px;
    background-color: var(--light-color);
    border-radius: 15px;
    box-shadow: 0px 4px 8px rgba(89, 73, 30, 0.16);
}

/*Mensaje de recomendación*/
.recommended{
    position: absolute;
    width: 101px;
    height: 31px;
    top: calc(0% - 31px/2);
    left: calc(50% - 101px/2);
    padding: 8px;
    font-size: 1.2rem;
    line-height: 1.5rem;
    font-family: var(--secondary-family-font);
    text-align: center;
    border-radius: 8px;
    background-color: var(--primary-color);
    color: white;
}

.plan-card__title{
    padding-top: 31px;
    margin-bottom: 8px;
    font-size: 1.4rem;
    line-height: 1.8rem;
    color: black;
    font-weight: 500;
}

.plan-card__price{
    padding:5px 0;
    font-size: 5.2rem;
    font-weight: bold;
    line-height: 6.3rem;
    font-family: var(--secondary-family-font);
    color:black;
    position: relative;
    left:-7px;
}

.plan-card__price span{
    vertical-align: top;
    font-size: 1.2rem;
    font-weight: 500;
    line-height: 1.5rem;
}

.plan-card__saving{
    margin-top: 16px;
    font-size: 1.2rem;
    line-height: 1.5rem;
    color: #757575;
    font-weight: 500;
}

.plan-card__button{
    margin-top: 16px;
    margin-bottom: 24px;
    width: 151px;
    height: 48px;
    border-radius: 4px;
    background: var(--off-white);
    border: solid 2px var(--primary-color);
    color: var(--warm-dark-color);
    font-size: 1.4rem;
    line-height: 1.8rem;
    font-weight: bold;
    text-align: center;
}

.plan-card__button span{ 
    display: inline-block;
    width: 20px;
    height: 20px;
    background-image: url("assets/icons/orange-right-arrow.svg");
    vertical-align: text-bottom;
}

.right-arrow{
    position: absolute;
    right: -40px;
    padding: 15px;
    top: calc(50% - 20px);
}
.left-arrow{
    position: absolute;
    left: -40px;
    padding: 15px;
    top: calc(50% - 20px);
}

resultado final de la lección

Hola! al momento de ver este video y al revisar en la pagina la implementación de gap- Flexbox en los distintos navegadores, se evidencia que el uso aumento a un porcentaje de 88.35%.

.plans-container--slider

Hice que haya un poco de interacción creando dos flechas ubicadas con un position:absolute;

  • Las cuales son dos etiquetas tipo ancord(a), ligada a un ID que le puse a cada tabla

  • También le agregué un scroll-behavior: smooth ; para que fuera suave el desplazamiento

-Esto funciona; sin embargo, si es una pantalla más grande, se verán las flechas de la otra tarjeta.

De todas maneras les dejo el codigo por si lo quieren probar, aunq me imagino q más de uno debio intentar algo asi

.plans-container--slider{
  display:flex;
  height: 316px;
  /* voy a crear el scroll, empezamos por overflow-x, para trabjar verticalmente, este solo tiene efecto con los elemento dentro del contenedor */
  overflow-x:scroll;
  scroll-behavior: smooth ;
  overscroll-behavior-x:contain;
  /* scroll-snap-type esta propiedad hace que si me ubico en medio de dos tarjetas, se ira a la más cercana y no quedara parada en la mitad */
  scroll-snap-type: x proximity;
  /* luego de estas propiedades, tenemos que agregarle al contenedor de las tarjetas otra regla para que pueda funcionar y decir en que parte queremos que se centre(scroll-snap-align:center;) */
}
.flecha-izquierda{
  position:absolute;
  top:30%;
  left:5%;
  height: 20px;
  width: 20px;
  background:url(./assets/assets/icons/izquierda-flecha.png) center/cover no-repeat;
  
  
}

.flecha-derecha{
  position:absolute;
  top:30%;
  right:5%;
  height: 20px;
  width: 20px;
  background:url(./assets/assets/icons/derecha-flecha.png) center/cover no-repeat;
 
}

pd: si alguien conoce la extensión para hacer gift pasemela xD

Para centrar los planes añadir en .plans-container–slider

justify-content: center;

Si no quieres que se vea la barra de scrool puedes agregar la propiedad:


scrollbar-width: none;

y listo, queda mucho más estético.


ya se puede usar gap

Se me ocurrió agregar un margin a los costados de las tarjetas con nth::child - aunque de momento no he sido capaz de centrar en la versión escritorio, supongo que cuando agreguemos los media queries cambiamos el with del slider contenedor

/**margen al lado de las tarjetas*/

.plans-container--slider    
.plans-container--card:nth-child(1) {
    margin-left: 100px;
}

.plans-container--slider    
.plans-container--card:nth-child(3) {
    margin-right: 100px;
}

.

Pude acomodar el diseño de las dos columnas laterales del slider en función a esta implementación del scroll. Así es como me quedó. Código abajo

HTML

<section class="plans-container--slider">
	<!-- Aqui van las cards -->
</section>
<div class=" plans-container--column plans-container--column__left"></div>
<div class="plans-container--column plans-container--column__right"></div>

CSS

.plans-container--slider{
  width: 65%;
  height: 316px;
/*El margin para centrarlo */
  margin: 0 auto;
}

.plans-container--column{
/*El height es el mismo que el card (.plans-container--card)*/
  height: 250px;
  position: absolute;
/*las dos barras juntan un 30%, el gap que se da con la card es el restante del width, que en este caso es de 5%*/
  width: 15%;
  background-color: var(--just-white);
/*Estas columnas están en el contenedor principal (.main-plans-container), el cual tiene un padding vertical de 70px. Poniendo este tamaño como bottom, casi se alinea con el slide, pero el height añadido de la barra del scroll arruina los cálculos. Pero me gusta como quedó xD*/
  bottom: 70px;
  border-radius: 5px;
}

.plans-container--column__left{
  left: 0;
}

.plans-container--column__right{
  right: 0;
}

Propiedad de desbordamiento

overflow - x>

Permite horizontalmente ver el desbordamiento del contenido.

con el valor: scroll: coloca un scroll para la visualización del contenido

Fuente: https://developer.mozilla.org/en-US/docs/Web/CSS/overflow-x

Está quedando genial 😃

Por cierto, sabían que con la extensión live server de vscode pueden visualizar en tiempo real la página en sus dispositivos moviles, tan solo deben teclear en el navegador la dirección ip privada del pc donde están codificando y el puerto del servidor, eso sí, deben estar conectados a la misma red.

Con el siguiente CSS, logre que las tarjetas de los bordes tambien se mantengan en el centro, sin embargo, las tarjetas siempre se mantendran de 230px. Este efecto se ve bien para moviles y tablets, para pc, no tanto.

Las fotos son del media query de una tablet (768px, 874px)

.plans-container--slider {
    display: flex;
    height: 316px;
    overflow-x: scroll;
    overscroll-behavior-x: contain;
    scroll-snap-type: x proximity;
}

.plans-container--card {
    position: relative;
    scroll-snap-align: center;
    margin: 50px 50px 0;
    min-width: 230px;
    height: 250px;
    padding: 0 15px;
    background-color: var(--just-white);
    border-radius: 15px;
    box-shadow: 0 4px 8px rgba(89, 73, 30, 0.16);
}

.plans-container--card:first-child {
    margin-left: calc((100% - 230px + 10px) / 2);
}

.plans-container--card:last-child {
    margin-right: calc((100% - 230px + 10px) / 2);
}

Para los que están tomando el curso en estas fechas, les dejo la tabla de como esta gap al día de hoy.

![](

Si alguien quiere remover el scrollbar:

.plans-container--slider::-webkit-scrollbar {
  display: none;
}
  <section id="plans" class="main-plans-container">

            <div class="plans--title">
                <h2>  Escoge el plan que mejor se ajuste a ti. </h2>
                <p>Cualquier plan te da acceso completo a nuestra plataforma</p>
            </div>
<!--targetas -->

            <section class="plans-container--slider"> 
                <article  class="plans-container--card">
                    <div class="plan-info-container ">
                        <h3 class="plan-car--title">Pago Anual </h3>
                        <p class="plan-card--price"> <span>$</span>99</p>
                        <p class="plan-card-saving">* Ahorra $129 comparando al plan mensual.</p>
                        <button class="plan-card--ca">Escoge este <span></span></button>
                    </div>
                </article>
                <p class="slide-izquierdo"> <span></span></p> 
                <article  class="plans-container--card">
                    <p class="recomendado">Recomendado</p>
                    <div class="plan-info-container ">
                        <h3 class="plan-car--title">Pago Anual </h3>
                        <p class="plan-card--price"> <span>$</span>99</p>
                        <p class="plan-card-saving">* Ahorra $129 comparando al plan mensual. </p>
                        <button class="plan-card--ca">Escoge este <span></span></button>
                    </div>
                </article>
               <p class="slide-derecho"> <span></span></p> 
                
                <article  class="plans-container--card">
                    <div class="plan-info-container ">
                        <h3 class="plan-car--title">Pago Anual </h3>
                        <p class="plan-card--price"> <span>$</span>99</p>
                        <p class="plan-card-saving">* Ahorra $129 comparando al plan mensual.</p>
                        <button class="plan-card--ca">Escoge este <span></span></button>
                    </div>
                </article>
            </section>
           
        </section>
.slide-izquierdo span{
    display: inline-block;
    width: 20px;
    height: 20px;
    background-image: url('/icons/mdi_keyboard_arrow_down.png');
    margin-top: 150px;
}
.slide-derecho span{
    display: inline-block;
    width: 20px;
    height: 20px;
    background-image: url('/icons/mdi_keyboard_arrow_down\(1\).png');
    margin-top: 150px;
}

![](


¿Por que desaparece el margen de esta tarjeta? 😦

Overscroll-behavior no funciona. Alguien podría ayudarme?