Escolha com Multimídia
Variação da múltipla escolha onde as opções são imagens, áudios ou vídeos em vez de texto. O aprendiz escolhe a opção multimídia que responde corretamente à pergunta.
Experimente
Qual postura é ergonomicamente correta?
Selecione a imagem que mostra a postura correta ao usar o computador:
Código-fonte
Dados de exemplo
Pergunta e opções, cada uma com imagem, legenda e comentário de retorno.
| 1 |
<?php
|
| 2 |
$pergunta = 'Qual imagem responde corretamente à pergunta?';
|
| 3 |
$opcoes = [
|
| 4 |
['imagem' => 'opcao-a.jpg', 'legenda' => 'Alternativa A', 'correta' => false, 'feedback' => 'Não é essa. Veja a alternativa destacada em verde.'],
|
| 5 |
['imagem' => 'opcao-b.jpg', 'legenda' => 'Alternativa B', 'correta' => true, 'feedback' => 'Isso mesmo!'],
|
| 6 |
['imagem' => 'opcao-c.jpg', 'legenda' => 'Alternativa C', 'correta' => false, 'feedback' => 'Não é essa. Veja a alternativa destacada em verde.'],
|
| 7 |
];
|
| 8 |
?>
|
Estrutura da pergunta e das opções
Cada opção é um botão com imagem e legenda colada logo abaixo.
| 1 |
<div class="questao" data-tipo="escolha-multimidia">
|
| 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-feedback="<?= htmlspecialchars($opcao['feedback']) ?>"
|
| 11 |
data-selecionada="false">
|
| 12 |
<img src="<?= htmlspecialchars($opcao['imagem']) ?>" alt="<?= htmlspecialchars($opcao['legenda']) ?>">
|
| 13 |
<span class="questao-opcao-legenda"><?= htmlspecialchars($opcao['legenda']) ?></span>
|
| 14 |
</button>
|
| 15 |
<?php endforeach; ?>
|
| 16 |
</div>
|
| 17 |
|
| 18 |
<button type="button" class="questao-verificar">Verificar resposta</button>
|
| 19 |
|
| 20 |
<div class="questao-feedback" hidden></div>
|
| 21 |
<button type="button" class="questao-reset" hidden>Tentar novamente</button>
|
| 22 |
|
| 23 |
</div>
|
Grade das opções
As duas primeiras opções ficam lado a lado; da terceira em diante, a opção ocupa a linha toda e fica centralizada.
| 1 |
.questao-opcoes {
|
| 2 |
display: grid;
|
| 3 |
grid-template-columns: 1fr 1fr;
|
| 4 |
gap: 12px;
|
| 5 |
margin: 16px 0;
|
| 6 |
}
|
| 7 |
|
| 8 |
.questao-opcao:nth-child(n+3) {
|
| 9 |
grid-column: 1 / -1;
|
| 10 |
justify-self: center;
|
| 11 |
width: 50%;
|
| 12 |
}
|
Opção com imagem e legenda
A legenda fica colada na base da imagem, sem respiro entre as duas.
| 1 |
.questao-opcao {
|
| 2 |
display: block;
|
| 3 |
width: 100%;
|
| 4 |
padding: 0;
|
| 5 |
border: 2px solid #d1d5db;
|
| 6 |
border-radius: 12px;
|
| 7 |
background: #fff;
|
| 8 |
overflow: hidden;
|
| 9 |
cursor: pointer;
|
| 10 |
text-align: left;
|
| 11 |
transition: border-color 0.2s, box-shadow 0.2s;
|
| 12 |
}
|
| 13 |
|
| 14 |
.questao-opcao:hover {
|
| 15 |
border-color: #6366f1;
|
| 16 |
}
|
| 17 |
|
| 18 |
.questao-opcao img {
|
| 19 |
display: block;
|
| 20 |
width: 100%;
|
| 21 |
aspect-ratio: 1 / 1;
|
| 22 |
object-fit: cover;
|
| 23 |
}
|
| 24 |
|
| 25 |
.questao-opcao-legenda {
|
| 26 |
display: block;
|
| 27 |
padding: 10px 12px;
|
| 28 |
font-size: 14px;
|
| 29 |
text-align: center;
|
| 30 |
color: #374151;
|
| 31 |
background: #f9fafb;
|
| 32 |
}
|
Opção selecionada
Contraste forte antes de verificar — borda sólida mais anel de destaque, não só uma cor fraca de fundo.
| 1 |
.questao-opcao.selecionada {
|
| 2 |
border-color: #6366f1;
|
| 3 |
box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.35);
|
| 4 |
}
|
Resultado da verificação
Mesmo contraste forte para acerto e erro, já com as opções travadas.
| 1 |
.questao-opcao.acerto {
|
| 2 |
border-color: #22c55e;
|
| 3 |
box-shadow: 0 0 0 3px rgba(34, 197, 94, 0.35);
|
| 4 |
}
|
| 5 |
|
| 6 |
.questao-opcao.erro {
|
| 7 |
border-color: #ef4444;
|
| 8 |
box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.35);
|
| 9 |
}
|
| 10 |
|
| 11 |
.questao-opcao:disabled {
|
| 12 |
cursor: not-allowed;
|
| 13 |
}
|
Encontrar os elementos da questão
Localiza a questão, as opções e os elementos de ação.
| 1 |
document.addEventListener('DOMContentLoaded', function () {
|
| 2 |
document.querySelectorAll('.questao[data-tipo="escolha-multimidia"]').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;
|
Selecionar uma opção
Só uma opção fica marcada por vez; selecionar ainda não julga a resposta.
| 1 |
function selecionar(alvo) {
|
| 2 |
opcoes.forEach(function (opcao) {
|
| 3 |
var selecionada = opcao === alvo;
|
| 4 |
opcao.dataset.selecionada = selecionada ? 'true' : 'false';
|
| 5 |
opcao.classList.toggle('selecionada', selecionada);
|
| 6 |
});
|
| 7 |
}
|
| 8 |
|
| 9 |
opcoes.forEach(function (opcao) {
|
| 10 |
opcao.addEventListener('click', function () {
|
| 11 |
if (!respondida) selecionar(opcao);
|
| 12 |
});
|
| 13 |
});
|
Verificar a resposta
Corrige a opção marcada e mostra o comentário próprio dela.
| 1 |
verificar.addEventListener('click', function () {
|
| 2 |
if (respondida) return;
|
| 3 |
var escolhida = Array.prototype.filter.call(opcoes, function (opcao) {
|
| 4 |
return opcao.dataset.selecionada === 'true';
|
| 5 |
})[0];
|
| 6 |
if (!escolhida) {
|
| 7 |
feedback.textContent = 'Escolha uma opção antes de verificar.';
|
| 8 |
feedback.hidden = false;
|
| 9 |
return;
|
| 10 |
}
|
| 11 |
|
| 12 |
respondida = true;
|
| 13 |
|
| 14 |
opcoes.forEach(function (opcao) {
|
| 15 |
opcao.disabled = true;
|
| 16 |
if (opcao.dataset.correta === 'true') opcao.classList.add('acerto');
|
| 17 |
else if (opcao === escolhida) opcao.classList.add('erro');
|
| 18 |
});
|
| 19 |
|
| 20 |
feedback.textContent = escolhida.dataset.feedback;
|
| 21 |
feedback.hidden = false;
|
| 22 |
|
| 23 |
verificar.hidden = true;
|
| 24 |
reset.hidden = false;
|
| 25 |
});
|
Reiniciar
Restaura o estado inicial da questão.
| 1 |
reset.addEventListener('click', function () {
|
| 2 |
respondida = false;
|
| 3 |
opcoes.forEach(function (opcao) {
|
| 4 |
opcao.disabled = false;
|
| 5 |
opcao.dataset.selecionada = 'false';
|
| 6 |
opcao.classList.remove('selecionada', 'acerto', 'erro');
|
| 7 |
});
|
| 8 |
feedback.hidden = true;
|
| 9 |
reset.hidden = true;
|
| 10 |
verificar.hidden = false;
|
| 11 |
});
|