Como criar um controle deslizante de classificação de emoji com JavaScript

Emojis são alguns dos ícones mais usados ​​em aplicativos sociais atualmente. Quer você queira transmitir emoções ou melhorar a comunicação, existe um emoji ou uma combinação de emojis para realizar a tarefa. Neste tutorial, construiremos um componente emoji de classificação que permitirá ao usuário avaliar seu nível de satisfação usando um controle deslizante.

Estrutura HTML

A estrutura HTML consistirá em um elemento div contêiner com os seguintes elementos filhos:

  • Um título e um subtítulo
  • O elemento de imagem para mostrar o emoji atual
  • Uma div para mostrar o conteúdo da classificação.
  • Um elemento de entrada de intervalo.

Estilo com CSS

Começaremos aplicando os seguintes estilos ao corpo para centralizar todos os nossos elementos na página.

Bricolage Grotesque é uma fonte disponível nas fontes do Google. E a cor que escolhi usa uma leve transparência para que quando o fundo mudar, a cor do texto também mude.

Por último, você verá uma propriedade de transição no fundo, para que quando mudarmos a cor ela desapareça bem de uma para outra.

1
body {
2
  font-family: 'Bricolage Grotesque', sans-serif;
3
  display: flex;
4
  justify-content: center;
5
  align-items: center;
6
  flex-direction: column;
7
  min-height: 100vh;
8
  background: #fff;
9
  color: rgba(0,0,0,0.7);
10
  transition: background .5s ease-in-out;
11
}

Para o elemento contêiner, aplique os estilos a seguir para que os elementos filhos fiquem centralizados e empilhados verticalmente.

1
.container {
2
  width: 300px;
3
  padding: 0 10px;
4
  background: #B4BED9;
5
  border-radius: 20px;
6
  padding: 40px 5px;
7
  display: flex;
8
  flex-direction: column;
9
  align-items: center;  
10
  text-align: center;
11
  justify-content: space-around;
12
  position: relative;
13

14
}

O título e o subtítulo são colocados na parte superior do elemento contêiner com os seguintes estilos.

1
.title {
2
  font-size: 3rem;
3
  font-weight: 800;
4
  margin: 0 0 1rem 0;
5
  line-height: .9;
6
}
7
.subtitle {
8
  font-size: 1rem;
9
  margin: 0;
10
}

Controle deslizante personalizado

A entrada do intervalo consiste em uma barra e um elemento de controle deslizante por padrão. O elemento de controle deslizante (o polegar) se move ao longo da barra horizontal, permitindo aos usuários selecionar um valor específico. O intervalo de entrada também parece diferente dependendo do navegador em que é exibido. Aqui está a entrada de intervalo padrão no Chrome.

entrada de intervaloentrada de intervaloentrada de intervalo

Em vez de usar o controle deslizante padrão acima, iremos personalizá-lo para ter uma aparência muito melhor. Definir -webkit-appearance: none; e appearance: none; na entrada do intervalo.

1
input[type="range"] {
2
  -webkit-appearance: none;
3
  appearance: none;
4
}

O efeito desses estilos é remover a aparência padrão para que possamos fornecer nosso estilo personalizado. Defina os seguintes estilos adicionais na barra deslizante.

1
input[type="range"] {
2
  position: absolute;
3
  top: 85%;
4
  -webkit-appearance: none;
5
  appearance: none;
6
  width: 80%;
7
  background: #e5e5e5;
8
  height: 2px;
9
  border-radius: 5px;
10
  outline: none;
11
  box-shadow: #F2D2BD;
12
}

A aparência do polegar varia entre diferentes navegadores; portanto, aplicaremos estilos individuais com base no navegador para tornar o polegar consistente em diferentes navegadores. O estilo  -webkit-appearance: none;  removerá o estilo de miniatura padrão fornecido pelo navegador. Vamos também aplicar uma altura, largura, preenchimento e cor de fundo personalizados.

1
input[type="range"]::-webkit-slider-thumb {
2
  -webkit-appearance: none;
3
  padding: 5px;
4
  height: 5px;
5
  width: 5px;
6
  border:5px solid #fff;
7
  border-radius: 50%;
8
  cursor: pointer;
9
  background: #4c4c4c;
10
}
11

12
/* FIREFOX */
13
input[type="range"]::-moz-range-thumb {
14
  padding: 5px;
15
  height: 5px;
16
  width: 5px;
17
  border:5px solid #fff;
18
  border-radius: 50%;
19
  cursor: pointer;
20
  background: #4c4c4c;
21

22
}

Defina as dimensões da imagem e adicione uma animação de efeito de salto.

1
@keyframes bounce {
2
  0%, 100% {
3
    transform: translateY(0);
4
  }
5
  50% {
6
    transform: translateY(-10px);
7
  }
8
}
9

10
img {
11
  height: 150px;
12
  width: 150px;
13
  outline: none;
14
  animation: dance 1s infinite;
15
}

Por fim, estilize o div de conteúdo de classificação.

1
.rating {
2
  font-size: 20px;
3
  font-weight: 100;
4
  width: 150px;
5
}

Funcionalidade JavaScript

À medida que o valor na entrada do intervalo muda, usaremos JavaScript para atualizar o tipo de emoji, a cor do contêiner e a mensagem de classificação.

Baixei um conjunto brilhante de ga-analytics#sendElementsClickEvent”>100 emojis SVG da Envato Elements, ideal para este projeto.

ga-analytics#sendElementsClickEvent”>100 emojis SVG100 emojis SVG100 emojis SVG

Então, com meus ícones SVG selecionados e carregados, vamos pegar nossos elementos e definir nossos dados.

1
const container = document.querySelector('.container')
2
const slider = document.getElementById("slider");
3
const emoji = document.querySelector(".emoji");
4
const rate = document.getElementById("message");
5
const colors = ["#d35e65", "#d3965c", "#cad48a", "#6ed494", "#18c574"];
6
const emoticons = [
7
  {
8
    text: "Awful",
9
    url: "Disappointed.svg"
10
  },
11
  {
12
    text: "Bad",
13
    url: "Sad.svg"
14
  },
15
  {
16
    text: "Okay",
17
    url: "Expressionless.svg"
18
  },
19
  {
20
    text: "Good",
21
    url: "Smile.svg"
22
  },
23
  {
24
    text: "Great",
25
    url: "Love.svg"
26
  }
27
];

A matriz emojis define objetos; cada objeto contém uma imagem emoji e um texto que descreve o sentimento do emoji. Usaremos esses dados para exibir emojis dinamicamente com base nas interações do usuário com o componente de classificação.

A seguir, crie uma função chamada UpdateRating(). Dentro de UpdateRating() função, obtenha o valor no controle deslizante em movimento.

1
function UpdateRating() {
2
   const value =slider.value;
3
  }

A seguir, criaremos instruções if que verificarão o valor no controle deslizante e atualizarão o estilo do emoji, a cor de fundo e a mensagem dependendo do valor no controle deslizante. Valores baixos atrairão uma classificação baixa, emojis tristes e mensagens negativas, enquanto valores altos atrairão uma classificação alta, mensagens positivas e emojis positivos.

O controle deslizante abrange de 0 a 100; portanto, alocaremos cada mensagem em um intervalo de 20 unidades.

Atualize o UpdateRating funcionar conforme mostrado abaixo.

1
function UpdateRating() {
2
  const value =slider.value;
3
  
4
  if (value >= 0 && value < 20) {
5
    emoji.src = emojis[0].url
6
    rate.textContent =  emojis[0].text;
7
    container.style.backgroundColor =colors[0];
8

9
  } else if (value >= 20 && value < 40) {
10
    emoji.src = emojis[1].url
11
    rate.textContent =  emojis[1].text;
12
    container.style.backgroundColor =colors[1];
13
    
14
  } else if (value >= 40 && value < 60) {
15
    emoji.src = emojis[2].url
16
    rate.textContent =  emojis[2].text;
17
    container.style.backgroundColor =colors[2];
18
    
19
  } else if (value >= 60 && value < 80) {
20
    emoji.src = emojis[3].url
21
    rate.textContent =  emojis[3].text;
22
    container.style.backgroundColor = colors[3];
23
    
24
  } else if (value >= 80 && value <= 100) {
25
    emoji.src = emojis[4].url
26
    rate.textContent =  emojis[4].text;
27
    container.style.backgroundColor = colors[4];   
28
  }}

Vamos refatorar nossa lógica condicional para garantir que o código não seja repetitivo. Crie uma função chamada setProperties(), que leva o índice como argumento. Dentro setProperties()adicione a lógica repetitiva.

1
function setProperties(index){
2
  emoji.src = emojis[index].url
3
  rate.textContent =  emojis[index].text;
4
  container.style.backgroundColor =colors[index];
5
  }

Para cada condição, chame o setProperties() funcionar assim:

1
function UpdateRating() {
2
  const value =slider.value;
3
 
4
  if (value >= 0 && value < 20) {
5
    setProperties(0)
6
    
7
  } else if (value >= 20 && value < 40) {
8
    setProperties(1)
9
    
10
  } else if (value >= 40 && value < 60) {
11
    setProperties(2)
12
    
13
  } else if (value >= 60 && value < 80) {
14
    setProperties(3)
15
    
16
  } else if (value >= 80 && value <= 100) {
17
    setProperties(4) 
18
  }}

Finalmente, precisamos adicionar um ouvinte de eventos ao intervalo de entrada. O ouvinte de evento ouvirá o oninput evento e depois ligue para o UpdateRating() função. Um oninput evento ocorre quando o valor de um elemento de entrada é alterado. Em relação ao intervalo de entrada, o oninput O evento fornecerá feedback (valor) em tempo real quando o usuário interagir com ele.

1
slider.addEventListener("input", UpdateRating);

O UpdateRating() A função será invocada toda vez que o usuário mover o controle deslizante.

Conclusão

Este tutorial abordou como construir um componente funcional de classificação de emojis. Também aprendemos como o elemento do intervalo de entrada é estilizado em diferentes navegadores. Para aprimorar a funcionalidade, você também pode solicitar feedback adicional dos usuários.

Vamos nos lembrar do que construímos – e espero que você tenha gostado dessa experiência!

Deixe uma resposta