当前位置: 首页 > news >正文

threejs:document.createElement创建标签后css设置失效

vue3+threejs,做一个给模型批量CSS2D标签的案例,在导入模型的js文件里,跟着课程写的代码如下:

import * as THREE from 'three';
// 引入gltf模型加载库GLTFLoader.js
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';// 引入CSS2模型对象CSS2DObject
import {CSS2DObject
} from 'three/addons/renderers/CSS2DRenderer.js';const model = new THREE.Group();
const loader = new GLTFLoader();
// 路径要特别注意,默认是从public读取的,模型文件必须放在public下,并且路径前的public要省略
loader.load('models/简易小区.glb', gltf => {gltf.scene.getObjectByName("小区房子").traverse(function (obj) {if (obj.isMesh) {let label = tag(obj.name);const pos = new THREE.Vector3();obj.getWorldPosition(pos);label.position.copy(pos);label.name = obj.name;model.add(label);}});model.add(gltf.scene);
}, undefined, error => {console.error(error);
});function tag(name) {// 创建dom元素(作为标签)let div = document.createElement('div');div.innerHTML = name;div.classList.add('css2dtag');//使用dom元素生成CSS2模型对象CSS2DObjectlet label = new CSS2DObject(div);div.style.pointerEvents = 'none';//避免HTML标签遮挡三维场景的鼠标事件return label;//返回CSS2模型标签      }export default model;

在vue文件里设置css。

<template>
</template><script setup>
import { scene } from './init.js';
</script><style scoped>.css2dtag {background: #ffffff;color: orangered;}
</style>

运行代码后发现css没有生效。

查了资料,找到一篇参考文章:

threejs 代码创建div设置样式不生效的问题原因探讨 - 简书

尝试去掉scoped,确实生效了,但是这种处理并不理想。

在继续学习threejs课程的时候,发现老师教了另一种批量创建的办法。

对vue文件修改如何:

增加一个id为css2dtag的div,css加上scoped。

<template><div id="css2dtag" style="display: none;"></div>
</template><script setup>
import { scene } from './init.js';
</script><style scoped>#css2dtag {background: #ffffff;color: orangered;}
</style>

然后在导入模型的js文件里,通过克隆这个div来批量创建dom元素。

import * as THREE from 'three';
// 引入gltf模型加载库GLTFLoader.js
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';// 引入CSS2模型对象CSS2DObject
import {CSS2DObject
} from 'three/addons/renderers/CSS2DRenderer.js';const model = new THREE.Group();
const loader = new GLTFLoader();
// 路径要特别注意,默认是从public读取的,模型文件必须放在public下,并且路径前的public要省略
loader.load('models/简易小区.glb', gltf => {gltf.scene.getObjectByName("小区房子").traverse(function (obj) {if (obj.isMesh) {let label = tag(obj.name);const pos = new THREE.Vector3();obj.getWorldPosition(pos);label.position.copy(pos);label.name = obj.name;model.add(label);}});model.add(gltf.scene);
}, undefined, error => {console.error(error);
});function tag(name) {// 通过克隆来批量创建divlet div = document.getElementById('css2dtag').cloneNode();div.innerHTML = name;//使用dom元素生成CSS2模型对象CSS2DObjectlet label = new CSS2DObject(div);div.style.pointerEvents = 'none';//避免HTML标签遮挡三维场景的鼠标事件return label;//返回CSS2模型标签      
}export default model;

再次运行代码,css生效了。

http://www.lryc.cn/news/544264.html

相关文章:

  • 安装2018版本的petalinux曲折经历
  • return和print
  • springboot411-基于Java的自助客房服务系统(源码+数据库+纯前后端分离+部署讲解等)
  • 跨平台文件互传工具
  • final 关键字在不同上下文中的用法及其名称
  • Elasticsearch:使用阿里云 AI 服务进行嵌入和重新排名
  • 【愚公系列】《鸿蒙原生应用开发从零基础到多实战》004-TypeScript 中的泛型
  • IP属地是通过卫星定位的吗?如何保护用户隐私
  • 【云原生之kubernetes实战】在k8s环境中高效部署Vikunja任务管理工具(含数据库配置)
  • php序列化与反序列化
  • 视频级虚拟试衣技术在淘宝的产品化实践
  • 音视频-WAV格式
  • c++ std::array使用笔记
  • 第39天:安全开发-JavaEE应用SpringBoot框架Actuator监控泄漏Swagger自动化
  • 浏览器JS打不上断点,一点就跳到其他文件里。浏览器控制台 js打断点,指定的位置打不上断点,一打就跳到其他地方了。
  • conda环境管理 kernel注册到jupyter notebook
  • 【SpringBoot】【log】 自定义logback日志配置
  • 15.7 LangChain 版智能销售顾问实战:构建企业级知识驱动型对话系统
  • 计算机网络基础:揭开网络世界的神秘面纱
  • 工会考试知识点分享
  • az devops login报错:Failed to authenticate using the supplied token.
  • Halcon图像预处理算子 sobel算子、傅里叶变换算子、卷积算子
  • Java Web应用中获取客户端的真实IP地址
  • 洛谷————P11559 【MX-X7-T0】[LSOT-3] 嗯欧哎
  • 2020年SCI1区TOP:异质综合学习和动态多群体粒子群算法HCLDMS-PSO,深度解析+性能实测
  • FinRobot:一个使用大型语言模型进行金融分析的开源AI代理平台
  • 【windows driver】 开发环境简明安装教程
  • 强制完整性级别(MIL)和用户账户控制(UAC)的联系与区别
  • 性能附录:如何计算并发用户数(摘自高楼老师《性能30讲》)
  • 视频推拉流EasyDSS点播平台云端录像播放异常问题的排查与解决