Prism 的主题部分和做代码分析的部分,实际上是分开。
从文件上看,能简单理解为:
- JS 部分会负责整理识别各语言,整理并将内部的代码进行分类,打上对应的标签。
- CSS部分负责染色
既然染色部分是独立的,那么自然也可以实现黑暗模式的颜色切换了。
⚠️使用 AI 得到的糟糕方案#
由于并没有修改 Prism 的经验,所以在询问 GPT 后得到了一个令人_匪夷所思_的答案:
之所以说的上是匪夷所思,是因为这个方案的核心思想,使用不同的 schema,然后监听对应的时间切换,来实现。这个方案看起来实现倒是简单,但是小问题非常多:
- 每次进行切换的时候,由于时间的延后,以及需要重新加载 CSS,所以代码框的绘制永远是延后的。
- 这个方案默认是监听
prefers-color-schema
这个系统事件的,对于一些通过修改 html 属性的手动切换,代码的侵入性实在是过大。
这个方案,在最后不得不废弃。
重写 CSS#
尽管这个说起来十分简单,但是不知道为什么,在网上并没有找到现成可以用的相关代码(可能大家都没兴趣?)
在多方查阅后,某个 Codepen 提供的代码改动给了我一些启发。并完成了如下的内容:
这段代码主要还是通过声明具体的 class 的颜色为CSS变量来实现的。通过监听html 标签中data-theme
属性是否为dark
来判断当前使用的主题颜色。
这个方案是本站目前正在使用的方案,相比重新加载 CSS 会有更好的性能和显示效果。