Наложение изображений
Наложение изображений

Наложение изображений

11 июля 2023       146 просмотров

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

Ок, хули бы и да, подумал я, принцип-то понятен. Не нравилась мне только оснастка — с телефона с таким управляться неудобно, потому было принято решение набросать что-нибудь визуально простое, без лишних элементов.

Для начала нам понадобится 2 изображения одинакового разрешения. И немного JS. HTML "на глаз". CSS — по вкусу.

<html>
<title>Заголовок</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <!--запрещаем масштабирование, чтобы верстка не поплыла-->
<script type="text/javascript"> /*ивент для мыши*/
    document.addEventListener('mousemove', function(e) {
        var body = document.querySelector('body');
        var eraser = document.createElement("span");
        eraser.style.left = -50 + e.offsetX+'px';
        eraser.style.top = -50 + e.offsetY+'px';
        body.appendChild(eraser);
    });
</script>
<script type="text/javascript"> /*ивент для тача*/
    document.addEventListener('touchmove', function(y) {
        var body = document.querySelector('body');
        var eraser = document.createElement("span"); /*да, технически мы рисуем, а не стираем, но выглядит-то так, будто стираем*/
        var touches = event.touches;
        if (touches.length > 0) {
            var touch = touches[0];
            eraser.style.left = -50 + touch.clientX+'px';
            eraser.style.top = -50 + touch.clientY+'px';
            body.appendChild(eraser);
        }
    });
</script>
<style>
* {
    margin: 0;
    padding: 0; /*отступы не нужны*/
}
body {
    position: relative;
    width: 100%;
    height: auto;
    overflow: hidden;
    background: url("/images/2023/07/11/00/00.jpg");
    background-size: 100% auto;
    background-position: center;
    background-blend-mode: multiply; /*режим наложения слоев*/
    background-repeat: no-repeat;
}
span {
    display: block;
    position: absolute;
    width: 100px; /*ширина блока */
    height: 100px; /*высота блока */
    background: url("/images/2023/07/11/00/01.jpg");
    background-size: 100% auto; /*растягиваем с сохранением пропорций*/
    background-attachment: fixed; /*фон не перемещается вместе с элементом*/
    background-repeat: no-repeat; /*фон не размножается*/
    background-position: center; /*центрируем*/
    border-radius: 50%; /*скругляем края*/
    pointer-events: none; /*не может быть целью*/
}
</style>
</html>

И, сразу же, пример.

upd Товарищ тут предложил рацуху — сделать кнопку сброса для мобильных устройств, что ж, почему бы и нет, заодно дополним нашу писанину стандартными тегами (пример подправлен):

<html>
<head>
<title>Заголовок</title>
</head>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" /> <!--запрещаем масштабирование, чтобы верстка не поплыла-->
<body>
<button class="mobbutton" onclick="resetPage()">сброс</button>
<script>
    function resetPage() {
    // Используем объект location для перезагрузки страницы
    location.reload();
}
</script>
<script type="text/javascript"> /*ивент для мыши*/
    document.addEventListener('mousemove', function(e) {
        var body = document.querySelector('body');
        var eraser = document.createElement("span");
        eraser.style.left = -50 + e.offsetX+'px';
        eraser.style.top = -50 + e.offsetY+'px';
        body.appendChild(eraser);
    });
</script>
<script type="text/javascript"> /*ивент для тача*/
    document.addEventListener('touchmove', function(y) {
        var body = document.querySelector('body');
        var eraser = document.createElement("span"); /*да, технически мы рисуем, а не стираем, но выглядит-то так, будто стираем*/
        var touches = event.touches;
        if (touches.length > 0) {
            var touch = touches[0];
            eraser.style.left = -50 + touch.clientX+'px';
            eraser.style.top = -50 + touch.clientY+'px';
            body.appendChild(eraser);
        }
    });
</script>
<style>
* {
    margin: 0;
    padding: 0; /*отступы не нужны*/
}
body {
    position: relative;
    width: 100%;
    height: auto;
    overflow: hidden;
    background: url("/images/2023/07/11/00/00.jpg");
    background-size: 100% auto;
    background-position: center;
    background-blend-mode: multiply; /*режим наложения слоев*/
    background-repeat: no-repeat;
}
span {
    display: block;
    position: absolute;
    width: 100px; /*ширина блока */
    height: 100px; /*высота блока */
    background: url("/images/2023/07/11/00/01.jpg");
    background-size: 100% auto; /*растягиваем с сохранением пропорций*/
    background-attachment: fixed; /*фон не перемещается вместе с элементом*/
    background-repeat: no-repeat; /*фон не размножается*/
    background-position: center; /*центрируем*/
    border-radius: 50%; /*скругляем края*/
    pointer-events: none; /*не может быть целью*/
}
.mobbutton {
    display: none; <!--по-умолчанию кнопка — спрятана-->
}
@media (max-width: 600px) { <!--проверяем ширину окна и пишем стиль кнопки-->
    .mobbutton {
    background: #00000000;
    font-size: 14px;
    text-transform: uppercase;
    padding: 5px;
    color: #536370;
    font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
    display: block;
    text-align: center;
    width: 100%;
    position: fixed;
    bottom: 0;
}
}
</style>
</body>
</html>