倒计时器

注意


此页为于 SCP 维基内部使用的“组件”页。用于在其他页面中引用。

未经组件作者或工作人员允许,请勿修改此页的内容。


这是什么

CroquemboucheCroquembouche用在一大堆页面上的一大堆各种各样的CSS“改进”,因为我觉得这样就能使其更容易处理。

该组件做出了很多非常细碎的改动以使得写作体验更加舒服且能够使制作组件/版式更加容易一点(也就是我经常干的事)。它不会对读者来说在视觉上改变页面中的任何东西——这些改动是为作者服务的。

我不期望用了这个组件的文章的翻译版也会用到这个组件,除非那个翻译者也喜欢这个组件而且也想用这个组件之类的。

这个组件可能不会与其它组件或版式冲突,且即使会冲突,也可能不会有什么影响。

用法

在任意维基上:

[[include :scp-wiki:component:croqstyle]]

该组件被设计于与其它组件一同使用,所以-=-是用来隐藏该文档的。在另一个组件内使用时,请确保将该组件放在[[iftags]],这样你的组件的用户就不会强制同样使用 Croq 风格。

相关组件

其它个人自定义组件(只会改变一点点东西):

个人自定义版式(在视觉上有大的变化):

CSS修改

大小合理的脚注

不让脚注达到一百万里那么宽,让你能确实地阅读脚注。

.hovertip { max-width: 400px; }

等宽字体编辑/代码

使编辑文本框内字体等宽,且将所有等宽字文本改为Fira Code,也是个明显很优秀的等宽字字体。

@import url('https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;700&display=swap');
 
:root { --mono-font: "Fira Code", Cousine, monospace; }
#edit-page-textarea, .code pre, .code p, .code, tt, .page-source { font-family: var(--mono-font); }
.code pre * { white-space: pre; }
.code *, .pre * { font-feature-settings: unset; }

电传打字机背景

给<tt>元素加上亮灰色的背景({{文本}}),使得代码片段更为突出。

tt {
  background-color: var(--swatch-something-bhl-idk-will-fix-later, #f4f4f4);
  font-size: 85%;
  padding: 0.2em 0.4em;
  margin: 0;
  border-radius: 6px;
}

不要大脸

禁用悬停于某人的头像的时候出现的大图片,因为这图片又蠢又真的很烦人,想看大头像版本的话直接点击一下就行了。

.avatar-hover { display: none !important; }

碎裂碎裂

任何在带有nobreak类的div中的文本可以在字母间自动换行。

.nobreak { word-break: break-all; }

代码颜色

将我终端中的代码颜色加为变量。可能我会在什么时候把它改成比如Monokai或者别的更加常见的终端主题,但是现在暂时这还是我的个人主题,是从Tomorrow Night Eighties中衍生而来的。

还有,将.terminal类像[[div class="code terminal"]]一样添加到假代码方块中可以让它有一个有点伪终端样的暗色背景。不能用在[[code]]中,因为Wikidot嵌入了一大堆语法来使其高亮,不用一大堆CSS是改不动的。只能用在非[[code]]的代码片段中。

:root {
  --c-bg: #393939;
  --c-syntax: #e0e0e0;
  --c-comment: #999999;
  --c-error: #f2777a;
  --c-value: #f99157;
  --c-symbol: #ffcc66;
  --c-string: #99cc99;
  --c-operator: #66cccc;
  --c-builtin: #70a7df;
  --c-keyword: #cc99cc;
}
 
.terminal, .terminal > .code {
  color: var(--c-syntax);
  background: var(--c-bg);
  border: 0.4rem solid var(--c-comment);
  border-radius: 1rem;
}

调试模式

将位于.debug-mode中的任何东西周围画上线。线的颜色是红色的但是遵从CSS变量--debug-colour

你还可以将div.debug-info.overdiv.debug-info.under添加到某个元素中以给调试框加注释——虽然你得确保有留下足够的垂直空间,让注释不会与其上方或下方的东西重叠。

……就像这样!

.debug-mode, .debug-mode *, .debug-mode *::before, .debug-mode *::after {
  outline: 1px solid var(--debug-colour, red);
  position: relative;
}
.debug-info {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  font-family: 'Fira Code', monospace;
  font-size: 1rem;
  white-space: nowrap;
}
.debug-info.over { top: -2.5rem; }
.debug-info.under { bottom: -2.5rem; }
.debug-info p { margin: 0; }

这是一个会显示倒计时器的组件。给它一个时间戳它就会倒计时到那个时刻。

演示

更多展示例:https://scp-sandbox-3.wikidot.com/demo:countdown-timer

用法

将以下代码放在页面里:

[[include :scp-wiki-cn:component:countdown
| timestamp = 1752897600
| format = DDd HH:MM:SS
| text_when_elapsed = Timer ended.
| css =
.countdown {
font-size: 2em;
font-weight: bold;
text-align: center;
}
]]

支持以下参数。如果你省略了一个可选设置,那么它将会使用其默认值。

timestamp 需计时至的时刻,形式为UNIX时间戳。
或者,一个以英文逗号分隔的UNIX时间戳列表。
或者,一个表达式(参见下方)。
format
(可选)
计时器的输出格式。可应用自定义HTML。
占位符WWDDHHMM以及SS将在倒计时中被替换为周数/日数/小时数/分钟数/秒数。
默认值:HH:MM:SS
text_when_elapsed
(可选)
在时间走完后计时器停止倒数时显示的文本。可应用自定义HTML。
默认值:00:00:00 (你的格式下所有数值达到0时的内容)
css
(可选)
用来为组件内部的iframe添加样式的CSS。若要为外部添加样式,请使用通常的CSS模块。

例如:在应用暗色版式的页面中,可以尝试 .countdown { color: white }

在倒计时器永久结束计时后,其内容将几乎保持静态,倒计时功能也不再可用。在你方便时,你应当从页面上移除本倒计时器并以正常内容替换。

选择一个时间戳

该组件使用UNIX时间戳,也即自UTC时间1970年起经过的秒数。一个给定的UNIX时间戳对所有人都意味着相同的时间,无论人们在世界上所处的位置如何——不需要处理时区与本地化了。

例如:

  • 1767225600 - 倒数至UTC 2026元旦午夜,
  • 1863561600 - 倒数至UTC 2029-01-20午夜

有很多免费资源可以得到你脑中的截止时间所对应的UNIX时间戳,比如https://www.unixtimestamp.com/

如果你真的需要时区本地化,我们有这个功能的组件:时区转换器

时间戳列表

你可以传入一个以逗号分隔开的时间戳列表。组件将选择第一个不在过去的时间。

在当前时间达到该时间戳时,计时器将停止。它不会自动跳至列表中的下一个时间戳,而是展示text_when_elapsed的内容。在该页面下次加载时它将开始向列表中的下一个时间戳倒数。

时间戳表达式

假使你需要一个自适应的倒计时,例如:不断重复,或取决于页面加载时的时间,你可提供一表达式而非固定的时间戳。

表达式中,字母“t”将被替换为页面加载完成时的时间戳,余下部分被传至Javascript的计算中。输出必须为需要倒计时至的另一个时间戳。
例如:

  • t + 60 - 自页面加载完成后倒数60秒
  • t - (t % 60) + 60 - 倒计时至下一个整分钟时。(就是把当前的时间戳,减去其本身对60取余之结果以向下取整至一个分钟开始处。这将返回一个处于过去的时间戳,故而加60将之推向未来)
  • t - (t % 3600) + 3600 - 倒计时至下一个整点时
  • Math.floor(t / 86400) * 86400 + 86400 - 倒计时至UTC午夜
  • Math.floor(t / 86400) * 86400 + 86400 + 21600 - 倒计时至UTC6点

除非你是天才,试图理解这里的算术要花一点时间。我每次看到它的时候就会花上一点时间。

CSS结构

就CSS改变样式而言,这就是iframe里内容的结构。检查页面源代码以获取全部细节。

<div class="countdown">
<span class="timer timer--active">00:00:00</span>

<!-- 只在计时器停止时显示 -->
<span class="timer timer--elapsed">Timer ended.</span>
</div>

iframe本身位于带有类.countdown-wrapper的div之中。

进阶CSS

你可以使用CSS在计时器停止时令页面发生变化。选择器.countdown-wrapper:has(iframe[style*=".01px"])会匹配一个已结束的倒计时。在展示页上有个例子。

无障碍

构建本倒计时器时已考虑到对无障碍性之最佳实践。使用本组件前考虑先阅读下文,这样你就不会因为做了蠢事搞砸我完美的造物。

太长不看:避免在读者仍在阅读时使用本组件移除内容,因为这将造成含障碍的体验。

ARIA属性:

  • 本计时器使用了ARIA角色"timer",这代表它对于屏幕阅读器用户而言是计时器但无需随着计时器每秒变换时重复将其读出。
  • 当计时器结束倒计时时,它使用aria-live="polite"以在一段时间的静默后彬彬有礼地向屏幕阅读器用户宣读你的text_when_elapsed——只要这段文字不是形如“00:00:00”就会被读出。

遵从WCAG 2.2

  • 成功标准2.2.1 定时可调(A级):若该计时器被用于与一真实事件同步(例如:竞赛结束,系列文章发布),则此要求被免除。若该计时器被用于在读者继续阅读前人为延迟之,则该行为违背了指南之字面意义而未违反其精神,因其意图为给予用户足够时间以完成一行为,并且用户在计时终止后便可继续阅读。若你将本计时器用于在读者有完整阅读之可能前移除内容,则违反了本指南。
  • 成功标准2.2.2 暂停,停止,隐藏(A级):在悬停或获得焦点时,应显示一个可通过点击或键盘交互暂停计时器的按钮。
  • 成功标准2.2.3 无定时(AAA级):只要该计时器不被用于自用户处移除内容,这被视为可行的。若该组件被用于设定一个时间限制而非只是倒计时至某一时刻,则不适用此条。
  • 成功标准2.3.2 闪烁三次 (AAA级):即便含有大号的花哨字体,该计时器每秒最多闪烁一次,低于最大阈值(每秒三次闪烁)。
除非特别注明,本页内容采用以下授权方式: Creative Commons Attribution-ShareAlike 3.0 License