移动端开发常见的问题?

最近在开发公司基于微信端的服务号,遇到一些坑,也只有跳进去才知道该如何解决?

跳坑之一:
移动端适配的方案,网上有很多关于移动端适配的方案,有rem,Media Query和js+css,总之,不同的场景用不同的方案,在我刚接触移动适配的时候我是选择用Media去做兼容性写法,后来发现这样写的效率很低,代码冗余,最关键的是只能大致针对多数设备做一个折中的方案,做不到全适配。后来,选择了rem去做适配,因为只需要将px换算成rem就可以全适配,但是在字体的处理和图标的处理上用rem的话误差有点大,所以个人建议还是用px,根据设备的分辨率采用不同的大小,一般主流的也就是1倍,2倍和3倍。相对应的px变成1,2,*3也就ok了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
(function( window , document ){
'use strict';
//给hotcss开辟个命名空间,别问我为什么,我要给你准备你会用到的方法,免得用到的时候还要自己写。
var hotcss = {};
(function() {
//根据devicePixelRatio自定计算scale
//可以有效解决移动端1px这个世纪难题。
var viewportEl = document.querySelector('meta[name="viewport"]'),
hotcssEl = document.querySelector('meta[name="hotcss"]'),
dpr = window.devicePixelRatio,
maxWidth = 540,
designWidth = 0;
//var isAndroid = win.navigator.appVersion.match(/android/gi);
var isIPhone = window.navigator.appVersion.match(/iphone/gi);
if (isIPhone) {
// iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
if (dpr >= 3 && (!dpr || dpr >= 3)) {
dpr = 3;
} else if (dpr >= 2 && (!dpr || dpr >= 2)){
dpr = 2;
} else {
dpr = 1;
}
} else {
// 其他设备下,仍旧使用1倍的方案
dpr = 1;
}
//允许通过自定义name为hotcss的meta头,通过initial-dpr来强制定义页面缩放
if (hotcssEl) {
var hotcssCon = hotcssEl.getAttribute('content');
if (hotcssCon) {
var initialDprMatch = hotcssCon.match(/initial\-dpr=([\d\.]+)/);
if (initialDprMatch) {
dpr = parseFloat(initialDprMatch[1]);
}
var maxWidthMatch = hotcssCon.match(/max\-width=([\d\.]+)/);
if (maxWidthMatch) {
maxWidth = parseFloat(maxWidthMatch[1]);
}
var designWidthMatch = hotcssCon.match(/design\-width=([\d\.]+)/);
if (designWidthMatch) {
designWidth = parseFloat(designWidthMatch[1]);
}
}
}
document.documentElement.setAttribute('data-dpr', dpr);
hotcss.dpr = dpr;
document.documentElement.setAttribute('max-width', maxWidth);
hotcss.maxWidth = maxWidth;
if( designWidth ){
document.documentElement.setAttribute('design-width', designWidth);
hotcss.designWidth = designWidth;
}
var scale = 1 / dpr;
//iphone6 hack, 2016/05/12 by alu
if (scale == 0.5 && isIPhone && window.innerWidth == 375) {
scale = 0.51;
}
var content = 'initial-scale=' + scale + ', minimum-scale=' + scale + ', maximum-scale=' + scale + ', user-scalable=no,width=device-width';
if (viewportEl) {
viewportEl.setAttribute('content', content);
} else {
viewportEl = document.createElement('meta');
viewportEl.setAttribute('name', 'viewport');
viewportEl.setAttribute('content', content);
document.head.appendChild(viewportEl);
}
})();
hotcss.px2rem = function( px , designWidth ){
//预判你将会在JS中用到尺寸,特提供一个方法助你在JS中将px转为rem。就是这么贴心。
if( !designWidth ){
//如果你在JS中大量用到此方法,建议直接定义 hotcss.designWidth 来定义设计图尺寸;
//否则可以在第二个参数告诉我你的设计图是多大。
designWidth = parseInt(hotcss.designWidth , 10);
}
return parseInt(px,10)*320/designWidth/20;
}
hotcss.rem2px = function( rem , designWidth ){
//新增一个rem2px的方法。用法和px2rem一致。
if( !designWidth ){
designWidth = parseInt(hotcss.designWidth , 10);
}
//rem可能为小数,这里不再做处理了
return rem*20*designWidth/320;
}
hotcss.remAddpx=function(rem,px,designWidth){
var px1=hotcss.rem2px(rem,designWidth);
var px2=px*hotcss.dpr/2;
return px1+px2;
}
hotcss.mresize = function(){
//对,这个就是核心方法了,给HTML设置font-size。
var innerWidth = document.documentElement.getBoundingClientRect().width || window.innerWidth;
if( hotcss.maxWidth && (innerWidth/hotcss.dpr > hotcss.maxWidth) ){
innerWidth = hotcss.maxWidth*hotcss.dpr;
}
if( !innerWidth ){ return false;}
document.documentElement.style.fontSize = ( innerWidth*20/320 ) + 'px';
//document.documentElement.style.zoom =1/ hotcss.dpr;
hotcss.callback && hotcss.callback();
};
hotcss.mresize();
//直接调用一次
window.addEventListener( 'resize' , function(){
clearTimeout( hotcss.tid );
hotcss.tid = setTimeout( hotcss.mresize , 33 );
} , false );
//绑定resize的时候调用
window.addEventListener( 'load' , hotcss.mresize , false );
//防止不明原因的bug。load之后再调用一次。
setTimeout(function(){
hotcss.mresize();
//防止某些机型怪异现象,异步再调用一次
},333)
window.hotcss = hotcss;
//命名空间暴露给你,控制权交给你,想怎么调怎么调。
})( window , document );

跳坑之二
移动端图片的处理
因为做的是电商类项目,因此图片展示是占了页面的80%,大量的商品需要展示在有限的空间里,一开始是采用的电脑端一样的分页系统,发现体验不好,总感觉怪怪的。后来经过与负责人沟通之后改为滚动加载分页,当然说实话还是因为公司没有产品经理,而且需求在不断的变化(是因为项目在不断的摸索中,根据市场的反馈可能会做调整)。图片的大小是返回的是后台处理过的大小,保证不被拉伸或者压缩。
这里谈谈滚动加载的核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
window.onscroll = function(){
//获取整个bdoy内容文档的高度
var dheight = document.body.clientHeight || document.documentElement.scrollHeight;
//获取滚动条的高度
var stop = document.body.scrollTop || document.documentElement.scrollTop;
//var sheight = document.body.scrollHeight || document.documentElement.scrollHeight;
//获取可视区域的高度
var cheight = window.innerHeight || document.documentElement.clientHeight;
var dh = stop+cheight+20;
if(dh >= dheight){
clearTimeout(this.scrollTimer);
this.scrollTimer = setTimeout(function(){
//执行ajax操作数据
page++;
if(page <= data.pageCount){
showAjax(page);
//$("#loading").show();
//$("#nomore").hide();
}else{
//Notify.notify({ message: "更多内容,敬请期待", type: "warning", duration: 2000 });
//alert("没有更多了");
//$("#loading").hide();
//$("#nomore").show();
return false;
}
},200);
}
};

跳坑之三
a链接跳转后样式重置的问题,我的导航用到了a链接,点击后跳转,对应的样式需要对应到点击后的a链接上。
直接贴代码:

1
2
3
if ($($(this))[0].href == String(window.location)) {
};//如果这个链接的地址跟窗口的地址做对比,如果发生了跳转那么为true

跳坑之四
底部功能栏连续点击后有些安卓机器的微信浏览器无法识别是不是新的链接而跳转。
一开始的底部功能栏是直接用html写在页面上的,后来测试发现有些安卓机器多次点击后不跳转。后来改为动态加载底部功能栏,a链接的后面跟上时间戳。让浏览器能识别该链接已经发生了变化从而去跳转。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var d = new Date().getTime();
var footerHtml = '<ul class="list">' +
'<li class="item">' +
' <a href="/shop-place?t='+d+'">' +
' <i class="u-icon u-icon-topic"></i>' +
' <span class="txt">场景</span>' +
' </a>' +
' </li>' +
' <li class="item">' +
' <a href="/brand_list?t=' + d + '">' +
' <i class="u-icon u-icon-cate"></i>' +
' <span class="txt">品牌</span>' +
' </a>' +
' </li>' +
' <li class="item">' +
' <a href="/producePage?t=' + d + '">' +
' <i class="u-icon u-icon-house"></i>' +
' <span class="txt">商城</span>' +
' </a>' +
' </li>' +
' <li class="item">' +
' <a href="/ucenter?t=' + d + '">' +
' <i class="u-icon u-icon-profile"></i>' +
' <span class="txt">个人</span>' +
' </a>' +
' </li>' +
' </ul>';

另外为了方便开发,选择了jquery的Swiper.js插件进行头部分类栏,flexslider.js来做广告图的展示。
具体开发的时候还需要到一些问题以及解决的方法,下回我们在慢慢讲解。
end.

Share Comments