详解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 11 HTML / CSS
css3实现可滑动跳转的分页插件示例
May 08 HTML / CSS
一款纯css3实现的鼠标经过按钮特效教程
Nov 09 HTML / CSS
基于CSS3实现的漂亮Menu菜单效果代码
Sep 10 HTML / CSS
css3类选择器之结合元素选择器和多类选择器用法
Mar 09 HTML / CSS
css3实现椭圆轨迹旋转的示例代码
Oct 29 HTML / CSS
H5 canvas中width、height和style的宽高区别详解
Nov 02 HTML / CSS
用HTML5实现手机摇一摇的功能的教程
Oct 30 HTML / CSS
HTML5之SVG 2D入门4—笔画与填充
Jan 30 HTML / CSS
用HTML5制作烟火效果的教程
May 12 HTML / CSS
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
Aug 24 HTML / CSS
html+css实现赛博朋克风格按钮
May 26 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中call_user_func函数使用注意事项
2014/11/21 PHP
详解将数据从Laravel传送到vue的四种方式
2019/10/16 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
简单实用的全选反选按钮例子
2013/10/18 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
jquery.map()方法的使用详解
2015/07/09 Javascript
javascript实现数组去重的多种方法
2016/03/14 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
全面了解javascript中的错误处理机制
2016/07/18 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
2017/06/04 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
jQuery插件artDialog.js使用与关闭方法示例
2017/10/09 jQuery
详解Vue组件实现tips的总结
2017/11/01 Javascript
JS面向对象的程序设计相关知识小结
2018/05/26 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
Python内置模块ConfigParser实现配置读写功能的方法
2018/02/12 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
python 使用pdfminer3k 读取PDF文档的例子
2019/08/27 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
基于TensorFlow常量、序列以及随机值生成实例
2020/01/04 Python
浅谈keras的深度模型训练过程及结果记录方式
2020/01/24 Python
python 遗传算法求函数极值的实现代码
2020/02/11 Python
Python中sys模块功能与用法实例详解
2020/02/26 Python
Python基于template实现字符串替换
2020/11/27 Python
ASICS印度官方网站:日本专业运动品牌
2020/06/20 全球购物
应聘教师推荐信
2013/10/31 职场文书
初三学生评语大全
2014/04/24 职场文书
大学生预备党员自我评价
2015/03/04 职场文书
2015年青年教师工作总结
2015/05/25 职场文书