UIDoc 的 HTML 和 CSS 支持
UIDoc 支持的 HTML、CSS、响应式布局、交互、滚动和绑定功能,以及它省略的重要浏览器特性。
UIDoc 故意实现了一个适用于游戏 UI 的实用浏览器式子集。它会提前编译资源,并通过引擎渲染;它不会运行浏览器、JavaScript 或实时 DOM。
要获得可工作的首屏,请从以下内容开始 UIDoc 快速入门.
生成的仓库参考文档 docs/uidoc_supported_css.md,是完整的属性/值列表。它由 UIDoc::debug_supported_css_reference() 输出,并由 UIDoc 测试检查。本页从创作层面说明这一约定。
未知声明、被拒绝的值、不受支持的选择器、格式错误的 HTML,以及不受支持的媒体查询,都会被视为编译错误。解析器可能继续收集诊断信息,但在错误修复前该资源无效。不受支持的 CSS 块级 at-rule 会被静默跳过;不要依赖浏览器 at-rule 的行为。
运行中的游戏不会热重载 UIDoc 的 HTML 和 CSS。资源变更后请重启游戏。用于运行时调试, uidoc_runtime_inspect 可暴露实时 DOM 节点、当前绑定、计算后的样式、事件处理器/键值载荷以及矩形。其 screen_rect, client_ui_tree,以及 client_click 都使用以左下角为原点的引擎视口坐标;截图像素使用左上角原点。
以下 compile 工具在资源预处理失败时会内联包含结构化 UIDoc 诊断信息。 uidoc_diagnostics 在 viewportMatrix: true 会返回汇总通过次数,并将同一配置文件中同一源节点的相同问题类别分组。 unique_issue_count 是该分组后的节点/类别计数; issue_occurrence_count 是跨所有视口/缩放条目的原始总数。仅当每个失败条目都很有用时,才设置 viewportMatrixVerbose: true 只有在每个失败条目都值得关注时才这样做。即使不同源节点共享选择器或 CSS 源行,它们也不会被合并,因此共享规则问题仍可能显示为多个组;修正一次规则后重新运行诊断。
有两类常见的创作警告需要结合上下文理解:
dynamic_text_intrinsic_layout表示频繁变化的文本可能改变固有尺寸盒并使缓存布局失效。添加data-text-reserve使用预期最宽、考虑本地化的样本文本,或者给元素一个明确的宽度和高度。这不是重复文本或渲染错误。image_aspect_drift表示某个图像的宽度和高度彼此独立,并且使用object-fit: fill。请使用contain,cover,或aspect-ratio用于普通美术资源。专门制作、故意拉伸以填充轨道的进度条填充是一个有效例外;请视觉检查该情况。
HTML 和 UIDoc 属性
元素名称会被接受为通用布局节点。这些元素在运行时具有专门行为:
span
行内文本内容
img
从以下位置加载的引擎资源图像 src
button
指针交互和点击事件
input
使用以下方式绑定的可编辑文本 data-bind-value
非空文本内容会创建文本节点。请使用 {{name}} 用于顶层文本绑定,以及 {{item.name}} 在重复列表中使用。图像 src 值也支持这种插值。类名和 data-key 值是静态的。
id, class, style
CSS 匹配和行内样式
src, width, height
图像来源和尺寸
value, placeholder, disabled
输入和控件状态
data-if="binding"
当顶层布尔绑定为 true 时包含一个子树;可选地 ! 对其取反
data-for="item in items"
为受 CSL 绑定的列表重复一个子树
data-for-key="item.id"
解析重复点击的 event.key ,来自一个直接表达式
data-key="role"
为节点赋予静态的交互/输入角色
data-bind-value="name"
将输入连接到 UIDoc 文本值
data-text-reserve="00:00"
在绘制实时绑定文本时,测量一个稳定的字面样本
data-on-click="event:name"
将点击事件发送给 CSL 回调; event.handler 接收完整的精确值,包括 event:
data-style-transform-x/y
绑定数值位移而不重新布局
data-style-transform-scale
绑定数值视觉缩放
data-style-opacity
绑定数值不透明度
data-style-color
绑定受支持的 CSS 颜色字符串,而不改变结构
data-style-image-fill-amount
绑定图像填充量
data-scroll-zoom
在可滚动视口上绑定完整内容缩放
绑定表达式属性包含直接表达式,例如 data-for-key="item.id", data-style-opacity="item.opacity",以及 data-scroll-zoom="zoom"。不要将这些表达式放在 {{...}}中。Mustache 插值仅限于文本和图像 src 值。
data-if 比其他列表感知绑定属性更受限:它查找顶层布尔值,不会解析诸如 item.visible这样的重复别名。对于重复子树中的非交互视觉状态,请绑定 item.opacity 或 item.color。不透明度不会禁用命中测试,因此在构建 CSL 列表时应过滤结构性或交互性行,而不是留一个不可见按钮在原处。
重复控件身份与测试
data-for-key 决定重复点击的 event.key。运行时控件身份是独立的:它以静态的 data-key (然后是 HTML id,再到匿名标签回退)开头,并附加 #key:index 到每个外层循环。这里 key 是传给 UI.uidoc_list_item(...);通常它应与由 data-for-key解析出的相同稳定 ID 一致。因此,重复按钮可能会在 client_ui_tree 中显示为:
使用 client_ui_tree 来复制精确的实时身份。 Test.click_button 接受完整名称或后缀,并将最后的 /__widget 视为可选,因此 Test.click_button("seed-cell#seed-42:7") 当后缀唯一时会选中该实例。仅按角色查询可能会选择任意一个最近的重复实例。嵌套列表会附加多个 #key:index 对。处理器字符串和可见标签不是身份选择器。
原始 style 和 script 块在 HTML 中属于编译错误。请将编写的 CSS 放在 index.css中;这里没有 JavaScript 运行时。
CSS 选择器与层叠
支持的选择器包括:
元素名称、
.class,#id,以及*.后代选择器和直接子代(
>)组合符。用逗号分隔的选择器列表。
:hover,:focus,:active,:pressed,:mouse-down,:dragging,:scroll-state,以及:disabled.
UIDoc 使用正常的 id/class/类型特异性,并以源顺序作为平局决胜。行内 style 会最后应用。绘制顺序使用 z-index,然后是文档顺序。
交互伪状态规则中的会影响布局的声明会被忽略并给出诊断。悬停按钮可以安全地改变其颜色或不透明度,但不应改变其大小或周围布局。
不受支持的选择器形式包括兄弟组合符、属性选择器、伪元素、 :not(), :nth-*, :is(), :where(),以及 :has().
CSS 布局
UIDoc 支持 display: block, display: flex,以及 display: none。其他 display 值会被诊断并回退到 block。其布局属性包括:
width,height,min-*,max-*,aspect-ratio,以及box-sizing.margin,padding,gap,row-gap,以及column-gap.flex,flex-direction,flex-wrap,flex-grow,flex-shrink,以及flex-basis.align-items,align-self,align-content,以及justify-content.position: static,relative,absolute,或fixed,以及inset,top,right,bottom,以及left.overflow,overflow-x,以及overflow-y使用visible,hidden,auto,或scroll.
长度支持无单位像素的相关组合、 px, rem, em, %, vw, vh、safe-area env(...),以及加法或减法的 calc(...) ,最多可包含八个项。百分比 padding 和 margin 会被诊断并忽略。百分比和视口单位对 gap 也无效,但它们受尺寸、flex basis 以及单独的 top/right/bottom/left 偏移量支持。
padding, margin,以及 inset 接受标准的一值、二值、三值和四值形式。百分比值在 inset 简写中不受支持;当需要百分比时请使用单独的偏移属性。
CSS 关键字和数学表达式按属性检查,不会因为浏览器在某处接受就全局接受。具体而言:
auto仅对列出它的属性行有效,例如尺寸、flex basis、偏移量、align-self以及 overflow。none仅在列出的位置有效,例如display、受支持的绘制/滤镜重置、pointer-events,以及image-fill-direction.calc(...)仅可用于文档中说明的长度字段。它允许最多八个简单长度项的加法和减法。乘法、除法、嵌套数学表达式、min(),max(),以及clamp()均不受支持,并且百分比项需要一个确定的包含块。
如有疑问,请查看 docs/uidoc_supported_css.md中的确切属性行;另一个属性接受的值并不意味着同一标记在这里也有效。
文本、图像与绘制
支持的展示特性包括:
color,background,background-color,以及一种线性、径向或圆锥background-image渐变。border,border-width,border-color,以及单一统一的border-radius值。诸如border-bottom、按角设置的圆角以及百分比圆角均不受支持。仅需要单边时,请使用一个具有固定高度/宽度和背景色的显式子分隔线。最多八个以逗号分隔的
box-shadow或text-shadow层;box shadow 可以是 inset。一种
filter: blur(...)或filter: drop-shadow(X Y [blur] [color]),以及backdrop-filter: blur(...).opacity,z-index,以及pointer-events.font-family,font-size,font-style,font-weight,line-height,letter-spacing,text-align,white-space,overflow-wrap,以及word-break.Text
outline-color和outline-width.object-fit: cover,contain,或fill用于图像。image-tint,image-grayscale,image-fill-amount,以及image-fill-direction.translate,缩放,以及translate(...),translateX(...),translateY(...),以及scale(...)变换子集。平移百分比会相对于元素自身的边框盒解析;视口平移单位仍不受支持。
颜色支持常见的 CSS 形式,包括十六进制、 rgb()/rgba(), hsl()/hsla()、命名颜色、 透明,以及 currentColor (如适用)。
渐变最多支持八个颜色停靠点、CSS 方向/角度和位置、 currentColor,以及 在 oklab 中 或 在 srgb 中;Oklab 为默认值。不支持多个背景层和 CSS 图像 URL。请使用一个 img 带有引擎资源路径的位图背景。
box-shadow 遵循元素的矩形边框盒。 filter: drop-shadow(X Y [blur] [color]) 遵循经过滤镜处理后的元素绘制出的 alpha,包括透明图像角。若省略颜色,则默认为元素的 currentColor。将其放在实际的 img 用于不规则或九宫格切片位图;放在容器上时,也会将容器中已绘制的后代包含在阴影轮廓中。
进度图像填充
对于连续进度条,请放置一个全尺寸的 img 在固定尺寸轨道内,绑定一个归一化的 0..1 值与 data-style-image-fill-amount,并设置 image-fill-direction: right 加上 object-fit: fill。使用矩形或渐变纹理,避免在进度条内部出现非预期的透明空隙。
不要将图标或其他装饰性透明图像重复用作填充。 image-tint 是乘法性的并保留源 alpha;它不会把透明像素变成不透明。 object-fit: cover 在轨道很窄时,还会强力裁剪方形图稿。综合这些选择,即使 UIDoc 的填充裁剪工作正常,也可能产生空白前导空间或对角楔形。
诊断当前不会检查纹理 alpha,也不会标记 object-fit: cover 进度填充上的。请在 0, 0.25, 0.5,以及 1处通过视觉检查进度条。Game UI kit 的配对 fill_*.png 资源是专为其对应底图打造的,并且 .kit-progress-fill 会应用预期的适配。
UIDoc 默认使用内置的 AllIn 字族,带有真实的 400、700 和 900 字重。 @font-face 可以通过资源 ID 声明项目的 TTF 或 OTF 字体资源。样式和字重会选择最近的已声明字形;缺失的粗体或倾斜可能会被合成。字体异步加载,因此 UIDoc 会先使用下一个字族或 AllIn,直到所请求的字形就绪,然后使文本布局失效。
省略 line-height 以使用随字号缩放的默认行高。显式 line-height: normal 不被接受。无单位值表示倍率;长度值表示固定的继承长度。
letter-spacing 会被继承,并接受 normal、无单位像素、 px, rem,或 em. normal 会解析为零。
变换子集不包括旋转、倾斜、3D 变换,或多标记 缩放 值。一个滤镜值包含一个 blur(...) 或一个 drop-shadow(...);不支持滤镜链和其他滤镜函数。filter 和 backdrop-filter 合成器作用域最多可嵌套四层。
响应式样式和安全区域
支持媒体查询,但仅限以下明确条件白名单:
(min-width: N)和(max-width: N).组合的最小和最大宽度查询。
Tailwind 风格
(width >= N)和(width <= N).(hover: hover).
宽度值接受无单位像素、 px,以及 rem。不支持的媒体块会被丢弃,并给出诊断信息。
在接受安全区域长度的地方使用这些值:
UIDoc 的顶部安全区域内边距也会预留游戏的顶部栏带。
滚动和缩放
overflow-x 和 overflow-y 彼此独立,因此一个视口可以水平、垂直或双轴滚动。双轴视口在拖动时会同时平移两个轴。启用垂直滚动时,鼠标滚轮会进行垂直滚动;仅水平的视口会将滚轮映射为水平滚动。
运行时当前会绘制垂直滚动条滑块。即使没有绘制水平滑块,仍可通过拖动访问水平内容。
data-scroll-zoom="zoomBinding" 会为交互式滚动视口添加类似浏览器的内容缩放。它会缩放后代几何、文本、图像、变换、命中测试和滚动范围,而视口及其同级元素保持固定。绑定发生变化时,引擎会保留视口中心周围的可视区域,并重新限制滚动位置。引擎安全范围为 0.05 到 20;应用通常应使用更窄的范围。
Tailwind 风格类
UIDoc 资源可以使用受支持的 Tailwind 风格实用类。实用类会在资源处理期间解析并降级为 UIDoc CSS;游戏中并不会运行 Tailwind。涵盖的领域包括 display、position、flex、尺寸、间距、inset、对齐、文本、颜色、边框、圆角、溢出、指针事件、不透明度、z-index、宽高比、阴影、变换以及任意图像效果属性。
降级步骤支持 hover:, focus:, active:, disabled:,响应式 sm:/md:/lg:/xl:/2xl:,以及诸如 w-[320px],以及 CSS @apply。不包含 Tailwind preflight/base reset。UIDoc 无法表示的输出会导致资源烘焙失败。
不支持的主要浏览器特性
JavaScript 和 DOM API
使用 CSL 绑定驱动状态, data-if, data-for以及事件回调。
CSS Grid
使用 flexbox、块布局或显式定位。
CSS 变量和自定义属性
从 CSL 绑定值,或使用普通共享类。
过渡、关键帧和 CSS 动画
对 opacity、translation、scale 或 scroll zoom 等 CSL 绑定进行动画。
伪元素和高级选择器
向文档添加显式元素和类。
容器查询和大多数媒体特性
使用受支持的视口宽度和 hover 查询。
CSS URL 背景和多个背景层
使用受支持的渐变或一个 img 引擎资源。
按角圆角和多于八个阴影
使用受支持的单圆角/八阴影限制,或显式嵌套元素。
min(), max(),以及 clamp() CSS 数学函数
将 width/height 与受支持的 min-* 和 max-* 属性结合。
旋转、倾斜、3D 变换、滤镜链以及其他滤镜函数
将视觉效果制作为资源,或使用受支持的 translate/scale/blur/drop-shadow 效果。
Web 表单、导航、fetch、iframe、canvas、SVG DOM、音频和视频
使用 CSL 和相应的引擎系统。
浏览器语义和可访问性行为
UIDoc 元素是游戏 UI 节点;HTML 标签名并不意味着浏览器行为。
UIDoc 的目标是让常见游戏 UI 易于编写,而不是复现每一项 HTML 和 CSS 特性。请将布局保持在此子集内,这样资源烘焙才会可预测,客户端/服务器 UI 模拟也能保持确定性。
最后更新于