Как реализовать плавную смену фонового рисунка в firefox?

Ссылка скопирована
2 ответов

Пытаюсь реализовать смену фона при скролле. Изначально просто менял значение для 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; }

но мне не подходит, так как картинок фона будет много. Кто что может посоветовать?

Дополнительно:

перед сменой картинок было бы неплохо их подгрузить, иначе задержки будут в любых браузерах.

  • Froggyweb, опять-таки, пробовал делать предзагрузку через добавление скрытого img. не увидел разницы.
  • Kentavr16, https://habr.com/ru/articles/482820/
  • На момент написания вопроса ответ - никак. Нужно искать свое костыльное решение.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Анна SEO Ответ

    Для реализации плавной смены фонового рисунка в Firefox можно воспользоваться CSS свойством `transition`. Это свойство позволяет задать плавное изменение значения определенного свойства CSS при изменении состояния элемента.

    Прежде всего, необходимо создать контейнер для фонового изображения, например, `

    ` с классом `background-container`. Затем задаем стили для этого контейнера в CSS файле:

    .background-container {
        background-image: url('путь_к_изображению');
        background-size: cover;
        background-position: center;
        transition: background-image 0.5s ease;
    }

    .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("новый_путь_к_изображению")';

    document.querySelector('.background-container').style.backgroundImage = 'url("новый_путь_к_изображению")';

    Таким образом, при клике на кнопку или при срабатывании определенного события, будет происходить плавная смена фонового изображения в Firefox благодаря использованию CSS свойства `transition`.

    Не забудьте также проверить совместимость данного подхода с другими браузерами, чтобы обеспечить корректную работу на всех платформах.

    Другие ответы (1) Ответить на вопрос
    Кирилл JS

    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;
    }

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

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно