详解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将你的设计带入下个高度
Aug 08 HTML / CSS
目前不被任何主流浏览器支持的CSS3属性汇总
Jul 21 HTML / CSS
推荐一些比较有用的css3新属性
Nov 11 HTML / CSS
canvas绘制表情包的示例代码
Jul 09 HTML / CSS
HTML5的结构和语义(1):前言
Oct 17 HTML / CSS
html5与css3小应用
Apr 03 HTML / CSS
html5弹跳球示例代码
Jul 23 HTML / CSS
HTML5 input placeholder 颜色修改示例
May 30 HTML / CSS
详解HTML5中rel属性的prefetch预加载功能使用
May 06 HTML / CSS
html5给汉字加拼音加进度条的实现代码
Apr 07 HTML / CSS
flex弹性布局详解
Mar 20 HTML / CSS
使用CSS实现按钮边缘跑马灯动画
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
async和DOM Script文件加载比较
2014/07/20 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
2016/01/05 PHP
JavaScipt基本教程之JavaScript语言的基础
2008/01/16 Javascript
Mootools 1.2教程 排序类和方法简介
2009/09/15 Javascript
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)
2013/06/28 Javascript
对 jQuery 中 data 方法的误解分析
2014/06/18 Javascript
使用javascript实现监控视频播放并打印日志
2015/01/05 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
jQuery实现的简单无刷新评论功能示例
2017/11/08 jQuery
JS兼容所有浏览器的DOMContentLoaded事件
2018/01/12 Javascript
原生JS实现的碰撞检测功能示例
2018/05/18 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
在Heroku云平台上部署Python的Django框架的教程
2015/04/20 Python
Python解析json文件相关知识学习
2016/03/01 Python
Python实现完整的事务操作示例
2017/06/20 Python
pyqt5的QWebEngineView 使用模板的方法
2018/08/18 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
使用Python脚本从文件读取数据代码实例
2020/01/19 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
2020/03/10 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
小女主人连衣裙:Little Mistress
2017/07/10 全球购物
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
情人节活动策划方案
2014/02/27 职场文书
报到证办理个人委托书
2014/10/06 职场文书
领导干部群众路线剖析材料
2014/10/09 职场文书
上课说话检讨书
2015/01/27 职场文书
爱国主题班会教案
2015/08/14 职场文书
浅谈JS的二进制家族
2021/05/09 Javascript
python 标准库原理与用法详解之os.path篇
2021/10/24 Python