先说结论:用 ::after 伪元素 + transform: scaleY(0.5) 这套方案,目前来看是最稳、最可控的。它比硬写 0.5px 或者去改 viewport 要靠谱得多。 直接用 ::after 伪元素 + transform: scaleY(0.5) 是目前最稳、最可控的解法,比硬
先说结论:用 ::after 伪元素 + transform: scaleY(0.5) 这套方案,目前来看是最稳、最可控的。它比硬写 0.5px 或者去改 viewport 要靠谱得多。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
直接用 ::after 伪元素 + transform: scaleY(0.5) 是目前最稳、最可控的解法,比硬写 0.5px 或改 viewport 更可靠。
border: 1px?一个很常见的场景:在 DPR=2 的 iPhone 上,1 个 CSS 像素实际上对应着 2 个物理像素。你写的 border: 1px,浏览器就会老老实实渲染出 2 个物理像素的宽度。这在肉眼的观感上,线条自然就粗了一圈。要是 DPR=3 的设备,那更是“雪上加霜”。浏览器不会智能地帮你“降采样”边框,它只是机械地把1px拉伸到对应的物理像素数上。
我们来看看大家容易踩的坑:
border-bottom: 1px solid #eee,结果在真机上看起来像是一条 2px 粗的灰线。0.5px 直接声明,结果部分安卓 WebView(尤其是比较旧的版本)根本不认识这个值,直接当作 0px 处理,边框就消失了。viewport 来实现缩放,结果整个页面的字体、间距全乱套了,所有尺寸都得重新调整,成本太高。::after + scaleY(0.5) 怎么写才不偏位?这个写法的关键不在于缩放本身,而在于定位基点和父容器的约束。缩放默认是以元素的中心点为轴心的,这会导致伪元素的位置发生偏移,要么下移,要么上浮。
这里有几个必须注意的细节:
position: relative,否则 ::after 的 absolute 定位就失去了参照物。transform-origin 必须显式设为 0 100%(左下角)。这样才能让 scaleY(0.5) 从底部向上压缩,保证线条对齐,不出差错。height 推荐写 1px + scaleY(0.5)。写 2px 也行,但写 1px 语义更清晰,一看就知道是要画一个物理像素的线。border 属性来画伪边框。它受盒模型影响很大,缩放后内容区可能被挤占。一个标准的底部单边实现示例:
.line-bottom {
position: relative;
}
.line-bottom::after {
content: '';
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 1px;
background-color: #ddd;
transform: scaleY(0.5);
transform-origin: 0 100%;
}
scale(0.5) 会把内容压扁吗?放心,它不会压扁里面的内容,但确实会干扰盒模型。如果你直接给元素加一个 border: 2px 再整体缩放,这个 border 仍然会计入 width/height,最终导致内容区变窄。
border: 1px,然后再整体 scale(0.5)。box-sizing: border-box,否则缩放后边框位置会飘移。transform-origin 要改为 0 0(左上角),这样缩放锚点才稳定。scaleY 支持不好,所以做四边边框时,统一用 scale(0.5) 更稳妥。四边边框的代码长这样:
.border-all {
position: relative;
}
.border-all::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 200%;
height: 200%;
border: 1px solid #e5e5e5;
transform: scale(0.5);
transform-origin: 0 0;
box-sizing: border-box;
}
scaleY(0.333)?从理论上讲,是的。但从实际收益来看,意义不大,反而会增加维护成本。
scaleY(0.5) 渲染出来的效果已经足够锐利,人眼几乎无法分辨它与真实 1px 的差异。@media (-webkit-min-device-pixel-ratio: 3) 来单独处理,那就要小心了。部分 Android 机型会错误上报 DPR=3,导致你的边框变得过细,甚至直接消失。window.devicePixelRatio 后动态添加 class。但对于绝大多数日常项目来说,这步操作真的没太大必要。这里还有一个容易被忽略的细节:伪元素的 background-color 或 border-color 在深色模式下可能会对比度不足。别忘了同时检查暗色主题下的视觉效果。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述