Objetivo: Introduzir a captura de valor de um input e a resposta a um clique de botão.
Descrição: Crie uma página HTML com:
Um campo de texto (<input type="text">) com um id para que o usuário possa digitar seu nome.
Um botão (<button>) com o texto “Enviar”.
Ao clicar no botão, seu script JavaScript deve ler o nome digitado no campo de texto e exibir um alerta de boas-vindas na tela, como por exemplo: Olá, [Nome do Usuário]! Bem-vindo(a)!.
Desafio Bônus: Adicione uma funcionalidade para que, ao clicar no texto de uma tarefa, ela seja marcada como “concluída” (por exemplo, aplicando um estilo de texto riscado com text-decoration: line-through).
Objetivo: Utilizar eventos de formulário e teclado para fornecer feedback instantâneo ao usuário.
Descrição: Crie um formulário de cadastro com campos para nome, e-mail e senha. Implemente as seguintes validações que acontecem enquanto o usuário digita:
Nome: Não pode estar vazio.
E-mail: Deve conter o caractere @.
Senha: Deve ter no mínimo 8 caracteres.
Abaixo de cada campo, exiba uma mensagem de erro (ex: em um <p> com cor vermelha) assim que a regra for violada. A mensagem deve desaparecer quando o campo se tornar válido novamente.
Conceitos-chave:addEventListener('keyup', ...) ou addEventListener('input', ...) , element.classList para estilização, condicionais, .length, .includes().
Desafio Bônus: Adicione um campo de “Confirmar Senha” e valide se o seu valor é idêntico ao do campo “Senha”. Além disso, desabilite o botão de “Cadastrar” do formulário enquanto houver algum erro de validação.
Objetivo: Criar uma experiência de usuário mais rica com a exibição de um modal.
Descrição: Desenvolva uma galeria com várias imagens em miniatura.
Crie uma seção na página com pelo menos 4 imagens pequenas (<img>).
Ao clicar em qualquer uma das miniaturas, uma janela modal deve aparecer, sobrepondo o restante do conteúdo.
O modal deve conter a imagem que foi clicada, porém em um tamanho maior.
O modal também deve ter um botão “Fechar” (um “X” no canto, por exemplo) que, ao ser clicado, o esconde.
Conceitos-chave: Manipulação da propriedade display ou de classes para mostrar/esconder elementos, capturar atributos (getAttribute('src')), estrutura HTML/CSS para overlays.
Desafio Bônus: Permita que o usuário feche o modal também ao pressionar a tecla Esc no teclado ou ao clicar fora da área da imagem (no overlay).
Objetivo: Gerenciar o estado de um jogo, implementar lógica de vitória e reiniciar o estado da aplicação.
Descrição: Crie um jogo da velha funcional. A interface deve ser um grid 3x3 (pode ser feito com <div>s ou <button>s).
Os jogadores, “X” e “O”, devem se alternar a cada clique em uma célula vazia.
Após cada jogada, o script deve verificar se houve um vencedor (três marcas iguais em qualquer linha, coluna ou diagonal).
Se houver um vencedor, exiba uma mensagem (ex: “O jogador X venceu!”) e impeça novas jogadas.
Se todas as células forem preenchidas sem um vencedor, declare um empate.
Adicione um botão “Reiniciar Jogo” que limpa o tabuleiro e reinicia a lógica.
Conceitos-chave: Arrays para representar o estado do tabuleiro, lógica condicional complexa, gerenciamento de turnos, desabilitar elementos (element.disabled).
Desafio Bônus: Mantenha um placar que mostre quantas vitórias cada jogador (X e O) acumulou durante a sessão.
Objetivo: Implementar interações avançadas utilizando a API de Drag and Drop do HTML5.
Descrição: Crie uma interface com duas colunas principais.
A primeira coluna, “A Fazer”, deve conter uma lista de itens (ex: <div>s com texto). Esses itens devem ser “arrastáveis”.
A segunda coluna, “Concluído”, deve ser uma “área de soltura”.
O usuário deve ser capaz de clicar e arrastar um item da coluna “A Fazer” e soltá-lo dentro da coluna “Concluído”. Ao ser solto, o item deve se mover permanentemente para a nova coluna.
Desafio Bônus: Permita que os itens também possam ser arrastados de volta da coluna “Concluído” para a coluna “A Fazer”. Adicione um feedback visual (ex: uma borda pontilhada) na coluna “Concluído” quando um item estiver sendo arrastado sobre ela.
Objetivo: Simular uma aplicação de e-commerce, manipulando um conjunto de dados e atualizando a UI dinamicamente.
Descrição: Crie uma página para exibir uma lista de produtos.
No seu arquivo JavaScript, crie um array de objetos. Cada objeto representará um produto e deve ter propriedades como id, nome, preco e categoria (ex: “Eletrônicos”, “Roupas”).
Renderize todos os produtos na página, criando os elementos HTML correspondentes.
Adicione os seguintes controles de filtro na página:
Um campo de busca (<input type="text">) para filtrar por nome.
Um seletor (<select>) ou checkboxes para filtrar por categoria.
Um input do tipo range para filtrar por preço máximo.
À medida que o usuário interage com qualquer um dos filtros, a lista de produtos exibida na tela deve ser atualizada em tempo real para mostrar apenas os itens que correspondem a todos os critérios selecionados.
Conceitos-chave: Manipulação de arrays (filter(), map(), forEach()), combinação de múltiplos eventos (input, change), renderização dinâmica a partir de um array de dados.
Desafio Bônus: Adicione botões para ordenar os produtos filtrados por preço (menor para maior e maior para menor).