详解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 相关文章推荐
css背景图片的背景裁切、背景透明度、背景变换等效果运用
Dec 24 HTML / CSS
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
Dec 30 HTML / CSS
CSS3+JavaScript实现炫酷呼吸效果的示例代码
Jun 15 HTML / CSS
html5 乒乓球(碰撞检测)实例二
Jul 25 HTML / CSS
移动端html5 meta标签的神奇功效
Jan 06 HTML / CSS
html5+css3进度条倒计时动画特效代码【推荐】
Mar 08 HTML / CSS
10个最常见的HTML5面试题 附答案
Jun 06 HTML / CSS
Html5实现移动端、PC端 刮刮卡效果
Jun 30 HTML / CSS
基于HTML5陀螺仪实现ofo首页眼睛移动效果的示例
Jul 31 HTML / CSS
HTML5中使用json对象的实例代码
Sep 10 HTML / CSS
css实现左上角飘带效果的完整代码
Mar 18 HTML / CSS
聊聊CSS粘性定位sticky案例解析
Jun 01 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
php获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
PHP加密解密类实例分析
2015/04/20 PHP
PHP排序算法类实例
2015/06/17 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
2017/06/06 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
javaScript对象和属性的创建方法
2007/01/15 Javascript
判断控件是否已加载完成的代码
2010/02/24 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
jquery中ajax学习笔记3
2011/10/16 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
javascript新闻跑马灯实例代码
2020/07/29 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
js返回顶部实例分享
2016/12/21 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
ionic App问题总结系列之ionic点击系统返回键退出App
2017/08/19 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
vue 动态创建组件的两种方法
2020/12/31 Vue.js
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
浅析Python编写函数装饰器
2016/03/18 Python
python直接访问私有属性的简单方法
2016/07/25 Python
利用python画出折线图
2018/07/26 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
Python执行时间的几种计算方法
2020/07/31 Python
python 代码运行时间获取方式详解
2020/09/18 Python
学会迭代器设计模式,帮你大幅提升python性能
2021/01/03 Python
俄罗斯奢侈品牌衣服、鞋子和配饰的在线商店:INTERMODA
2020/07/17 全球购物
优秀大学生推荐信范文
2013/11/28 职场文书
毕业生就业自荐信
2013/12/04 职场文书
经理管理专业自荐信范文
2013/12/31 职场文书
导购员的岗位职责
2014/02/08 职场文书
合作与交流自我评价
2015/03/09 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书
python+opencv实现目标跟踪过程
2022/06/21 Python
win10输入法不见了只能打出字母怎么解决?
2022/08/05 数码科技