如下内容转载自微信开放社区腾讯位置服务官方文章《手把手教你避开组件cover-view的那些坑》css
做者:腾讯位置服务html
连接: developers.weixin.qq.com/community/d…canvas
来源:微信开放社区 著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。小程序
最近在开发城市地铁图项目,具体功能有规划路线、定位最近地铁站、以及显示整个城市的地铁网状图等功能。根据需求,在实现的时候在地铁线路图上须要添加定位按钮及线路弹框来展现位置信息以及地铁站详情信息。bash
在地铁图调研初期,原计划实现渲染方案是采用svg来绘制,可是调研后发现小程序原生API不支持svg。同时,咱们在开源中找到一个svg的框架库来实现绘制,可是开发初期发现遇到不少没法实现的需求和性能问题。在对开源库的代码跟踪后,发现绘制方案也是canvas的方式,因而咱们决定使用原生canvas的方案来支持地铁图。可是呢,又遇到一些问题,那么咱们来看看几个具体的点:微信
在canvas上使用view来添加图片和弹框时,发现图片以及弹框在canvas的下面,不能正常显示图片。框架
查看文档发现canvas、map、video等原生组件使用的是native实现的,默认显示在小程序的最上层,因此就把view换成cover-view或者cover-image。ide
使用view效果:svg
<!-- 线路 -->
<view class = "sublines sublines-icon">
<image class = 'sublinesIcon' src = "/static/img/ic_sublines.png" bindtap = 'clickSublines' wx-if = "{{lineIconShow}}" ></ image >
</view>
复制代码
替换成cover-view效果:性能
<!-- 线路 -->
<cover-view class = "sublines sublines-icon">
<cover-image class = 'sublinesIcon' src = "/static/img/ic_sublines.png" bindtap = 'clickSublines' wx-if ="{{lineIconShow}}"></cover-image>
</cover-view>
复制代码
可是使用cover-view又遇到了层级和样式的问题。
.locationIcon {
width: 3rem;
height: 3rem;
position: fixed;
bottom: 3rem;
left: 0.7rem;
}
复制代码
设置单边border效果:
<!-- 起终点设置弹框 -->
<cover-view class = "sdMark" style = 'top:{{tapClient.y}}px;left:{{tapClient.x}}px;' wx-if = "{{sdMarkShow}}">
<cover-view class = 'sdMarkContent'>
<cover-view class = 'sdMarkItem' bindtap = 'clickStart'>设为起点</cover-view>
<cover-view class = 'sdMarkItem' bindtap = 'clickEnd' >设为终点</cover-view>
<cover-view class = 'sdMarkItem' bindtap = 'clickStationDetail'>站点详情</cover-view>
</cover-view>
</cover-view>
复制代码
修改后的代码:
<!-- 起终点设置弹框 -->
<cover-view class = "sdMark" style = 'top:{{tapClient.y}}px;left:{{tapClient.x}}px;' wx-if = "{{sdMarkShow}}">
<cover-view class = 'sdMarkContent'>
<cover-view class = 'sdMarkItem' bindtap = 'clickStart'>设为起点</cover-view>
<cover-view class = 'line'></cover-view>
<cover-view class = 'sdMarkItem' bindtap = 'clickEnd'>设为终点</cover-view>
<cover-view class = 'line'></cover-view>
<cover-view class = 'sdMarkItem' bindtap``= 'clickStationDetail'>站点详情</cover-view>
</cover-view>
<cover-view class = "icon">
<cover-image class = 'icArrow' src = '/static/img/ic_arrow.png'></cover-image>
</cover-view>
</cover-view>
复制代码
最终的效果:
踩坑总结:canvas层级较高,使用cover-view或者cover-image在canvas作操做。单边border相关的操做使用图片或者块级元素来代替。
cover-view相关文档: developers.weixin.qq.com/miniprogram…
欢迎体验和吐槽:"腾讯位置服务-地铁图"插件: lbs.qq.com/miniprogram…