2 maneiras de criar uma interface do usuário de cartão de rolagem (Flexbox e CSS Grid)

Vamos criar isso de duas maneiras diferentes para que você tenha um bom entendimento de várias propriedades CSS. Você pode usar esse padrão de interface do usuário em diferentes partes de seus sites, por exemplo:

  • Para apresentar os membros da equipe
  • Para mostrar postagens/produtos em destaque ou mais recentes
  • Para listar depoimentos

Como acontece com qualquer novo recurso CSS, você pode ver inconsistências dependendo do navegador usado para verificar as demonstrações. Por exemplo, o Chrome mostrará nossa barra de rolagem personalizada, enquanto o Firefox ainda mostrará a barra de rolagem padrão. Tenha isso em mente e verifique caniuse.com para o suporte do navegador de vários recursos de front-end.

Nossa interface do usuário do cartão de rolagem

Confira a primeira versão do nosso componente finalizado que usa flexbox para o layout da grade:

E aqui está a segunda versão do nosso componente finalizado que usa CSS Grid para o layout da grade:

Tente rolar cada um para que metade de um cartão fique visível na borda – veja como o comportamento de rolagem automaticamente encaixa os cartões na posição!

1. Determine o layout

Vamos começar discutindo os requisitos do projeto.

Precisamos criar um layout de cartão rolável adaptável. O número de cartões que aparecerão na visualização mudará dependendo do tamanho da janela de visualização.

Aqui está uma tabela útil onde registramos como nosso layout (grade) deve se comportar em diferentes telas:

Tela Tamanho da janela de visualização Colunas de grade Lacuna da grade
X-Pequeno < 500px 1 10px
Pequena ≥ 500px 2 20px
Médio ≥ 700px 3 30px
Grande ≥ 1100px 4 40px

Para visualizar as coisas, on telas extra pequenas, o layout ficará assim:

O layout do cartão em telas de até 499pxO layout do cartão em telas de até 499pxO layout do cartão em telas de até 499px

On telas pequenas, ficará assim:

O layout do cartão em telas entre 500px e 699pxO layout do cartão em telas entre 500px e 699pxO layout do cartão em telas entre 500px e 699px

On telas médias, terá esta aparência:

O layout do cartão em telas entre 700px e 1099pxO layout do cartão em telas entre 700px e 1099pxO layout do cartão em telas entre 700px e 1099px

Por fim, em telas grandes, ficará assim:

O layout do cartão em telas maiores que 1099pxO layout do cartão em telas maiores que 1099pxO layout do cartão em telas maiores que 1099px

Também precisamos bloquear (encaixar) os cartões visíveis no lugar, cada vez que um usuário terminar de rolar. Desta forma teremos sempre um número exato de cartas em vista e evitaremos ver apenas uma parte das outras cartas; a posição de rolagem mudará imediatamente para o ponto inicial do cartão mais próximo. Este salto produzirá um efeito em que cada conjunto de cartas visíveis se comportará um pouco como slides de carrossel.

Esse efeito será ainda mais óbvio em telas de dispositivos móveis, onde apenas um único cartão aparece e, à medida que você desliza, o cartão adjacente desliza.

Para entender melhor o que estou descrevendo, veja o vídeo a seguir, ou melhor ainda, confira as demos com vários tamanhos de tela:

2. Definir a marcação HTML

Usaremos uma estrutura bem direta para isso: um elemento container com um título e uma lista de cartões dentro dele. Cada cartão conterá um título, conteúdo e link. Vamos envolver esses elementos em torno de alguns extras divs para garantir que o botão de link sempre fique na parte inferior do cartão.

Aqui está a marcação:

3. Especifique os estilos principais

Para construir o layout desejado e principalmente o grid, podemos utilizar diferentes técnicas de layout. Começaremos com uma abordagem flexbox e depois continuaremos com uma CSS Grid.

Para simplificar, discutiremos apenas as partes importantes do CSS.

Todos os cartões ficarão dentro de um contêiner que terá uma largura de 1400px.

Interface do usuário do cartão Flexbox

As principais coisas sobre o invólucro do cartão:

  • Será um contêiner flexível.
  • Terá overflow-x: scrollpois queremos rolar horizontalmente para ver todos os cartões.
  • Precisaremos de uma barra de rolagem personalizada que corresponda às cores da nossa marca, supondo que a cor primária da nossa marca seja vermelho escuro.

As principais coisas sobre cada cartão:

  • Será um contêiner flexível com flex-direction definido como column. Isso significa que os itens flexíveis serão empilhados verticalmente ao longo do eixo principal.
  • Como dito anteriormente, o botão do link deve estar sempre na parte inferior, independentemente do título e do conteúdo de cada cartão. Então, para alcançar essa uniformidade, forneceremos o wrapper do link pai margin-top: auto.
  • Nós vamos dar-lhe flex-shrink: 0 pois não queremos encolher e usar o flex-basis propriedade para definir sua largura. o flex-grow propriedade não nos interessa, então vamos manter o padrão 0 valor. A largura dependerá do tamanho da tela e da margem entre os cartões adjacentes. Vamos explicar.

Em telas extra pequenas, todos os cartões terão uma largura igual à largura do pai.

Para calcular a largura do cartão em telas pequenas, faremos estes cálculos:

O layout do cartão em telas pequenas explicadoO layout do cartão em telas pequenas explicadoO layout do cartão em telas pequenas explicado
  • Espaço total entre os cartões visíveis = 1 * 20px => 20px. Omitimos o espaço da última carta.
  • A largura de cada cartão = calc(50% – 10px). O valor 10px derivado do cálculo: Espaço total entre cartões visíveis / Número de cartões visíveis (20px / 2 => 10px).

Para calcular a largura do cartão em telas médias, faremos estes cálculos:

O layout do cartão em telas médias explicadoO layout do cartão em telas médias explicadoO layout do cartão em telas médias explicado
  • Espaço total entre os cartões visíveis = 2 * 30px => 60px. Omitimos o espaço da última carta.
  • A largura de cada cartão = calc(calc(100% / 3) – 20px). O valor 20px derivado do cálculo: Espaço total entre cartões visíveis / Número de cartões visíveis (60px / 3 => 20px).

gorjeta

Precisamos de um layout de três colunas. Então, em vez de escrever calc(33,333% – 20px), vamos deixar os navegadores decidirem a porcentagem exata adicionando um cálculo aninhado.

Para calcular a largura do cartão em telas grandes, faremos estes cálculos:

O layout do cartão em telas grandes explicadoO layout do cartão em telas grandes explicadoO layout do cartão em telas grandes explicado
  • Espaço total entre os cartões visíveis = 3 * 40px => 120px. Omitimos o espaço da última carta.
  • A largura de cada cartão = calc(25% – 30px). O valor 30px derivado do cálculo: Espaço total entre cartões visíveis / Número de cartões visíveis (120px / 4 => 30px).

Para bloquear a janela de visualização em determinados elementos após o término da rolagem, usaremos o recurso CSS Scroll Snap. Dito isto:

  • O invólucro do cartão receberá o scroll-snap-type: x mandatory valor da propriedade. Isso garante que o navegador se encaixe em um ponto de encaixe assim que a rolagem do usuário terminar.
  • Cada cartão receberá o scroll-snap-align: start valor da propriedade. Isso determina a parte do cartão em que a rolagem deve parar. Tente dar outro valor como center para ver a diferença.

Tente também rolar sem essas duas propriedades habilitadas para ver a diferença.

Aqui estão os estilos mais importantes:

E a demonstração relacionada do CodePen, onde você pode examinar todos os estilos:

IU do cartão de grade CSS

Nesta segunda abordagem, criaremos o mesmo layout de cartão, mas com CSS Grid.

O layout da grade CSSO layout da grade CSSO layout da grade CSS

Aqui estão as modificações que aplicaremos:

  • O invólucro do cartão será um contêiner de grade.
  • Colocaremos todos os itens da grade como colunas graças ao grid-auto-flow: column valor da propriedade.
  • Nós vamos usar o grid-auto-columns propriedade para definir o tamanho das colunas. O tamanho da coluna dependerá do tamanho da tela e do espaço entre cada coluna. Os cálculos são exatamente os mesmos que fizemos anteriormente com o flex-basis propriedade. Assim, os valores da grid-auto-columns propriedade irá corresponder aos valores dos acima mencionados flex-basis propriedade em qualquer tamanho de tela.

informação

Aplicamos a propriedade flex-basis ao item flex, então a propriedade grid-auto-columns (e geralmente todas as propriedades CSS Grid) ao container grid.

Aqui estão os estilos modificados:

E, novamente, a demonstração do CodePen relacionada, onde você pode examinar todos os estilos:

Conclusão

Neste tutorial, examinamos duas maneiras de criar uma interface do usuário de cartão de rolagem horizontal. Ao longo do caminho, passamos por vários recursos modernos de CSS. Isso lhe dará alguns novos conhecimentos e espero que tenha inspirado você a criar layouts de interface do usuário que aproveitam algumas das coisas que abordamos aqui.

Se você puder pensar em outra maneira de construir este layout, não se esqueça de compartilhe conosco! Como sempre, muito obrigado por ler!

Tutoriais Flexbox no Tuts+

O Flexbox é uma parte notoriamente complicada do CSS, mas não se preocupe, nós cuidamos de você!



Deixe um comentário

O seu endereço de e-mail não será publicado.