小程序应用中WebView中原生组件限制问题解析

背景

在微信的文档中有一个章节说明了『 原生组件的使用限制 』有这么一段话

『由于原生组件脱离在 WebView 渲染流程外,因此在使用时有以下限制:

原生组件的层级是最高的,所以页面中的其他组件无论设置 z-index 为多少,都无法盖在原生组件上。
后插入的原生组件可以覆盖之前的原生组件。
原生组件还无法在 scroll-view、swiper、picker-view、movable-view 中使用。
部分CSS样式无法应用于原生组件,例如:
无法对原生组件设置 CSS 动画
无法定义原生组件为 position: fixed
不能在父级节点使用 overflow: hidden 来裁剪原生组件的显示区域
原生组件的事件监听不能使用 bind:eventname 的写法,只支持 bindeventname。原生组件也不支持 catch 和 capture 的事件绑定方式
在iOS下,原生组件暂时不支持触摸相关事件。
在工具上,原生组件是用web组件模拟的,因此很多情况并不能很好的还原真机的表现,建议开发者在使用到原生组件时尽量在真机上进行调试。』

解析

所谓的原生组件,即非Web组件系统扩展Native组件。因为小程序在视图渲染层面使用了WebView,而在Video,Map这类组件,使用WebView的WebCore渲染之后体验不佳的诟病一直存在,而且标准不一。小程序上因使用原生的WebView进行渲染,而不是用修改的WebView内核(至少在iOS上没有这么干),而无法对web原生标签扩展。基于用户体验,和坑爹的技术限制,小程序提出了原生组件的概念,也就是在WebView上面使用原生组件填充占位元素的方式修补这类组件用户体验问题。因为WebView和原生组件在应用层本身就不是一个渲染层级,于是出现Web上面的标签无法浮于Video之上(直播应用的恶梦),在不修改技术思路的前提下,position: fixed, overflow: hidden这样的属性是不可能用于原生组件的样式的。不过伪同层渲染也不是说不可能,即在渲染原生组件时候根据层级镂空面积。

特别在Map上使用WebView作为渲染之后体验不佳的诟病一直存在,特别是地图上marker标记过多的重度场景下,笔者所在的公司的在使用高德地图Web端提供出来的C端具备反人类的体验,地图拖拉龟速,点击响应缓慢,加载loading地图区域等待时间过长。而Video则支持的格式有限,列出部分浏览器的支持的如下:

Firefox:支持 Ogg Vorbis和WAV 
Opera :支持Ogg Vorbis和WAV 
Safari :支持MP3,AAC格式 ,和MP4 
Chrome :支持Ogg Vorbis,MP3,WAV,AAC和MP4 
Internet Explorer 9+ :支持MP3,AAC格式 ,和MP4 
IOS :支持MP3,AAC格式 ,和MP4 
Android :支持AAC和MP3 

上述,可以知道视频支持有限(限于版权)。而就我们关注的移动端iOS和Andoroid,实现一个视频播放,我们可能都会有以下几点的需求:
1、全屏处理;
2、覆盖层效果;
3、自动播放;
4、播放控制;
5、隐藏播放控件;
在iOS上如果使用WebView,你无法修改全屏下的工具这一点体验已经足够让所有的产品经理抓狂,更不用说Android的这么多的机型。覆盖层效果在微信上不得不使用微信提供原生组件cover-view实现,而限于原生实现限制,cover-view的支持有限。

设计方案

1、组件层于WebView层之上

这也应该是微信小程序团队现阶段使用的方案,通过特殊的占位标签,使用getBoundingClientRect获取组件位置,而原生组件跟随Webview滚动。
Talking is cheap. Show me your code,那么用代码实现的效果的如下。


now_lowest_gif.gif

从图中可见,覆盖层确实位于原生组件之下。

2、组件层于WebView层之下

此方式略微复杂。需要通过与Webview scroll联动的置于Webview之下的Component Layer实现,而Webview背景设置为透明。至于事件,通过Webview的事件透传,传递到Component Layer,需要通过缓存webview中元素再计算是否被点中通过重写hitTest方法实现。通过此技术方案实现的好处也是明显的,因为原生组件层很多时候都是置于最底层,而Web上的组件可以轻松覆盖于Native之上,无需使用cover-view之类的hack方法。
效果如下所示


图片发自简书App

Tips

在iOS上还特别需要注意一点UIWebview的坑。在使用-webkit-overflow-scrolling 使用,你会发现momentum scroll阶段并不会触发scroll事件,而且 scrollTop 属性不会变化,当然getBoundingClientRect也同样失效。如果考虑使用touchmove 这样事件你也仅仅在手指还在屏幕上的时候触发,检测滚动区域内部元素的getBoundingClientRect 同样无效。

当然幸运的是,这么大一个坑只是发生在UIWebview,对WKWebview并没有影响。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,971评论 25 707
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,977评论 3 119
  • #我抱#下午一直抱着熹妹在手里,这时蜜姐走过来要亲妹妹,我说:“别把妹妹弄醒了”。她说:“我摸一下”。这时熹妹醒了...
    蜜与熹阅读 112评论 1 1
  • 复习周在学校待着有大把大把的时间用,吃饭时找个电影看,刚好看的是“”谁的青春不迷茫“”这样一个讲述高三如何压迫...
    Cream邢阅读 316评论 0 1
  • 前天晚上,跳舞回来,快到小区门口,远远的就看见一群人围在马路上,堵住了来往车流,我是个胆小的人,像打架之类的事情,...
    李四儿如夜阅读 392评论 4 4