详解canvas绘制多张图的排列顺序问题


Posted in HTML / CSS onJanuary 21, 2019

在开发中,如果遇到需要使用canvas同时绘制多张图片,但因为图片大小的不一样,排在数组前面的图片不一定能先被load然后绘制,就可能会导致画出来的图的排列顺序和预想的不一样(特别是因为跨域加了域名重定向的图片尤为明显),我的解决办法是:先全部画出来再排序再append到需要的节点里去。

<div id="myContent"></div>
let imgArray = ['img1.png', 'img2.png'];
let receiveArray = new Array();
let $myContent = document.getELmentById("myContent");
let {imgW, imgH} = {300, 300};

let Canvas = document.createElement('canvas');
let ctx = Canvas.getContext("2d");
let scaleBy = 2;
Canvas.width = imgW * scaleBy;
Canvas.height= imgH * scaleBy;
imgArray.forEach((e, idx) => {
    let img = new Image();
    img.src = e;
    e.addEventListener('load', () => {
        ctx.drawImage(img, 0, 0, imgW * scaleBy, imgH * scaleBy);
        
        let imgCont = new Image();
        imgCont.src = Canvas.toDataURL();
        imgCont.id = 'img' + idx; 
        receiveArray.push(imgCont); // 将绘制的img节点收集到数组里,这里的顺序可能和imgArray的顺序不一样
        if (receiveArray.length === imgArray.length) { //所有图片load并绘制完成
            let sortArr = new Array();
            receiveArray.forEach(ex => { //将所有绘制图片按imgArray顺序排序
                sortArr[ex.id.split('img')[1]] = ex;
            })
            sortArr.forEach(ex2 => {
                $myContent.appendChild(ex2)
            })
        }
    })
})

其实这也是一种略显无奈的做法,因为无法判断加载图片的实际大小,小的图片会先load并绘制,如果重定向域名后会加大这种现象,采用了绘制完再排序的做法。如果有谁想到更好的办法,欢迎指正批评。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3弹性盒模型开发笔记(一)
Apr 26 HTML / CSS
纯CSS实现菜单、导航栏的3D翻转动画效果
Apr 23 HTML / CSS
详解HTML5 LocalStorage 本地存储
Dec 23 HTML / CSS
html5指南-4.使用Geolocation实现定位功能
Jan 07 HTML / CSS
HTML5里的placeholder属性使用实例和美化显示效果的方法
Apr 23 HTML / CSS
HTML5头部标签的一些常用信息小结
Oct 23 HTML / CSS
HTML5利用约束验证API来检查表单的输入数据的代码实例
Dec 20 HTML / CSS
iphoneX 适配客户端H5页面的方法教程
Dec 08 HTML / CSS
详解HTML5 录音的踩坑之旅
Dec 26 HTML / CSS
Html5实现首页动态视频背景的示例代码
Sep 25 HTML / CSS
Html5页面上如何禁止手机虚拟键盘弹出
Mar 19 HTML / CSS
html2canvas生成的图片偏移不完整的解决方法
May 19 HTML / CSS
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
Jan 18 #HTML / CSS
canvas绘制圆角头像的实现方法
Jan 17 #HTML / CSS
HTML5如何使用SVG的方法示例
Jan 11 #HTML / CSS
Canvas 像素处理之改变透明度的实现代码
Jan 08 #HTML / CSS
详解Canvas实用库Fabric.js使用手册
Jan 07 #HTML / CSS
Html5原创俄罗斯方块(基于canvas)
Jan 07 #HTML / CSS
h5使用canvas画布实现手势解锁
Jan 04 #HTML / CSS
You might like
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
JQuery写动态树示例代码
2013/07/31 Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
2013/08/28 Javascript
给文字加上着重号的JS代码
2013/11/12 Javascript
jquery交替变换颜色的三种方法 实例代码
2013/11/19 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
2016/02/18 Javascript
JavaScript 随机验证码的生成实例代码
2016/09/22 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
原生JS实现图片轮播切换效果
2016/12/15 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
vue组件间通信解析
2017/03/01 Javascript
ajax +NodeJS 实现图片上传实例
2017/06/06 NodeJs
微信小程序实现页面跳转传值以及获取值的方法分析
2017/12/18 Javascript
基于vue-ssr服务端渲染入门详解
2018/01/08 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
2019/06/11 Javascript
js实现表格单列按字母排序
2020/08/12 Javascript
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
Python的Flask框架中实现分页功能的教程
2015/04/20 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
Python使用pyh生成HTML文档的方法示例
2018/03/10 Python
对python的unittest架构公共参数token提取方法详解
2018/12/17 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
Keras搭建自编码器操作
2020/07/03 Python
pycharm全局搜索的具体步骤
2020/07/28 Python
什么是GWT的Entry Point
2013/08/16 面试题
幼儿园教师工作感言
2014/02/15 职场文书
捐献物资倡议书范文
2014/05/19 职场文书
感恩小明星事迹材料
2014/05/23 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
统招统分证明
2015/06/23 职场文书
PHP设计模式(观察者模式)
2021/07/07 PHP
java.util.NoSuchElementException原因及两种解决方法
2022/06/28 Java/Android