CSS2DObject无法触发点击事件

three.js@0.13X版本后,CSS2DRenderer中的 CSS2DObject无法触发点击事件。 原因是OrbitControls中会对绑定的Dom进行事件监听,并且阻止穿透。

解决办法是:

  • 在实例化 OrbitControls 时绑定renderer(而不是CSS2DRenderer)
  • 这时候OrbitControls无法转动,因为CSS2DRenderer的图层较高,所以还需要给 CSS2DRendererpointerEvents='none'
  • 再给 CSS2DObject的el的pointerEvents='auto'
Typescript 复制代码
const camera = new THREE.PerspectiveCamera(fov, aspect, near, far)
const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true })
renderer.setSize(element.offsetWidth, element.offsetHeight)
element.appendChild(renderer.domElement)
const CSSRenderer = new CSS2DRenderer()
CSSRenderer.setSize(element.offsetWidth, element.offsetHeight)
CSSRenderer.domElement.style.position = 'absolute'
CSSRenderer.domElement.style.top = '0px'
element.appendChild(CSSRenderer.domElement)
const control = new OrbitControls(camera, renderer.domElement) // important!
CSSRenderer.domElement.style.pointerEvents = 'none' // important!
// CSSObject
const div = document.createElement("div")
div.style.pointerEvents = "auto" // important!
const object = new CSS2DObject(div)
相关推荐
快起来别睡了27 分钟前
如何解决前端的跨域问题?一文告诉你
前端
香蕉可乐荷包蛋35 分钟前
vue防内存泄漏和性能优化浅解
前端·vue.js·性能优化
tianchang36 分钟前
create-vue-ssr - 现代化Vue SSR开发的一站式解决方案
前端·vue.js·架构
是晓晓吖37 分钟前
源网站数据采集方案之解析DOM(四)
前端·chrome
中烟创新38 分钟前
DeepSeek部署实战:模型对比、部署优化与应用场景解析
前端·后端
归于尽44 分钟前
别再纠结布局了!Flex 和 Grid 的 “神仙操作” 都在这
前端·css
Point1 小时前
[ahooks] useCountDown源码阅读
前端·javascript
默默地离开1 小时前
React中的useLayoutEffect:解决闪烁问题的利器
前端·react.js
mrsk1 小时前
每天一个小知识点,DRY究竟是什么?
前端·面试·代码规范
Nicholas681 小时前
Flutter动画框架之SingleTickerProviderStateMixin、TickerProvider、Ticker源码解析(三)
前端