高度层级需要一致的光源假设
别名: 光源方向 · lighting model · 阴影方向
概念解释
卡片的影子在下方偏右,浮动按钮却四周发光,顶上的提示条影子朝上。三块都「有高度」,放在同一屏上却没法排谁更高:灯好像同时在天花板、在物体内部、在地板下。高度要能比较,先得共用一个光源假设。影子方向互相打架时,人读到的不是三层楼,是三套无法换算的局部特效。单一光源通常是斜上方,因为那是对真实场景的默认猜测;一旦产品里的灯会搬家,高度阶梯就散架。
机制
从阴影恢复形状和相对高度,依赖场景由少数灯照明、灯的方向在短时间内不变。视觉系统用这个约束把各处半影对到同一把尺子上:都是「离同一盏灯所照的地面有多远」。方向矛盾等于告诉系统「这些影子不是同一物理世界里的」,恢复过程会放弃全局高度,改成逐个对象装饰。四周发光尤其有害:它取消了「光从一边来」的前提,对象更像自发光,高度变成光晕半径,无法与下方投影的卡片比较。顶光改底光(影子朝上)还会被读成「这块凹进去」,高度符号翻转。
怎么研究
把同一组对象的影子方向做成一致斜上、随机、以及混合自发光。请人按「离屏幕有多远」排序,看一致条件下的等级相关、随机条件下是否掉到接近无相关。也可以画箭头标出每条影子暗示的光方向,统计一屏内方向的角差。角差超过大约直角,高度排序任务就会明显变差。不必上真实三维渲染,平面投影已经足够暴露方向冲突。
边界
品牌插画、英雄区可以有自己的戏剧光,只要不进入控件层的高度体系。夜间摄影风的营销页故意用脚灯,那是情境,不要把那套影子拷进表单控件。某些游戏 HUD 用内发光表示选中,选中态不是高度,应与 elevation 分开命名,以免工程师把 glow 和 drop shadow 当成同一档。深色主题如果还坚持投影,光源假设仍然要一致;只是投影本身在深底上几乎看不见,一致也救不了可见性。
怎么落地
- 全产品只写死一个光方向(例如左上或正上),所有投影的偏移朝同一侧。禁止某一组件「为了好看」改成居中扩散。
- 内发光、描边光留给选中、错误、焦点,不要当作比投影更高的一层。
- 新组件入库时用一张叠图:把它的影子箭头画进现有页面的箭头旁边,方向不一致就不收。
- 验证:在一页上给每个投影画一条从对象中心指向影子最深处的箭头。箭头簇的张角若明显大于一小束,改偏移直到簇重新收拢,再请人按高度排序这些对象。排序仍乱,再查是不是有自发光混进了投影体系,而不是继续把某一块的影子加深。