00:00 / 00:00

LAPLACE Chat

範本

目前 LAPLACE Chat 提供三種範本載入方式:

  • 內建範本:由本站作者與第三方作者提供的內建免費範本,可滿足絕大多數的使用情境
  • 遠端範本:由第三方作者提供的遠端範本,可滿足主播的客製化需求
  • 進階 CSS 編輯器(自訂 CSS 樣式):由開發者或主播自行撰寫的 CSS 樣式,可滿足任意樣式客製需求

雲端載入(僅限內建範本)

當您開啟本選項時,將會從本站內建的雲端載入範本,此功能具有下列特性:

  • 您不需要再於 OBS 中貼上冗長的 CSS 樣式,樣式將始終保持在最新狀態
  • 同時支援雲端範本與自訂 CSS 樣式,樣式之間不會衝突,自訂 CSS 樣式將總是覆寫雲端載入的樣式
  • 此選項可用來解決部分主播不會設定樣式的問題,以及彈幕機更新導致樣式失效後無法即時更新樣式的問題
  • 解決個別第三方推流程式(例如嗶哩嗶哩直播姬)無法載入較長自訂 CSS 的問題

此功能於 Apr 21, 2025 上線

遠端範本

當您開啟本選項時,將會從您提供的 URL 拉取可用的 CSS 樣式。此特性可方便開發者與設計師為 LAPLACE Chat 提供遠端交付的 CSS 樣式

測試範本:https://rsrc.laplace.cn/assets/bubble-alt.css

此功能於 Apr 22, 2025 上線

進階 CSS 編輯器(自訂 CSS 樣式)

最傳統的範本客製方式,您可以在這裡撰寫任意的 CSS 樣式,然後將其複製到 OBS 中即可套用範本,此功能具有下列特性:

  • 當您在設定器中載入某個內建範本時,該範本的完整 CSS 程式碼會載入到 CSS 編輯器中,您可以在此編輯此範本並取得即時預覽
  • 如果您啟用了「雲端載入」功能,此時 CSS 編輯器中的內容為參考樣式,您可以刪除其中大部分內容,僅保留您需要覆寫的 CSS 樣式,然後將其複製到 OBS 的「自訂 CSS」中,即可覆寫雲端範本的樣式

範本優先順序

LAPLACE Chat 的範本優先順序按照下列順序 從低到高 排列:

  1. @layer template - 雲端載入(內建範本)
  2. @layer remote-css - 遠端範本
  3. @layer custom-css - 進階 CSS 編輯器(自訂 CSS 樣式)

當開發者依照上述規範撰寫層疊層樣式時,自訂 CSS 將總是覆寫遠端範本的樣式;遠端範本將總是覆寫雲端載入的範本。三種載入方式可以同時存在

因此,利用此特性,您可以達成:

  • 透過雲端載入一款您喜歡的內建範本
  • 以遠端載入他人基於此範本修改的二創樣式
  • 在自訂 CSS 中加入您自訂的樣式

關於層疊層的詳細用法,可參考 MDN 文件

開發者:如何交付遠端範本

身為開發者,如果您需要遠端交付範本,則需要滿足下列幾個條件:

  • 您需要提供一個可用的 CSS 檔案,並且可以穩定地透過 HTTPS 存取
  • CSS 的內容與您直接在設定器中編輯的自訂 CSS 相同,不需要額外的格式
  • 在樣式中使用 @layer remote-css 層疊層,可更好地相容範本的優先順序
  • CSS 檔案大小小於 1024 KB(圖片素材不計入)
  • 放行所有來自 Cloudflare Workers 的 IP。通常來說不需要額外設定,如果您需要以白名單放行,請參考 Cloudflare IP Ranges
  • 放行所有來自 LAPLACE-Chat/* CSS-Preprocessor 的 User Agent 請求(例如 LAPLACE-Chat/1.0.1 CSS-Preprocessor)。通常來說不需要額外設定
  • CSS 中的圖片素材需要可透過 HTTPS 存取,並放行來自彈幕機的 CORS 請求
  • 建議使用境外的伺服器儲存,檔案放在中國大陸可能反而會很慢

範本中繼資料

遠端範本支援新特性「中繼資料」,您可以在 CSS 檔案的最上方定義中繼資料,為使用者展示範本的詳細資訊,規範:

/*
  @title        必填:模版标题
  @author       必填:作者
  @description  选填:模版描述
  @updated      选填(建议填写):May 10, 2025, 1:39:30 AM PDT
  @version      选填:版本,建议使用 semver。例如 1.0.0
  @thumbnail    选填:预览图,建议尺寸 240×192px 的倍数。完整的 HTTPS 链接。例如 https://rsrc.laplace.cn/assets/chat-templates/thumbnails/laplace.png
*/

完整範例(順序不影響):

/*
  @title        气泡样式(魔改)
  @description  用来测试远程 CSS 的样式
  @author       LAPLACE Chat
  @updated      May 10, 2025, 7:02:13 AM PDT
  @version      1.0.0
  @thumbnail    https://rsrc.laplace.cn/assets/chat-templates/thumbnails/laplace.png
*/

/* 引入 Google Fonts 字体,理论上国内可以直接访问 */
/* @import 不要嵌套在 @layer 层叠层内 */
@import url('https://fonts.googleapis.com/css2?family=Jost:ital,wght@0,400;0,600;1,400;1,600&display=swap');

/* 模版本身样式,建议嵌套在 remote-css 层叠层内,可以更好的兼容模版优先级 */
@layer remote-css {
  body { background-color: rgba(0, 0, 0, 0); }

  /* 其他样式 */
  ...
}

僅填寫部分欄位的範例:

/*
  @title 气泡样式(魔改)
  @author LAPLACE Chat
  @updated May 10, 2025, 7:02:13 AM PDT
*/

@layer remote-css {
  body { background-color: rgba(0, 0, 0, 0); }

  /* 其他样式 */
  ...
}

此特性於 May 10, 2025 上線

授權驗證

本站不會參與任何與授權、驗證相關的流程,如果您提供的是付費範本,為了防止交付物遭到未經授權的使用,您可能需要自行實作授權驗證以及存取統計等相關邏輯,可能的方案為:

  • 為不同的客戶提供不同的 URL 網址,例如:
    • https://example.com/templates/12345.css
    • https://example.com/templates/67890.css
  • 為不同的客戶提供不同的驗證參數,例如:
    • https://example.com/templates/bubble.css?token=1234567890
    • https://example.com/templates/bubble.css?token=0987654321
  • 只放行來自 LAPLACE-Chat/* CSS-Preprocessor 的 User Agent 請求
  • 只放行來自 Cloudflare Workers 的 IP 的請求

快取策略

  • CSS 預處理器會將範本快取至多 5 分鐘,也就是說,最多每 5 分鐘請求一次站源連結,如果您的範本有大量使用者使用,可以考慮從站源額外增加快取時間,以降低頻寬壓力,通常來說 1 萬使用者以下不需要過多考慮
  • 用戶端透過 ETag 來驗證範本是否更新,預設 Cache-Control 標頭為 30 分鐘

動態效果控制 reduced-motion

可以透過 reduced-motioncan-motion 條件類別名稱來控制事件的動態效果,當事件速率大於特定值時,事件清單將套用全域的 reduced-motion 類別名稱,否則套用 can-motion 類別名稱。此特性可避免彈幕達到一定速率時,動畫效果永遠無法顯示完成而導致可讀性變差等問題

可查看簡約氣泡(復刻)範本中的用例。控制台模式下為增強可讀性,則總是套用 reduced-motion 類別名稱

用例:

.event--message {
  /* 只有当事件出现速率低于弹幕机内置的阈值时,对最后 n+2 条弹幕应用动画 */
  .can-motion &:nth-last-child(-n + 2) {
    animation: slideInFromBar1 ease-out forwards;
    animation-duration: var(--animation-duration);
  }
}

內建配色

LAPLACE Chat 基於 Kladewind 與 OKLCH 色彩空間,提供了更符合人眼視覺的 Scheme-based Color Auto Switching™(簡稱 SCAS)色盤,可依據目前的系統配色自動微調整體明度(在本頁切換配色方案即可查看效果)

所有色盤皆相容 Tailwind CSS 的配色命名方案。您可以使用下方的調色盤快速尋找並複製顏色變數

red

orange

amber

yellow

lime

green

emerald

teal

cyan

sky

blue

indigo

violet

purple

fuchsia

pink

rose

gray

參數

您可以透過下列參數微調 SCAS 色盤在不同情境下的表現:

  • --mix-base:混合基色,預設值為 #fff
  • --mix-factor:混合因子,淺色模式下預設為 100%,深色模式下預設為 75%(即目前主色與混合基色所佔比例中,主色佔比 100%/75%)

使用範例

@layer remote-css {
  [data-theme="dark"] {
    --mix-base: #fffdbf;
    --mix-factor: 50%;
  }

  .event {
    --event-toast-bg-1: color-mix(
      in hsl,
      var(--color-red-900) 60%,
      transparent
    );
    --event-toast-bg-2: color-mix(
      in hsl,
      var(--color-purple-900) 60%,
      transparent
    );
    --event-toast-bg-3: color-mix(
      in hsl,
      var(--color-blue-900) 60%,
      transparent
    );
  }
}

引導範本

身為範本作者,您可以參考下方的範本變數進行設計

最後更新:Sep 20, 2024

/* 引导模版 by LAPLACE Chat */
/*
  🛑本模版为引导模版,包含大多数的 CSS 变量定义,您可在当前模版的基础上通过修改 CSS 对样式进行自定义
  LAPLACE Chat 的编辑器为 VS Code 同款编辑器,支持颜色可视化取色,快捷键也与 VS Code 一致,可直接在编辑器中设计样式
  编辑的内容会自动保存在本地,页面刷新后可自动恢复

  被注释掉的属性可按 ctrl - /(Windows)或者 command - /(macOS)取消注释
 */

/* 引入 Google Fonts 字体,理论上国内可以直接访问 */
/* 更多字形可通过访问 https://fonts.google.com/ 进行挑选 */
@import url("https://fonts.googleapis.com/css2?family=Jost:ital,wght@0,400;0,600;1,400;1,600&display=swap");

/* 请根据实际的载入场景选择使用 remote-css 或 custom-css 层叠层 */
@layer custom-css {
  /* 创建弹幕专用变量 */
  .event {
    /* 以下为平台内置变量 */
    /* 应用全局自定义字体 */
    /* --font-sans 为 LAPLACE Chat 内置变量,可调用非衬线字体 */
    --event-font-family: "Jost", var(--font-sans);

    /* 弹幕文本颜色 */
    /* --event-message-text: red; */
    /* 也可以套用内置变量,该变量会自动根据深色模式自动调整颜色 */
    /* --event-message-color: var(--text-color); */

    /* 在这里重新定义普通弹幕、总督、提督、舰长用户名的文本颜色 */
    --event-username-text-0: #037456;
    --event-username-text-1: rgb(242, 118, 109);
    --event-username-text-2: rgb(185, 81, 220);
    --event-username-text-3: rgb(67, 114, 255);

    /* 弹幕颜色变量 */
    --event-danmaku-text: rgb(0, 0, 0);
    --event-danmaku-text-0: rgb(30, 101, 58);
    --event-danmaku-text-1: rgb(182, 10, 39);
    --event-danmaku-text-2: rgb(123, 16, 111);
    --event-danmaku-text-3: rgb(23, 70, 158);
    --event-danmaku-bg-0: rgba(114, 255, 140, 0.193);
    --event-danmaku-bg-1: rgba(254, 60, 96, 0.13);
    --event-danmaku-bg-2: rgba(248, 97, 246, 0.138);
    --event-danmaku-bg-3: rgba(0, 132, 255, 0.175);
    --event-danmaku-current-rank-text: rgb(0, 0, 0);
    --event-danmaku-current-rank-text-1: rgb(96, 62, 3);
    --event-danmaku-current-rank-text-2: rgb(63, 70, 87);
    --event-danmaku-current-rank-text-3: rgb(101, 54, 20);
    --event-danmaku-current-rank-bg-1: rgb(255, 207, 50);
    --event-danmaku-current-rank-bg-2: rgb(203, 203, 207);
    --event-danmaku-current-rank-bg-3: rgb(233, 180, 147);
    --event-danmaku-mod-text: rgb(102, 105, 185);
    --event-danmaku-streamer-text: rgb(191, 120, 192);

    /* 醒目留言颜色变量 */
    --event-superchat-top-text: #000000;
    --event-superchat-top-text-1: rgb(8, 22, 146);
    --event-superchat-top-text-2: rgb(6, 81, 127);
    --event-superchat-top-text-3: rgb(154, 111, 19);
    --event-superchat-top-text-4: rgb(164, 82, 31);
    --event-superchat-top-text-5: rgb(146, 17, 8);
    --event-superchat-top-text-6: rgb(127, 9, 46);
    --event-superchat-top-bg-1: rgba(16, 67, 255, 0.368);
    --event-superchat-top-bg-2: rgba(16, 167, 255, 0.368);
    --event-superchat-top-bg-3: rgba(255, 235, 16, 0.368);
    --event-superchat-top-bg-4: rgba(255, 124, 16, 0.368);
    --event-superchat-top-bg-5: rgba(255, 40, 16, 0.368);
    --event-superchat-top-bg-6: rgba(255, 16, 64, 0.368);
    --event-superchat-message-text: rgb(255, 255, 255);
    --event-superchat-message-text-1: rgb(225, 234, 255);
    --event-superchat-message-text-2: rgb(225, 252, 255);
    --event-superchat-message-text-3: rgb(255, 251, 225);
    --event-superchat-message-text-4: rgb(255, 237, 225);
    --event-superchat-message-text-5: rgb(255, 226, 225);
    --event-superchat-message-text-6: rgb(255, 221, 229);
    --event-superchat-bg: transparent;
    --event-superchat-bg-1: rgb(48, 42, 209);
    --event-superchat-bg-2: rgb(32, 137, 194);
    --event-superchat-bg-3: rgb(221, 159, 36);
    --event-superchat-bg-4: rgb(209, 117, 42);
    --event-superchat-bg-5: rgb(209, 59, 42);
    --event-superchat-bg-6: rgb(167, 16, 16);

    /* 礼物颜色变量 */
    --event-gift-text: rgb(0, 0, 0);
    --event-gift-text-1: rgb(239, 242, 255);
    --event-gift-text-2: rgb(220, 255, 233);
    --event-gift-text-3: rgb(99, 69, 0);
    --event-gift-text-4: rgb(255, 247, 241);
    --event-gift-text-5: rgb(255, 243, 243);
    --event-gift-text-6: rgb(255, 226, 230);
    --event-gift-bg-1: rgb(55, 126, 224);
    --event-gift-bg-2: rgb(82, 183, 67);
    --event-gift-bg-3: rgb(255, 208, 67);
    --event-gift-bg-4: rgb(255, 145, 41);
    --event-gift-bg-5: rgb(242, 68, 68);
    --event-gift-bg-6: rgb(160, 0, 51);
    --event-gift-normal-text-1: rgb(29, 82, 155);
    --event-gift-normal-text-2: rgb(44, 141, 29);
    --event-gift-normal-text-3: rgb(180, 140, 21);
    --event-gift-normal-text-4: rgb(231, 125, 25);
    --event-gift-normal-text-5: rgb(181, 34, 34);
    --event-gift-normal-text-6: rgb(150, 9, 54);
    --event-gift-normal-bg-1: transparent;
    --event-gift-normal-bg-2: transparent;
    --event-gift-normal-bg-3: transparent;
    --event-gift-normal-bg-4: transparent;
    --event-gift-normal-bg-5: transparent;
    --event-gift-normal-bg-6: transparent;

    /* 舰长颜色变量 */
    --event-toast-text: rgb(0, 0, 0);
    --event-toast-text-1: rgb(140, 0, 0);
    --event-toast-text-2: rgb(118, 18, 152);
    --event-toast-text-3: rgb(0, 56, 146);
    --event-toast-bg-1: rgb(255, 185, 187);
    --event-toast-bg-2: rgb(250, 187, 255);
    --event-toast-bg-3: rgb(192, 216, 255);

    /* MVP(守护圣法师、etc)颜色变量 */
    --event-mvp-text: rgb(0, 0, 0);
    --event-mvp-text-1: rgb(114, 79, 47);
    --event-mvp-text-2: rgb(114, 79, 47);
    --event-mvp-text-3: rgb(114, 79, 47);
    --event-mvp-text-4: rgb(114, 79, 47);
    --event-mvp-text-5: rgb(114, 79, 47);
    --event-mvp-text-6: rgb(114, 79, 47);
    --event-mvp-bg-1: rgb(229, 211, 183);
    --event-mvp-bg-2: rgb(229, 211, 183);
    --event-mvp-bg-3: rgb(229, 211, 183);
    --event-mvp-bg-4: rgb(229, 211, 183);
    --event-mvp-bg-5: rgb(229, 211, 183);
    --event-mvp-bg-6: rgb(229, 211, 183);

    /* 互动颜色变量 */
    --event-interaction-text-enter: rgb(127, 137, 159);
    --event-interaction-text-follow: rgb(219, 113, 7);
    --event-interaction-text-share: rgb(174, 85, 207);
    --event-interaction-text-follow-special: rgb(217, 50, 50);
    --event-interaction-text-follow-mutual: rgb(47, 142, 219);

    /* 系统颜色变量 */
    --event-system-text: rgba(35, 34, 37, 0.553);

    /* 禁言颜色变量 */
    --event-user-block-text: #fff;
    --event-user-block-bg: rgb(255, 0, 0);
  }

  /* 弹幕类型变量 */
  .event--message {
    /* --avatar-size: 18px; */
  }

  /* 总督变量 */
  .event.guard-level--1 {
  }

  /* 提督变量 */
  .event.guard-level--2 {
  }

  /* 舰长变量 */
  .event.guard-level--3 {
  }

  /* 弹幕事件样式 */
  .event--message {
  }

  /* 弹幕事件中的消息样式 */
  .event--message .message {
  }

  /* 粉丝勋章样式 */
  .event--message .fans-medal {
  }

  /* 粉丝勋章名称样式 */
  .event--message .fans-medal-content {
  }

  /* 粉丝勋章等级样式 */
  .event--message .fans-medal-level {
  }

  /* 修改「榜1」图标 */
  /* 变量定义可从 https://master--60f5c0ae4a7e3f003ba05641.chromatic.com/ 查看 */
  .event--message .current-rank {
  }

  /* 修改房管图标 */
  .event--message .mod-badge {
  }

  /* 舰长事件样式 */
  /*
    .event-show-as--normal 将排除置顶礼物条
    .event-show-as--sticky 用于置顶礼物条
    */
  .event--toast.event-show-as--normal {
  }

  /* 礼物事件样式 */
  /*
    .event-size--highlight 将排除非高亮礼物事件
    .event-size--normal 用于非高亮事件
    */
  .event--gift.event-show-as--normal.event-size--highlight {
  }

  /* SC 样式 */
  /* SC 颜色分为上下两个部分,因此需要单独定义背景 */
  .event--superchat.event-show-as--normal {
  }

  /* SC 上方样式 */
  .event--superchat.event-show-as--normal .top {
  }

  /* SC 下方正文样式 */
  .event--superchat.event-show-as--normal .message {
  }

  /* 礼物/SC文本颜色变量 */
  /*
    此处可使用 .event-superchat-rank--[n] 和 .event-gift-rank--[n] 分别定义样式,
    也可以像我这样使用 .event-price-rank--[n] 统一定义样式
    */
  .event.event-price-rank--1 {
  }

  .event.event-price-rank--2 {
  }

  .event.event-price-rank--3 {
  }

  .event.event-price-rank--4 {
  }

  .event.event-price-rank--5 {
  }

  .event.event-price-rank--6 {
  }
}

最後更新於 2026年9月19日

Tech otakus destroy the world