FastComments.com

FastComments 图像聊天功能通过允许用户在图像的任意位置单击来创建讨论点,从而实现对图像的交互式讨论。用户可以点击图像的特定部分来就这些区域发起对话,并创建显示讨论位置的可视标记。

此功能非常适合用于设计反馈、产品评论、带有图示的教学材料、含评论的照片图库,以及任何需要将上下文讨论锚定到特定图像位置的场景。

响应式设计 Internal Link

Percentage-Based Positioning

Image Chat 使用基于百分比的坐标来定位图像上的聊天标记,而不是像素坐标。当用户点击图像时,小部件会将点击的像素坐标转换为图像宽度和高度的百分比。这种方法可确保无论图像如何显示,标记都保持在正确的位置。

例如,如果用户在一个宽度为 1000px 的图像上从左边缘向右点击 250 像素,小部件会将此存储为距左侧 25%。当另一个用户在移动设备上以 500px 宽查看同一图像时,标记会显示在距左侧 125 像素的位置,这仍然是宽度的 25%。

Benefits for Responsive Layouts

该百分比系统使 Image Chat 能在所有设备大小和方向上无缝工作。根据屏幕宽度、CSS 规则或容器约束,你的图像可能以不同尺寸显示,但标记始终与预期位置对齐。

在大型显示器的桌面电脑上的用户,会在与智能手机小屏幕用户相同的相对位置看到标记。标记会随着图像本身按比例缩放。

Image Scaling and Aspect Ratio

只要你的图像在缩放时保持纵横比(这是浏览器的默认行为),基于百分比的标记将保持完美对齐。小部件假定图像按比例缩放并基于此假设计算位置。

如果你应用会扭曲图像纵横比的 CSS(例如使用 object-fit: cover 并设置特定尺寸),标记位置可能无法正确对齐。为了获得最佳效果,允许图像自然缩放或使用 object-fit: contain 来保持纵横比。

Chat Square Sizing

聊天标记的视觉大小也是基于百分比的。chatSquarePercentage 配置选项的默认值为 5%,意味着每个方块为图像宽度的 5%。这能确保在不同图像大小下视觉权重的一致性。

在宽度为 1000px 的图像上,使用默认的 5% 设置时,标记为 50px 的方块。在宽度为 500px 的图像上,相同的标记为 25px 的方块。它们始终与图像大小成比例。

Mobile Behavior

在宽度小于 768px 的屏幕上,Image Chat 会切换到为移动设备优化的布局。聊天窗口会全屏打开,而不是浮动在标记旁边。这在小屏幕上更易用,因为浮动窗口会遮挡过多图像内容。

标记本身仍然可见并可在其基于百分比的位置被点击。用户仍然可以看到所有讨论的位置并点击标记以打开全屏聊天界面。

Dynamic Image Loading

即使图像是异步加载或在页面加载后改变大小,基于百分比的系统仍能正常工作。小部件会监控图像元素并在图像尺寸发生变化时重新计算标记位置。

如果你正在进行懒加载图像或在不同断点使用不同尺寸的响应式图像,当图像尺寸改变时,标记会自动调整。

Cross-Device Consistency

由于坐标以百分比形式存储在数据库中,桌面电脑上创建的讨论在平板或手机上查看时会出现在完全相同的相对位置。用户可以跨设备协作而不会出现位置不一致的情况。

这也是双向有效的。在移动设备上通过点击特定位置创建的讨论,在大屏幕桌面显示器上查看时会出现在相同的相对位置。

Viewport Considerations

小部件计算的百分比是相对于图像元素本身,而不是视口。这意味着页面滚动或更改浏览器窗口大小不会影响标记位置。无论视口如何变化,标记都固定在图像上的位置。

Future-Proofing Content

基于百分比的方法使你的图像讨论对布局、设计或设备生态系统的变化具有弹性。随着新的屏幕尺寸和设备的出现,现有的讨论将继续正确显示,而无需任何更新或迁移。

自定义 Internal Link

深色模式支持

Image Chat 包含内置的深色模式支持。当您在配置中将 hasDarkBackground: true 设置为 true 时,聊天窗口和 UI 元素会自动调整以适应深色背景。

FastCommentsImageChat(imageElement, {
    tenantId: 'demo',
    hasDarkBackground: true
});

深色模式样式适用于聊天窗口、标记方块和所有交互元素。如果您站点有深色模式切换,可以在模式更改时重新初始化小部件,或者使用下面描述的 body class 方法。

动态深色模式

如果您站点的深色模式是通过向 body 元素添加 .dark 类来控制的,Image Chat UI 会自动响应这一点,而无需重新初始化。该小部件的样式设计为会对该类的存在作出响应。

/* 您的深色模式 CSS */
body.dark {
    background: #1a1a1a;
    color: #ffffff;
}

使用 CSS 的自定义样式

您可以使用 CSS 自定义标记、聊天窗口和其他元素的外观。该小部件会添加特定的类,您可以在样式表中针对这些类进行样式设置。

聊天方块和窗口使用 FastComments 的评论气泡样式系统,因此您对标准评论小部件所做的任何自定义也会影响 Image Chat。

聊天方块大小

chatSquarePercentage 选项控制可点击标记的大小。默认是图像宽度的 5%:

FastCommentsImageChat(imageElement, {
    tenantId: 'demo',
    chatSquarePercentage: 7  // 更大、更醒目的方块
});

较小的值会创建更细微的标记,使其更融合于图像。较大的值会使标记更突出、更容易点击,尤其是在移动设备上或为了无障碍目的。

移动端行为

在宽度小于 768px 的屏幕上,Image Chat 会自动切换到移动优化布局。聊天窗口将以全屏方式出现,而不是在标记旁浮动,从而在小屏幕上提供更好的可用性。

标记仍会在图像上的响应位置可见。用户可以点击任何标记以打开全屏聊天界面。此行为为内置功能,无需任何配置。

聊天窗口外观

在桌面端,聊天窗口宽度为 300px,并有一个指向标记的 16px 箭头。窗口会根据可用视口空间自动定位,使用类似 to-rightto-leftto-topto-bottom 的定位类。

您可以添加自定义 CSS 来调整这些窗口的颜色、字体、间距或其他视觉属性。聊天窗口使用与标准 FastComments 小部件相同的组件结构,因此它们会继承您应用的任何全局自定义。

惰性初始化

聊天窗口在桌面用户悬停时或在创建时立即初始化。这通过仅在用户实际与标记交互时才渲染聊天界面来减少初始加载开销。

惰性初始化是透明进行的。用户不会注意到任何延迟,但如果图像上有许多标记,浏览器就不需要渲染几十个隐藏的聊天窗口。

本地化

Image Chat 支持与标准 FastComments 小部件相同的所有本地化选项。设置 locale 选项以在不同语言中显示 UI 文本:

FastCommentsImageChat(imageElement, {
    tenantId: 'demo',
    locale: 'fr'  // 法语
});

FastComments 支持多种语言。locale 设置会影响所有 UI 文本,包括提示、按钮和占位符文本。

继承的自定义选项

由于 Image Chat 扩展了标准评论小部件,它继承了基础小部件的所有自定义选项。这包括自定义 CSS 类、自定义翻译、头像自定义、日期格式化等更多内容。

请参阅 FastComments 的主要自定义文档,以查看可用的完整自定义选项列表。

使用自定义字体

如果您的站点使用自定义字体,Image Chat UI 将从页面的 CSS 中继承这些字体。聊天窗口在您的页面 DOM 中渲染,并遵循您现有的排版设置。

为获得最佳效果,请确保在初始化 Image Chat 之前加载好自定义字体,或者接受在字体加载期间可能会有短暂的无样式文本闪烁。

标记的视觉设计

方形标记具有细微的视觉设计,使其在不压倒图像的情况下仍然显眼。如果您想要不同的视觉处理,可以使用 CSS 自定义它们的外观。

标记包含悬停状态,当用户将鼠标移动到其上方时会提供反馈。在触摸设备上,点击交互会通过打开聊天窗口提供即时反馈。


实时同步 Internal Link

实时更新

Image Chat 使用 WebSocket 连接在所有已连接用户之间实时同步所有对话。当有人创建新的标记、添加评论或删除讨论时,所有正在查看同一图像的其他用户会立即看到更新,无需刷新。

WebSocket 同步如何工作

当您初始化 Image Chat 时,组件会与 FastComments 服务器建立 WebSocket 连接。此连接在用户会话期间保持打开,并侦听与当前图像相关的更新。

WebSocket 系统为 Image Chat 使用三种类型的广播消息。当有人在图像上创建新标记时,会触发 new-image-chat 事件。当有人更新现有对话时,会触发 image-chat-updated 事件。当有人删除标记时,会触发 deleted-image-chat 事件。

广播 ID 系统

为防止回声效应(用户看到自己操作被广播回自己),每个更新都包含唯一的 broadcastId。当用户创建或更新标记时,客户端会为该操作生成一个 UUID。当 WebSocket 将更新广播回所有客户端时,发起操作的客户端会忽略该更新,因为它与自身的 broadcastId 相匹配。

这确保了流畅的交互:用户在界面上立即看到自己的更改,而无需等待通过服务器的往返,同时仍能确保所有其他用户接收到该更新。

连接弹性

如果因网络问题或服务器维护导致 WebSocket 连接中断,组件会自动尝试重新连接。在重连期间,用户仍然可以与现有标记交互,但他们在连接重新建立之前不会看到其他用户的实时更新。

一旦重新连接,组件会重新同步以确保没有错过任何更新。此过程是透明的,不需要用户干预。

带宽考量

WebSocket 消息轻量且仅包含同步状态所需的必要信息。创建新标记通常使用的带宽小于 1KB。该系统还包括智能批处理,以在高活动期间减少消息频率。

您在 FastComments 仪表板中的使用统计会跟踪 pubSubMessageCountpubSubBandwidth,以便您监控跨站点的实时同步活动。

跨标签页同步

如果用户在多个浏览器标签页中打开同一页面,一个标签页中的更新会立即出现在其他标签页中。这通过相同的 WebSocket 同步机制实现,无需任何额外配置。

用户可以在多台设备上同时打开您的站点,所有设备都会保持同步。如果两台设备都在查看同一图像,在桌面上创建的标记会立即出现在用户的平板上。

安全

WebSocket 消息通过安全连接(WSS)传输,并包含租户验证,以确保用户仅接收其有权查看的对话更新。服务器在广播之前会验证所有操作,以防止未授权的访问或篡改。

离线行为

当用户完全离线时,他们仍然可以查看现有标记,但无法创建新标记或查看他人的更新。组件会检测离线状态并显示适当的提示信息。

如果用户在离线时尝试创建标记然后重新上线,该操作将失败而不是排队,从而确保数据一致性。用户应在连接恢复后重试该操作。

性能影响

WebSocket 连接对性能的影响最小。当没有更新发生时,连接保持空闲,只有在发生活动时才处理消息。在具有中等标记活动的典型图像上,WebSocket 使用的 CPU 通常比渲染图像本身要少。

对于同时有数百名用户且标记创建活动频繁的页面,系统会进行水平扩展以保持性能,而不会影响单个客户端连接。

协作使用场景

实时同步使 Image Chat 对协作工作流特别强大。设计团队可以一起审查模型草图,所有人实时看到标记的位置。客户支持团队可以协同注释屏幕截图以识别问题。教学小组可以讨论图表,所有参与者在标记创建时都能看到彼此的标记。

即时反馈相比传统评论系统(用户需要刷新才能看到更新)创造了更具吸引力和更高产的协作体验。


有问题吗?

这就是 FastComments Image Chat 的全部内容!如果您有任何问题、在实现上需要帮助,或有功能建议,请在下方告诉我们或联系支持团队。

在我们的演示页面查看实时演示,亲眼看到 Image Chat 的实际运行效果。