1px问题产生的原因
从移动端的角度说个具体的场景,以iphone6为例。
iphone6的屏幕宽度为375px,设计师做的视觉稿
一般是750px,也就是2x,这个时候设计师在视觉稿
上画了1px的边框,于是你就写了“border-width:1px
”,so…1px边框问题产生了。
对设计师来说它的1px是相对于750px的(物理像素),对你来说你的1px是相对于375px的(css像素)“实际上你应该是border-width:0.5px”。
具体方案
知道了问题产生的原因,辣么就好弄解决方案啦,O(∩_∩)O。
用小数写边框
媒体查询,加小数的写法
1 | .border { border: 1px solid #999 } |
- 优点:方便噻
- 缺点: 安卓与低版本IOS不适用, 这个或许是未来的标准写法
tranform加伪类标签
利用伪类标签,更具父级定位,大小更具媒体查询
缩放实现效果(注意别忘记了“transform-origin: left top;”)
1 | <span class="border-1px">1像素边框问题</span> |
1 | // less |
需要注意input button是没有:before, :after伪元素的
- 优点: 其实不止是圆角, 其他的边框也可以这样做出来
- 缺点: 代码量也很大, 占据了伪元素, 容易引起冲突
box-shadow
利用阴影来模拟边框
1 | .border-1px{ |
2倍屏
3倍屏幕
border-image
弄出1px像素边框的实质是弄出0.5px这样的边框,所以我们可以利用类似于这样的图片,使得“border-image-slice”为2,那么实际上边框有一半是透明的,即可得到我们想要的“1px边框”
1 | <div class="test"> |
1 | .test{ |
- 修改颜色麻烦, 需要替换图片
- 圆角需要特殊处理,并且边缘会模糊
background
这方法基本不用(麻烦O(∩_∩)0),不过还是记录一下
1 | .background-image-1px { |
总结
从兼容性和灵活性来考虑,个人还是推荐tranform加伪类标签
的写法,节约时间成本。