详解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动画效果小结(推荐)
Jul 25 HTML / CSS
浅谈css3新单位vw、vh、vmin、vmax的使用详解
Dec 01 HTML / CSS
css3弹性盒子flex实现三栏布局的实现
Nov 12 HTML / CSS
详解HTML5通讯录获取指定多个人的信息
Dec 20 HTML / CSS
HTML5实现表单自动验证功能实例代码
Jan 11 HTML / CSS
利用HTML5画出一个坦克的形状具体实现代码
Jun 20 HTML / CSS
html5摇一摇代码优化包括DeviceMotionEvent等等
Sep 01 HTML / CSS
html5表单及新增的改良元素详解
Jun 07 HTML / CSS
html5实现图片转圈的动画效果——让页面动起来
Oct 16 HTML / CSS
浅谈html5 video 移动端填坑记
Jan 15 HTML / CSS
HTML5自定义视频播放器源码
Jan 06 HTML / CSS
css 中多种边框的实现小窍门
Apr 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中防止SQL注入的最佳解决方法
2013/04/25 PHP
php 强制下载文件实现代码
2013/10/28 PHP
php数组中删除元素之重新索引的方法
2014/09/16 PHP
浅析iis7.5安装配置php环境
2015/05/10 PHP
Session 失效的原因汇总及解决丢失办法
2015/09/30 PHP
PHP截取发动短信内容的方法
2017/07/04 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
AngularJS基础 ng-mousemove 指令简单示例
2016/08/02 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
深入浅析javascript继承体系
2017/10/23 Javascript
vue-router项目实战总结篇
2018/02/11 Javascript
vue-cli脚手架build目录下utils.js工具配置文件详解
2018/09/14 Javascript
关于Vue项目跨平台运行问题的解决方法
2018/09/18 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
Vue中强制组件重新渲染的正确方法
2021/01/03 Vue.js
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
详解django三种文件下载方式
2018/04/06 Python
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
python移位运算的实现
2019/07/15 Python
python 实现多线程下载视频的代码
2019/11/15 Python
Django 项目布局方法(值得推荐)
2020/03/22 Python
python利用os模块编写文件复制功能——copy()函数用法
2020/07/13 Python
如何利用python之wxpy模块玩转微信
2020/08/17 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
StubHub新加坡:购买和出售全球活动门票
2017/03/10 全球购物
乐高瑞士官方商店:LEGO CH
2020/08/16 全球购物
十八届三中全会宣传方案
2014/02/21 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
干部作风建设心得体会
2014/10/22 职场文书
幼儿园个人总结
2015/02/28 职场文书
无房证明样本
2015/06/17 职场文书
春节慰问简报
2015/07/21 职场文书
Go各时间字符串使用解析
2021/04/02 Golang