Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Добавить эффекта при смене фонового изображения (https://javascript.ru/forum/misc/83539-dobavit-ehffekta-pri-smene-fonovogo-izobrazheniya.html)

Ops 05.01.2022 19:21

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

Код:

<script>
var coin = 1;
var changeBg = function() {
  $('.item').css('background', 'url(assets/img/backgrounds/' + coin++ + '.jpg)');
  if (coin > 3)
    coin = 1;
}
setInterval(changeBg, 3000);
</script>
<style>
.item .background {
background-color: rgba(0,0,0,0.75);
  -webkit-transition: all 0.9s ease-in-out;
  -o-transition: all 0.9s ease-in-out;
  transition: all 0.9s ease-in-out;

}
</style>
<div class="item">
<p>1111111</p>
<p>1111111</p>
<p>1111111</p>
<p>1111111</p>
<p>1111111</p>
<p>1111111</p>
<p>1111111</p>
<p>1111111</p>
</div>


рони 05.01.2022 20:33

Ops,
https://javascript.ru/forum/misc/294...tml#post447488

Ops 05.01.2022 21:25

Спасибо. Похоже на то что надо :dance: . Попробую выдернуть куски кода с опасити.

Ops 05.01.2022 21:40

Такой вопрос, а как сделать чтобы у вложенного в div с меняющимся фоном дива опасити оставалась всегда = 1, не менялась вместе с родителем.

рони 05.01.2022 22:25

background-image opacity
 
Ops,
как вариант... но лучше к специалистам по css https://stackoverflow.com/questions/...-image-opacity

<!DOCTYPE html>

<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        .carousel {
            width: 350px;
            height: 170px;
            position: relative;
            border-radius: 8px;
            box-sizing: border-box;
            border: #8B4513 2px solid;
            background-image: linear-gradient(to right, rgba(255, 255, 255, 0.9) 0 100%), var(--src);
            background-size: 350px 170px;
        }

        .carousel.show {
            animation: up .8s linear forwards;

        }

        .carousel.hide {
            animation: up .3s  linear backwards;
        }

        .carousel.vertical {
            width: 170px;
            height: 350px;
            background-size: 170px 350px;
        }

        @keyframes up {
            0% {
                background-image: linear-gradient(to right, rgba(255, 255, 255, .9) 0 100%), var(--src);
            }

            20% {
                background-image: linear-gradient(to right, rgba(255, 255, 255, .7) 0 100%), var(--src);
            }

            40% {
                background-image: linear-gradient(to right, rgba(255, 255, 255, .5) 0 100%), var(--src);
            }

            60% {
                background-image: linear-gradient(to right, rgba(255, 255, 255, .3) 0 100%), var(--src);
            }

            80% {
                background-image: linear-gradient(to right, rgba(255, 255, 255, .1) 0 100%), var(--src);
            }

            100% {
                background-image: linear-gradient(to right, rgba(255, 255, 255, 0) 0 100%), var(--src);
            }
        }
    </style>

    <script>
        window.addEventListener("DOMContentLoaded", function() {
            document.querySelectorAll(".carousel").forEach(function(el) {
                    let {
                        src,
                        num,
                        pause = 3000,
                        i = 0
                    } = el.dataset;

                    function hide() {
                        el.classList.remove("show");
                        el.classList.add("hide");
                        window.setTimeout(show, 300)
                    }

                    function show() {
                        ++i;
                        el.style.setProperty("--src", `url('${src+i}')`);
                        i %= num;
                        el.classList.remove("hide");
                        el.classList.add("show");
                        window.setTimeout(hide, pause);
                    }
                    show();

                }

            )

        });
    </script>
</head>

<body>
    <div class="carousel" data-pause="3000" data-num=3 data-src='https://loremflickr.com/350/170/kitty,kitten?random='>
        12345
    </div>
    <div class="carousel vertical" data-pause="5000" data-num=12 data-src='https://loremflickr.com/170/350/dog,hound?random='>
        12345
    </div>
</body>

</html>

Ops 05.01.2022 23:18

Да, спасибо огромное. Но субъективно когда переход сделан кадрами, как по мне (на 60Гц hd монике и мощном компе, вхроме) немного по другому смотрится, более дергано, нежели вариант 1, хотя шаг наверное можно плотнее сделать. Я посмотрел как не наследовать прозрачность родителя, js-скриптом это делается, но я так углубляться не буду. Я по моему уже с таким сталкивался, пседвоклассами вроде как то решал.

рони 05.01.2022 23:59

js animate background-image opacity
 
Ops,
<!DOCTYPE html>
<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        .carousel {
            width: 350px;
            height: 170px;
            position: relative;
            border-radius: 8px;
            box-sizing: border-box;
            border: #8B4513 2px solid;
            --op: 0;
            background-image: linear-gradient(to right, rgba(255, 255, 255, var(--op)) 0 100%), var(--src);
            background-size: 350px 170px;
        }

        .carousel.vertical {
            width: 170px;
            height: 350px;
            background-size: 170px 350px;
        }
    </style>
    <script>
        window.addEventListener("DOMContentLoaded", function() {
            document.querySelectorAll(".carousel").forEach(function(el) {
                let {
                    src,
                    num,
                    pause = 3000,
                    i = 0,
                    op = 1,
                    delta = .005
                } = el.dataset;

                function hide() {
                    op += delta;
                    if (op > 1) {
                        op = 1;
                        delta = -delta;
                        ++i;
                        el.style.setProperty("--src", `url('${src+i}')`);
                        i %= num;
                    }
                    el.style.setProperty("--op", op);
                    requestAnimationFrame(op == 1 ? show : hide);
                }

                function show() {
                    op += delta;
                    if (op < 0) op = 0;
                    el.style.setProperty("--op", op);
                    if (op) requestAnimationFrame(show);
                    else {
                        delta = -delta;
                        window.setTimeout(hide, pause);
                    }
                }
                requestAnimationFrame(hide);
            })
        });
    </script>
</head>

<body>
    <div class="carousel" data-pause="3000" data-num=3 data-src='https://loremflickr.com/350/170/kitty,kitten?random='>
        12345
    </div>
    <div class="carousel vertical" data-pause="5000" data-num=12 data-src='https://loremflickr.com/170/350/dog,hound?random='>
        12345
    </div>
</body>

</html>

Ops 06.01.2022 01:46

Фактически готовое решение для простого слайдера. Быстро работает с большими картинками.
Конечно проще изначально делать слайдер картинками IMG, но у кого фоном уже сделано и по тем или иным причинам не хочется переделывать.
Ещё раз Спасибо.

Ops 07.01.2022 23:08

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

рони 08.01.2022 00:36

Цитата:

Сообщение от Ops
первое изображение растворяется и в этот момент начинает появляться второе, следующая картинка.

:-?

<!DOCTYPE html>

<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        .carousel {
            position: relative;
            z-index: 1;
            overflow: hidden;
            width: 350px;
            height: 170px;
            border-radius: 8px;
            box-sizing: border-box;
            border: #8B4513 2px solid;
        }

        .carousel:before {
            z-index: -1;
            position: absolute;
            left: 0;
            top: 0;
            content: var(--src_before);
            background-size: cover;
        }

        .carousel:after {
            z-index: -1;
            position: absolute;
            left: 0;
            top: 0;
            content: var(--src_after);
            opacity: var(--opacity_after);
            background-size: cover;
        }


        .carousel.vertical {
            width: 170px;
            height: 350px;
        }
    </style>
    <script>
        window.addEventListener("DOMContentLoaded", function() {
            document.querySelectorAll(".carousel").forEach(function(el) {
                let {
                    src,
                    num,
                    pause = 3000,
                    i = num - 1,
                    op = 1,
                    delta = .005
                } = el.dataset;

                function hide() {
                    op += delta;
                    if (op < 0) {
                        op = 0;
                        delta = -delta;
                        i++;
                        i %= num;
                        let url = src + (i + 1);
                        el.style.setProperty("--src_after", `url('${url}')`);


                    }
                    el.style.setProperty("--opacity_after", op);
                    requestAnimationFrame(op == 0 ? show : hide);
                }

                function show() {
                    op += delta;
                    if (op > 1) op = 1;
                    el.style.setProperty("--opacity_after", op);
                    if (op < 1) requestAnimationFrame(show);
                    else {
                        let url = src + (i + 1);
                        el.style.setProperty("--src_before", `url('${url}')`);
                        delta = -delta;
                        window.setTimeout(hide, pause);
                    }
                }
                requestAnimationFrame(show);
            })
        });
    </script>
</head>

<body>
    <div class="carousel" data-pause="3000" data-num=3 data-src='https://loremflickr.com/350/170/kitty,kitten?random='>
        12345
    </div>
    <div class="carousel vertical" data-pause="5000" data-num=12 data-src='https://loremflickr.com/170/350/dog,hound?random='>
        12345
    </div>

</body>

</html>


Часовой пояс GMT +3, время: 09:00.