详解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 相关文章推荐
修复iPhone的safari浏览器上submit按钮圆角bug
Dec 24 HTML / CSS
CSS3中利用animation属性创建雪花飘落特效
May 14 HTML / CSS
一款纯css3实现的鼠标悬停动画按钮
Dec 29 HTML / CSS
使用CSS3和Checkbox实现JQuery的一些效果
Aug 03 HTML / CSS
css3实现简单的白云飘动背景特效
Oct 28 HTML / CSS
html5中地理位置定位api接口开发应用小结
Jan 04 HTML / CSS
Javascript 高级手势使用介绍
Apr 21 HTML / CSS
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
Apr 10 HTML / CSS
HTML5 Canvas中使用用路径描画圆弧
Jan 01 HTML / CSS
浅谈HTML5 FileReader分布读取文件以及其方法简介
Nov 09 HTML / CSS
Html5 webview元素定位工具的实现
Aug 07 HTML / CSS
CSS 鼠标选中文字后改变背景色的实现代码
May 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
php中文验证码实现示例分享
2014/01/12 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
javascript document.images实例
2008/05/27 Javascript
javascript 模式设计之工厂模式详细说明
2010/05/10 Javascript
JavaScript中的style.cssText使用教程
2014/11/06 Javascript
js简单抽奖代码
2015/01/16 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
jQuery学习心得总结(必看篇)
2016/06/10 Javascript
微信小程序进行微信支付的步骤昂述
2016/12/01 Javascript
jQuery实现优雅的弹窗效果(6)
2017/02/08 Javascript
Less 安装及基本用法
2018/05/05 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
Nuxt.js开启SSR渲染的教程详解
2018/11/30 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
Python学习笔记之if语句的使用示例
2017/10/23 Python
Python+tkinter模拟“记住我”自动登录实例代码
2018/01/16 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
用Python解决x的n次方问题
2019/02/08 Python
Django框架 信号调度原理解析
2019/09/04 Python
tornado+celery的简单使用详解
2019/12/21 Python
python的pip有什么用
2020/06/17 Python
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
美国电力供应商店/电气批发商:USESI
2018/10/12 全球购物
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
《青蛙看海》教学反思
2014/04/23 职场文书
见义勇为事迹材料
2014/12/24 职场文书
2019终止劳动合同协议书最新范本!
2019/07/09 职场文书
利用JavaScript写一个简单计算器
2021/11/27 Javascript
Nginx禁止ip访问或非法域名访问
2022/04/07 Servers