📏 1px 边框问题
在 Retina(2x/3x)屏幕上,CSS 的 1px 实际渲染为 2~3 个物理像素,导致边框看起来比设计稿粗。
解决方案汇总
| 方案 | 原理 | 适用场景 |
|---|---|---|
| transform: scale() | 用伪元素画边框,transform 缩放 0.5 | 最通用,推荐 |
| viewport + rem | 根据 DPR 动态设置 viewport 缩放 | 全页面适配 |
| box-shadow | 用阴影模拟细边框 | 简单场景 |
| border-image / svg | 使用图片边框 | 复杂边框 |
推荐方案:伪元素 + transform
/* ===== 1px 细边框(最通用方案)===== */
/* 底部 1px 边框 */
.hairline-bottom {
position: relative;
}
.hairline-bottom::after {
content: '';
position: absolute;
left: 0; bottom: 0;
width: 100%; height: 1px;
background: #e0e0e0;
transform: scaleY(0.5);
transform-origin: 0 0;
}
/* 四边 1px 边框 */
.hairline-border {
position: relative;
}
.hairline-border::after {
content: '';
position: absolute;
top: 0; left: 0;
width: 200%; height: 200%;
border: 1px solid #e0e0e0;
border-radius: inherit;
transform: scale(0.5);
transform-origin: 0 0;
pointer-events: none; /* 不阻挡点击 */
}
/* 使用 CSS 变量适配不同 DPR */
@media (-webkit-min-device-pixel-ratio: 3) {
.hairline-bottom::after {
transform: scaleY(0.333); /* 3x 屏 */
}
}
⚠️ 注意
使用 transform: scale() 后,伪元素的 border-radius 也会被缩放。如果需要圆角边框,确保父元素设置 border-radius 且伪元素继承。