已知限制
支持范围是按特性列的表。这一页换个角度:从你会看到什么现象出发。
两者不重复。看表是「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-collapse 与 border-spacing 解析了但不生效——所以相邻单元格的边框不会合并成一条,也不会有间距。
文字不能两端对齐,不能缩进,不能加字距
text-align: justify 解析得出来,结算时和 left 走同一个分支,是空操作。
text-indent、letter-spacing、word-spacing、text-transform、word-break、hyphens 都没有字段。
单行截断的省略号不出现
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+D、Ctrl+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) { ... }
里面的规则一条都不会生效。
怎么判断一个现象是不是已知限制
先查支持范围那张表。表里标 ❌ 或 ⚠️ 的,就是这里的现象之一,不用再排查。
表里标 ✅ 而现象不对的,那才是真的有问题,值得报。