HarmonyOS 轻量 JS 开发框架与 W3C 标准差异分析
HarmonyOS 轻量 JS 应用开发框架(下文简称“框架”),是 HarmonyOS 为开发者提供的
一套开发 JS 应用的开发框架。开发框架采用类小程序的 web 开发方式,其实现大部分遵循
W3C 标准(主流 web 开发标准),但由于设备条件限制(例如,ROM 和 RAM 大小),“框架”
中部分组件和属性与 W3C 标准存在差异,需要开发者在开发过程中了解和掌握。
本文将会梳理当前“框架”已有的组件和属性与 W3C 标准相对应组件和属性的主要差异点,
并配以示例说明,供开发者在开发过程中参考。主要差异点包括:width 和 height 属性、
绝对定位和相对定位、文字显示、页面滑动和长按事件。
width 和 height 属性
作为一个前端开发者,在开发网页或者应用的过程中,我们一般不会手动设置组件的高度和
宽度,而是希望元素的大小根据窗口或者子元素自动调整,这就是自适应能力。
自适应能力使得布局更灵活,可适应不同设备、不同窗口和不同分辨率下的显示。
但是,“框架”当前提供的组件除 text 外,皆不支持内容高度和宽度的自适应能力,必须
由开发者明确指定高度和宽度,否则组件不会显示。
以一段简单的代码为例:
来源:HarmonyOS 开发者微信号 https://mp.weixin.qq.com/s/cAKrVR4iuPh-tFrdx1jg0A
根组件 div 未设置高宽属性,子组件 div 设置了高宽属性,在“框架”和 W3C 标准中其运
行效果图分别如图 1 和图 2 所示:
图 1 “框架”中不设置根组件的高度和宽度显示效果图
图 2 W3C 标准中不设置根组件的高度和宽度显示效果图从图 1 和图 2 可以看出,“框架”
中根组件必须设置高度和宽度,否则无法显示,即使根组件的子组件设置了高宽度属性,界
面也无法显示。另外由于 W3C 标准的 div 组件是块状元素,如果没有设置宽度,会独占一
行,所以在图 2 中,没有设置宽度,其显示范围为一整行。
“框架”中设置根组件的高度和宽度,则正常显示,效果如图 3 所示:
来源:HarmonyOS 开发者微信号 https://mp.weixin.qq.com/s/cAKrVR4iuPh-tFrdx1jg0A
图 3 “框架”下根组件设置高度和宽度效果图
针对 text 组件,不设置高宽属性的条件下,“框架”和 W3C 标准下 web 开发界面显示效
果一致,如图 4 和图 5 所示:
Hello World!
图 4 “框架”下 text 组件的文本显示图
来源:HarmonyOS 开发者微信号 https://mp.weixin.qq.com/s/cAKrVR4iuPh-tFrdx1jg0A
图 5 W3C 标准下 text 组件的文本显示图
绝对定位和相对定位
如何实现绝对定位和相对定位?如果你常 用 html 语言开发,你可 能会首先想到设 置
position 属性为 absolute 和 relative,然后通过 left 和 top 设置距离即可实现绝对定位和
相对定位的效果,其实现代码如下所示:
这是位于正常位置的标题
这个标题相对于其正常位置向右向下移动
这个标题相对于其页面左上角位置向右向下移动
但是在“框架”中,我们查看 HarmonyOS 官网 JS API 文档后发现,position 属性是不支
持设置 absolute 和 relative,那该如何实现绝对定位和相对定位这两种效果呢?如果我们
仔细阅读 HarmonyOS 官网文档,我们会发现“框架”提供了一个新组件 stack,借助这个
组件我们可以实现绝对定位的效果,示例代码如下所示,添加一个 stack 根组件(同时也作
为父组件),其子组件为 div,然后设置其 left 和 top 的值为 50px 来实现绝对定位的效果,
其效果如图 6 所示,子组件 div 相对于父组件 stack 向下、向右各偏移 50px。
style="
left: 50px;
top: 50px;
width: 100px;
height: 100px;
background-color: yellow;"
>
图 6 “框架”中绝对定位实现效果
另外,绝对定位存在一种特殊场景:如果是根组件,直接设置 top 和 left 属性即可实现绝
对定位功能;非根组件,其父组件必须是 stack,才能通过设置 top 和 left 属性来实现绝对
定位功能。根组件绝对定位是相对于页面左上角做偏移,非根组件绝对定位是相对于父组件
做偏移。如下代码所示,根组件直接设置 top 和 left 属性实现绝对定位,由于此时根组件
作为父组件不是 stack,所以设置子组件的绝对定位无效,如图 7 中所示,子组件黄色 div
来源:HarmonyOS 开发者微信号 https://mp.weixin.qq.com/s/cAKrVR4iuPh-tFrdx1jg0A
相对于父组件红色 div 未实现绝对定位的效果。
来源:HarmonyOS 开发者微信号 https://mp.weixin.qq.com/s/cAKrVR4iuPh-tFrdx1jg0A
图 7 “框架”中非根组件和根组件绝对定位实现效果图
相对定位:由于设备硬件 ROM 和 RAM 大小限制,当前“框架”不支持 W3C 标准中的相
对定位实现(position:relative),只支持部分 flex 布局属性,与 W3C 标准相比差异较大,
具体差异见表 1 所示。
表 1 “框架”下 flex 布局可支持属性对比
在“框架”中实现 flex 布局,将需要 flex 布局的子组件用 div 容器包裹一下,并将 div 的
display 属性设置为 flex 即可。如下图所示,我们要实现三个 div 一行排列且居中显示的 flex
来源:HarmonyOS 开发者微信号 https://mp.weixin.qq.com/s/cAKrVR4iuPh-tFrdx1jg0A