Как реализовать плавную смену фонового рисунка в firefox?
Пытаюсь реализовать смену фона при скролле. Изначально просто менял значение для bg-image на body при определенных позициях элементов во вьюпорте, но при первом появлении новой фоновой картинки проявлялись фризы. Нашел такое решение
body { &::after { content: ""; /* при скроле меняю значение переменной --bgImage,отрисовывается новый фон */ background-image: var(--bgImage); background-repeat: no-repeat; background-size: cover; position: fixed; transition: background-image 0.5s ease 0.2s; top: 0px; right: 0px; bottom: 0px; left: 0px; z-index: -5; } } |
body { &::after { content: ""; /* при скроле меняю значение переменной --bgImage,отрисовывается новый фон */ background-image: var(--bgImage); background-repeat: no-repeat; background-size: cover; position: fixed; transition: background-image 0.5s ease 0.2s; top: 0px; right: 0px; bottom: 0px; left: 0px; z-index: -5; } }
Все окей в хроме, опере. Но мозила упорно не хочет в транзишн. Картинки просто моментально сменяют друг друга. На стаковерфлоу нашел подобные решения
.test { width: 400px; height: 150px; position: relative; border: 1px solid green; } .test:before, .test:after { content: ""; position: absolute; top: 0px; right: 0px; bottom: 0px; left: 0px; opacity: 1; } .test:before { background-color: red; z-index: 1; transition: opacity 1s; } .test:after { background-color: green; } .test:hover:before { opacity: 0; } |
.test { width: 400px; height: 150px; position: relative; border: 1px solid green; } .test:before, .test:after { content: ""; position: absolute; top: 0px; right: 0px; bottom: 0px; left: 0px; opacity: 1; } .test:before { background-color: red; z-index: 1; transition: opacity 1s; } .test:after { background-color: green; } .test:hover:before { opacity: 0; }
но мне не подходит, так как картинок фона будет много. Кто что может посоветовать?
Дополнительно:
перед сменой картинок было бы неплохо их подгрузить, иначе задержки будут в любых браузерах.
На момент написания вопроса ответ - никак. Нужно искать свое костыльное решение.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Firefox не анимирует смену background-image так, как вы ожидаете. Это свойство в нормальном смысле не интерполируется: браузер не может плавно превратить одну картинку в другую. В Chrome иногда создаётся ощущение плавности из-за особенностей отрисовки, но рассчитывать на это нельзя.
Рабочий вариант - не менять одну картинку через background-image, а держать два слоя и анимировать opacity. Даже если картинок много, слоёв всё равно достаточно двух: текущий фон и следующий фон.
const bgA = document.querySelector(".bg-a");
const bgB = document.querySelector(".bg-b");
let active = bgA;
let passive = bgB;
function changeBackground(url) {
passive.style.backgroundImage = `url("${url}")`;
passive.classList.add("is-visible");
active.classList.remove("is-visible");
[active, passive] = [passive, active];
}
CSS:
.bg-layer {
position: fixed;
inset: 0;
z-index: -1;
background-size: cover;
background-position: center;
opacity: 0;
transition: opacity .5s ease;
}
.bg-layer.is-visible {
opacity: 1;
}
И обязательно предзагружайте изображения перед сменой. Иначе первый показ новой картинки всё равно может фризить, потому что браузер только в этот момент начнёт её загружать и декодировать.

Для реализации плавной смены фонового рисунка в Firefox можно воспользоваться CSS свойством `transition`. Это свойство позволяет задать плавное изменение значения определенного свойства CSS при изменении состояния элемента.
Прежде всего, необходимо создать контейнер для фонового изображения, например, `
.background-container { background-image: url('путь_к_изображению'); background-size: cover; background-position: center; transition: background-image 0.5s ease; }
Здесь мы указываем путь к изображению, устанавливаем его размер и позицию, а также добавляем `transition` для плавной анимации смены фонового изображения.
Далее, для того чтобы сменить фоновое изображение, можно использовать JavaScript. Например, при клике на кнопку, можно изменить фоновое изображение:
document.querySelector('.background-container').style.backgroundImage = 'url("новый_путь_к_изображению")';
Таким образом, при клике на кнопку или при срабатывании определенного события, будет происходить плавная смена фонового изображения в Firefox благодаря использованию CSS свойства `transition`.
Не забудьте также проверить совместимость данного подхода с другими браузерами, чтобы обеспечить корректную работу на всех платформах.