微信小程序中canvas绘制图表层级问题
引自官方文档
在微信小程序中存在一类特殊的组件,该类组件是由客户端创建的原生组件。这些组件有:
- camera
- canvas
- input(仅在focus时表现为原生组件)
- live-player
- live-pusher
- map
- textarea
- video
由于原生组件脱离在 WebView 渲染流程外,因此在使用时有以下限制:
- 原生组件的层级是最高的,所以页面中的其他组件无论设置
z-index
为多少,都无法盖在原生组件上。- 后插入的原生组件可以覆盖之前的原生组件。
- 原生组件还无法在 picker-view 中使用。
- 基础库 2.4.4 以下版本,原生组件不支持在 scroll-view、swiper、movable-view 中使用。
- 部分CSS样式无法应用于原生组件,例如:
- 无法对原生组件设置 CSS 动画
- 无法定义原生组件为
position: fixed
- 不能在父级节点使用
overflow: hidden
来裁剪原生组件的显示区域
- 原生组件的事件监听不能使用
bind:eventname
的写法,只支持bindeventname
。原生组件也不支持 catch 和 capture 的事件绑定方式。 - 原生组件会遮挡 vConsole 弹出的调试面板。在工具上,原生组件是用web组件模拟的,因此很多情况并不能很好的还原真机的表现,建议开发者在使用到原生组件时尽量在真机上进行调试。
uChart 绘制图表由于层级高导致拉出的抽屉无法覆盖图表问题。
方案一:使用cover-view、cover-image代替view组件实现抽屉组件
方案二:打开抽屉时候将已渲染的图表转化为图片替换canvas绘制的图表
由于cover-view、cover-image组件存在样式的限制,所以适用于简单的层级比较少的业务开发,而对于嵌套层级较多的业务显然方案二更适合。
以下是图表转为图片的代码,默认转为png格式的图片
const context = uni.createCanvasContext(canvasId, _self); context.draw(false, () => { setTimeout(() => { uni.canvasToTempFilePath({ canvasId: canvasId, complete(res) { console.log(res) _self.img = res.tempFilePath; } }) }, 1000) })