DEV Community

Cover image for Seção com Scroll Lateral Controlado por Botões ← →
Bob Wendell
Bob Wendell

Posted on

Seção com Scroll Lateral Controlado por Botões ← →

Marcação

A sessão abaixo irá renderizar os cards que serão criados via Java Script:

HTML

<section id="scrollSection" class="scroll">

</section>
Enter fullscreen mode Exit fullscreen mode

CSS

.scroll {
  background-color: black;
  padding: 50px;
  overflow-x: auto;
  scroll-behavior: smooth;
  white-space: nowrap; 
}
Enter fullscreen mode Exit fullscreen mode

Dentro da sessão abaixo teremos o painel que irá renderizar os botões que controlaram o Scroll Lateral do elemento scrollSection:

HTML

  <section id="panel" class="panel">
    <button id="back" class="btn">back</button>
    <button id="next" class="btn">next</button>
  </section>
Enter fullscreen mode Exit fullscreen mode

CSS

.panel {
  display: flex;
  justify-content: space-between;
}

.btn {
  border-radius: 8px;
  background-color: rgb(168, 103, 228);
  padding: 8px;
  width: 50%;
}
Enter fullscreen mode Exit fullscreen mode

Java Script

Dados:

A constante data armazenará as informações dos Cards a serem criados. Aqui trabalharemos apenas com as Cores:

const data = [

  {
    color: 'red',
  },

  {
    color: 'yellow',
  },

  {
    color: 'green',
  },

  {
    color: 'blue',
  },

  {
    color: 'white',
  },

  {
    color: 'orange',
  },

  {
    color: 'gray',
  },

  {
    color: 'brown',
  },

  {
    color: 'purple',
  },

];
Enter fullscreen mode Exit fullscreen mode

Criando Cards:

A função createCard Cria um elemento div com a classe cards e irá inserir o Card dentro do elemento scrollSection:

const createCard = (color) => {
  const scrollSection = document.getElementById('scrollSection');
  const div = document.createElement('div');
  div.className = 'cards';
  div.style.backgroundColor = color;
  scrollSection.appendChild(div);
};
Enter fullscreen mode Exit fullscreen mode

CSS:

.cards {
    width: 200px;
    height: 200px;
    border-radius: 15px;
    margin: 30px;
    display: inline-block;
}
Enter fullscreen mode Exit fullscreen mode

Podemos usar o map para mapear o array e para cada Objeto dentro dele executar a função createCard passando como parametro o valor dentro da chave color do Objeto:

data.map(object => createCard(object.color));
Enter fullscreen mode Exit fullscreen mode

Painel de controle:

Agora iremos configurar o addEventListener com duas conticionais referentes aos botões do painel.

Se o elemento clicado contém o id next a scrollSection irá se mover 500px para direita →

Se o id for back se movimentará 500px para esquerda ←

addEventListener('click', (event) => {
  if (event.target.id === 'next') {
    document.getElementById('scrollSection').scrollBy(500, 0);
  };
  if (event.target.id === 'back') {
    document.getElementById('scrollSection').scrollBy(-500, 0);
  };
})
Enter fullscreen mode Exit fullscreen mode

Bônus

Sessão responsiva com Media Queries:

A sessão scrollSection só terá Scroll Lateral e o Painel só será visivel em telas Menores de 500px de largura

Para isso retira o white-space: nowrap; da classe scroll e adicione visibility: hidden; à classe panel,

E crie um Media Query com as seguintes configurações:

@media screen and (max-width: 500px) {

    .scroll {
        white-space: nowrap;
    }

    .panel {
        visibility: visible;
    }

}
Enter fullscreen mode Exit fullscreen mode

Saiba Mais

scroll-behavior

white-space

Usando Media Queries

map()

scrollBy()

Top comments (0)