JSFiddle - React, Tailwind, and code Playground

CSS

body {
	  margin: 0;
}

JavaScript

import * as THREE from "https://cdn.jsdelivr.net/npm/three@0.119.1/build/three.module.js";
import {
  CSS2DRenderer,
  CSS2DObject
} from 'https://cdn.jsdelivr.net/npm/three@0.119.1/examples/jsm/renderers/CSS2DRenderer.js';

var camera, scene, renderer, labelRenderer;

init();
animate();

function init() {

  camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 0.01, 10);
  camera.position.z = 5;

  scene = new THREE.Scene();

  InitTooltip();

  renderer = new THREE.WebGLRenderer();
  renderer.setPixelRatio(window.devicePixelRatio);
  renderer.setSize(window.innerWidth, window.innerHeight);
  document.body.appendChild(renderer.domElement);

  labelRenderer = new CSS2DRenderer();
  labelRenderer.setSize(window.innerWidth, window.innerHeight);
  labelRenderer.domElement.style.position = 'absolute';
  labelRenderer.domElement.style.top = '0px';
  document.body.appendChild(labelRenderer.domElement);

}

function InitTooltip() {

	// cube mesh

  var geometry = new THREE.BoxBufferGeometry();
  var material = new THREE.MeshBasicMaterial({
    color: 0xff0000
  });
  var cube = new THREE.Mesh(geometry, material);
	cube.visible = false;
	scene.add(cube);
	
	// label
	
  var cubeDiv = document.createElement('div');
  cubeDiv.className = 'label';
  cubeDiv.textContent = "PC";
  cubeDiv.style.marginTop = '-1em';
  cubeDiv.style.color = "white";
  var cubeLabel = new CSS2DObject(cubeDiv);
	// cubeLabel.visible = false; FIX
  cubeLabel.position.set(0, 1, 0);
  cube.add(cubeLabel);
  
}


function animate() {

  requestAnimationFrame(animate);
  renderer.render(scene, camera);
	labelRenderer.render( scene, camera );

}