全局 CSS 样式
了解如何使用全局 CSS 样式自定义游戏外观
全局 CSS 样式可以让你自定义游戏中消息的视觉效果——修改颜色、字体、背景、间距、圆角等等。在创作台的「全局 CSS 样式」编辑器中直接编写 CSS 即可。
直接写 CSS 规则就行,不需要添加 <style> 标签。样式作用于整个聊天区(包括消息列表和游戏状态面板),不会影响聊天页之外的部分。
不熟悉 CSS?可以让 AI 帮你写。把你想要的效果描述给它(比如「用户消息气泡改成渐变紫色背景」),它就能生成对应的 CSS 代码,复制粘贴即可。
写好的 CSS 还可以存进素材库,在别的作品里一键导入。
先了解:样式作用到哪里
这一节决定了你写的选择器能不能命中,建议先读。
平台把你的 CSS 分成两条路注入,中间隔着一道浏览器的样式隔离墙:
| 注入到哪 | 覆盖的内容 | 典型类名 |
|---|---|---|
| 每条消息内部 | 消息正文渲染出来的一切 | .msg-narration、.msg-bubble、.msg-options… |
| 聊天页整体 | 消息的外壳、游戏面板、开幕小剧场容器 | .user-message、.gs-tab-btn、.lore-bubble… |
由此带来三条必须知道的规则:
① 两层之间不能组合选择。 消息正文渲染在各自独立的隔离区里,外层选择器够不到它:
/* ❌ 永远不生效:.user-message 在外层,.msg-narration 在消息内部 */
.user-message .msg-narration { color: red; }
/* ✅ 直接写内部类名即可,它本来就只作用于消息正文 */
.msg-narration { color: red; }这类写法不会报错,只是静默失效——发现某条规则怎么写都没反应,先检查是不是跨了这两层。
② body / html / :root 会被自动改写成聊天容器。 你想「改页面背景」时可以直接写 body { background: ... },平台会把它转成只作用于聊天区,不会真的影响整站:
body {
background: linear-gradient(180deg, #1a1030, #0d0618);
}③ 允许 @import,但禁止脚本类写法。 @import 会被保留(常用于引入字体);expression() 和 javascript: URL 会被剔除;粘贴进 HTML 标签会在创作台直接报错。另外单条规则写错只会丢掉那一条,不影响其它规则。
用户消息气泡
通过 .msg-message-user 类自定义用户发送的消息样式。
渐变背景:
.msg-message-user {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 18px 18px 4px 18px;
color: #fff;
}边框描边风格:
.msg-message-user {
background: transparent;
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 12px;
}磨砂玻璃风格:
.msg-message-user {
background: rgba(255, 255, 255, 0.08);
backdrop-filter: blur(12px);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 16px;
}AI 消息气泡
通过 .msg-message-assistant 类自定义 AI 回复的消息样式。
用户消息气泡有系统默认样式(背景 + 圆角 + 模糊),AI 消息气泡默认是透明的。两者都可以通过全局 CSS 自由覆盖。
半透明背景:
.msg-message-assistant {
background: rgba(255, 255, 255, 0.05);
border-radius: 18px 18px 18px 4px;
padding: 12px 16px;
}左边框装饰:
.msg-message-assistant {
border-left: 3px solid #667eea;
padding-left: 12px;
}暗色卡片风格:
.msg-message-assistant {
background: rgba(30, 30, 30, 0.6);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 12px;
padding: 12px 16px;
}覆盖预设标签样式
如果你使用了预设标签但不喜欢默认样式,可以直接用全局 CSS 覆盖,不需要修改正则规则。
/* 旁白改为金色边框风格 */
.msg-narration {
color: #c9a96e;
font-style: normal;
border-left: 2px solid #c9a96e;
padding-left: 12px;
background: none;
-webkit-text-fill-color: initial;
}
/* 场景描述改小字号 */
.msg-scenario {
color: #888;
font-size: 0.9em;
}内置类名参考
以下是所有可覆盖的 CSS 类名:
消息外壳(控制宽度与间距)
这一组在消息的外层,管的是气泡摆在哪、多宽、隔多远。想让用户气泡更宽、想调消息之间的间距,改的是这里。
| 类名 | 说明 |
|---|---|
.message-wrapper | 单条消息的最外层。margin-bottom 决定消息之间的间距 |
.user-message | 玩家消息外框:默认 max-width: 70% + 右对齐。改气泡宽度改这个 |
.ai-message | AI 消息外框:默认整宽、透明、无圆角 |
.message-timestamp | 消息下方的时间戳(字号 / 颜色;左右消息自动分别对齐) |
.system-hint-bubble | 居中的系统提示条外壳 |
.system-hint-text | 系统提示条里的文字 |
/* 让用户气泡窄一点、消息之间松一点 */
.message-wrapper .user-message {
max-width: 55%;
}
.message-wrapper {
margin-bottom: 24px;
}这一组请带上 .message-wrapper 前缀写(如 .message-wrapper .user-message)。系统默认样式也是这个写法,权重相同时才稳定盖得住;只写 .user-message 在个别情况下可能不生效。
消息容器(内容区)
这一组在消息内部,管的是正文的背景、圆角、内边距。
| 类名 | 说明 |
|---|---|
.msg-message | 所有消息的内容容器,玩家和 AI 消息都包含此类 |
.msg-message-user | 玩家消息的内容区,与 .msg-message 同时存在(默认带背景 + 圆角 + 模糊) |
.msg-message-assistant | AI 回复的内容区,与 .msg-message 同时存在(默认透明无样式) |
.msg-options-readonly | 只读场景(回忆页 / 创作台预览)追加在内容容器上,可据此关掉选项的点击态 |
三者的关系:.msg-message 是基础类,所有消息都有。在此基础上,玩家消息会追加 .msg-message-user,AI 消息会追加 .msg-message-assistant。所以用 .msg-message 设置通用样式(如字体、行高),用另外两个分别控制各自的外观。
外壳和内容区是两层,不能组合写。 .user-message .msg-narration { } 这种跨层选择器不生效(原因见上文「样式作用到哪里」)。要改正文里的东西,直接写 .msg-* 就行。
预设标签
| 类名 | 对应标签 | 说明 |
|---|---|---|
.msg-narration | <narration> | 旁白文字 |
.msg-system | <system> | 系统提示 |
.msg-bubble | <bubble> | 角色对话气泡 |
.msg-bubble-wrap | <bubble> | 带说话人头像/名称时的外层包装容器(VStack 布局:头部 + 气泡) |
.msg-bubble-header | <bubble> | 说话人头部区域(头像 + 名称的行容器) |
.msg-bubble-header--no-avatar | <bubble> | 说话人没有头像时,头部会额外带上这个类 |
.msg-bubble-avatar | <bubble> | 说话人头像图片 |
.msg-bubble-name | <bubble> | 说话人名称文字 |
.msg-scenario | <scenario> | 场景描述 |
.msg-quoted | "中文引号" | 引号包裹的对话文字 |
折叠面板
| 类名 | 说明 |
|---|---|
.msg-details | 折叠面板容器 |
.msg-summary | 折叠面板标题 |
.msg-details-body | 折叠面板展开后的内容 |
选项
| 类名 | 说明 |
|---|---|
.msg-options | 选项容器 |
.msg-question | 选项的问题文字 |
.msg-option-item | 可点击的单个选项 |
.msg-options-hint | <hint> 子标签渲染出的提示行(选项框内、选项列表上方、不可点击) |
.msg-options-presets | 预设推进选项行的容器(选项框内、选项列表下方,横向滚动) |
.msg-preset-pill | 单个预设推进选项(胶囊按钮,如「剧情加速」「制造暧昧」,点击把它填进输入框) |
预设推进选项是平台在最新一条 AI 回复的选项框里自动加的一排胶囊按钮,不需要作者在正文里写任何标签;它只出现在最新一条 AI 回复上,历史消息和回忆页不显示。样式默认跟随 .msg-option-item 的主题色,改它用 .msg-preset-pill 就行,例如:
.msg-preset-pill {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.2);
}开场白美化
| 类名 | 说明 |
|---|---|
.msg-preset | 开场白美化容器 |
.msg-preset h1 | 开场白标题 |
.msg-preset p | 开场白段落 |
.msg-preset .highlight | 开场白高亮文字 |
开幕小剧场的外层容器
开幕小剧场的内容是你自己写的 HTML,样式也写在它自己里面,正常不需要用到全局 CSS。
下面三个类是平台包在小剧场外面的容器。它们默认几乎没有样式(没有底色、没有边框、没有内边距),只做三件事:
| 类名 | 默认做了什么 | 什么时候需要改 |
|---|---|---|
.lore-wrapper | 下外边距(小剧场与下方第一条消息的距离) | 想让小剧场紧贴消息,或拉开更多距离 |
.lore-bubble | 圆角 + overflow: hidden | 想要方角,或你的内容有外投影 / 溢出元素被裁掉了 |
.lore-content | 宽度 100% + 基础字号 | 想给内联渲染的小剧场换个基础字号 |
用 ``` 包裹时这几个类才真的重要。 那种情况下你的 HTML 跑在 iframe 里,而 iframe 是放在 .lore-bubble 内部的——overflow: hidden 会把你内容的四角和任何溢出部分裁掉,你从 iframe 里面改不了,只能在这里改:
.lore-bubble {
border-radius: 0;
overflow: visible;
}不用 ``` 包裹(内联渲染)时,大部分效果直接写在你自己的 HTML 里就行,用不到这三个类。
游戏面板更新提示
AI 回复后游戏面板刷新期间,会在消息下方显示一张「正在更新游戏面板」的胶囊提示。
| 类名 | 说明 |
|---|---|
.state-updating-hint | 提示卡片外壳(背景、边框、圆角、内边距、高斯模糊) |
.state-updating-text | 「正在更新游戏面板」文字 |
.state-updating-dots | 文字后方三个动画点的容器 |
.state-updating-dots .dot | 单个动画点(继承动画,可调字号/颜色) |
.state-updating-dots .dot-1 | 第 1 个点(动画延迟 0s) |
.state-updating-dots .dot-2 | 第 2 个点(动画延迟 0.2s) |
.state-updating-dots .dot-3 | 第 3 个点(动画延迟 0.4s) |
游戏面板
如果你的角色启用了游戏面板(World Mode),也可以用全局 CSS 定制面板的视觉效果。
面板主容器
| 类名 | 说明 |
|---|---|
.gs-game-state-panel | 游戏面板最外层根容器 |
.gs-layout-inline | 移动端 / 窄屏的内嵌模式 |
.gs-layout-side | 桌面端侧栏模式 |
.gs-side-left | 侧栏模式中的左侧面板 |
.gs-side-right | 侧栏模式中的右侧面板 |
.gs-inline-wrapper | 内嵌模式包装器(含 .gs-expanded 展开状态) |
.gs-inline-panel | 内嵌模式展开后的面板容器 |
.gs-inline-world | 内嵌模式顶部的世界状态条容器 |
.gs-panel-header | 标签栏区域 |
.gs-panel-content | 内容滚动区域 |
.gs-side-left-top | 侧栏左列顶部世界状态区 |
.gs-side-header | 侧栏头部区域 |
.gs-side-title | 侧栏标题文字 |
.gs-side-content | 侧栏内容区域 |
.gs-resize-handle | 面板宽度拖拽手柄容器 |
.gs-resize-pill | 拖拽手柄胶囊形指示器 |
标签栏
| 类名 | 说明 |
|---|---|
.gs-game-state-tabs | 标签栏根容器 |
.gs-tabs-scroll | 标签横向滚动容器 |
.gs-tab-btn | 单个标签按钮 |
.gs-tab-btn.gs-active | 当前激活的标签 |
.gs-tab-icon | 标签内的图标 |
.gs-tab-label | 标签文字 |
.gs-tab-badge | 标签右上角更新数量徽章 |
.gs-tab-badge-warn | 徽章的警示态(物品栏已满时) |
「只看变化」开关
角色面板顶部的开关,打开后只显示本轮有变化的属性。
| 类名 | 说明 |
|---|---|
.gs-only-changed-row | 开关整行(含 .gs-only-changed-row--on 开启态) |
.gs-only-changed-row--inline | 窄屏内嵌模式下的排布变体 |
.gs-only-changed-label | 开关左侧文字 |
.gs-switch | 开关轨道 |
.gs-switch-knob | 开关滑块 |
摘要条
| 类名 | 说明 |
|---|---|
.gs-summary-bar | 摘要条容器(可点击展开) |
.gs-summary-bar.gs-summary-expanded | 展开状态的摘要条 |
.gs-summary-content | 摘要内容滚动容器 |
.gs-summary-list | 摘要项目列表 |
.gs-summary-value | 单个摘要值文字 |
.gs-summary-sep | 摘要项之间的分隔符(竖线) |
.gs-summary-empty | 无数据时的占位符 |
.gs-expand-icon | 展开/收起箭头图标 |
快速访问按钮
| 类名 | 说明 |
|---|---|
.gs-quick-access-buttons | 快速按钮组容器 |
.gs-quick-btn | 单个快速访问按钮 |
.gs-btn-icon | 按钮内图标 |
.gs-btn-label | 按钮文字标签 |
折叠分区
| 类名 | 说明 |
|---|---|
.cs-root | 折叠分区根容器 |
.cs-root.cs-open | 已展开状态的分区 |
.cs-header | 分区标题行(可点击折叠/展开) |
.cs-icon | 分区标题前的图标 |
.cs-title-group | 标题和副标题的包装容器 |
.cs-title | 分区主标题 |
.cs-subtitle | 分区副标题 |
.cs-count | 标题行末尾的计数徽章 |
.cs-chevron | 折叠箭头图标 |
.cs-body | 分区展开后的内容容器 |
玩家卡片
| 类名 | 说明 |
|---|---|
.ps-wrap | 玩家卡片外层包装 |
.ps-card | 玩家卡片主体 |
.ps-avatar | 玩家头像容器 |
.ps-avatar-img | 玩家头像图片 |
.ps-avatar-char | 无头像时的首字母占位符 |
.ps-info | 玩家信息区域 |
.ps-name | 玩家名称 |
.ps-desc | 玩家描述文字 |
.ps-edit-icon | 编辑按钮图标 |
.ps-clickable | 玩家卡可点击时追加此类(可用来去掉 hover 效果) |
角色列表
| 类名 | 说明 |
|---|---|
.cs-wrap | 角色列表外层包装 |
.cs-list | 角色卡片列表 |
.cs-card | 单个角色卡片 |
.cs-card-head | 角色卡片头部(头像 + 名称) |
.cs-card-body | 角色卡片展开后的内容 |
.cs-avatar | 角色头像容器 |
.cs-avatar.cs-avatar--pulse | 有更新时的脉冲动画头像 |
.cs-avatar-img | 角色头像图片 |
.cs-avatar-char | 无头像时的首字母占位符 |
.cs-head-info | 角色名称信息区域 |
.cs-head-row | 名称和性别的行容器 |
.cs-name | 角色名称文字 |
.cs-gender | 角色性别标签 |
.cs-gender-male | 男性标签(默认蓝色) |
.cs-gender-female | 女性标签(默认粉色) |
.cs-gender-icon | 性别标签里的图标 |
.cs-desc | 角色卡里的描述文字 |
.cs-edit-icon | 角色编辑按钮图标 |
.cs-clickable | 角色卡可点击时追加此类 |
.cs-empty-state | 还没有角色时的空状态容器 |
.cs-empty-icon | 空状态图标 |
.cs-empty-text | 空状态提示文字 |
角色区的空状态是 .cs-empty-*,关系面板的空状态是 .gs-empty-*,是两套不同的类名,别写混了。
角色属性卡片
| 类名 | 说明 |
|---|---|
.gs-character-card | 属性卡片根容器 |
.gs-character-card.gs-character-card-clickable | 可点击的属性卡片 |
.gs-card-header | 卡片头部(头像 + 名称) |
.gs-avatar | 头像容器 |
.gs-avatar-img | 头像图片 |
.gs-avatar-char | 无头像时的首字母占位符 |
.gs-header-info | 头部信息区域 |
.gs-char-name | 角色名称 |
.gs-char-gender | 角色性别标签 |
.gs-attr-group | 属性分组容器 |
.gs-group-header | 属性分组标题行 |
.gs-group-name | 分组名称文字 |
.gs-group-attrs | 分组内属性列表 |
.gs-attr-row | 单行属性(键值对) |
.gs-attr-key | 属性键名 |
.gs-attr-value | 属性值(文字类型) |
.gs-attr-bar-wrapper | 进度条包装容器 |
.gs-attr-bar-track | 进度条背景轨道 |
.gs-attr-bar-fill | 进度条填充部分 |
.gs-attr-bar-label | 进度条旁边的数值标签 |
世界信息
| 类名 | 说明 |
|---|---|
.gs-world-info-line | 世界信息行容器 |
.gs-world-item | 单个世界信息项 |
.gs-world-value | 世界信息值文字 |
.gs-world-sep | 项目之间的分隔符 |
.world-section | 世界分区容器 |
.world-title-row | 世界分区标题行(标题 + 编辑按钮) |
.world-title | 世界分区标题 |
.world-edit-icon | 世界分区的编辑按钮图标 |
.world-list | 世界信息列表 |
.world-item | 列表中的单个项目 |
.world-value | 项目值文字 |
.world-sep | 列表项分隔符 |
物品栏
| 类名 | 说明 |
|---|---|
.inv-wrap | 物品栏外层容器 |
.inv-tabs | 物品栏分类标签栏 |
.inv-tab | 单个分类标签 |
.inv-tab.inv-tab-active | 当前激活的分类 |
.inv-tab-label | 分类标签文字 |
.inv-tab-count | 分类物品数量 |
.inv-tab-add | 添加新分类按钮 |
.inv-tab-add-input | 添加分类时的输入框 |
.inv-empty | 物品栏为空时的占位提示 |
.inv-items | 物品网格容器 |
.inv-cell | 单个物品格子 |
.inv-cell.inv-cell-open | 已展开详情的物品格子 |
.inv-row | 物品行(列表模式) |
.inv-row-actions | 物品行操作按钮区域 |
.inv-item | 物品主体(图标 + 名称) |
.inv-icon | 物品图标 |
.inv-icon-placeholder | 无图标时的表情占位 |
.inv-item-name | 物品名称 |
.inv-item-count | 物品数量标签 |
.inv-icon-btn | 物品操作图标按钮 |
.inv-icon-btn.inv-icon-btn-danger | 危险操作按钮(删除等) |
.inv-icon-btn-img | 操作按钮内的图标 |
.inv-detail-wrapper | 物品详情展开容器 |
.inv-detail-inner | 物品详情内层 |
.inv-detail | 物品详情卡片 |
.inv-detail-icon-img | 详情中的物品图标图片 |
.inv-detail-icon-emoji | 详情中的物品图标表情 |
.inv-detail-count | 详情中的物品数量 |
.inv-detail-desc | 物品详情描述文字 |
.inv-detail-empty | 物品无描述时的占位 |
.inv-add-item-btn | 「添加物品」按钮(含 .inv-add-item-disabled 满仓禁用态) |
.inv-full-hint | 物品栏满时的提示 |
批量清理
物品多的时候,玩家可以进入多选模式一次删除多个物品。
| 类名 | 说明 |
|---|---|
.inv-batch-entry-btn | 「批量清理」入口按钮 |
.inv-select-bar | 多选模式下底部的操作条 |
.inv-select-bar-btn | 操作条里的按钮 |
.inv-select-bar-delete | 操作条里的删除按钮 |
.inv-select-count | 「已选 N 项」计数文字 |
.inv-checkbox | 物品格上的勾选框(含 .inv-checkbox-on 选中态) |
.inv-cell-selected | 已勾选的物品格 |
关系面板
| 类名 | 说明 |
|---|---|
.gs-relationship-tab | 关系面板根容器 |
.gs-pair-list | 关系对列表 |
.gs-empty-state | 无关系数据时的空状态容器 |
.gs-empty-icon | 空状态图标 |
.gs-empty-text | 空状态提示文字 |
关系对卡片
| 类名 | 说明 |
|---|---|
.rel-pair-card | 关系对卡片容器 |
.rel-pair-card.rel-pair-card--clickable | 可编辑的关系对卡片 |
.rel-pair-head | 卡片头部(两个角色的头像/名称) |
.rel-pair-identity | 单侧角色身份区域 |
.rel-pair-identity--left | 左侧角色 |
.rel-pair-identity--right | 右侧角色 |
.rel-pair-identity--dormant | 该侧角色处于休眠状态时追加此类 |
.rel-pair-avatar | 角色头像 |
.rel-pair-avatar.rel-pair-avatar--player | 玩家头像(特殊标记) |
.rel-pair-initial | 无头像时的首字母占位 |
.rel-pair-name | 角色名称 |
.rel-pair-attrs | 关系属性列表 |
.rel-pair-row | 单行属性 |
.rel-pair-row.rel-pair-row--number | 数值型属性行 |
.rel-pair-row.rel-pair-row--string | 文字型属性行 |
.rel-pair-row.rel-pair-row--changed | 本轮有变化的属性行 |
.rel-pair-label | 属性名称 |
.rel-pair-col | 属性值列(左/右各一列) |
.rel-pair-col--left | 左侧属性列 |
.rel-pair-col--right | 右侧属性列 |
.rel-pair-col--text | 文字型属性列 |
.rel-pair-num | 数值文字 |
.rel-pair-delta | 数值变化量(如 +3) |
.rel-pair-bar | 属性进度条 |
.rel-pair-bar--left | 左侧进度条(从右往左填充) |
.rel-pair-bar--right | 右侧进度条(从左往右填充) |
.rel-pair-bar-fill | 进度条填充部分 |
.rel-pair-text | 文字型属性值 |
.rel-pair-dash | 无值时的破折号占位 |
.rel-pair-empty | 无属性时的占位 |
小组件标签页
游戏面板里的「小组件」标签页,内容是一个图标格栅:第一格固定是「组件盒」入口,后面是玩家已安装的小组件。
| 类名 | 说明 |
|---|---|
.widget-desktop | 标签页根容器 |
.widget-grid | 图标格栅 |
.widget-icon | 单个图标按钮(含 .is-running 运行中状态) |
.widget-icon-cover | 图标封面方块 |
.widget-icon-label | 图标下方的标题文字 |
.widget-cover-fallback | 小组件没有封面图时的文字占位 |
.widget-running-dot | 右上角「运行中」绿点 |
.widget-box-icon-btn | 第一格「组件盒」入口按钮 |
.widget-box-cover | 「组件盒」入口的封面(默认透明无阴影) |
标签页里显示哪些小组件由玩家自己安装决定,作者只能改样式和标签名。点开组件盒后的弹层是平台界面,不受全局 CSS 影响。