这个问题的现象提及来很简单。html
小程序页面中有一篇很长的文章,内部有一个Echarts图表,手指上下滑动观看内容。ios
可是手指滑动区域在Echarts图表上时,页面却不能滑动了。git
以下图: github
由于在小程序上渲染图表用到的是echarts-for-weixin这个组件,而这个组件确实不支持一些Echarts功能。web
因此最开始我怀疑是这个组件的问题,认为它把个人滑动事件给吞了。canvas
为了确认这个问题,我直接在这个组件ec-canvas旁加了个兄弟节点view,而后用绝对定位将其覆盖在ec-canvas,这样滑动的时候就会滑动到个人view上而不是ec-canvas。小程序
可是结果在ios下,仍是不能滑动。微信小程序
因而我给这个view的加了个背景色,在ios下的真机调试时发现,ec-canvas组件仍是在view上面。微信
不管是加大view上的z-index值,仍是将absolute改成fixed,反正ec-canvas组件所渲染的图表就是在view上面,而没有被view遮挡。echarts
这个ec-canvas组件是如此出众,不管什么都遮盖不了它的风采。
而致使它如此出众的缘由就是:图表是一个canvas组件,而小程序中canvas是一个原生组件。
接下来就让咱们看看小程序中使用原生组件的限制。
这里先附上连接:小程序原生组件使用限制。
让咱们看看关键的地方:
也就是说canvas这类原生组件就是比view这种非原生的组件层级高。
为了解决原生组件层级最高的限制。小程序专门提供了 cover-view 和 cover-image 组件,能够覆盖在部分原生组件上面。这两个组件也是原生组件。
我将原来的兄弟view组件替换为了cover-view组件,而后但愿达到能够滑动的效果。
虽然此时cover-view组件已经能够覆盖在canvas上了,可是依然不能滑动。
关于这个问题,咱们能够认为小程序的全部组件都是放在webview中,而原生组件在webview中用的是占位符。
在滚动时,获取原生组件占位符的位置,再改变原生组件的位置。(若是仔细观察,会发现这些原生组件有时会产生一些奇怪的抖动,这一点能够佐证这个论点。)
因此ios下,咱们手指在canvas和cover-view这类原生组件上滑动时,事件是不会传导到webview上的,页面也就不会滑动。
对于这个问题,由于我这边和echarts的交互比较少,因此个人解决方案就是在echarts渲染完毕后将它替换为一张图片。
若是我更新了数据,那么就从新放出echarts,等它渲染完毕后,再次替换为一张图片。
因为公司代码不适合放出,因此我搞了个简易版的代码放在这里。
wxml文件关键代码:
<view class="echart-container"> <image wx:if="{{echartImgSrc!==''}}" src="{{echartImgSrc}}" class='echart-img'></image> <ec-canvas wx:if="{{echartImgSrc===''}}" id="mychart-dom-pie" canvas-id="mychart-pie" ec="{{ ec }}" bind:init="echartInit"></ec-canvas> </view>
js文件关键代码:
Page({ data: { ec: { }, echartImgSrc: '' }, initChart(canvas, width, height) { const chart = echarts.init(canvas, null, { width: width, height: height }); canvas.setChart(chart); var option = { // ... }; chart.on('finished', () => { this.selectComponent('#mychart-dom-pie').canvasToTempFilePath({ success: res => { this.setData({ echartImgSrc: res.tempFilePath }) }, fail: res => console.log('转换图片失败', res) }); }) chart.setOption(option); return chart; }, echartInit(e) { this.initChart(e.detail.canvas, e.detail.width, e.detail.height); } });
总的来讲,解决起来还算简单。
可是对于和Echarts有不少交互的场景,这个方案就未必那么好实现了。
从这个问题入手,我对微信小程序原生组件的玩法有了更多的认识。
更深刻一点的认识就是,微信小程序当下对原生组件的这种处理更像是在一件普通的布衣上贴上貂皮补丁。
虽然考虑到了原生组件所带来的性能优点,可是一样也会引起大量的问题,对于这件衣服的总体表现而言这些貂皮补丁恐怕并不见得是件好事。
但愿之后小程序能从根本上解决这种问题吧。
原文出处:https://www.cnblogs.com/vvjiang/p/11161103.html