跳到主要内容

iframe Embed

TinyEmulator can be embedded into any website via iframe. This is the simplest integration method.

Basic Embed

<iframe
src="https://play.tinyemulator.com"
width="100%"
height="600"
frameborder="0"
allowfullscreen
allow="autoplay; fullscreen; gamepad"
></iframe>

Launch with Parameters

TinyEmulator supports two URL parameter formats:

The simplest way to load a game — compatible with EmulatorJS-style parameters:

<iframe
src="https://play.tinyemulator.com?core=nes&rom=https://example.com/game.nes&gameName=Super Mario&single=1"
width="100%"
height="600"
frameborder="0"
allowfullscreen
allow="autoplay; fullscreen; gamepad"
></iframe>

Parameters:

ParameterRequiredDescription
coreYesEmulator core name (see core mapping table)
romYesROM file URL (must be CORS-accessible)
gameNameNoGame display name
singleNoSingle player mode (hide netplay): 1 or 0

Core Name Mapping

EmulatorJS coreTinyEmulator type
nesnes
snessnes
gbagba
gbgb
gbcgbc
genesisgenesis
megadrivegenesis
n64n64
psxpsx
arcadearcade
fbneoarcade
atari26002600
atari78007800
colecovisioncoleco
ngpngp
pcepce
segacdsegacd

TinyEmulator Native Format (props)

Advanced format using Base64-encoded JSON for more control:

<iframe
src="https://play.tinyemulator.com?props=eyJ0eXBlIjoibmVzIiwidGl0bGUiOi...&single=1"
width="100%"
height="600"
frameborder="0"
allowfullscreen
></iframe>

Encoding: Base64(encodeURIComponent(JSON.stringify(gameConfig)))

{
"type": "nes",
"title": "Super Mario Bros",
"app": "nes",
"uid": "unique-id",
"rom": "https://example.com/game.nes"
}

Encoding helper (JavaScript):

function encodeProps(props) {
return btoa(encodeURIComponent(JSON.stringify(props)));
}

const props = {
type: "nes",
title: "Super Mario",
app: "nes",
uid: "game-" + Date.now(),
rom: "https://example.com/game.nes"
};

const url = "https://play.tinyemulator.com?props=" +
encodeURIComponent(encodeProps(props)) + "&single=1";

Migration from EmulatorJS

If you are currently using EmulatorJS, simply replace the iframe src:

Before (EmulatorJS):

<iframe
src="https://www.emulatorjs.org/embed/NES?core=nes&rom=https://example.com/game.nes"
...
></iframe>

After (TinyEmulator):

<iframe
src="https://play.tinyemulator.com?core=nes&rom=https://example.com/game.nes&single=1"
...
></iframe>

Complete Examples

Example 1: Full HTML Page

A complete standalone page with a game library and emulator:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Retro Game Site</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: system-ui, sans-serif;
background: #1a1a2e;
color: #fff;
padding: 20px;
max-width: 1000px;
margin: 0 auto;
}
h1 { margin-bottom: 20px; color: #64b5f6; }
.game-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
gap: 12px;
margin-bottom: 20px;
}
.game-card {
background: #16213e;
border: 2px solid #0f3460;
border-radius: 8px;
padding: 12px;
cursor: pointer;
text-align: center;
transition: all 0.2s;
}
.game-card:hover {
border-color: #64b5f6;
transform: translateY(-2px);
}
.game-card.active {
border-color: #64b5f6;
background: #0f3460;
}
.emulator-wrapper {
position: relative;
width: 100%;
padding-bottom: 75%;
background: #000;
border-radius: 8px;
overflow: hidden;
}
.emulator-wrapper iframe {
position: absolute;
top: 0; left: 0;
width: 100%; height: 100%;
border: none;
}
</style>
</head>
<body>
<h1>🎮 Retro Games</h1>

<div class="game-grid" id="gameGrid"></div>

<div class="emulator-wrapper">
<iframe
id="emulator"
src="about:blank"
allowfullscreen
allow="autoplay; fullscreen; gamepad"
></iframe>
</div>

<script>
const games = [
{ name: "Super Mario", core: "nes", rom: "https://your-cdn.com/mario.nes" },
{ name: "Zelda", core: "nes", rom: "https://your-cdn.com/zelda.nes" },
{ name: "Pokemon", core: "gba", rom: "https://your-cdn.com/pokemon.gba" },
];

const grid = document.getElementById("gameGrid");
const iframe = document.getElementById("emulator");

games.forEach((game, index) => {
const card = document.createElement("div");
card.className = "game-card";
card.textContent = game.name;
card.onclick = () => loadGame(game, card);
grid.appendChild(card);
});

function loadGame(game, card) {
document.querySelectorAll(".game-card").forEach(c => c.classList.remove("active"));
card.classList.add("active");

const url = `https://play.tinyemulator.com?core=${game.core}&rom=${encodeURIComponent(game.rom)}&gameName=${encodeURIComponent(game.name)}&single=1`;
iframe.src = url;
}
</script>
</body>
</html>

Example 2: React Component

import { useState } from "react";

const GAMES = [
{ id: 1, name: "Super Mario", core: "nes", romUrl: "https://your-cdn.com/mario.nes" },
{ id: 2, name: "Sonic", core: "genesis", romUrl: "https://your-cdn.com/sonic.md" },
];

function TinyEmulator({ game, single = true, width = "100%", height = 600 }) {
const src = `https://play.tinyemulator.com?core=${game.core}&rom=${encodeURIComponent(game.romUrl)}&gameName=${encodeURIComponent(game.name)}${single ? "&single=1" : ""}`;

return (
<div style={{ position: "relative", width, height, background: "#000", borderRadius: 8, overflow: "hidden" }}>
<iframe
src={src}
title={game.name}
width="100%"
height="100%"
frameBorder="0"
allowFullScreen
allow="autoplay; fullscreen; gamepad"
/>
</div>
);
}

function GameLibrary() {
const [selectedGame, setSelectedGame] = useState(null);

return (
<div>
<h2>Game Library</h2>
<div style={{ display: "flex", gap: 12, marginBottom: 20 }}>
{GAMES.map(game => (
<button
key={game.id}
onClick={() => setSelectedGame(game)}
style={{
padding: "10px 16px",
background: selectedGame?.id === game.id ? "#64b5f6" : "#16213e",
color: "#fff",
border: "none",
borderRadius: 6,
cursor: "pointer",
}}
>
{game.name}
</button>
))}
</div>

{selectedGame ? (
<TinyEmulator game={selectedGame} />
) : (
<p>Select a game to start playing</p>
)}
</div>
);
}

export default GameLibrary;

Example 3: Vue 3 Component

<template>
<div class="game-page">
<h2>Play Retro Games</h2>

<div class="game-list">
<button
v-for="game in games"
:key="game.id"
:class="{ active: selectedGame?.id === game.id }"
@click="selectedGame = game"
>
{{ game.name }}
</button>
</div>

<div v-if="selectedGame" class="emulator-container">
<iframe
:src="emulatorUrl"
:title="selectedGame.name"
frameborder="0"
allowfullscreen
allow="autoplay; fullscreen; gamepad"
></iframe>
</div>
</div>
</template>

<script setup>
import { ref, computed } from "vue";

const games = [
{ id: 1, name: "Super Mario", core: "nes", romUrl: "https://your-cdn.com/mario.nes" },
{ id: 2, name: "Metroid", core: "nes", romUrl: "https://your-cdn.com/metroid.nes" },
];

const selectedGame = ref(null);

const emulatorUrl = computed(() => {
if (!selectedGame.value) return "about:blank";
const g = selectedGame.value;
return `https://play.tinyemulator.com?core=${g.core}&rom=${encodeURIComponent(g.romUrl)}&gameName=${encodeURIComponent(g.name)}&single=1`;
});
</script>

<style scoped>
.game-page {
max-width: 900px;
margin: 0 auto;
padding: 20px;
}
.game-list {
display: flex;
gap: 8px;
margin-bottom: 16px;
}
.game-list button {
padding: 8px 16px;
background: #16213e;
color: #fff;
border: 2px solid #0f3460;
border-radius: 6px;
cursor: pointer;
}
.game-list button.active {
background: #0f3460;
border-color: #64b5f6;
}
.emulator-container {
position: relative;
width: 100%;
padding-bottom: 75%;
background: #000;
border-radius: 8px;
overflow: hidden;
}
.emulator-container iframe {
position: absolute;
top: 0; left: 0;
width: 100%; height: 100%;
border: none;
}
</style>

Example 4: Game Grid with Modal Popup

Click a game card to open the emulator in a modal:

<!DOCTYPE html>
<html>
<head>
<style>
.grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; padding: 20px; }
.card {
background: #f5f5f5;
border-radius: 8px;
padding: 16px;
text-align: center;
cursor: pointer;
transition: transform 0.2s;
}
.card:hover { transform: scale(1.05); }
.modal-overlay {
display: none;
position: fixed;
top: 0; left: 0;
width: 100%; height: 100%;
background: rgba(0,0,0,0.8);
z-index: 1000;
justify-content: center;
align-items: center;
}
.modal-overlay.active { display: flex; }
.modal {
width: 90%;
max-width: 900px;
background: #000;
border-radius: 8px;
overflow: hidden;
}
.modal-header {
padding: 10px 16px;
background: #333;
color: #fff;
display: flex;
justify-content: space-between;
align-items: center;
}
.close-btn {
background: none;
border: none;
color: #fff;
font-size: 20px;
cursor: pointer;
}
.modal iframe {
width: 100%;
height: 500px;
border: none;
display: block;
}
</style>
</head>
<body>
<div class="grid" id="grid"></div>

<div class="modal-overlay" id="modal">
<div class="modal">
<div class="modal-header">
<span id="modalTitle">Game</span>
<button class="close-btn" onclick="closeModal()">&times;</button>
</div>
<iframe id="modalIframe" src="about:blank" allowfullscreen allow="autoplay; fullscreen; gamepad"></iframe>
</div>
</div>

<script>
const games = [
{ name: "Super Mario Bros", core: "nes", rom: "https://cdn.example.com/smb.nes" },
{ name: "Contra", core: "nes", rom: "https://cdn.example.com/contra.nes" },
{ name: "Pokemon Red", core: "gbc", rom: "https://cdn.example.com/pokemon.gbc" },
{ name: "Sonic 3", core: "genesis", rom: "https://cdn.example.com/sonic3.md" },
];

const grid = document.getElementById("grid");
const modal = document.getElementById("modal");
const modalTitle = document.getElementById("modalTitle");
const modalIframe = document.getElementById("modalIframe");

games.forEach(game => {
const card = document.createElement("div");
card.className = "card";
card.innerHTML = `<h3>${game.name}</h3><p>${game.core.toUpperCase()}</p>`;
card.onclick = () => openGame(game);
grid.appendChild(card);
});

function openGame(game) {
modalTitle.textContent = game.name;
const url = `https://play.tinyemulator.com?core=${game.core}&rom=${encodeURIComponent(game.rom)}&gameName=${encodeURIComponent(game.name)}&single=1`;
modalIframe.src = url;
modal.classList.add("active");
}

function closeModal() {
modal.classList.remove("active");
modalIframe.src = "about:blank";
}

modal.onclick = (e) => {
if (e.target === modal) closeModal();
};
</script>
</body>
</html>

Example 5: Using Props Format (Advanced)

// Helper to encode props
function encodeProps(props) {
return btoa(encodeURIComponent(JSON.stringify(props)));
}

// Create iframe dynamically
function createEmulator(container, gameConfig) {
const encoded = encodeProps(gameConfig);
const iframe = document.createElement("iframe");
iframe.src = `https://play.tinyemulator.com?props=${encodeURIComponent(encoded)}&single=1`;
iframe.width = "100%";
iframe.height = "600";
iframe.frameBorder = "0";
iframe.allowFullscreen = true;
iframe.setAttribute("allow", "autoplay; fullscreen; gamepad");
container.appendChild(iframe);
return iframe;
}

// Usage
const gameConfig = {
type: "nes",
title: "Super Mario Bros",
app: "nes",
uid: "user-" + userId + "-game-" + gameId,
rom: "https://cdn.example.com/roms/mario.nes",
props: {
// Additional core-specific props
}
};

createEmulator(document.getElementById("game-container"), gameConfig);

Responsive Embed

Use CSS to make the iframe responsive with different aspect ratios:

.emulator-4by3 {
position: relative;
width: 100%;
padding-bottom: 75%; /* 4:3 aspect ratio (NES, SNES, GBA) */
height: 0;
overflow: hidden;
}

.emulator-16by9 {
position: relative;
width: 100%;
padding-bottom: 56.25%; /* 16:9 aspect ratio (arcade, psx) */
height: 0;
overflow: hidden;
}

.emulator-4by3 iframe,
.emulator-16by9 iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border: none;
}
<div class="emulator-4by3">
<iframe
src="https://play.tinyemulator.com?core=nes&rom=https://example.com/game.nes"
frameborder="0"
allowfullscreen
allow="autoplay; fullscreen; gamepad"
></iframe>
</div>

Security Considerations

SettingRecommendedReason
allow attributeautoplay; fullscreen; gamepadEnable required features
sandboxNot recommendedMay break emulator functionality
CSPAdd play.tinyemulator.com to frame-srcIf your site uses Content Security Policy

Cross-Origin Notes

Since TinyEmulator runs in a cross-origin iframe:

  • No direct DOM access: You cannot access the emulator's DOM from your page
  • localStorage: The emulator uses its own isolated storage
  • File uploads: Users upload ROMs directly within the iframe
  • Audio: Requires user interaction first (browser autoplay policy)

Self-Hosted Embed

If you self-host TinyEmulator, replace the iframe src with your own domain:

<iframe
src="https://play.your-domain.com?core=nes&rom=https://example.com/game.nes"
width="100%"
height="600"
frameborder="0"
allowfullscreen
allow="autoplay; fullscreen; gamepad"
></iframe>