背景
在前端页面开发中,UI会提供@2x,@3x等二倍三倍不同尺寸的图,对于刚刚接触前端或者移动端开发的前端er可能会有些不是太明白。在实际开发中可能还会遇到以下情况:ui提供的网页设计图中一个input框是80px(尺寸为举例),前端er在代码中按照80px高度还原在网页上发现输入框的尺寸太高,这些问题的产生式因为UI和前端er在“像素”这个问题上不同的理解而造成的,下面就详细说说“像素”。
像素
- 设备像素(device pixel):设备像素设是物理概念,指的是设备中使用的物理像素。比如iPhone 5的分辨率640 x 1136px。
- CSS像素(css pixel):CSS像素是Web编程的概念,指的是CSS样式代码中使用的逻辑像素。
在CSS规范中,长度单位可以分为两类,绝对(absolute)单位以及相对(relative)单位。px是一个相对单位,相对的是设备像素(device pixel)。
比如iPhone 5使用的是Retina视网膜屏幕,dpr为2,所以设备像素数为640 x 1136px,而CSS逻辑像素数为320 x 568px。
DPR
参考文章:设备像素比devicePixelRatio简单介绍
设备像素和css像素之间的换算就用到了DPR(devicePixelRatio)。
结合具体项目来谈谈1像素问题。
在项目开发的过程中,会遇到1像素边框问题,这个1像素主要针对的是移动端DPR不为1的移动设备。
如下图
红色的方框为在iphone端显示为1像素的问题,相应代码(stylu)如下:
base.styl
@media (-webkit-min-device-pixel-ratio: 1.5),(min-device-pixel-ratio: 1.5)
.border-1px
&::after
-webkit-transform: scaleY(0.7)
transform: scaleY(0.7)
@media (-webkit-min-device-pixel-ratio: 2),(min-device-pixel-ratio: 2)
.border-1px
&::after
-webkit-transform: scaleY(0.5)
transform: scaleY(0.5)
mixin.styl
border-1px($color)
position: relative
&:after
display: block
position: absolute
left: 0
bottom: 0
width: 100%
border-top: 1px solid $color
content: " "
思路:对于不同的DPR利用css3中的transform scal属性进行缩放,为了显示出效果,下面我们将DPR为2的缩放改为5然后再测试设备上看单个底部边框的宽度。
base.styl
@media (-webkit-min-device-pixel-ratio: 1.5),(min-device-pixel-ratio: 1.5)
.border-1px
&::after
-webkit-transform: scaleY(0.7)
transform: scaleY(0.7)
@media (-webkit-min-device-pixel-ratio: 2),(min-device-pixel-ratio: 2)
.border-1px
&::after
-webkit-transform: scaleY(5)
transform: scaleY(5)
页面显示
在这里将scaleY(5)时,iphone5上的实际像素变为10px了,因为mixin.styl给定了边框宽度为1px,iphone5dpr为2,然后又放大了5倍,所以上图中灰色边框的css像素为10px。
【题外话】上面这个项目是如何设计1像素边框的,运用到的知识点
- stylus函数:mixin.styl中border-1px( color),传入的参数是 color,这个参数用来改变边框的颜色
- 伪元素选择器;::after伪元素,设置border-top:在这里给定边框的css像素为1px,设置内容为空,绝对定位。