如下內容轉載自微信開放社區騰訊位置服務官方文章《手把手教你避開組件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…