Добавить эффекта при смене фонового изображения
Имею вот такой код, он крутит по счётчику бекграундные картинки из заданной диры, никак не получается сделать плавное растворение и перетекание из одной картинки в другую. Меняется не то что совсем резко, но той красивой плавности не могу достичь. Вопрос скорее по CSS, хотя мне кажется JS такое тоже умеет.
Код:
<script> |
|
Спасибо. Похоже на то что надо :dance: . Попробую выдернуть куски кода с опасити.
|
Такой вопрос, а как сделать чтобы у вложенного в div с меняющимся фоном дива опасити оставалась всегда = 1, не менялась вместе с родителем.
|
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> |
Да, спасибо огромное. Но субъективно когда переход сделан кадрами, как по мне (на 60Гц hd монике и мощном компе, вхроме) немного по другому смотрится, более дергано, нежели вариант 1, хотя шаг наверное можно плотнее сделать. Я посмотрел как не наследовать прозрачность родителя, js-скриптом это делается, но я так углубляться не буду. Я по моему уже с таким сталкивался, пседвоклассами вроде как то решал.
|
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> |
Фактически готовое решение для простого слайдера. Быстро работает с большими картинками.
Конечно проще изначально делать слайдер картинками IMG, но у кого фоном уже сделано и по тем или иным причинам не хочется переделывать. Ещё раз Спасибо. |
А как можно сделать чтобы одно изображение, при переходе, накладывалось на другое. Т.е. первое изображение растворяется и в этот момент начинает появляться второе, следующая картинка. Что бы уйти от мелькания одноцветного белого фона между картинками.
|
Цитата:
<!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, время: 14:17. |