At Google I/O 2026, Chrome engineer Thomas Nattestad unveiled the HTML-in-Canvas API, which is a new web platform feature that lets developers render HTML elements directly into canvas, WebGL, and WebGPU contexts while preserving accessibility and interactivity.
The Problem It Solves
Building UI for 3D web experiences has long forced developers into an uncomfortable choice: overlay HTML elements on top of canvas (breaking immersion and causing z-order headaches), or rebuild UI systems from scratch inside the canvas (losing accessibility, internationalization, and native browser features like text selection and form inputs).
HTML-in-Canvas eliminates this trade-off. A form rendered as a texture on a 3D surface still works with screen readers. Buttons on a spinning cube still respond to clicks. Text inputs on a curved menu still show blinking cursors.
How It Works
The API introduces three core primitives:
layoutsubtreeattribute — Opt-in for canvas children to participate in layout and hit testingdrawElementImage()— Draw a child element into the canvas (with WebGL and WebGPU equivalents)paintevent — Fires when canvas children change, enabling efficient updates
For WebGL, there's texElementImage2D(). For WebGPU, there's copyElementImageToTexture(). Both render HTML to textures while keeping the DOM synchronized for accessibility.
<canvas id="canvas" layoutsubtree>
<form id="myForm">
<input type="text" placeholder="Type here...">
</form>
</canvas>
<script>
const ctx = canvas.getContext('2d');
canvas.onpaint = () => {
ctx.reset();
const transform = ctx.drawElementImage(myForm, 100, 50);
myForm.style.transform = transform.toString();
};
</script>Framework Support
Three.js and PlayCanvas integrations are already available. The Three.js implementation (PR #31233 by mrdoob) adds an HTMLTexture class that handles the synchronization automatically.
Try It Now
The API is available behind a flag in Chrome Canary:
- Enable
chrome://flags/#canvas-draw-element - Check out the live demos
- Read the full explainer
Resources
- Video: Google I/O 2026 Talk
- Spec: WICG/html-in-canvas
- Three.js Integration: PR #31233
- Samples: Official Examples