No Login Data Private Local Save

Emoji Reaction Overlay Generator - Online Video Comment Style

13
0
0
0
Preview Screen
0
Select Emojis
Animation Style

Copy ready-to-use HTML for OBS or web

Frequently Asked Questions

An emoji reaction overlay is a visual effect layer that displays animated emojis floating across a video screen—popularized by TikTok, Instagram Reels, and YouTube Shorts. It simulates live audience reactions, making videos more engaging and interactive. You can use this tool to generate the HTML/CSS code and add it to your livestream (OBS), video edits, or website.

Click "Export Overlay HTML" to copy the complete HTML snippet. In OBS, add a Browser Source, paste the code into a local HTML file, then point the browser source to that file. Set width/height to match your canvas, and ensure "Transparent background" is enabled. The emojis will render over your gameplay or camera feed seamlessly.

Yes! Use the custom emoji input field to add any Unicode emoji (❤️🔥😂👍 etc.) or even text symbols. The tool will mix your custom emoji into the reaction pool. For image-based stickers, you can modify the exported HTML to use <img> tags instead of text emojis.

The "Float Up" style most closely matches TikTok and Reels reaction animations—emojis rise from the bottom and fade near the top. "Wave" adds a playful side-to-side sway, while "Pop" works great for emphasis reactions that appear and hold briefly. "Burst" is ideal for explosive celebration moments.

The overlay uses pure CSS animations which are GPU-accelerated in modern browsers. Emoji particles are lightweight DOM elements. At typical settings (4-8 emojis/second), the performance impact is negligible. For OBS browser sources, each emoji is rendered efficiently. Reduce frequency/size if you notice any lag on lower-end hardware.

Absolutely. The exported HTML code includes a transparent background by default—perfect for overlaying on videos. The preview screen in this tool has a dark background for visibility, but the exported code uses background: transparent so only the emojis appear over your content.

Frequency controls how many emojis spawn per second. Spread controls how widely they're distributed horizontally across the screen (from narrow center-focused to full-width). Low spread + high frequency creates a dense column of reactions; high spread + low frequency gives scattered, occasional reactions.
`; } function copyToClipboard(text) { if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(text).then(() => showToast('Overlay HTML copied! Paste into a .html file.')); } else { const ta = document.createElement('textarea'); ta.value = text; ta.style.position = 'fixed'; ta.style.left = '-9999px'; document.body.appendChild(ta); ta.select(); document.execCommand('copy'); document.body.removeChild(ta); showToast('Overlay HTML copied!'); } } function showToast(msg) { $('#egToastMsg').text(msg); const toast = new bootstrap.Toast(document.getElementById('egToast')); toast.show(); } // Event bindings $('#egBurstBtn').on('click', () => burst(20)); $('#egToggleBtn').on('click', function() { state.isRunning = !state.isRunning; if (state.isRunning) { toggleLabel.textContent = 'Pause'; $(this).find('i').attr('class', 'fas fa-pause me-1'); startLoop(); } else { toggleLabel.textContent = 'Resume'; $(this).find('i').attr('class', 'fas fa-play me-1'); stopLoop(); } }); $('#egClearBtn').on('click', () => { clearAllEmojis(); if (!state.isRunning) { state.isRunning = true; toggleLabel.textContent = 'Pause'; $('#egToggleBtn').find('i').attr('class', 'fas fa-pause me-1'); startLoop(); } }); $('#egFreqSlider').on('input', function() { state.frequency = parseInt(this.value); $('#egFreqVal').text(state.frequency + '/sec'); restartLoop(); }); $('#egSizeSlider').on('input', function() { state.size = parseInt(this.value); $('#egSizeVal').text(state.size + 'px'); }); $('#egDurSlider').on('input', function() { state.duration = parseFloat(this.value); $('#egDurVal').text(state.duration.toFixed(1) + 's'); }); $('#egOpSlider').on('input', function() { state.opacity = parseInt(this.value) / 100; $('#egOpVal').text(Math.round(state.opacity * 100) + '%'); }); $('#egSpreadSlider').on('input', function() { state.spread = parseInt(this.value); $('#egSpreadVal').text(state.spread + '%'); }); $('input[name="egAnimType"]').on('change', function() { state.animType = this.value; clearAllEmojis(); if (state.isRunning) restartLoop(); }); $('#egExportBtn').on('click', function() { const html = generateExportHTML(); copyToClipboard(html); }); // Handle window resize for burst positioning let resizeTimeout; $(window).on('resize', function() { clearTimeout(resizeTimeout); resizeTimeout = setTimeout(() => { // Update any in-flight burst elements? Not critical—new spawns will use updated dimensions }, 300); }); // Init buildEmojiGrid(); updateSelectedEmojis(); $('#egFreqVal').text(state.frequency + '/sec'); $('#egSizeVal').text(state.size + 'px'); $('#egDurVal').text(state.duration.toFixed(1) + 's'); $('#egOpVal').text(Math.round(state.opacity * 100) + '%'); $('#egSpreadVal').text(state.spread + '%'); startLoop(); updateCounter(); // Spawn initial burst for visual appeal setTimeout(() => burst(8), 400); })();