微信小程序 canvas 层级过高 解决方案

这篇具有很好参考价值的文章主要介绍了微信小程序 canvas 层级过高 解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述:

先看bug:
微信小程序 canvas 层级过高 解决方案

思路:

baidu上 关于小程序canvas层级过高 的的解决方案,大致分为两种

  1. 将canvas标签替换为图片:
setTimeout(() => {
      wx.canvasToTempFilePath({
        x: 0,
        y: 0,
        width: 168,
        height: 168,
        canvasId: 'Canvas',
        success: (res) => {
          this.setData({ canvasImg: res.tempFilePath });
          console.log('canvasImg',this.data.canvasImg)
        }
      });
    },1000);
  1. 使用cover-view(小程序层级最高的标签)去覆盖canvas标签:
    关于cover-view的小程序官方文档

两种方案的不足:

方案1需要等待canvas渲染完成后再生成图片去替换,且canvas标签不能使用display:none;或 opacity: 0;去隐藏,所以这会导致在canvas渲染完成后仍然会闪动一下再切换成图片显示。

方案2要修改被覆盖的标签,将其层级提到最高。在阅读官方文档后,我就把页面底部的tab栏的view标签替换成了cover-view,结果导致icon消失了…这又是一个bug?

“所以这就结束了?哦,不!,乔治,我们不能就这样放弃!”

“有时候,生活会出其不意地带给我们灵感” ——鲁迅

灵感来源:

在午饭后刷b站时,我刷到一个关于游戏开发的视频,里面提到这样一件事:游戏开发者通常会提前将模型加载好 并放在玩家不可见的区域,等需要用到它的时候再把他挪到玩家眼前。

解决方案:

所以我可以将canvas标签挪到用户不可见的区域,在渲染时用loading动画代替,渲染完成后再将loading动画替换成图片!!

1、首先绘制canvas并生成图片

initCanvasFun(caseTypeList) {
    var context = wx.createCanvasContext('Canvas', this);
    var array = caseTypeList.map(t => t.count);
    var colors = ["#8E92F4", "#ECD67D", "#E77E7F", "#6AE29D", "#6644ff"];
    var total = 0;
    for (var val = 0; val < array.length; val++) {
      total += array[val];
    }
    var point = { x: 84, y: 84 };
    var radius = 84;
    for (var i = 0; i < array.length; i++) {
      context.beginPath();
      var start = 0;
      if (i > 0) {
        for (var j = 0; j < i; j++) {
          start += array[j] / total * 2 * Math.PI;
        }
      }
      var end = start + array[i] / total * 2 * Math.PI;
      context.arc(point.x, point.y, radius, start, end);
      context.lineTo(point.x, point.y);
      context.setStrokeStyle('transparent');
      context.setFillStyle(colors[i]);
      context.fill();
      context.closePath();
      context.stroke();
    }
    context.draw();

    setTimeout(() => {
      wx.canvasToTempFilePath({
        x: 0,
        y: 0,
        width: 168,
        height: 168,
        canvasId: 'Canvas',
        success: (res) => {
          this.setData({ canvasImg: res.tempFilePath });
          console.log('canvasImg',this.data.canvasImg)
        }
      });
    },1000);
  },

2、在canvas标签的style属性中设置绝对定位,将其放到视口外

<canvas canvas-id="canvascrime" wx:if="{{!canvasImg2}}" style="width:168px;height:168px; opacity: 0;position:absolute;left:-1000rpx;"></canvas>

3、随便写一个加载动画占位,在图片url生成后被图片标签替换

<view class="loading-box" wx:if="{{!canvasImg2}}">
	<view class="loading-left"></view>
	<view class="loading-right"></view>
</view>
.loading-box{
  position: absolute;
  width: 260rpx;
  height: 260rpx;
  /* background-color: rebeccapurple; */
}
.loading-left{
  position: absolute;
  left: 50%;
  top: 50%;
  height: 50rpx;
  width: 50rpx;
  border: 8rpx solid rgba(0, 0, 0, 0);
  border-left: 8rpx solid rgba(255, 255, 255, 0.2);
  border-radius: 50%;
  transform: translate(-50%,-50%);
  animation: clockwise 2.2s infinite;

  /* z-index: 10; */
}
.loading-right{
  position: absolute;
  left: 50%;
  top: 50%;
  height: 50rpx;
  width: 50rpx;
  border: 8rpx solid rgba(0, 0, 0, 0);
  border-right: 8rpx solid rgba(255, 255, 255, 0.2);
  border-radius: 50%;
  transform: translate(-50%,-50%);
  animation: clockwise 2s infinite;
  
}
@keyframes clockwise{
  from{
    transform: translate(-50%,-50%) rotate(0deg);
  }
  to{
    /* width: 200rpx; */
    transform: translate(-50%,-50%) rotate(720deg);
  }
}

完成效果:

微信小程序 canvas 层级过高 解决方案
完美解决,看起来就很“大数据”文章来源地址https://www.toymoban.com/news/detail-491273.html

到了这里,关于微信小程序 canvas 层级过高 解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序canvas层级太高,与其他非原生组件层级冲突

     官网已经提出新版本以支持同层渲染,但是实际项目中层级还是冲突的。  最后在文档中找到这样一段话,用真机打开,层级就正常了 。所以建议大家,多使用真机调试去测试!!!!

    2024年02月11日
    浏览(45)
  • 关于uniapp小程序内置canvas标签层级过高,覆盖其他标签问题

    uniapp 原因:是因为canvas是原生组件,而uniapp的 view、text 等标签相当于二次封装过的,给予z-index也是不生效的,微信开发者工具没有问题,但真机测试会爆这个雷 恰巧碰上一个需求需要一个canvas生成图片放在页面,点击按钮后生成一个二维码模态框,二维码也是canvas生成图

    2024年02月12日
    浏览(59)
  • video视频背景层级过高解决方案

    uni-app开发的项目中使用video标签设置视频做为页面背景,video标签层级过高,页面中内容不展示。 官方提供了三种办法: cover-这个标签使用说明:这个标签APP端它不支持嵌套,就是就算这种都是不支持的,所以如果你的页面比较复杂的话这种方法是不行的,页面元素简单的话

    2024年02月03日
    浏览(38)
  • 【微信小程序】echart中canvas原生组件层级太高遮挡vantui中的组件

    之前的问题图片如下: 最开始想到的方案是降低canvas的层级,但是canvas是原生组件,他的层级是没法改变 所以又想到改变vant组件的层级,但是一样无果。。。 随后,看到网上大篇幅的都是使用显示隐藏来操控picker的,这样会如果页面可以滑动,就导致用户还是可以看到ec

    2024年02月13日
    浏览(46)
  • 小程序ucharts层级过高如何解决

    为什么canvas组件总是会在最上层? 由于canvas组件是原生组件,原生组件的层级是最高的,所以页面中的其他组件无论设置 z-index 为多少,都无法盖在原生组件上 在页面出现点击事件,存在弹框,ucharts的图层会会出现在弹框上层,ucharts的图层事件会超过弹框事件,导致样式出

    2024年02月12日
    浏览(40)
  • 微信小程序canvas画布不清晰解决方法

    绘制的图片,文字等十分模糊 添加以下代码,通过设置分辨率来解决 完整代码: 模糊不清的时候 多多进行调试一下就可以了 多尝试新方案 

    2024年02月10日
    浏览(57)
  • 解决uniapp微信小程序canvas不能引入字体的问题

    这是微信小程序最近修复问题,里面有关于loadFontFace的修复 在使用前要先把调试基础库调整为 2.25.1 ,我调到这个版本就好其他的版本我也没试 下面是我画布导出的大概效果 姓名这里使用了字体,白色的轮廓是字体轮廓填充 首先要了解一个api名称:uni.loadfontface 这里source里

    2024年02月09日
    浏览(61)
  • 微信小程序:小程序常见问题及解决方案

    在小程序中使用原生的表单组件时,在有弹出框出现的情况下,原生表单组件会出现在遮罩层上面,且会造成事件穿透的情况。 解决方案一: 使用cover-view,cover-view比原生组件的层级更高,或者说也是一种原生组件,不过在cover-view的子组件只能是coveri-view、cover-image,对于包

    2024年02月10日
    浏览(70)
  • 微信小程序 | 人脸识别的最终解决方案

    📌 个人主页 :个人主页 ​🧀 推荐专栏 :小程序开发成神之路 --( 这是一个为想要 入门和进阶小程序开发专门开启的精品专栏 !从 个人到商业的全套开发教程 ,实打实的干货分享,确定不来看看? 😻😻) 📝 作者简介 :一个读研中创业、打工中学习的能搞全栈、也搞算

    2024年02月02日
    浏览(65)
  • 微信小程序 - HTTPS 证书链解决方案

    问题信息 errMsg: \\\"request:fail -2:net::ERR_FAILED\\\" errno: 600001 Ps1:这个错误是在微信小程序项目迁移的时候,调用 HTTPS API 时一不小心配置错了很容易产生的问题,DDDD~ Ps2:电脑端工具能访问 API 成功,估计是勾选了不效验合法域名的原因,而手机端就显示报错 分析原因 猜想1:一开始

    2024年02月11日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包