Componente você sabia
Veja como criar um lindo #componente você sabia com #javascript e CSS.

Este componente exibe curiosidades programadas que aparecem com efeito de máquina de escrever, proporcionando uma experiência dinâmica ao usuário. Ele é ideal para destacar informações técnicas, novidades ou fatos interessantes em portais educacionais ou #sistemas voltados para programadores. Além disso, oferece controles interativos para iniciar, parar e ajustar a velocidade da exibição, permitindo testes e personalização fácil.
Código completo
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Efeito Máquina de Escrever</title>
<style>
body {
font-family: 'Courier New', monospace;
background: #0a0a0a ;
color: #fff ;
margin: 20px;
padding: 0;
}
.demo-controls {
margin-top: 20px;
padding: 15px;
background: #2a2a2a ;
border-radius: 4px;
}
.demo-controls button {
background: #00bfff ;
color: white;
border: none;
padding: 8px 16px;
margin: 5px;
border-radius: 4px;
cursor: pointer;
font-family: inherit;
}
.demo-controls button:hover {
background: #0099cc ;
}
.speed-control {
margin: 10px 0;
}
.speed-control label {
color: #ccc ;
margin-right: 10px;
}
.speed-control input {
margin: 0 10px;
}
#voce -sabia {
background: #1e1e1e ;
color: #ccc ;
padding: 12px 20px;
border-left: 4px solid #00bfff ;
font-size: 14px;
margin-bottom: 20px;
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
}
.titulo {
color: #00bfff ;
font-weight: bold;
}
#curiosidade {
margin-left: 8px;
position: relative;
}
/* Cursor piscante */
#curiosidade ::after {
content: '|';
color: #00bfff ;
animation: blink 1s infinite;
font-weight: bold;
}
@keyframes blink {
0%, 50% { opacity: 1; }
51%, 100% { opacity: 0; }
}
</style>
</head>
<body>
<div id="voce-sabia">
<span class="titulo">Você sabia?</span>
<span id="curiosidade"></span>
</div>
<div class="demo-controls">
<h3 style="color: #00bfff ; margin-top: 0;">Controles da Demo</h3>
<button onclick="iniciarEfeito()">Iniciar</button>
<button onclick="pararEfeito()">Parar</button>
<button onclick="proximaCuriosidade()">Próxima</button>
<div class="speed-control">
<label>Velocidade:</label>
<input type="range" id="velocidade" min="10" max="200" value="80" onchange="ajustarVelocidade()">
<span id="velocidade-valor">80ms</span>
</div>
</div>
<script>
const curiosidades = [
"No JavaScript, `NaN !== NaN` é verdadeiro!",
"Em PHP, `empty([])` retorna true — arrays vazios são considerados vazios!",
"`let` no JavaScript tem escopo de bloco, `var` não.",
"O CodeIgniter 4 é totalmente orientado a objetos.",
"`localStorage` salva dados mesmo após fechar o navegador.",
"Você pode usar `nth-child(odd)` no CSS para estilizar linhas alternadas!",
"JavaScript foi criado em apenas 10 dias por Brendan Eich!",
"CSS Grid pode criar layouts complexos com apenas algumas linhas!",
"O `console.table()` exibe arrays e objetos em formato de tabela!",
"PHP significa 'PHP: Hypertext Preprocessor' (acrônimo recursivo)!",
"O `===` no JavaScript compara valor E tipo, `==` apenas valor.",
"CSS flexbox resolve 90% dos problemas de alinhamento!",
"O `async/await` torna código assíncrono mais legível que Promises.",
"Em PHP, você pode usar `??` para verificar se uma variável existe.",
"O `document.querySelector()` é mais poderoso que `getElementById()`.",
"CSS custom properties (variáveis) funcionam em tempo real!",
"JavaScript possui 'hoisting' - declarações são movidas para o topo.",
"O CodeIgniter usa o padrão MVC (Model-View-Controller).",
"O `console.time()` e `console.timeEnd()` medem performance!",
"PHP 8 introduziu Union Types e Named Arguments.",
"O `Array.from()` pode converter qualquer coisa em array!",
"CSS `:has()` é como um 'parent selector' que sempre quisemos!",
"O `fetch()` API substituiu o antigo XMLHttpRequest.",
"Em PHP, `null coalescing assignment` (??=) atribui se for null.",
"JavaScript Map e Set são mais eficientes que Object e Array para certas tarefas.",
"CSS Container Queries permitem responsividade baseada no container!",
"O `structuredClone()` faz deep copy de objetos nativamente!",
"PHP Fibers permitem programação assíncrona sem callbacks.",
"O `AbortController` pode cancelar fetch requests em JavaScript!",
"CSS `:is()` e `:where()` simplificam seletores complexos!",
"O `BigInt` em JavaScript trabalha com números maiores que 2^53!",
"PHP 8.1 trouxe Enums nativos para o language!",
"CSS `aspect-ratio` mantém proporções sem JavaScript!",
"O `?.` (optional chaining) evita erros em propriedades undefined!",
"Em PHP, `match` é mais poderoso que `switch`!",
"JavaScript `WeakMap` e `WeakSet` permitem garbage collection automático!",
"CSS `clamp()` cria valores responsivos com min, max e preferido!",
"O `Intl` API formata datas, números e strings por localização!",
"PHP attributes (# annotations) substituem docblocks!",
"CSS `@layer` controla a cascata e especificidade!",
"O `queueMicrotask()` agenda tarefas na microtask queue!",
"CodeIgniter 4 usa Composer para gerenciamento de dependências!",
"CSS `@supports` testa suporte a propriedades antes de aplicar!",
"JavaScript Proxy pode interceptar e customizar operações em objetos!",
"PHP 8.2 introduziu readonly classes!",
"CSS `scroll-behavior: smooth` cria rolagem suave sem JS!",
"O `Reflect` API fornece métodos para operações interceptáveis!",
"Em PHP, você pode usar `yield` para criar generators!",
"CSS `:focus-visible` aplica estilos apenas no foco via teclado!",
"JavaScript `Temporal` API vai substituir o problemático Date!",
"PHP JIT (Just-In-Time) compilation pode acelerar código em até 3x!",
"CSS `gap` funciona tanto em Grid quanto em Flexbox!",
"O `ResizeObserver` detecta mudanças de tamanho em elementos!",
"CodeIgniter 4 tem hot reloading em desenvolvimento!",
"CSS `color-mix()` mistura cores como um photoshop!",
"JavaScript `top-level await` permite await fora de funções async!",
"PHP 8.3 trouxe readonly properties em classes!",
"CSS `@starting-style` define estilos iniciais para animações!",
"O `scheduler.postTask()` controla prioridade de tarefas!",
"Em PHP, `array_is_list()` verifica se é um array sequencial!",
"CSS View Transitions API anima entre páginas como SPA!"
];
let letraIndex = 0;
let curiosidadeAtual = "";
let delayEntreLetras = 80;
let delayEntreFrases = 3000;
let timeoutId = null;
let intervalId = null;
let rodando = false;
function escreverCuriosidade() {
const span = document.getElementById("curiosidade");
if (letraIndex < curiosidadeAtual.length) {
span.textContent += curiosidadeAtual.charAt(letraIndex);
letraIndex++;
timeoutId = setTimeout(escreverCuriosidade, delayEntreLetras);
} else {
// Aguarda antes de mostrar a próxima curiosidade
timeoutId = setTimeout(proximaCuriosidade, delayEntreFrases);
}
}
function proximaCuriosidade() {
if (!rodando) return;
const span = document.getElementById("curiosidade");
curiosidadeAtual = curiosidades[Math.floor(Math.random() * curiosidades.length)];
span.textContent = "";
letraIndex = 0;
escreverCuriosidade();
}
function iniciarEfeito() {
if (rodando) return;
rodando = true;
proximaCuriosidade();
}
function pararEfeito() {
rodando = false;
if (timeoutId) {
clearTimeout(timeoutId);
timeoutId = null;
}
}
function ajustarVelocidade() {
const slider = document.getElementById("velocidade");
const valorSpan = document.getElementById("velocidade-valor");
delayEntreLetras = parseInt(slider.value);
valorSpan.textContent = delayEntreLetras + "ms";
}
// Iniciar automaticamente quando a página carregar
document.addEventListener("DOMContentLoaded", function() {
console.log("DOM carregado, iniciando efeito...");
iniciarEfeito();
});
// Cleanup quando a página for fechada
window.addEventListener("beforeunload", pararEfeito);
</script>
</body>
</html>
Adapte e use.
Compartilhe este artigo: