手机端网页开发兼容性指南
毫无疑问,随着微信的崛起,移动端网页开发又进一步,需求量不断攀升。但是智能手机市场的丰富多彩,百花齐放,导致移动端的网页开发和传统的 PC 端网页开发有所不同。
很多人可能正迈向手机端网页开发,但又听说手机端网页开发有着这样或那样的问题,所以有些忐忑。
这里,博主用近年来开发手机端页面的经历,来告诉大家手机端应该注意哪些问题,同时也会讲一讲这些问题产生的原因以及解决的方法。
问题清单
-
<meta>
标签处理 - 1px 边框问题
- 300 毫秒点击延迟问题
- 点透问题
- 图片分辨率问题(@2x与@3x图)
问题详解
meta 标签处理
在 2014 年,W3C 就发布了 HTML5。现在手机端网页都是采用 HTML5 标准。当然,在一些 PC 网页,越来越多的人也采用了新的网页标准。
在开始写手机端网页时,我们会在 HTML 中写上下面的代码:
<meta name="viewport" content="width=device-width, initial-scale=1">
关于 viewport 的细节请参考:https://www.cnblogs.com/2050/p/3877280.html
1px 边框问题
所谓的 1px 边框问题就是在 dpr 大于 1 的屏幕上,我们在 CSS 声明的 border 为 1px 所呈现出来的效果不是我们希望的 1px。
我们知道屏幕有许许多多的像素点组成,每一个像素点只可以呈现一种颜色,像素点就是颜色分配的最小单位。
图片来自:https://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html
观察上面这张图,不难发现,在同一物理尺寸大小下,我们可以划分出不同的数量的小方格。如果我们把其比为像素点,我们可以知道,在同一大小的手机屏幕上,由于工艺和材料的不同,我们可以得到不同数量像素点的屏。
同一尺寸,像素点密度越大,那么它所呈现出来的颜色越丰富,看上去也就越清晰。苹果的 Retina 屏就是一种高清屏,屏幕密度比一般安卓手机要大(不过现在安卓手机屏幕的分辨率也变大了)。
更多关于各种尺寸的单位请查看:https://blog.csdn.net/zhoulei1995/article/details/78671256
因为 CSS 中的 px 是一个相对单位,所以在 dpr 为 1 的屏幕中,它会用 1 个像素点去渲染;但在 dpr 为 2 的屏幕中,它会用 4 个像素点去渲染。而我们实际上期望在所有的屏幕中,一边框都是一个像素点去渲染的。
那么如何解决这个问题呢?
博主使用的就是 @media 媒体查询 + 伪类 + transform: scale 这种方式来实现。
border-1px($color) {
position: relative
&:after {
display: block
position: absolute
left: 0
bottom: 0
width: 100%
border-top: 1px solid $color
content: ' '
}
}
@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)
}
}
}
更多 1px 解决方案:https://www.w3cplus.com/css/fix-1px-for-retina.html
300 毫秒点击延迟问题
在 PC 时代,我们用鼠标点击,即可触发一些动作。但是在智能手机时代,一切变得不同了。2007 年,首款 iPhone 发布前,工程师针对移动端大屏手机的体验做了一些优化。比如单击可以触发一个动作,双击可以触发另一个动作,如放大网页,这极大方便了用户。
那么如果判断用户是单机还是双击呢?苹果工程师相处了一个方法,用户点击时会有一个 300 毫米的延迟,之后才会触发动作。这个 300 毫秒的间隙,如果用户又点击了一次,那么可以判断用户本次的操作为双击。
可是随着移动互联网的发展,许多网页不需要双击操作,因为网页针对移动端的优化做的越来越好。如此以来,300 毫秒的设计反而在大多数场景成了一个问题。
FastClick
-
简介
FastClick,FT Labs 专门为解决移动端浏览器 300 毫秒点击延迟问题所开发的一个轻量级的库。 -
原理
在检测到 touchend 事件的时候,FastClick 会通过 DOM 自定义事件立即触发一个模拟 click 事件的 click 事件(自定义事件),并把浏览器在 300 毫秒之后真正触发的 click 事件阻止掉。
更多细节参考:http://www.cnblogs.com/chaojidan/p/4517895.html
点透问题
这个问题造成的原因是:触摸事件和点击事件的时间不一致。
js 事件执行顺序:触摸事件 > 点击事件。
如 A 和 B 两个元素,且采用绝对定位,相互不包含,但是 A 在 B 的上面。假设 A 和 B 都绑定了触摸事件,那 A 元素事件触发后 A 元素隐藏,这个时候点击效果造成的触摸事件触发了,但是点击事件还没触发。
本来应该作用到 A 元素上的,但是 A 元素隐藏了,就触发到 B 元素上了。所以看上去像发生了点透事件。
图片分辨率问题(@2x与@3x图)
为什么移动端我们有 @2x 与 @3x 图之分呢?这个还是因为手机屏幕问题,有的是普通屏,有的是高清屏,这就造成了相同尺寸的屏幕像素密度不同。
这里我们需要认识一下尺寸和分辨率。
- 尺寸:物理单位,一个绝对单位,如:米
- 分辨率:相对单位,如:像素
先说一下手机,如 iPhone 3GS 和 iPhone 4 都是 3.5 英寸,但是前者分辨率为 320 * 480,而后者的分辨率为 640 * 960。
同样,同一尺寸的图片,其分辨率也可能不同。
主要有两种情况会造成问题:
- 图片的分辨率大于屏幕分辨率
- 图片的分辨率小于屏幕分辨率
第一种情况:由于图片的像素数目屏幕物理像素的数目,这样一来即使使用全部的物理像素也无法完整显示这张图片,因此浏览器也会经过一定的算法,将图片进行压缩,使得压缩后图片的位图像素等于物理像素。
结果:图片清晰度不会发生变化,但是会有一些色差及锐利度的减少。
第二种情况:用来显示图片的屏幕物理像素个数大于图片物理像素,那么屏幕多出的物理像素将采用填充的方法来显示图片。
结果:造成图片模糊。