文档 / YSU 内核

已知限制

支持范围是按特性列的表。这一页换个角度:从你会看到什么现象出发。

两者不重复。看表是「position 支持吗」,看这一页是「为什么这个页面排版不对」。

版式类

用了 position: absolute 的页面,元素全在错的位置

position 及其四个偏移量解析进了计算样式,但布局与绘制阶段零读取。所以绝对定位的元素按常规流排——占位置、参与外边距合并、按文档顺序叠。

绝对定位的弹层、下拉菜单、悬浮按钮、覆盖层,现在都会把周围内容挤开,而不是浮在上面。

fixed 同理,而且滚动时会跟着页面走,不会固定在视口上。

float 做的多栏布局,全乱

float 连字段都没有——全仓零命中。所以 float: left 是一条被丢掉的声明。

用浮动做两栏、三栏布局的老页面,以及用 float 排图片环绕文字的页面,会退化成一列堆叠。

定宽元素不居中?

margin: 0 auto 是支持的,判据是 LengthUnit::Auto纵向的 auto 没有处理,所以「垂直居中」那类写法不生效。

display: flex 的卡片墙挤成一行

flex-wrap 解析进了计算样式,但布局不读。所有子项都在一行里,放不下就压缩(flex-shrink 默认是 1),而不是折行。

align-content 同样不读——它管的是多行之间的对齐,没有多行用不上。

order 没有字段,改变排列顺序做不到。

表格有 colspan 就错位

跨行跨列没有实现。<td colspan=2> 会被当成一个普通单元格,后面所有单元格左移一列,整行的列对不齐。

<table border=1> 画不出格线——呈现属性到 CSS 的映射层不存在。单元格自己的 border 能画出来。

<caption> 整段不可见:盒子建出来了,布局不处理它,文字没有行盒。

border-collapseborder-spacing 解析了但不生效——所以相邻单元格的边框不会合并成一条,也不会有间距。

文字不能两端对齐,不能缩进,不能加字距

text-align: justify 解析得出来,结算时和 left 走同一个分支,是空操作。

text-indentletter-spacingword-spacingtext-transformword-breakhyphens 都没有字段。

单行截断的省略号不出现

text-overflow 全仓零命中。需要单行截断的地方(列表、卡片、标签)现在文字会溢出或者被裁掉,没有

line-height: 20px 被静默忽略

行高只吃无单位倍数与 normal。带单位的长度取不出 f64,那条分支不认,值保持原样。

不报错,只是不生效。 这是最容易让人怀疑人生的那一类问题。

内容类

图片不显示

<img> 不产生替换内容。固有尺寸算不出来,宽度是零——所以既不显示,也不占位。

background-image 不生效:background 简写只挑颜色,其余丢弃。

DrawCommand::Image 这个命令变体定义了,但没有任何地方生产它。从图片的取回、解码、固有尺寸、纹理上传到绘制,五环全空。

emoji 显示成空白

字形图集是单通道灰度格式,彩色字形(emoji)被判定为装不下,直接跳过。

@font-face 声明无效

字体声明会被解析进字体表,然后停在里——字体文件既没下载也没注册到整形器。页面用的是回退字体。

emoji 之外的彩色图标字体同理

font-face 那条路不通,图标字体也加载不了。

脚本不执行

<script> 的内容被正确解析成 DOM 文本节点,边界处理也按规范做(脚本数据的双重转义、</script> 的识别)。然后没有人执行它。

所以打开一个依赖脚本的页面,看到的是「没有脚本时应该有的样子」:由脚本渲染的内容全空,需要脚本切换的交互全无。

:hover:focus 样式不生效

选择器里 :hover:active:focus:visited 的匹配逻辑是写好了的,但匹配需要一个 ElementState 参数,而外壳不提供任何状态——四项全为假。

所以悬停效果、焦点样式、已访问链接的变色都不会出现。链接点击本身是正常的,只是鼠标悬停时除了光标变手型之外没有别的反馈。

::before / ::after 不生成内容

伪元素解析得出来,但匹配时不区分元素本身与伪元素——p::before { color: red } 会把 color 作用到 p 自己身上。

生成内容(content)与计数器都没有,所以有序列表画出来也是圆点而不是编号。

var()calc() 不生效

自定义属性会被当成普通属性名落进兜底分支丢掉,var(--x) 取不到东西。calc() 全仓只在测试里出现。

尺寸类

放大之后页面变宽,不是变大

这是对的行为,不是 bug。缩放改的是布局视口宽度,页面按新宽度重新排版。所以放大之后换行位置会变,文字会变粗——而不是整体像图片一样被拉大。

同理,vw 单位的元素在缩放时会跟着变。

设备像素比

传进内核的是逻辑尺寸加设备像素比。传错的话不会报错,只会让文字大小不对——在 2 倍屏上会小四分之一。

看代码看不出来,截图对比才看得出来。

网络类

页面比别的浏览器慢

没有连接池:每取一个资源都是一条新连接加一次 TLS 握手。一个引五份样式表的页面就是五条连接。

没有压缩:请求不发 Accept-Encoding,也不解 Content-Encoding。传输量是压缩后的三到五倍。

没有缓存:刷新就是全部重新取。

取不到图片和脚本

子资源只取样式表。<img><script>、字体文件都不发请求。

登录状态保持不住

Cookie 不存也不发。需要登录的页面每次都是未登录状态。

外壳类

命令行传文件没用

./ui/build/vexo page.html      # 参数被忽略

外壳不解析 argv,只把它转交给 QApplication。打开本地文件要走 Ctrl+O、拖放、或者地址栏输路径。

没有书签、下载、设置、开发者工具

这四个都没做。Ctrl+DCtrl+P 这类常见键位没有绑定。

一个加载卡住的状态

ysu_fetch 在收到的 URL 为空指针或者不是合法 UTF-8 时,只写错误槽就返回,不调用回调。外壳在等回调,于是加载计数不回退,状态栏停在「正在加载」。

触发条件很窄,但知道有这回事比不知道强。

那些「看着该动却没动」的

这一类最费时间,因为没有任何错误信息。汇总一下共同点:解析进来了但没人读

属性现象
position 及其四个偏移按常规流排
z-index按文档顺序叠
visibility: hidden照样画出来
flex-wrap不折行
align-content不生效
line-height: <长度>保持原值
border-collapse / border-spacing不生效
border-radius: 10px 20px退回方角
@font-face用回退字体
@media only screen整条查询不匹配

最后一条值得单独说:only screen 是现实页面里最常见的媒体查询写法之一,而 only 关键字没有分支,only screen 既不等于 screen 也不等于 all整条查询恒不匹配。所以:

@media only screen and (min-width: 600px) { ... }

里面的规则一条都不会生效。

怎么判断一个现象是不是已知限制

先查支持范围那张表。表里标 ❌ 或 ⚠️ 的,就是这里的现象之一,不用再排查。

表里标 ✅ 而现象不对的,那才是真的有问题,值得报。