问题描述
通常我们实现边框的方法都是设置1px的边框,但是在retina屏上因为设备像素比的不同,边框在移动设备上的表现也不相同,例如在devicePixelRatio = 2的retina屏下会显示成2px。这对于拥有像素眼的设计同事来说是无法忍受的,他们会一眼看出这边框粗了很多(真可怕,不过经历这次问题之后,感觉自己也练成了像素眼),并且在用户体验上略差,所以现在要解决的问题就是在retina屏幕下实现1px的边框。
解决方案
查找了一些资料,也对比了很多方案,个人认为这个是css的问题,所以尽量不使用js来协助较好。但是可能会有局限。下面就列举一些方案,并对比下优劣。
1.IOS8+已经支持0.5px了,所以,可以使用media query+0.5px来解决这类问题:
#box{
border:1px solid #fff;
}
@media (-webkit-min-device-pixel-ratio: 2) {
#box {
border:0.5px solid #fff;
}
}
不支持0.5px的ios7及安卓,会显示为0px,所以对于这些系统需要另外写样式。这个方案支持圆角。
2.对于devicePixelRatio >= 2的设备,在需要加边线的元素上使用after伪元素,尺寸设置为1px,然后使用transform:scale进行缩小0.5倍操作:
.border-bottom1px {
position: relative
}
.border-bottom1px:after {
content: '';
position: absolute;
left:;
bottom:;
width: 100%;
height: 1px;
-webkit-transform-origin: 0 bottom;
transform-origin: 0 bottom;
background: #d7d6dc
}
@media(-webkit-min-device-pixel-ratio:2) {
.border-bottom1px:after {
-webkit-transform: scaleY(.5);
transform: scaleY(.5)
}
}
这个方案实现单条边线较合适,多条边线伪元素不够用。并且不能实现圆角边框。并且代码相对较多较分散,维护不易。
3.box-shadow
.border-bottom1px{
-webkit-box-shadow:0 1px 1px -1px rgba(0, 0, 0, 0.5);
}
这个方案可以实现圆角,可以实现多边框,
但是在某些机器上有阴影,很影响美观,所以一般不用。简单边框还是用2比较合适。
4.background-image
用css设置1px的image,50%透明,50%带有颜色:
.border-1px {
background-image:linear-gradient(180deg, red, red 50%, transparent 50%),
linear-gradient(270deg, red, red 50%, transparent 50%),
linear-gradient(0deg, red, red 50%, transparent 50%),
linear-gradient(90deg, red, red 50%, transparent 50%);
background-size: 100% 1px,1px 100% ,100% 1px, 1px 100%;
background-repeat: no-repeat;
background-position: top, right top, bottom, left top;
padding: 10px;
}
可以实现单条或多条边框,圆角不能实现
5.图片
需要多加载一张图片,另外边框颜色修改的时候需要更换图片,一般不使用这个方法。
6.viewport+rem
在devicePiexlRatio=2情况下设置meta:
<meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">
再设置rem:
html {
font-size: 20px;
}
header {
height: 3rem;
}
将边线宽换成rem就可以。
js协助的方法类似,使用js判断UA,看是否是ios8+,是的话添加一个类。