Подтвердить что ты не робот

Реализация слоев в холсте HTML5

Я собираюсь реализовать Photoshop-подобные слои в холсте HTML5. В настоящее время у меня есть две идеи. Первая и, возможно, более простая идея - иметь элемент Canvas для каждого слоя, например:

<canvas id="layerName" width="320" height="240" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="layerName" width="320" height="240" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="layerName" width="320" height="240" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>

Таким образом, когда вы рисуете слой, он фактически переходит к этому слою. Слои с прозрачными положениями можно увидеть до нижних слоев (холсты). Укладка слоя выполняется с помощью свойства z-index.

Вторая идея - использовать один элемент Canvas и реализовать некоторую логику для обработки слоев, как в этом случае:

<!DOCTYPE html>
<html>
    <head>
        <title>Test</title>
        <script>
            window.addEventListener('load', function() {
                var canvas = document.getElementById("canvas");  
                var ctx = canvas.getContext("2d");  

                var order = 0;

                function drawLayer1() {
                    ctx.fillStyle = "rgb(200,0,0)";
                    ctx.fillRect (10, 10, 55, 50);
                }

                function drawLayer2() {
                    ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
                    ctx.fillRect (30, 30, 55, 50);
                }

                function draw() {
                    ctx.clearRect(0, 0, 256, 256);

                    if (order === 0) {
                        drawLayer1();
                        drawLayer2();
                    }
                    else {
                        drawLayer2();
                        drawLayer1();
                    }
                }

                setInterval(draw, 250);
                setInterval(function() {
                    order = 1 - order;
                }, 200);
            }, false);
        </script>
    </head>
    <body>
        <canvas id="canvas" width="256px" height="256px"></canvas>
    </body>
</html>

В приведенном выше коде два слоя изменят порядок укладки каждые 200 мсек.

Итак, вопрос в том, каким образом был бы лучший способ? Каковы плюсы и минусы обоих подходов?

4b9b3361

Ответ 1

Если вы хотите использовать один элемент canvas и иметь внутри него несколько слоев, вы можете посмотреть мою библиотеку:

Он использует поврежденную систему rect, чтобы уменьшить количество перекрасок, выполняемых каждый раз, когда изменяется холст, поэтому вы не только получаете слои (которые могут быть вложенными), но также получаете оптимизированные перерисовки.

Вот простая демонстрация:

Ответ 2

Использование нескольких холстов должно быть быстрее, потому что холст становится зацикленным, а затем просто зацикливается на экране браузером. Вы переносите нагрузку на переключение слоев в браузере, который просто должен перемещать некоторые прямоугольники графических данных.

Если вы сами выполняете слоирование, у вас больше контроля, но бремя лежит на JS и JS-двигателе для выполнения всей работы. Я бы избегал этого, если бы у меня был выбор, но если вы собираетесь использовать эффекты слоя, которые работают с базовыми слоями, это может быть вашим единственным выбором.

Ответ 3

Установка атрибута div контейнера должна была предотвратить эту проблему с перезаписью. Попробуйте установить положение в "окклюдированном тексте" - например, если в настоящее время он будет абсолютным, он будет выглядеть в том же регионе, что и верхний левый относительный материал.

И это, вероятно, очевидно, но, по порядку div в html, вы можете исключить использование оси z. Если вы хотите, чтобы ваш материал был общим (и для других разработчиков), используйте ось z, но сохраните базовую линию, к которой вы добавляете индексы уровня (чтобы базовая линия могла быть изменена при использовании другого кода с использованием оси z проблематичным способом).