@mars130

Как использовать zindex в js?

Всем привет, есть такой вот код, который генерирует рисунок по слоям из разных папок. Возникла проблема с очерёдностью слоёв в теории скрипт должен отрисовывать слои поочерёдно, но почему-то этого не происходит.
Подскажите пожалуйста как в этом скрипте указать zindex с JS знаком мало.

+ если есть такая возможность, может ли скрипт сразу сохранять результат на сервер или на локальную машину? Если да, то пожалуйста подскажите как это сделать.

<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
 
<script type='text/javascript'>
document.addEventListener('DOMContentLoaded', function() {

 x = 2048;
    y = 2048;
 
    var canvas = document.getElementById('canvas1');
    
    /*if (! canvas || ! canvas.getContext) { return false; }*/
    canvas.width = x;
    canvas.height = y;
    var ctx = canvas.getContext('2d');
    var img1 = new Image();
    var img2 = new Image();
    var img3 = new Image();
    var img4 = new Image();
    var img5 = new Image();
    var img6 = new Image();
    var img7 = new Image();
    var img8 = new Image();
    var img9 = new Image();
    var img10 = new Image();
    var img11 = new Image();
    var img12 = new Image();
    var img13 = new Image();
    img1.src = "img/background/1.png";
    img2.src = "img/shadow/1.png";
    img3.src = "img/wings/1.png";
    img4.src = "img/body/1.png";
    img5.src = "img/face/1.png";
    img6.src = "img/crystal/1.png";
    img7.src = "img/stockings/1.png";
    img8.src = "img/armor/1.png";
    img9.src = "img/clothes/1.png";
    img10.src = "img/collar/1.png";
    img11.src = "img/pads/1.png";
    img12.src = "img/hair/1.png";
    img12.src = "img/accessory/1.png";
    img1.onload = function() {
        ctx.drawImage(img1, 0, 0, x, y).style.zIndex = 0;
    }
    img2.onload = function() {
        ctx.drawImage(img2, 0, 0, x, y).style.zIndex = 5;
    }
	img3.onload = function() {
        ctx.drawImage(img3, 0, 0, x, y);
    }
	img4.onload = function() {
        ctx.drawImage(img4, 0, 0, x, y);
    }
	img5.onload = function() {
        ctx.drawImage(img5, 0, 0, x, y);
    }
	img6.onload = function() {
        ctx.drawImage(img6, 0, 0, x, y);
    }
	img7.onload = function() {
        ctx.drawImage(img7, 0, 0, x, y);
    }
	img8.onload = function() {
        ctx.drawImage(img8, 0, 0, x, y);
    }
	img9.onload = function() {
        ctx.drawImage(img9, 0, 0, x, y);
    }
	img10.onload = function() {
        ctx.drawImage(img10, 0, 0, x, y);
    }
	img11.onload = function() {
        ctx.drawImage(img11, 0, 0, x, y);
    }
	img12.onload = function() {
        ctx.drawImage(img12, 0, 0, x, y);
    }
	img13.onload = function() {
        ctx.drawImage(img13, 0, 0, x, y);
    }
var dataURL = canvas.toDataURL();
 console.log(dataURL);
 
 document.getElementById("canImg").innerHTML = "<img   src='"+canvas.toDataURL("image/png")+"' alt='from canvas'/>";
 });

</script>
</head>
<body>
<canvas name="text" id="canvas1"></canvas> 	
</body>
</html>
  • Вопрос задан
  • 209 просмотров
Решения вопроса 1
@Aricus
Мне приходит в голову сделать вложенные onload:
var img1 = new Image();
img1.src = "img/background/1.png";
img1.onload = function() {
    ctx.drawImage(img1, 0, 0, x, y);
    var img2 = new Image();
    img2.src = "img/shadow/1.png";
    img2.onload = function() {
        ctx.drawImage(img2, 0, 0, x, y);
    }
}

Второй вариант: слои можно сделать самими canvas: придётся создавать отдельный canvas на каждую картинку.
<div style="position: relative;">
<canvas id="layer1" width="100" height="100"
style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="layer2" width="100" height="100"
style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
</div>

А вообще, код плохой, потому что идёт множество повторений. По возможности любые повторения нужно прятать в циклы for или forEach, а также в функции. Потому что если что-то нужно будет менять, это нужно будет сделать в 1 месте, а не в 10. В данном случае, src картинок лучше вынести в массив, а всё остальное сделать в цикле forEach по этому массиву.
Кроме того, вместо var лучше использовать let: почитайте разницу между ними.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы