如何让uni-app APP看起来更像原生?

前言

其实我们常用APP的人,对于一个页面是原生APP还是hybird APP,我们往往一眼就能看出来谁是网页质感、手感,谁是原生质感、手感,但是真让你说两者差别在哪里,你可能又一时说不出。今天我就试着讨论一下这个问题。

下文主要对比讨论网页和原生的区别,而且,下文中我所谓的网页,是假定没有优化的、做的非常弱鸡的、前后端分离且JS渲染的网页,显然,uni-app很容易做出这种网页。而我所谓的原生,是假定优化的很棒的原生。只有这样,我们才能最大限度地优化网页,让网页尽量贴近原生体验。

图片

原生APP的图片有什么特点?

  1. 懒加载,没有加载成功的时候,有占位图案,或者即便没有占位图案,至少宽高是撑起来的,而网页会从一个小点突然变成一张图,容器由扁的突然撑高,尤其是使用了Vue等框架的前提下。

  2. 原生的图片尺寸都是严格规定的,会为不同dpi准备生成@2、@3的图片,而网页可能由一张非常大的图片用样式缩小,然后直接用,于是很卡顿。

解决方案

  1. 一定要给所有图片设定写死的宽高。

因为uniapp为了兼容小程序,它的<image>组件是有默认宽高的,这跟HTML的<img>是2个概念,所以,最好给每一张图片都设定写死的宽高(所谓写死当然不是指用px单位,应当用rpx单位)。

  1. 关于图片实际大小的问题。

现在主流手机的ppi都是3,也就是说,主流手机的CSS像素宽度是360像素,设备像素宽度是1080像素,因此,一张全宽的图片,设计它的时候,它的宽度像素应当设为1080像素即可,就是说,uniapp里面750rpx宽度的图片,设计的时候按1080像素做,比例是1.44倍,代码里写图片宽度的时候不要写1080px,而是写750rpx。

可能美工大人会说,不是按照750px宽度设计吗?

这特么老黄历了,五年前的规矩也该变变了。

  1. 首屏使用占位图,也就是骨架屏。

骨架屏的本质就是灰色的背景色,只在首屏使用即可,也没必要使用第三方组件库,自己调一调就出来了。

  1. 预加载后一页的首屏数据和图片。

除了骨架屏,我们还有一种更新的技术是,前一页闲时加载后一页首屏的数据和图片。当图片有了缓存,当然就秒开了。

当然,有个前提是,从统计后台看,你的用户有大概率会进入该下级页面,达到一定概率值,才值得为该下级页面做预加载,不可能给所有下级页面都使用预加载。

  1. 首屏用菊花图。

一个页面有N个下级页面,不可能全都提前加载数据和图片,这时候,对于不重要的页面用用菊花图也无妨。也就是说,开场菊花图转啊转,然后ajax首屏数据,然后js渲染,然后监听图片load事件,等一切全搞定,才给全页面执行show,并开始加载下方的数据和图片。

所以下方的内容并不是一进页面就ajax,而是需要监听全页面是不是show了,只当show了才开始ajax下方的内容。

  1. 首屏下方图片使用懒加载。

首屏下方的图片不可能用菊花图,用懒加载即可。那么骨架屏和懒加载的区别是什么?骨架屏是连图带文字全都要做骨架,懒加载只是图片做即可,效果类似,都是灰色的底色。关于懒加载方案,uniapp的<image>的lazy-load属性支持APP(不支持H5),所以APP可以用。

  1. 使用交错GIF、交错PNG、渐进JPEG。

交错GIF、交错PNG、渐进JPEG是一种更先进的图片,它们的意思是,图片显示不是从上到下一点点展开,而是尽快充满全部面积,然后慢慢由不清晰渐变到清晰。作图工具都能制作这种图片,就看你觉得值不值得费这个力气了。

  1. 解决uniapp做的APP会闪烁的问题。

当页面结构复杂,css样式太多的情况,使用<image>可能导致样式生效较慢,出现 “闪一下” 的情况,此时全局设置image{will-change: transform}可优化此问题。

到此,对于图片的处理就非常接近原生了。

容器

原生APP的容器有什么特点?

  1. 跟图片一样,APP的容器也是默认撑起高度的,而弱鸡网页的容器可能在打开的瞬间是无高度的,因为没内容,等ajax到内容后才忽然撑起高度。

  2. APP的列表是惰性渲染的,只有接近展现的时候才会渲染,滚动也相当丝滑,而弱鸡网页没有这种优化。

  3. 真1像素发丝线。

  4. 原生通常是首页、无限加载的列表没有滚动条,正文有滚动条,而弱鸡网页一律有滚动条,或者是懂得用::-webkit-scrollbar隐藏滚动条,然而,在APP端并不生效。

解决方案

很多方案跟上面相似。

  1. 首页首屏可以采用骨架屏。

骨架屏可以做到提前撑起容器高度。

  1. 首页首屏也可以采用菊花图。

也可以放弃撑起高度这个念头,直接先白屏+菊花图,然后一瞬间呈现全渲染好的容器。

  1. 首页下方骨架屏和菊花图都可以,根据场景定。

  2. 列表建议使用.nvue。

对于无限滚动的列表,或者数量超过50个的列表,就建议用.nvue,且使用list组件(https://uniapp.dcloud.io/component/list)甚至使用recycle-list组件(https://uniapp.dcloud.io/component/recycle-list)。

  1. 对于参差瀑布流建议使用.nvue。

应使用waterfall组件(https://uniapp.dcloud.io/component/waterfall)。

  1. 真1像素发丝线。

当然要实现,这是起码的。方案就不说了,可以上网搜索。

  1. 隐藏滚动条。

微信小程序给出的解决方案是使用<scroll-view>、开启enhanced,关闭show-scrollbar,但是在APP上无效。APP上应该是使用.nvue + <scroll-view>,即:

<scroll-view :show-scrollbar="false" scroll-y>

由此也可知,.nvue是必须学的,而且在各种首页上必须使用。

手势

原生APP的手势有什么特点?

什么是手势?就是手指拉出浮层、拉走浮层等等。比如新闻APP,文章下面有评论框,默认是一行高度,点击它,会浮出浮层,往下一划,就收起浮层。

除此之外,还有触底刷新、下拉刷新等等。

H5网页开发一般不会考虑手势,怎么接近这种原生体验呢?

解决方案

  1. 拉出、拉走浮层。

uni-app并没有更高级的手势封装,只能使用原始的@touchstart、@touchmove、@touchend,好在玩法并不难,随便举个例子:

<view class="somearea" @touchstart="start" @touchend="end">

</view>
let startData = { clientX: null, clientY: null }
export default {
  methods: {
    start(e) {
      startData.clientX = e.changedTouches[0].clientX;
      startData.clientY = e.changedTouches[0].clientY;
    },
    end(e) {
      const subX = e.changedTouches[0].clientX - startData.clientX;
      const subY = e.changedTouches[0].clientY - startData.clientY;
      if (subY > 50 || subY < -50) {
        console.log("上下滑");
      } else {
        if (subX > 100) {
          console.log("右滑");
        } else if (subX < -100) {
          console.log("左滑");
        } else {
          console.log("无效");
        }
      }
    },
  },
};

接着就是添加动效。

  1. 触底刷新、下拉刷新。

uni-app自带,能用一定要用,如果追求与众不同的触底刷新和下拉刷新,一定要使用nvue的refresh组件(https://uniapp.dcloud.io/component/refresh)。

动效

原生APP的动效有什么特点?

原生的动效特点是——至少原生还有点动效,能给人一种高级感,而网页就是那么干巴巴的,屁动效都木有。

解决方案

解决方案就是拒绝干巴巴咯。这就需要创意了,比如淘宝网,随便点开一张商品缩略图,你看到的不仅仅是图片放大,还有变大的动效,另外图片周围会有一些文字有入场效果。当增加了新功能,或者打算主推一个功能的时候,如果怕用户无法发现新功能的入口,就可以给按钮加个流光溢彩效果。等等等等。

这个话题就不展开说了,特效该抄袭就抄袭,没啥不好意思。

组件

原生APP的组件有什么特点?

原生APP的组件肯定有自己独特的外观和操作体验,而uni-app的组件跟微信小程序一个样,让人有一种感觉就是好似在用微信小程序,这肯定是不行的,就比如Toast,微信小程序的成功Toast是一个对勾,而你的APP的对勾跟小程序一模一样,会让人以为你这个APP跟腾讯有一腿。

解决方案

要么自己写组件,那么使用第三方组件库。

总结

经过这样一番折腾,不信你的APP不像原生!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342