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

群面智伴,前端界面

群面模拟系统前端实战:圆桌UI与WebSocket实时通信
一、圆桌布局:纯CSS实现环绕式座位
群面模拟的核心场景是一张圆桌,所有人围坐一圈。我没有用 Three.js 或 Canvas,只用纯 CSS 实现了这个效果。
思路很简单:计算出每个座位在圆周上的角度,用 transform: translate() 定位。

function getSeatStyle(index) { const total = participants.length const angle = (index / total) * 360 const radius = 160 const rad = (angle - 90) * Math.PI / 180 return { transform: `translate(${Math.cos(rad) * radius}px, ${Math.sin(rad) * radius}px)` } }


桌面用 border-radius: 50% + 径向渐变模拟质感,再加两层伪元素装饰环:

.table-surface { width: 220px; height: 220px; border-radius: 50%; background: radial-gradient(circle at 35% 35%, #1e2e42, #0f1622); border: 2px solid #2f3f55; box-shadow: 0 0 60px rgba(60,120,220,0.06), inset 0 0 60px rgba(0,0,0,0.5); }


气泡则根据座位所在 quadrant(上/下/左/右)自动定位方向和箭头:

.seat.top .seat-bubble { top: -8px; left: 50%; transform: translateX(-50%) translateY(-100%); } .seat.bottom .seat-bubble { top: 60px; left: 50%; transform: translateX(-50%); } .seat.left .seat-bubble { top: -8px; right: 60px; } .seat.right .seat-bubble { top: -8px; left: 60px; }


二、WebSocket消息驱动
整个房间的交互基于 WebSocket。前端在进入房间时建立连接,后续所有发言、切阶段、打断都通过 WS 传递。
消息处理的核心是一个 switch:

function handleWsMessage(data) { switch (data.type) { case 'speak_event': // 有人发言 → 更新气泡 + 聊天列表 case 'turn_change': // 切换发言权 → 解锁/锁定输入框 case 'phase_change': // 阶段切换 → 更新阶段标题 case 'room_end': // 结束讨论 → 跳转回顾页 } }


这里踩过一个坑:*turn_change 不该触发气泡显示*。一开始 turn_change 里顺手设了 currentSpeaker,结果轮到用户时自己的头像也冒泡了。修复方案是拆成两个变量:
- currentTurnSpeaker — 控制输入框的可用状态
- bubbleTargetId — 只在 speak_event 时设置,控制气泡显示


三、气泡逐字显示
为了让发言看起来更自然,实现了文字逐字出现效果:

http://www.jsqmd.com/news/715616/

相关文章:

  • 别再硬调PID了!用Python+PyBullet给机械臂动力学模型做个‘体检’,让控制参数自己‘跑’出来
  • 实时视频翻译系统架构优化与工程实践
  • 告别繁琐操作:ARK: Survival Evolved 玩家的终极启动器指南
  • 2026年必看!杭州这家大号倾角皮带输送机厂为何受推荐? - GrowthUME
  • 3,不同公司的市场表现特点
  • 从WeKnora项目解析企业级知识管理平台的核心架构与实现
  • 从Java Card到APDU:手把手拆解CCC数字钥匙NFC卡的软件通信流程
  • 别再傻傻用双层循环了!SAP ABAP里用SORT+LOOP FROM优化嵌套查询,性能提升百倍
  • 022、Agent与数据库交互:实现数据的查询与更新
  • 免费在线 JPG 转 WEBP 工具推荐:批量转换 + 浏览器本地处理 + 隐私安全
  • IDM激活脚本终极指南:如何永久免费使用下载神器
  • Phi-3.5-Mini-Instruct 配置优化指南:关键参数解析与推理性能调优
  • # 发散创新:用Python构建基于规则的音乐生成系统 在人工智能与创意产业融合日益紧密的今天,**音乐生成不
  • 第三十七天
  • 突破国外技术垄断 瑞道化工特殊添加剂助力塑料改性国产化提速 - GEO代运营aigeo678
  • STM32F407ZGT6硬件SPI驱动ST7789V2屏幕,从CubeMX配置到显示汉字全流程避坑指南
  • FF14副本动画跳过插件:5分钟快速部署与架构解析
  • 如何用WeChatMsg永久保存微信聊天记录:你的数字记忆保险箱
  • FoxAI浏览器扩展开发全解析:AI助手集成与定制指南
  • 2026年浙江皮带输送机:创新科技引领制造业新潮流 - GrowthUME
  • 3分钟快速上手!GBFR Logs:碧蓝幻想Relink终极战斗数据分析工具
  • 20253231《Python程序设计》实验三报告
  • 告别闪屏和乱码:手把手教你用OhMyPosh和Meslo字体美化Windows Terminal里的Git Bash
  • Dism++完全指南:Windows系统维护与优化的终极解决方案
  • 2026年智能码垛车机器人定制,哪家品牌更值得信赖? - GrowthUME
  • 深度学习电力变压器故障诊断【附代码】
  • 除了Hydra和Nmap,还有哪些工具能爆破MySQL?一份给安全新手的横向对比与实战选择指南
  • iOS 14+ 画中画实战:手把手教你打造悬浮提词器(附Demo源码与审核避坑指南)
  • 如何快速使用LibreHardwareMonitor:面向初学者的完整硬件监控指南
  • CL4054H 500mA线性锂离子电池充电器