Tooltips, menus, overlays

Back to Modules

Tooltips, Menus, and Overlays in Three.js

In Three.js, implementing tooltips, menus, and general overlays is crucial for creating interactive and user-friendly 3D experiences. There are two primary approaches: using standard HTML/CSS elements overlaid on the canvas, or rendering the UI elements directly within the 3D scene as Three.js objects.

1. HTML/CSS Overlays (Recommended for most cases)

This is generally the most flexible and straightforward method, leveraging the power of web standards for UI. You render your Three.js scene on a <canvas> element, and then position HTML elements on top of it using CSS.

How it works:

Implementation for specific UI elements:

Tooltips:

Create a hidden HTML div. Use a Raycaster to detect when the mouse cursor intersects with a 3D object. On hover, update the tooltip's content and position it near the mouse or the object, then make it visible. Hide it on mouse out.

// HTML (in your index.html)
// <div id="tooltip" style="position: absolute; display: none; background-color: rgba(0,0,0,0.7); color: white; padding: 5px; border-radius: 3px;"></div>

// JavaScript (in your Three.js code)
const raycaster = new THREE.Raycaster();
const mouse = new THREE.Vector2();
const tooltip = document.getElementById('tooltip');

function onMouseMove(event) {
    mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
    mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;

    raycaster.setFromCamera(mouse, camera);
    const intersects = raycaster.intersectObjects(scene.children);

    if (intersects.length > 0) {
        const intersectedObject = intersects[0].object;
        tooltip.style.display = 'block';
        tooltip.innerHTML = `Object: ${intersectedObject.name || 'Unnamed'}`;
        tooltip.style.left = `${event.clientX + 10}px`;
        tooltip.style.top = `${event.clientY + 10}px`;
    } else {
        tooltip.style.display = 'none';
    }
}

window.addEventListener('mousemove', onMouseMove, false);

Menus and Overlays:

Design your menu or overlay using standard HTML and CSS. Position it over your Three.js canvas. All interactions are handled directly by standard JavaScript event listeners on the HTML elements. You can toggle their visibility based on application state or user actions.

2. Rendering UI in 3D (Three.js Objects)

For more immersive experiences, especially in VR/AR, or when you want UI elements to truly exist within the 3D scene and be affected by lighting, shadows, and post-processing, you can create them directly using Three.js meshes.

How it works:

Example: HTML Overlay with a Three.js Scene

This example demonstrates a simple HTML div overlaid on top of a Three.js canvas. The HTML element's position is fixed relative to the viewport.