Como criar uma ferramenta de gradiente de cores em JavaScript

Um gradiente é uma mistura de duas ou mais cores que passam suavemente de uma para outra. Os gradientes adicionam estética moderna aos antecedentes, texto, botões, etc.

No CSS, os gradientes são adicionados como um valor do background propriedade. Por exemplo, um gradiente simples pode ser assim:

1
background: linear-gradient(to right, red, pink);

Aqui, estamos criando um gradiente linear que faz a transição de vermelho para rosa horizontalmente. Você também pode definir um ângulo para controlar a direção do gradiente. Confira este exemplo:

1
background: linear-gradient(45deg, red, pink);

Aqui, o gradiente transita de vermelho para rosa em um ângulo de 45 graus. Para saber mais sobre como manipular gradientes com CSS, aqui está um guia rápido:

O que estamos criando neste tutorial

Neste tutorial, você usará o JavaScript e aprenderá como criar uma ferramenta que produz todos os tipos de gradientes CSS. Aqui estão os recursos da ferramenta de gradiente:

  • Um elemento de visualização para mostrar o gradiente atual.
  • Uma opção para escolher entre gradientes lineares ou radiais.
  • A capacidade de adicionar e remover as cores do gradiente.
  • Uma opção para adicionar um ângulo ao gradiente linear.
  • Capacidade de copiar o código de gradiente gerado.

No final do tutorial, você terá algo assim:

HTML: Crie a interface

Nossa ferramenta de gradiente terá uma interface bastante mínima, cuja marcação se parece com a seguinte:

1
 class="container">
2
  

Gradient Generator

3
   class="preview">
4

5
   class="gradient-type">
6
    
7
       type="radio" name="gradient-type" value="linear" checked> Linear
8
    
9
    
10
       type="radio" name="gradient-type" value="radial"> Radial
11
    
12
  
13

14
   class="color-control">
15
     class="color-list">
16
      
17
    
18
     class="add-color">
19
       class="add-color-btn">+
20
    
21
  
22
   class="slider-wrapper ">
23
     class="slider-content">
24
      
25
       id="angle-value">45°
26
      360°
27
    
28
     class="slider" type="range" id="angle" min="0" max="360" value="45" />
29
  
30

31
   id="output">

32
   type="text" name="" class="css-output">
33
  
34
   class="copy-css">
35
    Copy CSS
36
  
37

CSS: modelando o gerador de gradiente

Vamos estilizar nossa ferramenta de gradiente. Abaixo estão os estilos para os elementos do corpo, recipiente, visualização e parada de cores:

1
body {
2
  display: flex;
3
  flex-direction: column;
4
  align-items: center;
5
  min-height: 100vh;
6
  padding: 20px;
7
  font-family: "DM Mono", monospace;
8
  
9
}
10
.container {
11
  width: 80%;
12
  max-width: 600px;
13
  display: flex;
14
  gap: 20px;
15
  flex-direction: column;
16
  align-items: center;
17
  border-radius: 20px;
18
  border: #f3ecec solid 1px;
19
  padding: 40px 80px;
20
}
21
.preview {
22
  width: 100%;
23
  height: 200px;
24
  border-radius: 8px;
25
}
26
.color-control {
27
  display: flex;
28
  gap: 25px;
29
  padding: 20px;
30
  border-radius: 8px;
31
}
32
.color-list {
33
  display: flex;
34
  flex-wrap: wrap;
35
  gap: 10px;
36
  margin-bottom: 15px;
37
}
38
.color-list input[type="color"] {
39
  width: 48px;
40
  height: 48px;
41
  border: none;
42
  border-radius: 8px;
43
  padding: 4px;
44
  cursor: pointer;
45
}
46

47
.color-stop .add-color {
48
  width: 60px;
49
  height: 60px;
50
}
51

52
.add-color-btn {
53
  width: 48px;
54
  height: 48px;
55
  border: none;
56
  border-radius: 8px;
57
  padding: 4px;
58
  cursor: pointer;
59
}

Remova o botão de cor

Para remover uma cor do gradiente, um ícone de exclusão aparecerá ao passar o mouse sobre qualquer elemento do seletor de cores.

Aqui estão os estilos para isso:

1
.color-stop {
2
  position: relative;
3
}
4
.color-stop:hover .fa-solid.fa-trash-can {
5
  opacity: 1;
6
}
7

8
.fa-solid.fa-trash-can {
9
  position: absolute;
10
  opacity: 0;
11
  top: -35%;
12
  left: calc(100% - 20px);
13
  transform: none;
14
  background: transparent;
15
  font-size: 24px;
16
  cursor: pointer;
17
  color: red;
18
  transition: all 0.3s ease-in-out;
19
}

Entrada de intervalo

Os elementos de entrada do alcance podem parecer e se comportar de maneira diferente entre os navegadores. Para garantir uma aparência consistente, é importante personalizar o CSS para garantir a mesma experiência em vários navegadores. Aqui estão os estilos para o elemento deslizante Range

1
.slider-wrapper {
2
  display: flex;
3
  align-items: center;
4
  flex-direction: column;
5
  gap: 10px;
6
  font-family: Arial, sans-serif;
7
  width: 100%;
8
}
9
.slider-wrapper input[type="range"] {
10
  -webkit-appearance: none;
11
  appearance: none;
12
  width: 100%;
13
  height: 10px;
14
  background: #e5e7eb;
15
  border-radius: 2px;
16
  outline: none;
17
  cursor: pointer;
18
}
19

20
.slider-wrapper input[type="range"]::-webkit-slider-thumb {
21
  -webkit-appearance: none;
22
  appearance: none;
23
  width: 25px;
24
  height: 25px;
25
  border-radius: 5px;
26
  background: #119cec;
27
  cursor: pointer;
28
}
29

30
.slider-wrapper input[type="range"]::-moz-range-thumb {
31
  -webkit-appearance: none;
32
  appearance: none;
33
  width: 25px;
34
  height: 25px;
35
  border-radius: 5px;
36
  background: #119cec;
37
  cursor: pointer;
38
}
39

40
.slider-content {
41
  display: flex;
42
  justify-content: space-between;
43
  width: 100%;
44
}

Estilos restantes

O restante dos estilos ficará assim:

1
.slider-content {
2
  display: flex;
3
  justify-content: space-between;
4
  width: 100%;
5
}
6

7
#output {
8
  color: #000;
9
  width: 100%;
10
  height: 80px;
11
  padding: 15px;
12
  border: 1px solid #e7e2e2;
13
  border-radius: 12px;
14
}
15

16
.css-output {
17
  display: none;
18
}
19

20
.copy-css {
21
  color: #fff;
22
  width: 100%;
23
  font-size: 1.2rem;
24
  width: 100%;
25
  height: 45px;
26
  background-color: #119cec;
27
  border-radius: 8px;
28
  font-weight: 800;
29
  border: none;
30
}
31
pre {
32
  white-space: pre-wrap;
33
  word-wrap: break-word;
34
}

JavaScript: gradiente de construção

O primeiro passo como sempre é obter todos os elementos que precisam de manipulação.

1
const slider = document.getElementById("angle");
2
const sliderValue = document.getElementById("angle-value");
3
const addColorBtn = document.querySelector(".add-color-btn");
4
const gradientTypeInputs = document.querySelectorAll('input[name="gradient-type"]');
5
const sliderContainer = document.querySelector('.slider-wrapper');

Vamos definir as cores para a visualização inicial do gradiente.

1
let colors = ['#d81848', '#fd26ae', '#0c43c6'];

O colors A matriz servirá como fonte de verdade para todas as cores do gradiente. Todos os gradientes serão gerados com base nas cores desta matriz, por isso estaremos adicionando e removendo cores.

Para adicionar gradiente AA ao elemento de visualização, aplique uma transição de gradiente usando as cores do colors variedade.

1
const updateGradient = () => {
2
  let gradientString;
3
  const angle = document.getElementById("angle").value;
4
  const gradientType = document.querySelector('input[name="gradient-type"]:checked').value;
5
  console.log(gradientType);
6

7
  if (gradientType === 'linear') {
8
    gradientString = `linear-gradient(${angle}deg, ${colors.join(", ")})`;
9
  } else {
10
    gradientString = `radial-gradient(circle, ${colors.join(", ")})`;
11
  }
12

13
  const gradientPreview = document.querySelector(".preview");
14
  gradientPreview.style.background = gradientString;
15
  document.getElementById(
16
    "output"
17
  ).textContent = `.gradient {\n    background: ${gradientString};\n}`;
18
};

Aqui, estamos definindo o plano de fundo do contêiner de visualização para um linear ou radial plano de fundo, dependendo da seleção do usuário. Também estamos atualizando a saída para mostrar o código usado para gerar o gradiente.

Por padrão, o gradiente linear será mostrado porque a opção linear é verificada no HTML. Além disso, o ângulo será padrão no valor padrão do controle deslizante (45 graus).

O CSS gerado será assim:

1
.gradient {background: linear-gradient(45deg, #d81848, #fd26ae, #0c43c6);}

Atualizando valores

Para garantir que o tipo de gradiente seja atualizado quando o usuário selecionar a opção radial, vamos adicionar ouvintes de eventos às entradas do tipo de gradiente (input[name="gradient-type"]). Isso garantirá que o gradiente e o código gerados respondam às ações do usuário.

1
gradientTypeInputs.forEach(input => {
2
  input.addEventListener('change', () => {
3
    updateGradient();
4
  });
5
});

O próximo recurso é ocultar o controle deslizante do alcance quando a opção de gradiente radial for selecionada.

1
function toggleAngleSlider() {
2
  const gradientType = document.querySelector('input[name="gradient-type"]:checked').value;
3
  sliderContainer.style.display = gradientType === 'linear' ? 'block' : 'none';
4
}

O toggleAngleSlider() A função será chamada toda vez que houver uma mudança na seleção de gradientes.

1
gradientTypeInputs.forEach(input => {
2
  input.addEventListener('change', () => {
3
    updateGradient();
4
    toggleAngleSlider();
5
  });
6
});

Atualizar gradiente na seleção do usuário

Agora temos um gradiente predefinido, mas queremos permitir que o usuário faça seu gradiente selecionando cores personalizadas. Para conseguir isso, exibiremos as cores no colors Array como elementos do seletor de cores.

1
function initializeGradient() {
2
  const colorList = document.querySelector(".color-list");
3
  colorList.innerHTML = "";
4
  colors.forEach((color, index) => {
5
    const colorStop = document.createElement("div");
6
    colorStop.className = "color-stop";
7

8
    const colorInput = document.createElement("input");
9
    colorInput.type = "color";
10
    colorInput.className = "color-input";
11
    colorInput.value = color;
12
    colorInput.dataset.index = index;
13
    colorInput.addEventListener("input", (e) =>
14
      updateColor(e.target.dataset.index, e.target.value)
15
    );
16

17
    const removeButton = document.createElement("i");
18
    removeButton.className = "fa-solid fa-trash-can";
19

20
    colorStop.appendChild(colorInput);
21
    colorStop.appendChild(removeButton);
22
    colorList.appendChild(colorStop);
23
  });

O principal objetivo desta função é criar dinamicamente elementos de coloridos na interface do usuário com base na matriz de cores. Para cada cor da matriz, estamos criando um nativo Elemento permitindo que os usuários selecionem cores de gradiente personalizadas.

Além de criar catadores de cores, também adicionamos um ícone Remover a cada elemento de entrada para garantir que uma cor possa ser removida do gradiente.

Também anexamos um ouvinte de eventos que ouve quaisquer alterações em cada elemento do seletor de cores. Quando ocorre uma mudança de entrada, o updateColor() A função é invocada. Adicione o updateColor() função.

1
function updateColor(index, color) {
2
  colors[index] = color;
3
  updateGradient();
4
}

Esta função obterá o índice atual e atualizará a cor nesse índice para a cor recém -selecionada; Isso garante que o gradiente seja atualizado para refletir as cores selecionadas.

Agora, o usuário pode escolher cores personalizadas para seu gradiente.

Adicione e remova as cores de um gradiente

Ao lado dos catadores de cores, há um + Botão para adicionar novas cores.

Para ativar sua funcionalidade, precisamos adicionar um ouvinte de evento ao botão para que, quando o botão for clicado, ele acionará a adição de uma nova cor ao colors variedade.

1
function addColorStop() {
2
  if (colors.length >= 6) {
3
    alert("Maximum 6 colors allowed!");
4
    return;
5
  }
6
  colors.push("#ffffff");
7
  initializeGradient();
8
}

Para remover uma cor do gradiente, simplesmente a removemos da matriz e reinacionalizamos o gradiente. Reinacionar o gradiente criará um novo gradiente usando o atualizado colors variedade.

1
function removeColorStop(index) {
2
  if (colors.length > 2) {
3
    colors.splice(index, 1);
4
    initializeGradient();
5
  } else {
6
    alert("Minimum 2 colors required!");
7
  }
8
}

Como você pode ver, ao adicionar e remover as cores ao gradiente, também precisamos garantir que o usuário não possa adicionar mais de 6 cores e que deve haver pelo menos 2 cores para criar um gradiente.

Código de gradiente gerado por cópia

O último recurso é adicionar a capacidade de copiar o código gerado. Vamos adicionar um ouvinte de evento ao Copie CSS botão. Quando um usuário clica no botão, o código gerado será copiado para a área de transferência.

1
const copyCssBtn = document.querySelector(".copy-css");
2
copyCssBtn.addEventListener("click", () => {
3
  const gradientCode = document.getElementById("output")
4
 
5
  navigator.clipboard
6
    .writeText(gradientCode.textContent)
7
    .then(() => alert("CSS copied to clipboard!"))
8
    .catch((err) => console.error("Failed to copy: ", err));
9
});
10
})

Aqui está a demonstração final! Divirta -se criando seus gradientes

Conclusão

Criamos uma ferramenta de gradiente totalmente funcional (bastante épica). Agora você pode adicionar seus próprios gradientes atraentes aos seus designs!

Deixe uma resposta