jQuery / Método / .fadeIn() - Mostrar elementos gradualmente
No jQuery, .fadeIn() mostra elementos ocultos aumentando gradualmente sua opacidade. Em .fadeIn(800), 800 é a duração do efeito em milissegundos, não uma espera antes de começar. Coloque tarefas dependentes da conclusão no callback, e não logo após a chamada.
Duração, easing e conclusão
A documentação de .fadeIn() inclui .fadeIn(duration, easing, complete) com argumentos opcionais. Uma duração numérica maior torna o efeito mais lento. complete é a função chamada quando o efeito de um elemento termina.
| Duração indicada | Tempo | Expressão |
|---|---|---|
| Omitida | 400 ms por padrão | .fadeIn() |
| Número | Milissegundos especificados | .fadeIn(800) |
| "fast" | 200 ms | .fadeIn("fast") |
| "slow" | 600 ms | .fadeIn("slow") |
| 0 | Estado final sem transição gradual | .fadeIn(0) |
easing controla a progressão. O padrão é swing; linear avança de forma constante. Indique depois da duração, como .fadeIn(800, "linear"), e não sozinho no lugar dela. O exemplo completo usa o comportamento padrão.
Exemplo completo com dois avisos
Salve todo o código em UTF-8 como fadein-demo.html e abra no navegador. Não precisa instalar nada, mas é necessário internet para carregar a distribuição oficial completa do jQuery pela rede de distribuição de conteúdo, ou CDN. A versão slim exclui efeitos e não possui .fadeIn(): use o arquivo completo.
O código usa 4.0.0. Opacidade intermediária, 800/200 ms, conclusão por elemento, restauração durante o efeito e exibição instantânea foram executadas com 3.7.1 e 4.0.0. A transição é omitida quando o sistema solicita movimento reduzido.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Fade in two notice panels</title>
<style>
body { font: 16px/1.6 sans-serif; margin: 24px; }
.panel { display: none; padding: 16px; margin: 12px 0; background: #e4f3f1; }
button, select { padding: 8px; margin: 4px; }
</style>
<script src="https://code.jquery.com/jquery-4.0.0.min.js"></script>
</head>
<body>
<h1>Fade in two notice panels</h1>
<label for="duration">Duration:</label>
<select id="duration">
<option value="800">800 ms</option>
<option value="200">200 ms</option>
</select>
<label><input type="checkbox" id="instant"> Show instantly</label>
<button type="button" id="show">Show notices</button>
<button type="button" id="reset">Reset</button>
<div id="notices">
<div class="panel" id="one">Notice one</div>
<div class="panel" id="two">Notice two</div>
</div>
<p id="result" aria-live="polite"></p>
<script>
$(function () {
const $panels = $("#notices > .panel");
let completed = 0;
function report(state) {
$("#result").text(`state=${state} | completed=${completed}`);
}
function clearPanels() {
$panels.stop(true, false).hide().css("opacity", "");
completed = 0;
}
$("#show").on("click", function () {
clearPanels();
const reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
const duration = $("#instant").prop("checked") || reduce
? 0 : Number($("#duration").val());
$("#show").prop("disabled", true);
report("showing");
$panels.fadeIn(duration, function () {
completed++;
if (completed === $panels.length) {
report("visible");
$("#show").prop("disabled", false);
} else {
report("showing");
}
});
});
$("#reset").on("click", function () {
clearPanels();
$("#show").prop("disabled", false);
report("hidden");
});
report("hidden");
});
</script>
</body>
</html>
Os dois painéis começam com display: none e o resultado mostra:
state=hidden | completed=0
- Deixe Show instantly desmarcado, escolha 800 ms e use Show notices. Os painéis aparecem juntos e o botão fica desativado durante a animação.
- Ao concluir, os dois estão visíveis e aparece
state=visible | completed=2. Dois conta elementos concluídos, não cliques. - Após Reset, escolha 200 ms e repita para chegar ao mesmo resultado mais rápido. Alterar a lista não modifica um efeito já em andamento.
- Use Reset durante os 800 ms: os painéis somem imediatamente e retorna
state=hidden | completed=0. A conclusão antiga não reaparece após sua duração original. - Show instantly usa zero e mostra sem transição. Detectar movimento reduzido do sistema produz o mesmo resultado.
Se não houver fade visível, confira primeiro a opção instantânea e prefers-reduced-motion. O exemplo prioriza essa preferência, então até 800 pode resultar em exibição imediata.
O callback de conclusão executa por elemento
.fadeIn() não bloqueia o JavaScript seguinte até terminar. Informar conclusão na próxima linha pode fazê-lo durante o efeito. O exemplo incrementa completed dentro do callback para contar conclusões reais.
Cada painel chama o callback uma vez; não é uma única chamada para todo o conjunto. Somente quando completed alcança $panels.length aparece visible e o botão é reativado. O conjunto permanece fixo no exercício. Em uma função comum de callback, this é o elemento DOM que acabou de concluir.
Interromper, restaurar e solucionar problemas
Em .stop(true, false), true limpa os efeitos pendentes e false interrompe o atual sem concluí-lo. Seu callback de conclusão não executa, evitando interferência após Reset. .hide() oculta em seguida, remove opacidade em linha que possa ter ficado no meio e zera o contador.
Iniciar novamente faz a mesma limpeza e começa oculto. Desativar o botão evita acumular cliques e efeitos na fila. A limpeza fica restrita aos painéis e ao contador, sem alterar configurações globais.
Se falhar, confira o arquivo completo em Network e erros como .fadeIn is not a function em Console. Uma seleção vazia não executa callbacks por elemento. Verifique também visibility: hidden, ancestrais ocultos e regras display mais fortes: alterar opacidade não elimina toda causa de ocultação.




