2.4 KiB
2.4 KiB
聊天气泡图片预览经验总结
更新日期:2026-05-17
背景
聊天抽屉里的用户图片最初沿用了粗橙色外框和局部预览逻辑,结果出现两个问题:
- 视觉上太重,和抽屉整体的轻量信息流不一致。
- 图片在气泡里容易被裁切,用户看不到完整内容。
这类问题不要只改 CSS。只要预览器还散落在气泡内部,后续就很容易继续出现实例重复、交互不统一、内存负担变大等问题。
架构变更
这次把链路收成了两层:
UserMessageBubble只负责识别图片和上抛点击事件。ChatMessagesArea统一持有UnifiedMediaViewer,负责真正打开预览。
这样做的好处是:
- 预览器只保留一份实例,不会每条消息都挂一个。
- 图片点击、关闭、切换索引都在消息列表层统一处理。
- 气泡组件重新回到“纯展示 + 事件上抛”的职责。
交互经验
- 图片展示用
object-fit: contain,优先保证完整可见。 - 图片预览入口用单击,比双击更贴近用户直觉。
- 图片区域用 pointer cursor,语义上直接告诉用户“这里能打开预览”。
- 图片节点禁止拖拽,避免和单击预览冲突。
视觉经验
- 用户消息不再使用粗橙渐变外框,改成更轻的中性色边框和阴影。
- 图片和文本的视觉层次要分开,图片负责内容本体,文本负责输入信息。
- 选择态、hover 态都要克制,不要让一个轻量聊天气泡看起来像大卡片。
经验规则
- 图片预览器尽量放在列表层或页面层统一管理,不要塞进单条消息内部。
- 图片默认以完整显示优先,裁切只应是明确的产品选择。
- 图片交互语义要单一,单击负责打开预览,别再叠加多套入口。
- 气泡组件只保留事件和内容解析,不承担全局预览状态。
验证结果
UserMessageBubble.test.tsx通过。ChatMessagesArea.test.tsx通过。tsc -p packages/drawnix/tsconfig.json --noEmit通过。
相关文件
packages/drawnix/src/components/chat-drawer/UserMessageBubble.tsxpackages/drawnix/src/components/chat-drawer/ChatMessagesArea.tsxpackages/drawnix/src/components/chat-drawer/user-message-bubble.scsspackages/drawnix/src/components/chat-drawer/__tests__/UserMessageBubble.test.tsxpackages/drawnix/src/components/chat-drawer/__tests__/ChatMessagesArea.test.tsx