详解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实现多背景模拟动态边框的效果
Nov 08 HTML / CSS
CSS3实现网站商品展示效果图
Jan 18 HTML / CSS
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
Feb 01 HTML / CSS
使用HTML5技术开发一个属于自己的超酷颜色选择器
Sep 22 HTML / CSS
移动HTML5前端框架—MUI的使用
Dec 18 HTML / CSS
HTML5 解决苹果手机不能自动播放音乐问题
Dec 27 HTML / CSS
html5 canvas简单封装一个echarts实现不了的饼图
Jun 12 HTML / CSS
详解canvas绘制多张图的排列顺序问题
Jan 21 HTML / CSS
HTML5中input输入框默认提示文字向左向右移动的示例代码
Sep 10 HTML / CSS
Html5页面点击遮罩层背景关闭遮罩层
Nov 30 HTML / CSS
css实现左上角飘带效果的完整代码
Mar 18 HTML / CSS
flex布局中使用flex-wrap实现换行的项目实践
Jun 21 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使用exec shell命令注入的方法讲解
2013/11/12 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(二)
2014/06/23 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
替换php字符串中的单引号为双引号的方法
2017/02/16 PHP
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
javascript实现网页字符定位的方法
2015/07/14 Javascript
网页中JS函数自动执行常用三种方法
2016/03/30 Javascript
js两种拼接字符串的简单方法(必看)
2016/09/02 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
AngularJS实现controller控制器间共享数据的方法示例
2017/10/30 Javascript
webpack引入eslint配置详解
2018/01/22 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
JS根据json数组多个字段排序及json数组常用操作
2019/06/06 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
JavaScript实现点击切换验证码及校验
2021/01/10 Javascript
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
Python线程指南详细介绍
2017/01/05 Python
Python实现的双色球生成功能示例
2017/12/18 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
python高阶爬虫实战分析
2018/07/29 Python
python得到单词模式的示例
2018/10/15 Python
详解如何减少python内存的消耗
2019/08/09 Python
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
详解如何将 Canvas 绘制过程转为视频
2021/01/25 HTML / CSS
技术学校毕业生求职信分享
2013/12/02 职场文书
运动会稿件50字
2014/02/17 职场文书
效能风暴心得体会
2014/09/04 职场文书
十月围城观后感
2015/06/08 职场文书
公司与个人合作协议书
2016/03/19 职场文书
go类型转换及与C的类型转换方式
2021/05/05 Golang
java实现web实时消息推送的七种方案
2022/07/23 Java/Android