Не удается установить свойство background-image в CSS с помощью JavaScript

Обновление:

По каким-то причинам это не срабатывает с JavaScript. Он не позволяет многократно устанавливать фоновое изображение. Для решения проблемы я назначил свойство backgroundPosition как calc(50% + смещение_x) calc(50% + смещение_y), вместо того чтобы применять трансформацию в изображении. Похоже, что это работает на данный момент.


Не получается динамически задать свойство “background-image” элемента при помощи JavaScript. Ранее у меня не возникало проблем с этим, но сейчас мой скрипт совершенно не работает. В консоли отсутствуют сообщения об ошибках, поэтому я не понимаю, что происходит.

Я создал векторные графики для игры и пытаюсь перемещать их по экрану с помощью группы (<g transform = "translate(x, y)"></g>). Мой код берет текущий фон элемента по element.style.backgroundImage и заменяет строку, содержащую группу, на трансформированную версию.

Когда я запускаю:

element.style.backgroundImage = "url(\"" + новыи_фон + "\")";
console.log(element.style.backgroundImage);

старая версия фонового изображения (без трансформаций) отображается в выводе, и изображение не обновляется. Например, вывод может быть:

… <svg xmlns='http://www.w3.org/2000/svg' width='3000' height='3000'><g> …

В то время как вывод

console.log(новыи_фон);

оказывается корректным и выглядит примерно так:

… <svg xmlns="http://www.w3.org/2000/svg" width="3000" height="3000"><g transform="translate(945.123, 1256.789)"> …

Фон элемента не изменяется, несмотря на мои усилия. Я попробовал все, что только возможно. Подозревал, что проблема может быть в цикле (с интервалом около 50 мс), но увеличение интервала не дало результата. Эта система работает в других частях скрипта, где фон задается изначально.

Буду признателен за любую информацию.

Сталкивался с такой же фигней при работе с динамическим SVG. Попробуй setAttribute вместо прямого изменения стиля: element.setAttribute('style', 'background-image: url("data:image/svg+xml,' + encodeURIComponent(новыи_фон) + '");'). Или правильно создай data URI - браузеры часто глючат с SVG в CSS. И проверь, что в новый_фон не попали символы, которые ломают CSS.

Браузер может не успевать обработать изменения SVG. Попробуй обернуть установку backgroundImage в requestAnimationFrame. Или используй CSS переменные: задаешь --bg-image через setProperty, а в CSS ставишь background-image: var(--bg-image). Какой браузер кстати?

Принудительно сброс кэш браузера для background-image. Браузер часто держит старое изображение в памяти. Добавь случайный параметр в URL: "url('" + новый_фон + "?v=" + Date.now() + "')". Попробуй element.style.removeProperty(‘background-image’) перед установкой нового значения. У меня была такая же фигня с SVG - браузер “забывал” обновлять содержимое.