EN
展现形式 · 概念

Countdown Timer:倒计时

说明 Countdown Timer 倒计时作为高风险展现的使用条件:必须与折扣和预售的真实截止规则共用同一时间源,禁止循环重置的假倒计时,并覆盖时区、到期状态、读屏播报、减少动态与合规确认。

Countdown Timer 显示距离某个截止时刻的剩余时间。它是高风险展现:倒计时本身不说明任何事实,它只是把一个「截止时刻」变成压力,所以只有该时刻真实存在并被系统执行时才能使用。与 Timeline 的区别是:Timeline 按顺序展示已知事件,Countdown 只对一个未来时刻制造时间压力。

适合与不适合

适合结束时间明确且由系统强制执行的场景:折扣到期、预售截止、活动预约开放。不适合没有真实截止、会因库存补货或同价再次上线而继续存在的优惠,也不适合「为每位访客单独计时」,除非系统确实为该访客保留了库存或价格并会到点释放。多数场景下,静态的「10 月 1 日 23:59(UTC+8)结束」比动态倒计时更安全,也更易读。

与相邻模式的区别

模式判据
Countdown Timer动态呈现剩余时长,持续更新
Badge静态状态,如「限时」;没有更新,也不施压
Banner承载活动规则与行动;可以包含倒计时,但活动信息以促销内容为准
Timeline多个事件的顺序,无截止压力

优点与缺点

优点缺点
在真实截止前明确传达时间边界一旦与真实规则不一致,即成为误导
可以减少「不知道何时结束」的不确定持续更新带来无障碍与性能负担
与自动折扣的结束时间可以共用数据对不同时区、缓存与到期后状态要求高

真实性要求(红线)

  1. 同一时间源:倒计时读取的截止时刻,必须与折扣或预售的实际结束规则是同一份数据,不得在页面上另设一个手写的结束时间。Shopify 折扣的起止时间按后台所选时区计算(Shopify 帮助中心 Amount off 页,核验于 2026-09-29);促销规则以促销与折扣为准,购物车结果以促销兑现为准。
  2. 不使用客户端时钟作为真值:访客本机时间可能不准。可行的设计是用一个未缓存请求的响应 Date 头(MDN:GMT 时间)估计与服务端的偏移,再据此换算;这是设计建议,尚未在真实店铺验证。Liquid 的 date 过滤器对 'now' 输出的是页面最近一次渲染的时间,可能因缓存而不随访问更新(shopify.dev,核验于 2026-09-29),所以不要在 Liquid 里算剩余时间。
  3. 不得循环重置:到点后重新开始,或每次刷新都从固定时长重启,都属于虚假倒计时。FTC 2022 年 Dark Patterns 报告把「Baseless Countdown Timer」定义为显示一个到时会消失或重置的假倒计时,并把「没有截止期限,或只有到点即重置的无意义截止期限」的限时说法列为「False Limited Time Message」。
  4. 不把持续优惠说成限时:欧盟 UCPD Annex I 第 7 项禁止虚假声称商品只在极短时间内可得,以促使消费者立刻决定。欧盟委员会 2021/C 526 指南把「假计时器与有限库存声明」作为该项的例子,并在旅游行业的案例段落中写明,只有优惠此后不再以同一价格提供时才应呈现为限时(该表述出自行业案例,用于其他行业属类推)。
  5. 与价格陈述一致:倒计时常伴随「原价」比较。16 CFR 233.1 与 Price Indication Directive 第 6a 条对前价的要求见 Badge。

以上是对官方文本的转述。各市场的适用范围、其他国家与地区的规则,需要法务或合规确认。

内容与交互要求

  • 绝对时间始终可读:显示带时区的截止时刻,并用 <time datetime="…"> 提供机器可读值(MDN:time 只表示时间点或时长,不会自己倒计时)。
  • 时区与市场:写明时区;跨市场活动确认各市场是否同时结束。各市场的折扣可用范围未核验。
  • 只服务一个活动:不叠加多个计时器。
  • 不用负面措辞施压:文案只陈述事实。
  • 预售截止:来源是销售计划或下单窗口,不是折扣,发货时间需另行标明,不能借倒计时暗示未验证的时效。

响应式与无障碍

  • 不逐秒朗读:MDN 说明 role="timer" 隐含 aria-live="off",辅助技术不会播报其更新。默认让它保持静默。需要提醒时,只在少数关键节点用 role="status"(WCAG 4.1.3 Status Messages)播报一次;MDN 提示 assertive 只在必须打断时使用,倒计时通常不满足。live region 需在内容更新前已存在于 DOM。
  • 自动更新的控制:WCAG 2.2.2 Pause, Stop, Hide(A)要求,自动开始并与其他内容并行的自动更新信息,提供暂停、停止、隐藏,或控制更新频率的机制,除非自动更新是必要的。倒计时符合该页对自动更新信息的描述(按预设时间间隔更新)。降低刷新粒度(远离截止时按分钟或小时,最后阶段才到秒)并允许隐藏,是较稳妥的做法;「必要」例外是否成立需具体判断。
  • 时限:WCAG 2.2.1 Timing Adjustable(A)针对限制用户完成操作的时限,理解页把「让用户响应的机会窗口到期」算作时限。购物车保留、结账保留这类倒计时更可能落入该准则,需要提供延长、调整等机制或确认适用例外;纯营销截止是否适用,需无障碍与合规确认。
  • 减少动态:prefers-reduced-motion: reduce 表示用户希望减少或移除动画。此时数字直接替换,不做翻页、缩放或闪烁。
  • 不靠颜色:紧迫感的红色不能是唯一信息,文字对比度见 Badge。

状态与退化

状态处理
未开始显示开始时间;预热倒计时同样要求真实
进行中显示剩余时长与绝对截止时间
已结束撤下计时器与入口,改为「活动已结束」或直接移除;同步撤下相关文案与缓存页面
已加入购物车后到期以平台结算结果为准;到期前已加购的优惠在结账时的行为未核验,需实测
时钟偏差过大或数据缺失隐藏倒计时,保留静态截止文案,不显示 00:00:00 或 NaN
无 JavaScript服务端输出同一时间戳生成的静态截止文案
多个活动只显示与当前购物车相关的一个

常承载的内容与模块

内容来自促销与折扣与核心主张(后者要求检查倒计时是否真实结束);模块上与促销兑现相邻。金额核对见金额排查。Shopify 主题是否有原生倒计时组件、第三方应用是否读取折扣结束时间,均未核验。

发布前检查

  • 截止时刻是否与折扣配置或预售规则同源,而非另填?
  • 刷新、到点、清缓存后是否都不会重置?
  • 到期后折扣、页面与倒计时是否同时失效?
  • 是否有带时区的绝对时间,且不逐秒朗读?
  • 减少动态与无 JavaScript 是否已验证?
  • 相关声明是否已经过法务或合规确认?

固定版本主题实现

固定基线为 Dawn v15.3.0 与 Horizon 4.2.0;结论限于这两个提交,均为静态源码分析,未运行验证。

待继续完善

  • 未在真实店铺验证折扣到期、购物车与结账的行为差异。
  • 未核对 Shopify Markets 下不同市场的折扣可用范围与结束时间。
  • 各国其他法规(除 FTC 与欧盟文本外)未核对,需要合规确认。
  • 「必要」例外在 2.2.2 中的适用尚无统一判断。