详解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的opacity属性设置透明效果的用法
May 09 HTML / CSS
HTML5 Canvas图像模糊完美解决办法
Feb 06 HTML / CSS
canvas烟花特效锦集
Jan 17 HTML / CSS
Html5 实现微信分享及自定义内容的流程
Aug 20 HTML / CSS
HTML5的语法变化介绍
Aug 13 HTML / CSS
HTML5 window/iframe跨域传递消息 API介绍
Aug 26 HTML / CSS
HTMl5的存储方式sessionStorage和localStorage详解
Mar 18 HTML / CSS
HTML5学习笔记之html5与传统html区别
Jan 06 HTML / CSS
H5混合开发app如何升级的方法
Jan 10 HTML / CSS
移动端Html5中百度地图的点击事件
Jan 31 HTML / CSS
详解移动端h5页面根据屏幕适配的四种方案
Apr 15 HTML / CSS
CSS link与@import的区别和用法解析
May 07 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+Html+缓存
2006/12/20 PHP
PHP编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
php导入模块文件分享
2015/03/17 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
PHP实现批量修改文件名的方法示例
2019/09/18 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
动态加载js文件 document.createElement
2006/10/14 Javascript
javascript自然分类法算法实现代码
2013/10/11 Javascript
JS获取键盘上任意按键的值(实例代码)
2013/11/12 Javascript
jQuery选择器querySelector的使用指南
2015/01/23 Javascript
jQuery设置和移除文本框默认值的方法
2015/03/09 Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
2016/11/26 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
vue实现固定位置显示功能
2019/05/30 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
js中!和!!的区别与用法
2020/05/09 Javascript
微信小程序实现简单的select下拉框
2020/11/23 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
Python网络编程详解
2017/10/31 Python
Django Admin实现三级联动的示例代码(省市区)
2018/06/22 Python
详解pandas安装若干异常及解决方案总结
2019/01/10 Python
python序列类型种类详解
2020/02/26 Python
美国派对用品及装饰品网上商店:Shindigz
2016/07/30 全球购物
专科毕业生求职简历的自我评价
2013/10/12 职场文书
七年级政治教学反思
2014/02/03 职场文书
上班看电影检讨书
2014/02/12 职场文书
集体婚礼策划方案
2014/02/22 职场文书
学校领导四风问题整改措施思想汇报
2014/10/09 职场文书
财务整改报告范文
2014/11/05 职场文书
家庭聚会祝酒词
2015/08/11 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
一行代码python实现文件共享服务器
2021/04/22 Python
jquery插件实现搜索历史
2021/04/24 jQuery