Quiz Aritmético
Apresenta um problema matemático ou numérico com opções de resposta. Avalia raciocínio quantitativo e habilidade de cálculo em contextos aplicados.
Experimente
Uma turma tem 40 alunos. Se 75% completaram o módulo 1, quantos alunos ainda precisam concluí-lo?
Código-fonte
Dados de exemplo
Define a pergunta e as alternativas de exemplo.
| 1 |
<?php
|
| 2 |
$pergunta = 'Uma turma tem 40 alunos. Se 75% concluíram o módulo, quantos ainda faltam?';
|
| 3 |
// Uma unica correta: e o que justifica a escolha unica. Com duas certas, a
|
| 4 |
// interacao teria de voltar a ser de selecao multipla.
|
| 5 |
$opcoes = [
|
| 6 |
['texto' => '5 alunos', 'correta' => false],
|
| 7 |
['texto' => '10 alunos', 'correta' => true],
|
| 8 |
['texto' => '15 alunos', 'correta' => false],
|
| 9 |
['texto' => '30 alunos', 'correta' => false],
|
| 10 |
];
|
| 11 |
?>
|
| 12 |
|
Estrutura da pergunta e das opções
Monta o HTML da pergunta e dos botões de resposta.
| 1 |
<div class="questao" data-tipo="escolha-unica">
|
| 2 |
|
| 3 |
<p class="questao-pergunta"><?= htmlspecialchars($pergunta) ?></p>
|
| 4 |
|
| 5 |
<div class="questao-opcoes">
|
| 6 |
<?php foreach ($opcoes as $opcao): ?>
|
| 7 |
<button type="button"
|
| 8 |
class="questao-opcao"
|
| 9 |
data-correta="<?= $opcao['correta'] ? 'true' : 'false' ?>"
|
| 10 |
data-selecionada="false">
|
| 11 |
<?= htmlspecialchars($opcao['texto']) ?>
|
| 12 |
</button>
|
| 13 |
<?php endforeach; ?>
|
| 14 |
</div>
|
| 15 |
|
| 16 |
<button type="button" class="questao-verificar">Verificar resposta</button>
|
| 17 |
|
| 18 |
<div class="questao-feedback" hidden></div>
|
| 19 |
<button type="button" class="questao-reset" hidden>Tentar novamente</button>
|
| 20 |
|
| 21 |
</div>
|
Opção da questão
Estilo base do botão de alternativa.
| 1 |
.questao-opcao {
|
| 2 |
display: block;
|
| 3 |
width: 100%;
|
| 4 |
padding: 12px 16px;
|
| 5 |
margin-bottom: 8px;
|
| 6 |
border: 2px solid #d1d5db;
|
| 7 |
border-radius: 8px;
|
| 8 |
background: #fff;
|
| 9 |
cursor: pointer;
|
| 10 |
transition: border-color 0.2s, background-color 0.2s;
|
| 11 |
}
|
| 12 |
|
| 13 |
.questao-opcao:hover {
|
| 14 |
border-color: #6366f1;
|
| 15 |
}
|
Opção selecionada
Destaca a alternativa marcada antes de verificar.
| 1 |
.questao-opcao.selecionada {
|
| 2 |
border-color: #6366f1;
|
| 3 |
background: #eef2ff;
|
| 4 |
}
|
Resultado da verificação
Colore a alternativa como certa ou errada.
| 1 |
.questao-opcao.acerto {
|
| 2 |
border-color: #22c55e;
|
| 3 |
background: #f0fdf4;
|
| 4 |
}
|
| 5 |
|
| 6 |
.questao-opcao.erro {
|
| 7 |
border-color: #ef4444;
|
| 8 |
background: #fef2f2;
|
| 9 |
}
|
Encontrar os elementos da questão
Localiza os elementos da questão no DOM.
| 1 |
document.addEventListener('DOMContentLoaded', function () {
|
| 2 |
document.querySelectorAll('.questao[data-tipo="escolha-unica"]').forEach(function (questao) {
|
| 3 |
var opcoes = questao.querySelectorAll('.questao-opcao');
|
| 4 |
var verificar = questao.querySelector('.questao-verificar');
|
| 5 |
var feedback = questao.querySelector('.questao-feedback');
|
| 6 |
var reset = questao.querySelector('.questao-reset');
|
| 7 |
var respondida = false;
|
Marcar uma opção
Só uma alternativa fica marcada por vez — clicar numa desmarca as outras. Repare que o laço percorre TODAS a cada clique, em vez de alternar só a clicada: é o que garante que nunca sobre mais de uma marcada.
| 1 |
opcoes.forEach(function (opcao) {
|
| 2 |
opcao.addEventListener('click', function () {
|
| 3 |
if (respondida) return;
|
| 4 |
|
| 5 |
opcoes.forEach(function (outra) {
|
| 6 |
var marcada = outra === opcao;
|
| 7 |
outra.dataset.selecionada = marcada ? 'true' : 'false';
|
| 8 |
outra.classList.toggle('selecionada', marcada);
|
| 9 |
outra.setAttribute('aria-pressed', marcada ? 'true' : 'false');
|
| 10 |
});
|
| 11 |
});
|
| 12 |
});
|
Verificar a resposta
Com uma escolha só, basta olhar a alternativa marcada — não há combinação de acertos e erros para somar.
| 1 |
verificar.addEventListener('click', function () {
|
| 2 |
if (respondida) return;
|
| 3 |
|
| 4 |
var escolhida = questao.querySelector('.questao-opcao[data-selecionada="true"]');
|
| 5 |
if (!escolhida) return;
|
| 6 |
|
| 7 |
respondida = true;
|
| 8 |
var acertou = escolhida.dataset.correta === 'true';
|
| 9 |
|
| 10 |
opcoes.forEach(function (opcao) {
|
| 11 |
opcao.disabled = true;
|
| 12 |
if (opcao.dataset.correta === 'true') opcao.classList.add('acerto');
|
| 13 |
else if (opcao === escolhida) opcao.classList.add('erro');
|
| 14 |
});
|
| 15 |
|
| 16 |
feedback.textContent = acertou
|
| 17 |
? 'Correto! Essa é a alternativa certa.'
|
| 18 |
: 'Não foi dessa vez. A resposta certa está destacada.';
|
| 19 |
feedback.hidden = false;
|
| 20 |
|
| 21 |
verificar.hidden = true;
|
| 22 |
reset.hidden = false;
|
| 23 |
});
|
Reiniciar
Restaura o estado inicial da questão.
| 1 |
reset.addEventListener('click', function () {
|
| 2 |
respondida = false;
|
| 3 |
|
| 4 |
opcoes.forEach(function (opcao) {
|
| 5 |
opcao.disabled = false;
|
| 6 |
opcao.dataset.selecionada = 'false';
|
| 7 |
opcao.setAttribute('aria-pressed', 'false');
|
| 8 |
opcao.classList.remove('selecionada', 'acerto', 'erro');
|
| 9 |
});
|
| 10 |
|
| 11 |
feedback.hidden = true;
|
| 12 |
reset.hidden = true;
|
| 13 |
verificar.hidden = false;
|
| 14 |
});
|