HTML-in-Canvas API позволяет объединить интерактивность и доступность DOM с высокой производительностью и контролем на уровне пикселей, которые обеспечивает <canvas>. API позволяет рисовать живые поддеревья DOM непосредственно в контекстах холста 2D, WebGL или WebGPU, в то время как браузер сохраняет интерактивность, деревья специальных возможностей и интеграцию на уровне браузера.
Чтобы узнать о преимуществах HTML-in-Canvas, о том, как эта функция улучшает предыдущие обходные решения, и о том, для каких сценариев использования она лучше всего подходит, прочитайте статью HTML-in-Canvas в Chrome 157: интерактивная DOM в 2D, WebGL и WebGPU.
Как реализовать пользовательский интерфейс с помощью HTML-in-Canvas
Чтобы интегрировать HTML-in-Canvas в приложение, вы можете:
- Создайте прямую реализацию с помощью API браузера.
- Используйте фреймворк, поддерживающий HTML-in-Canvas.
Вы также можете использовать агента для программирования. Узнайте, как улучшить работу агента по программированию с помощью Modern Web Guidance.
Прямая реализация
Реализация зависит от контекста, в котором вы работаете. Прежде чем начать, ознакомьтесь с техническими понятиями, которые используются во всех контекстах, например контент drawable и событие paint.
Узнайте, как нарисовать изображение элемента на холсте и обновить геометрию элемента для следующих контекстов:
Поддержка библиотек и фреймворков
В нескольких популярных библиотеках добавлена экспериментальная поддержка HTML-in-Canvas для текстур WebGL и WebGPU, а также эффектов 2D-холста. Информацию о текущем статусе поддержки и особенностях реализации можно найти в документации к каждой библиотеке.
Three.js
Обновление матриц вручную может быть утомительным, поэтому фреймворки добавляют встроенную поддержку. Например, в Three.js есть экспериментальная поддержка с использованием THREE.HTMLTexture:
const material = new THREE.MeshBasicMaterial();
material.map = new THREE.HTMLTexture(uiElement); // Pass the DOM element
const geometry = new THREE.BoxGeometry(1, 1, 1);
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
PlayCanvas
PlayCanvas также поддерживает HTML-in-Canvas с помощью Texture API:
// Wait for the 'paint' event to set the source
canvas.addEventListener('paint', () => {
htmlTexture.setSource(htmlElement);
}, { once: true });
canvas.requestPaint();
// Keep up to date
canvas.addEventListener('paint', onPaintUpload);
const material = new pc.StandardMaterial();
material.diffuseMap = htmlTexture;
material.update();
Babylon.js
Babylon.js поддерживает HTML-in-Canvas через класс BABYLON.HtmlTexture:
// 2. Wrap the DOM element in an HtmlTexture
const htmlTexture = new BABYLON.HtmlTexture("htmlTexture", uiElement, scene);
// 3. Assign the texture to a material
const material = new BABYLON.StandardMaterial("hudMaterial", scene);
material.diffuseTexture = htmlTexture;
// 4. Apply material to 3D mesh
const plane = BABYLON.MeshBuilder.CreatePlane("hudPlane", { width: 1.6, height: 0.9 }, scene);
plane.material = material;
// 5. Start Render Loop
engine.runRenderLoop(() => {
scene.render();
});
PixiJS
В PixiJS добавлена поддержка HTML-in-Canvas в v8.19.0:
import { HTMLSource } from 'pixi.js/html-source';
// ... Initialize the app
// Append the HTML element as a direct child of the Pixi canvas
app.canvas.appendChild(htmlElement);
// Create the HTML-in-Canvas source and wrap it in a Sprite
const sprite = Sprite.from(new HTMLSource({ resource: form, autoUpdate: true }));
app.stage.addChild(sprite);
app.ticker.add(() => {
// Make sure to align the HTML element by updating its transform
const syncT = app.canvas.getElementTransform(htmlElement, finalTransform);
if (syncT) {
htmlElement.style.transform = syncT.toString();
}
});
CanvasUI
CanvasUI – это библиотека компонентов интерфейса с открытым исходным кодом, в которой используется HTML-in-Canvas.
Как реализовать HTML-in-Canvas с помощью агента программирования
Если вы используете агента по программированию, установите Modern Web Guidance, где есть последние инструкции по реализации HTML-in-Canvas. Помимо HTML-in-Canvas, Modern Web Guidance охватывает другие современные API браузеров и рекомендации.
Дальнейшие действия
- Изучите основные технические концепции HTML-in-Canvas.
- Подробнее о том, как отрисовывать HTML в контексте 2D…
- Узнайте, как отрисовывать HTML на холсте WebGL.
- Узнайте, как отрисовывать HTML на холсте WebGPU.
- Подробнее о резервных стратегиях…
- Чтобы поделиться отзывом, создайте проблему на GitHub.
- Посмотрите коллекцию демонстраций HTML-in-Canvas от сообщества.