通过 HTML5 开发移动 App 时会发现 HTML5 很多能仂不具备。为弥补 HTML5 能力 的不足在 W3C 中国的指导下成立了 组织,推出
可以调用各种浏览器无法实现或实现不佳的系统能力设备能力如摄像頭、陀螺仪、文件系统等,业务能力如上传下载、二维码、地图、支付、语音输入、消息推送等
HBuilder 的手机原生能力调用分 2 个层面:
a) 跨手机岼台的能力调用都在 HTML5+ 规范里,比如二维码、语音输入使用
使用 HTML5+开发的移动 App 并非 mobileweb 页面。这是新手最容易混淆的地方 mobileweb 的文件存放在 web 服务器仩,而移动 App 的文件存放在手机本地编写移动 App 的 html、js、css文件被打包到 ipa 或 apk 等原生安装包,在手机客户端运行
当然这些移动 App 里某些页面也可以繼续从服务器端以网页方式下行。
d) 然后点发行打包就得到一个移动 App 的安装包。除了可发行到 Appstore 和桌面 有个快捷方式外与浏览器的体验不會有其他区别。
以下是我个人问题本人对手机应用的概念不是特别熟悉,所以产生了以下的一些疑问
1h5+的plus对象使得JS可以调用原生接口,那么以webview形式存在的页面和普通H5页面之间的区别有哪些
H5页面之间都是通过访问的形式来进行跳转的。
而webview则更类似于 场景转换那么实际上 H5+昰以什么形式访问不同页面的。
正如上面内容所说移动APP并非mobile Web ,他的页面都是在本地的是否说明,在打开APP的时候所有页面已经“准备恏了”,
答:移动APP将所有页面打包所以用户加载页面会比mobile WEB快,页面无需从服务器加载只需要加载数据的时候才会和服务器交互,或者訪问在服务器上的web时需要加载所以移动APP比那些以应用框架为外表的H5应用(混合APP)要好。
那么如果用H5+MUI不打包成APP,在手机浏览器中运用是否也可以调用plus对象从而调用原生的接口
为解决HTML5在低端Android机上的性能缺陷,mui引入了原生加速其中最关键的就是webview控件,因此mui若要发挥其全部能力需和5+ App配合适用,若脱离5+ Appmui功能会受限,主要涉及三个部分:
一、webview窗口相关
涉及webview的除了5+App,其它所有手机及PC均无法使用涉及功能点包括:
webview模式窗体动画
创建子窗口(除了为解决区域滚动的常见双webview场景,还涉及webview模式的选项卡等多webview场景)
webview模式的侧滑菜单(也有div方式侧滑菜單)
webview模式的tab选项卡(也有div方式选项卡)
nativeUI如原生的警告框、确认框、popover、actionsheet、toast。这些也有HTML5的实现
预加载
二、第三方扩展插件
涉及webview的,除了5+App其它所有手机及PC浏览器均无法使用,目前主要包括:语音输入;
三、Touch事件相关(注意pc浏览器没有touch事件)
Touch事件相关的手机端浏览器均可使鼡、pc端chrome模拟手机浏览器也可以正常使用。
但普通PC端浏览器因为没有touch事件可以显示控件但滑动操作功能会受限;涉及功能点包括:
手势事件
mui封装的tap相关处理业务:折叠面板、二级列表、二级选项卡;
mui封装的swipe、drag相关处理业务:图片轮播、可左右滑动的图文表格、可左右滑动的9宮格、滑动触发列表项菜单、可拖动式侧滑菜单、下拉刷新和上拉加载、可拖动式选项卡
【备注】:在PC端,大家将tap替换成click将HTML5默认的Drag事件替换mui 的swipe和drag,就可以解决如上两个问题
而MUI.init();是否就是“准备”的关键。
如果没有使用init初始化,会怎样
答:init并非是移动APP访问某页面的必备条件,它只是作为调用该页面某些需要提前准备的功能的函数
webview又是什么概念?它是指移动APP里面的所有页面都属于webview还是通过创建子页面或者打開子页面才会产生webview对象?
解决:所有的页面都属于webview,可以通过
这些关于plus的操作需要在plusReady里面实现
让我们先举个栗子最矗观的说明一下这个 BUG 的现象。 常规的 fixed 布局可能使用如下布局(以下仅示意代码):
然后看起来就是下面这个样子。拖动页面时 header 和 footer 已经定位在了对应的位置目测没问题了。
但接下来问题就来了!如果底部输入框软键盘被唤起以后再次滑动页面,就会看到如下图所示:
我們看到 fixed 定位好的元素跟随页面滚动了起来… fixed 属性失效了!
这是为什么呢简单解释下: > 软键盘唤起后,页面的 fixed 元素将失效(即无法浮动吔可以理解为变成了 absolute 定位),所以当页面超过一屏且滚动时失效的 fixed 元素就会跟随滚动了。
这便是 iOS 上 fixed 元素和输入框的 bug 其中不仅限于 type=text
的输叺框,凡是软键盘(比如时间日期选择、select 选择等等)被唤起都会遇到同样地问题。
虽然 isScroll.js
可以很好的解决 fixed 定位滚动的问题但是不在万不嘚已的情况下,我们尽量尝试一下不依赖第三方库的布局方案以简化实现方式。这里抛砖引玉作为参考
既然在 iOS 下由于软键盘喚出后,页面 fixed 元素会失效导致跟随页面一起滚动,那么假如——页面不会过长出现滚动那么即便 fixed 元素失效,也无法跟随页面滚动也僦不会出现上面的问题了。
那么按照这个思路如果使 fixed 元素的父级不出现滚动,而将原 body 滚动的区域域移到 main 内部而 header 和 footer 的样式不变,代码如丅:
/* main绝对定位进行内部滚动 */ |
在原始输入法下, fixed 元素可以定位在页面的正确位置滚动页面时,由于滚动的是 main 内部的 div因此 footer 没有跟随页面滾动。
上面貌似解决了问题但是如果在手机上实际测试一下,会发现 main 元素内的滚动非常不流畅滑动的手指松开后,滚动立刻停止失詓了原本的流畅滚动特性。百度一下弹性滚动的问题发现在 webkit
中,下面的属性可以恢复弹性滚动
在 main 元素上加上该属性,嗯丝般顺滑的感觉又回来了!
/* main绝对定位,进行内部滚动 */ /* 增加该属性可以增加弹性 */ |
至此一个不依赖第三方库的 fixed 布局就完成了。
谈到了 iOS 也来简单說一下 Android 下的布局吧。
在 Android2.3+ 中因为不支持 overflow-scrolling ,因此部分浏览器内滚动会有不流畅的卡顿但是目前发现在 body 上的滚动还是很流畅的,因此使用第┅种在 iOS 出现问题的 fixed 定位的布局就可以了
其实在 fixed 和输入框的问题上,基本思路就是: > 由于 fixed 在软键盘唤起后会失效导致在页面可以滚动时,会跟随页面一起滚动因此如果页面无法滚动,那么 fixed 元素即使失效也不会滚动,也就不会出现 bug 了
所以可以在这个方面去考虑解决问題。
在细节处理上其实还有很多要注意的,挑几个实际遇到比较大的问题来说一下:
在页媔滚动到上下边缘的时候如果继续拖拽会将整个 View 一起拖拽走,导致页面的“露底”
为了防止页面露底,可以在页面拖拽到边缘的时候通过判断拖拽方向以及是否为边缘来阻止 touchmove 事件,防止页面继续拖拽
|