用了MUI之后,才发现,那坑比我想象之中的要多得多,有些是H5的坑,有些是plus的坑,接下来我一一来吐槽一番。

IOS下面,上拉的时候,速度稍微快一点,表头自动隐藏,等你不拉的时候又自动显示

这种情况,在Android下面是正常的。why?

因为mui框架的头部header和底部nav都是采用的fixed布局

  1. <header id="header" class="mui-bar mui-bar-nav action-head"

而IOS下面压根就不支持fixed布局,所以喽就杯具了,这个问题还体现在另一种情况下。那就是当页面中的内容很长超出了一屏,而且页面中存在文本框,这个时候如果我们文本框一聚焦,在ios下面会自动滚动,软键盘会弹出来,这时如果你上拉下拉操作,fixed布局的部分就漂浮了。

我的解决方案

抛弃mui中旧的openWindow和openWindowWithTitle,采用最新的titleNView

  1. owner.openWindowWithTitle = function (WebviewOptions, title) {
  2. var _styles = { // 窗口参数 参考5+规范中的WebviewStyle,也就是说WebviewStyle下的参数都可以在此设置
  3. titleNView: { // 窗口的标题栏控件
  4. titleText: title, // 标题栏文字,当不设置此属性时,默认加载当前页面的标题,并自动更新页面的标题
  5. titleColor: "#fff", // 字体颜色,颜色值格式为"#RRGGBB",默认值为"#000000"
  6. titleSize: "17px", // 字体大小,默认17px
  7. backgroundColor: "#449DED", // 控件背景颜色,颜色值格式为"#RRGGBB",默认值为"#F7F7F7"
  8. progress: { // 标题栏控件的进度条样式
  9. color: "#56CF87", // 进度条颜色,默认值为"#00FF00"
  10. height: "2px" // 进度条高度,默认值为"2px"
  11. },
  12. splitLine: { // 标题栏控件的底部分割线,类似borderBottom
  13. color: "#CCCCCC", // 分割线颜色,默认值为"#CCCCCC"
  14. height: "0px" // 分割线高度,默认值为"2px"
  15. },
  16. autoBackButton: true
  17. },
  18. };
  19. WebviewOptions.styles = _styles;
  20. mui.openWindow(WebviewOptions);
  21. }

为什么官方提供的Demo没有这样的现象,说到这里,心里就火,官方提供的demo,限制了上拉下拉的速度,很慢的,所以自然无法出现表头在ios下面自动隐藏的情况,而且也没有这个长屏幕输入文本框的情况。可是官方没有给出任何说明,这才是最坑的。

其它问题:这里的返回图标的大小无法设置。H5+文档中没有找到相关设置的地方,我晕。

设置状态栏颜色IOS下面无效

一开始,我直接是通过修改manifest.json的配置来进行修改的,怎知Android下面是可以了,但是ios下面无效。plus节点下面添加如下配置,将状态栏设置为蓝色背景。

  1. "plus": {
  2. "launchwebview":{"statusbar":{"background":"#449DED"}},
  3. "statusbar":{"background":"#449DED"},/*状态栏*/

为了在IOS中所有页面中修改状态栏颜色,我在一个公共的js文件中添加了如下代码:

  1. document.addEventListener('plusready', function () {
  2. plus.navigator.setStatusBarBackground("#449DED");// 设置系统状态栏背景为蓝色
  3. plus.navigator.setStatusBarStyle("UIStatusBarStyleBlackOpaque");// 设置系统状态栏样式为浅色文字
  4. }, false);

OK,问题解决。

单WebView下面的上拉下拉问题

为什么官网给的Demo没问题?因为那Demo太简单了,实在是无法模拟真实的应用场景。

我目前的解决办法:判断当主界面的数据大于2条时,这是因为我这里大于2条时会出现滚动条,我自动设置主界面的高度+1px,这样做是为了产生垂直滚动条,然后在所有触发这个滚动弹出层的地方,添加如下代码:(比如说点击状态、或者点击报修部门的时候)

  1. isEmptyScroll = true;
  2. window.scrollTo(1, 1);

加载数据列表的代码

  1. if (app.$data.list.length <= 2) {
  2. if (isEmptyScroll) {
  3. g.id("pullrefresh").style.height = g.getScreenInfo('height') +1 + 'px';
  4. }
  5. } else {
  6. g.id("pullrefresh").style.height = 'auto';
  7. }
  8. isEmptyScroll = false;

公共js代码:

  1. /**
  2. * 获得屏幕的高度
  3. * @param {Object} element
  4. */
  5. owner.getScreenInfo = function (element) {
  6. if (element == 'width') {
  7. return document.documentElement.clientWidth || document.body.clientWidth;
  8. } else {
  9. return document.documentElement.clientHeight || document.body.clientHeigth;
  10. }
  11. };

据说采用双webview的话不会出现这种问题,我暂时没有去实验过,可是官方又推荐使用单webview的方式,说双webview太耗性能而且使用没那么方便。很操蛋啊,我自然是优先采用官方推荐的方式哇!

获取App缓存大小并清除缓存Android无效

按照H5+的方式去操作,IOS下面能取到值,但是Android无效。

  1. //清除缓存
  2. document.getElementById('clearCache').addEventListener('tap', function() {
  3. mui.confirm('图片及离线缓存的内容将会被删除', '确定删除所有缓存?', btnArray, function(e) {
  4. if(e.index == 1) {
  5. plus.cache.clear(function() {
  6. mui.toast("应用缓存清除成功!");
  7. });
  8. }
  9. });
  10. });

获取缓存大小

  1. mui.plusReady(function() {
    //获取缓存大小
  2. var _result = '';
  3. plus.cache.calculate(function(size) {
  4. _result = g.bytesToSize(size);
  5. console.log(_result)
  6. document.getElementById("cacheSize").innerText =_result;
  7. });
    });

公共方法:

  1. //字节转换为KB等大小
  2. owner.bytesToSize = function (bytes) {
  3. if (bytes === 0) return '0 B';
  4. var k = 1024;
  5. sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
  6. i = Math.floor(Math.log(bytes) / Math.log(k));
  7. var _size = (bytes / Math.pow(k, i));
  8. return _size.toFixed(2) + ' ' + sizes[i];
  9. }

目前暂时没有想到什么好的办法解决。

波浪效果在部分Android机型下无效

由于我这个动画特效是采用的css3,所以很容易想到是浏览器样式不兼容引起的。其实就是添加-webkit-前缀来指定。因为移动端许多浏览器都是webkit内核。

HTML

  1. <div class="portrait-clockin fr">
  2. <div class="dot" v-on:tap="doPunchCard()">
  3. <div class="dot2">
  4. <div class="dot3">
  5. <ul>
  6. <li class="one fl" v-text="nowTime"></li>
  7. <li class="fl">打卡</li>
  8. </ul>
  9. </div>
  10. </div>
  11. </div>
  12. </div>

css样式:

  1. .portrait-clockin{width: 3rem;height: 3rem;margin: 0 15px 0px 0px;}
  2. .fr {
  3. float: right;
  4. }
  5. /*上班打卡 水波纹效果*/
  6. a.dot:active,a.dot2:active,a.dot3:active{background: #70a236;}
  7. .dot {
  8. animation: sploosh 1.5s cubic-bezier(0.165, 0.84, 0.44, 1);
  9. -webkit-animation:sploosh 1.5s cubic-bezier(0.165, 0.84, 0.44, 1);
  10. }
  11. .dot2 {
  12. animation: sploosh2 1.5s cubic-bezier(0.165, 0.84, 0.44, 1);
  13. -webkit-animation:sploosh2 1.5s cubic-bezier(0.165, 0.84, 0.44, 1);
  14. }
  15. .dot3 {
  16. animation: sploosh3 1.5s cubic-bezier(0.165, 0.84, 0.44, 1);
  17. -webkit-animation:sploosh3 1.5s cubic-bezier(0.165, 0.84, 0.44, 1);
  18. }
  19. .dot ul{margin: 0px;padding: 0px;width: 100%;margin: 0.65rem 0px;}
  20. .dot li{width: 100%;font-size: 0.48rem;line-height: 0.5rem;height: 0.5rem;}
  21. .dot li.one{font-size: 0.4rem;line-height: 0.8rem;height: 0.8rem;}
  22. .dot,.dot2,.dot3{
  23. height: 96px;width: 96px;
  24. font-size: 20px;color: #fff;line-height: 96px;text-align: center;border-radius: 100%;
  25. position: absolute;z-index:;animation-iteration-count:infinite;
  26. -webkit-animation-iteration-count:infinite;background: transparent;
  27. }
  28. @keyframes sploosh {
  29. 0% {box-shadow: 0 0 0 0px rgba(158, 203, 244, 0.7);background: rgba(84, 166, 240, 0.7);}
  30. 100% {box-shadow: 0 0 0 10px rgba(158, 203, 244, 0);background: rgba(84, 166, 240, 0);}
  31. }
  32. @keyframes sploosh2 {
  33. 0% { box-shadow: 0 0 0 0px rgba(110, 179, 243, 0.7);background: rgba(84, 166, 240, 0.7);}
  34. 100% {box-shadow: 0 0 0 6px rgba(110, 179, 243, 0);background: rgba(84, 166, 240, 0.3);}
  35. }
  36. @keyframes sploosh3 {
  37. 0% {box-shadow: 0 0 0 0px rgba(255, 255, 255, 0.7);background: rgba(84, 166, 240, 0.7);}
  38. 100% {box-shadow: 0 0 0 2px rgba(255, 255, 255, 0); background: rgba(84, 166, 240, 1);}
  39. }
  40.  
  41. @-webkit-keyframes sploosh {
  42. 0% {-webkit-box-shadow: 0 0 0 0px rgba(158, 203, 244, 0.7);background: rgba(84, 166, 240, 0.7);}
  43. 100% {-webkit-box-shadow: 0 0 0 10px rgba(158, 203, 244, 0);background: rgba(84, 166, 240, 0);}
  44. }
  45. @-webkit-keyframes sploosh2 {
  46. 0% {-webkit-box-shadow: 0 0 0 0px rgba(110, 179, 243, 0.7);background: rgba(84, 166, 240, 0.7);}
  47. 100% {-webkit-box-shadow: 0 0 0 6px rgba(110, 179, 243, 0);background: rgba(84, 166, 240, 0.3);}
  48. }
  49. @-webkit-keyframes sploosh3 {
  50. 0% {-webkit-box-shadow: 0 0 0 0px rgba(255, 255, 255, 0.7);background: rgba(84, 166, 240, 0.7);}
  51. 100% {-webkit-box-shadow: 0 0 0 2px rgba(255, 255, 255, 0); background: rgba(84, 166, 240, 1);}
  52. }
  53. /*波纹结束*/

关于圆点在IOS下面显示的问题

圆点效果如下:

我之前的做法:

  1. <span v-if="item.rad" href="#" class="round"></span>

CSS代码如下:

  1. /*小圆点*/
  2. .round {
  3. width: 6px;height: 6px;display: -webkit-inline-box;font-size: 7px;margin-left: -2px;
  4. line-height: 6px;text-align: center;color: #FD7777;text-decoration: none;position: absolute;top: 5px;
  5. }

结果我发现,在IOS下面这个小圆点是在是太小了,而且无论你怎么修改样式的宽和高都无效。

后来的做法:

HTML代码结构如下, class="round"部分

  1. <a v-for="(item,index) in menus" v-on:tap="getTaskList(item.name)" class="mui-control-item" v-bind:id="item.id" v-bind:class="{'mui-active': !index}">
  2. <span v-text="item.title"></span>(<span v-text="item.taskNum"></span>)
  3. <span v-if="item.rad" href="#" class="round"></span>
  4. </a>

CSS代码如下:

  1. /*小圆点*/
  2. .round {
  3. border-radius:50%;width: 6px;height: 6px;display: -webkit-inline-box;font-size: 6px;margin-left: -2px;
  4. line-height: 6px;text-align: center;background-color: #FD7777;text-decoration: none;position: absolute;top: 5px;
  5. }

HBuilder更新有风险

HBuilder隔三差五的就会发布新的补丁,然后你每天打开的时候,它就会自动弹出提示框,提示你是否更新,如果你一不小心点击了更新,那你最好先看看补丁解决了哪些问题,看一下它的更新日志。

然后一定要记得的是,要去更新你项目中mui.js、mui.css等等这些你项目中引用了的文件。如何更新呢?可以在最新的HBuilder中新建一个mui项目,然后把项目中的js和css文件拷贝过来。因为每一次打补丁,你很难确定它是否只修改了基座,还是其它mui相关的css或者js都有修改,所以保险的做法就是一起更新。还有个问题需要注意的是,每一次补丁升级,都有可能改出新的问题,所以在更新之前,建议先备份所有代码,或者给代码打一个标签。

使用图片缩放要注意

mui官方demo中提供了图片缩放功能,其实这里有需要注意的地方,如果需要用到图片缩放的界面中,存在文本框等需要输入和编辑的地方,会让你输入和编辑无效。也就是说你图片缩放只能在详情这种只需要展示的场景下使用,而官方是不会告诉你这些的,只有你被碰得头破血流,才会感到多么痛的领悟!

暂时就先吐槽这么多,其它的问题还有很多....

H5+混合移动app应用开发——坑我太甚的更多相关文章

  1. H5+混合移动app应用开发——开篇

    前言 经过2个多月的艰苦奋斗,app的第一个版本已经快完工了,期间遇到了太多的坑,作为一个喜欢分享的人,我当然不会吝啬分享这爬坑历程.不要问我有多坑,我会告诉你很多,很多..... 过去一直从事.ne ...

  2. H5+混合移动app应用开发——app升级

    当我们的app开发完成之后,无可避免的以后会进行产品升级,那么我们希望在客户的手机上让app进行自动升级,可以分为自动升级和手动升级. 自动升级:一般在客户app第一次打开首页的时候. 手动升级:在a ...

  3. H5+混合移动app

    H5+混合移动app 前言 经过2个多月的艰苦奋斗,app的第一个版本已经快完工了,期间遇到了太多的坑,作为一个喜欢分享的人,我当然不会吝啬分享这爬坑历程.不要问我有多坑,我会告诉你很多,很多.... ...

  4. H5、原生app、混合开发三者比较

    一.概念 a) H5:即Html5,接触过互联网的都知道html,所以很明显h5是html的第5次重大修改的一项超文本标记语言的标准协议. b) 原生:使用原生制作APP(Native app),即在 ...

  5. 移动端H5混合开发设置复盘与总结

    此篇接上一篇: 移动端H5混合开发,Touch触控,拖拽,长按, 滑屏 实现方案 https://www.cnblogs.com/buoge/p/9346699.html app 场布设置已经上线了, ...

  6. 浅谈App原生开发、混合开发及HTML5开发的优劣

    App混合开发(英文名:Hybrid App),是指在开发一款App产品的时候为了提高效率.节省成本即利用了原生的开发技术还应用了HTML5开发技术,是原生和HTML5技术的混合应用.目前App的开发 ...

  7. 能挣钱的微信JSSDK+H5混合开发

    H5喊了那么久,有些人都说不实用,有些人却利用在微信中开发H5应用赚得盆满钵满.微信JSSDK + HTML 5,让移动Web开发与微信结合轻而易举!跨平台.零成本,让大众创业变得更方便. 我觉得现在 ...

  8. Android H5混合开发(1):构建Cordova 项目

    Cordova是什么 Apache Cordova是一个开源的移动开发框架.允许你用标准的web技术-HTML5,CSS3和JavaScript做跨平台开发. 以移动平台为例,安卓.IOS平台设备的常 ...

  9. Android H5混合开发(2):自定义Cordova插件

    前言 Cordova虽然定义了很多基础的插件,供H5端使用原生设备的功能. 但是,如果业务相关的功能,需要提供给H5端使用,那么,就需要我们自定义插件了. 这个"自定义"不是指由A ...

随机推荐

  1. GpG使用指南

    1. 简介 1991年,程序员Phil Zimmermann为了避开政府监视,开发了加密软件PGP.这个软件非常好用,迅速流传开来,成了许多程序员的必备工具.但是,它是商业软件,不能自由使用.所以,自 ...

  2. IntelliJ IDEA2017.3 激活

    网上IntelliJ IDEA激活方式大多均已失效,目前常用激活方式为License Server 激活: http://idea.imsxm.com/ NOTE: 在上周五2017-12-1那天还是 ...

  3. MyEclipse 2015利用Cygwin+CDT搭建C/C++开发环境

    GitHub原文:https://github.com/x113773/testall/issues/22 首先安装Cygwin 1:首先去网站 www.cygwin.com 下载 Cygwin 的 ...

  4. Python正则表达式返回首次匹配到的字符及查询的健壮性

    re.findall(pattern,string)会搜索所有匹配的字符,返回的是一个列表,获取首个匹配需要re.findall(pattern,string)[0]访问, 但是如果findall没匹 ...

  5. 【最大权闭合子图】bzoj4873 [Shoi2017]寿司餐厅

    4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 369  Solved: 256[Submit][Status ...

  6. CSS3 动画 cheatsheet

    Transition 实例 .box { height: 100px; width: 100px; background: #212121; transition: width 1s ease, he ...

  7. CAD 二次开发 -- 自动加载开发的DLL

    CAD二次开发可以采用写扩展DLL的方式实现.该DLL的函数可以被CAD调用. 但是调用前,必须用命令netload 将该dll加载到CAD. 其实可以修改注册表,当CAD软件启动后,自动加载扩展DL ...

  8. Nginx是如何处理Request的?

    nginx是如何匹配过来的请求,然后做处理的呢?这个匹配的过程可以分为两步: 1.选择server 2.选择location    选择server 仅仅匹配server name 加入Nginx的配 ...

  9. ICP在pose-graph中的作用

    从1维的角度进行解释: 1m P0   o-----------------------o   P1 假如LOAM计算的两个车辆初始位姿P0.P1如上图所示,作为pose-graph的两个顶点.那么二 ...

  10. 我的第三个网页制作:b、i、s、u、sub、sup标签的使用

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...