【走进小程序原理】揭秘组件同层渲染
阅读本文的收获:为什么我的小程序组件不能随着页面滚动?为什么组件层级不对?我该如何解决?
在日常开发中,我们总能在小程序的开发文档里看到种种组件:
基础组件:小程序框架层开发
自定义组件:开发者or小程序官方,基于基础组件
进行二次开发
动态库组件:小程序官方开发的、以动态库形式发布的组件,其本质依然是自定义、基础组件
......
综上:就像是盖楼,框架开发的基础组件
,是小程序所有组件建筑的地基,我们今天要聊的正是它。
基础组件实现
前置名词解释
NA:
Native App
的缩写,是基于智能手机本地操作系统如iOS、Android、WP
并使用原生程式编写运行的第三方应用程序,一般开发语言为JAVA、C++、Objective-C、Swift
NA 组件:也称原生组件,是
Android、ios
等NA
客户端开发的控件
H5组件:是指
HTML5
语言编写的web
组件
webview:用来在
NA
代码中展示web
页面,有点类似web中的iframe
,ios、Android
中分别采取WKWebView
和WebView
控件实现。
前置特性解释
小程序前端框架,会将开发者实现的小程序布局转换成标准
HTML
布局;
NA
组件与webview
在两个层级(如下图1.1)在客户端代码中,后插入的
NA
组件,层级高于之前的NA
组件
框架层的基础组件,是基于H5
组件和NA
组件实现的。
比如小程序中的 canvas、map、animation-view、textarea、cover-view、cover-image、camera、video、live-player、input
这些都是原生组件。
相比于H5
组件,NA
组件不仅可以提供H5
组件无法实现的一些功能,还能提升用户体验上的流畅度,又因为减少了客户端代码与webview
通信的流程,降低了通信开销。
简单来说,NA
组件功能全、速度快、开销少;然而,命运赠送的礼物,早已在暗中标好了价格——原生组件并不是十全十美,它付出了其他代价。
图1.1
由于原生组件脱离在 webview
渲染流程外,因此在使用时有以下限制:
-
原生组件的层级是最高的:页面中的其他组件无论设置
z-index
为多少,都无法盖在原生组件上; -
部分 CSS 样式无法应用于原生组件;
-
原生组件无法在
scroll-view
、swiper
、picker-view
、movable-view
中使用:因为如果开发者在可滚动的DOM
区域,插入原生组件作为其子节点,由于原生组件是直接插入到webview
外部的层级,与DOM
之间没有关联,所以不会跟随移动也不会被裁减
这也就解释了,为什么你在使用一些原生组件时,会出现组件不随着页面滚动或是层级永远最高的bug。
.......是不是有点难搞?
解决NA的限制
解决这个问题不是一蹴而就的,它也有自己的历史进程:
cover-image
和cover-view
,是局部解决方案:由于在客户端中,后插入的原生组件层级高于前面的原生组件,所以把想覆盖原生组件的内容,用一个原生组件包裹后插入,从而hack
解决。
但这样做,就像是写css
的时候,写了一堆!important
,并不是一个优雅的解决方案,后面提到的同层渲染才是终极大杀器。
同层渲染
为了解决原生组件的层级问题,同时尽可能保留 NA 组件的优势,小程序客户端、前端及浏览内核团队一起制定了一套解决方案:由于此方案的控件并非绘制在 NA
贴片层,而是绘制在 WebView
所渲染的页面中,与其他 HTML
控件在同一层级,因此称为「同层渲染」;在支持同层渲染后,原生组件与其它H5
组件可以随意叠加,层级的限制将不复存在。
Android 同层渲染原理
前置特性解释
T7:T7内核是百度手机浏览器基于Blink研发的浏览内核
ZeusPlugin:T7浏览器内核的一个插件机制,可用来解析或发送前端、客户端指令,作为两者通信的中枢
swanCore:小程序前端框架
小程序在 Android
端采用 T7
浏览内核作为渲染层,内核提供了 ZeusPlugin
指令系统。
-
由
SwanCore
将开发者实现的小程序布局转换成标准HTML
布局,并对同层渲染的组件增加标识; -
T7
浏览内核渲染页面时,识别到标识,则认为此组件为同层组件; -
T7
浏览内核根据需求为同层组件扩展方法和属性,供前端SwanCore
调用; -
扩展的能力部分由浏览内核实现,也可通过小程序客户端的能力实现,根据能力具体内容而定。
ios 同层渲染原理
前置名词
WKWebView:
NA
组件,用来在NA
代码中展示web
页面,它在内部采用的是分层方式进行渲染
Compositing Layer:NA合成层,内核一般会将多个
webview
内的DOM
节点渲染到一个Compositing Layer
上,因此合成层与DOM
节点之间不存在一对一的映射关系
WKChildScrollView:也是NA组件,但
WebKit
内核已经处理了它与其他DOM
节点之间的层级关系,与webview
内的DOM
节点存在映射关系
前置特性
当把一个
webview
内的DOM
节点的CSS
属性设置为overflow: scroll
(低版本需同时设置-webkit-overflow-scrolling: touch
)之后,NA
的WKWebView
会为其生成一个对应的WKChildScrollView
iOS
端同层渲染,也正是基于 WKChildScrollView
实现的,大致流程如下:
-
小程序前端,在
webview
内创建一个DOM
节点并设置其 CSS 属性为overflow: hidden
且-webkit-overflow-scrolling: touch
; -
前端通知客户端查找到该
DOM
节点对应的原生WKChildScrollView
组件; -
将原生组件挂载到该
WKChildScrollView
节点上作为其子View
; -
WebKit
内核已经处理了WKChildScrollView
与对应DOM
节点之间的层级关系。 -
通过上述流程,小程序的
NA
组件就被插入到WKChildScrollView
了,也即是在 步骤1 创建的那个DOM
节点映射的原生WKChildScrollView
节点。此时,修改这个DOM
节点的样式属性同样也会应用到原生组件上。因此,同层渲染的原生组件与普通的H5
组件表现并无二致。
使用组件的注意事项
-
NA组件中支持同层渲染的情况(同时需要注意的是,同层渲染会存在失败的情况,如果尝试5次之后依旧失败,依旧会采用NA组件的方式)
组件名 | 支持版本 |
---|---|
video | v3.70.0 起 |
input | v3.105.0 起 |
textarea | v3.140.1起 |
live-player | v3.140.1 起 |
-
未支持同层渲染的
NA
组件或者较低版本,需要注意上文提到的原生组件的使用限制:
-
原生组件的层级是最高的,所以页面中的其他组件无论设置 z-index 为多少,都无法盖在原生组件上。后插入的原生组件可以覆盖之前的原生组件;
-
原生组件无法在 scroll-view、swiper、picker-view、movable-view 中使用;
-
无法对原生组件设置 CSS 动画;
-
不能在父级节点使用 overflow: hidden 来裁剪原生组件的显示区域
3.如需在NA组件中增加更高层级的组件,可考虑使用cover-image、cover-view
- END -

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
6. 二十不惑,ObjectMapper使用也不再迷惑
点击上方“BAT的乌托邦”,选择“设为星标” 后台回复“ 专栏 ”,开启专栏模式学习 ✍前言 各位好,我是YourBatman。从本文起,终于要和Jackson的“高级”部分打交道了,也就是数据绑定jackson-databind模块。通过接触它的高级API,你会持续的发现,前面花那么多篇幅讲的core核心部分是价值连城的。毕竟村上春树也告诉过我们:「人生没有无用的经历」嘛。 jackson-databind包含用于Jackson数据处理器的通用 「数据绑定功能」和「树模型」。它构建在Streaming API之上,并使用Jackson注解进行配置。它就是Jackson提供的高层API,是开发者使用得最多的方式,因此重要程度可见一斑。 虽然Jackson最初的用例是JSON数据绑定,但现在它也可以用于其它数据格式,只要存在解析器和生成器实现即可。但需要注意的是:类的命名在很多地方仍旧使用了“JSON”这个词(比如JsonGenerator),尽管它与JSON格式没有实际的硬依赖关系。 ❝ 小贴士:底层流式API使用的I/O进行输入输出,因此理论上是支持任何格式的 ❞ 版本约定 Jack...
- 下一篇
物联网SIM卡和SIM卡真的不是一回事
办卡吗,兄弟? 物联网卡?相信大家第一反应都是一愣。大家听过银行卡、电话SIM卡、会员卡…等等,很多人可能都是第一次听说物联网卡。那它到底是个什么东东?它能干什么呢?今天就带大家一探究竟。 那在物联网世界里,物与物之间是怎么感知和链接的呢? 我们首先要知道物联网的一个运行流程:物联网是通过设备上的各种传感器如温湿度传感器、RFID标签等感知终端来识别物体,采集数据等。然后,通过固定宽带、NB-IoT、2/3/4/5G在内的多种网络,将设备接入到物联网平台进行互联。若设备使用2/3/4/5G和NB-IoT网络接入,则需要通过物联网SIM卡接入运营商网络。 而随着物联网的发展,设备类型越来越多,设备尺寸越来越小,对物联网SIM卡外部环境的适配性要求越来越高,对物联网SIM卡寿命的要求越来越长,对物联网SIM卡尺寸的要求越来越小,促使物联网SIM卡的形态从插拔式SIM卡,演进到嵌入式SIM卡和vSIM卡。 Nano卡虽然看起来已经很小了,但是它们还需要设备具有配套的卡槽。这个卡槽的结构和走线,对于一些智能穿戴设备(智能手环、智能眼镜等)来说还是太大了。而且插拔式SIM卡里面的用户信息固定不可...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- Hadoop3单机部署,实现最简伪集群
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能