为什么会出现?
首先了解两个像素:设备的 物理像素[设备像素] & 虚拟像素[CSS像素] & 逻辑像素[设备独立像素]
- 物理像素:移动设备出厂时,不同设备的屏幕自带的不同屏幕像素,也称硬件像素;
- 虚拟像素:即css中记录的像素
- 逻辑像素:计算机坐标系统中的一个点,是由程序使用的虚拟像素(比如: CSS 像素),这个点没有固定大小,越小越清晰,可由相关系统转换为物理像素
devicePixelRatio(DPR):反应css中的像素与设备的像素比
- DPR为设备像素(物理像素)和设备独立像素(逻辑像素)的比例
- DPR = 物理像素 / 独立设备像素
1px变粗的原因:
transform: scale(0.5) 方案
- 设置height: 1px,根据媒体查询结合transform缩放为相应尺寸
div { height:1px; background:#000; -webkit-transform: scaleY(0.5); -webkit-transform-origin:0 0; overflow: hidden; }
- 用::after和::befor,设置border-bottom:1px solid #000,然后在缩放-webkit-transform: scaleY(0.5);可以实现两根边线的需求
div::after{ content:''; width:100%; border-bottom:1px solid #000; transform: scaleY(0.5); }
- 用::after设置border:1px solid #000; width:200%; height:200%,然后再缩放scaleY(0.5); 优点可以实现圆角,京东就是这么实现的,缺点是按钮添加active比较麻烦
.div::after { content: ''; width: 200%; height: 200%; position: absolute; top: 0; left: 0; border: 1px solid #bfbfbf; border-radius: 4px; -webkit-transform: scale(0.5,0.5); transform: scale(0.5,0.5); -webkit-transform-origin: top left; }
- 媒体查询 + transfrom
/* 2倍屏 */ @media only screen and (-webkit-min-device-pixel-ratio: 2.0) { .border-bottom::after { -webkit-transform: scaleY(0.5); transform: scaleY(0.5); } } /* 3倍屏 */ @media only screen and (-webkit-min-device-pixel-ratio: 3.0) { .border-bottom::after { -webkit-transform: scaleY(0.33); transform: scaleY(0.33); } }
- 设置height: 1px,根据媒体查询结合transform缩放为相应尺寸