ZorNet.Ru — сайт для вебмастера » JavaScript и jQuery » Волшебство JS: цвет фона блока исходя из картинки в нем

Волшебство JS: цвет фона блока исходя из картинки в нем

Волшебство JS: цвет фона блока исходя из картинки в нем
Улучшите внешний вид ваших веб-страниц с помощью скрипта "Волшебные динамические фоны". Этот современный JavaScript позволяет динамически устанавливать цвет фона для любого блока, анализируя цветовую палитру 🎨 содержащегося в нем изображения.

Как это работает:

• Находит размытое изображение (.blurID).
• Извлекает основной цвет из этого размытого изображения, рисуя его на скрытом маленьком холсте (canvas) размером 1x1 пиксель. Таким образом, браузер сам усредняет все цвета в один.
• Превращает полученный цвет в HEX-код (например, #RRGGBB).
• Устанавливает этот HEX-код в качестве цвета фона для соответствующего постера (.postID).

Если изображение ещё не загрузилось, скрипт подождёт и выполнит все действия после его загрузки. Если уже загрузилось — сработает сразу.

Установка:

Разместите это в самый низ кода веб-страницы:

Код
<script>
// Функция для извлечения доминирующего цвета из изображения
function getDominantColor(img) {
 const canvas = document.createElement('canvas');
 const ctx = canvas.getContext('2d');
 canvas.width = 1;
 canvas.height = 1;

 // Рисуем изображение на canvas 1x1 пикселя (браузер усреднит цвета)
 ctx.drawImage(img, 0, 0, 1, 1);

 // Получаем цвет первого (и единственного) пикселя
 const data = ctx.getImageData(0, 0, 1, 1).data;
 const r = data[0];
 const g = data[1];
 const b = data[2];

 // Возвращаем HEX-цвет
 return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
}

// Основная функция
function setPosterBackground() {
 const blurImg = document.querySelector('.blurID');
 if (!blurImg) {
 console.error('Элемент с классом .blurID не найден');
 return;
 }

 const updateBackground = function() {
 const color = getDominantColor(blurImg);
 const poster = document.querySelector('.postID');
 if (poster) {
 poster.style.backgroundColor = color;
 console.log('Установлен фон:', color);
 }
 };

 // Ждем загрузки изображения, если оно еще не загружено
 if (!blurImg.complete) {
 const handler = function() {
 updateBackground();
 blurImg.removeEventListener('load', handler); // Удаляем обработчик
 };
 blurImg.addEventListener('load', handler);
 } else {
 // Если уже загружено
 updateBackground();
 }
}

// Запускаем при загрузке страницы
document.addEventListener('DOMContentLoaded', setPosterBackground);
</script>

P.S.: у меня, допустим, этот материал для того, чтобы фон был подкрашен у всех картинок. Скрипт полностью написан мной, jaguar37rus (sergeichumadov), прибегнув к помощи посредством GPT (чат-бота с AI).

Источник: htmlstart.ucoz.net

26 Сентября 2025 Просмотров: 169 Комментариев: (2)

Поделиться в социальных сетях

Материал разместил

Комментарии: 2
-SAM-
-SAM- 08 Октября 2025 23:131
0
Проверял работу этого скрипта (ставил для теста сюда на ZorNet ещё месяц назад). Скажу, что работает. Но не так, как хотелось бы. Поскольку нет плавного перехода между фоном и тем цветом, который по контурам постера. Усредненный цвет далеко не тот цвет, что идёт на фоне изображения.

Лучше всего в таких случаях через доп. поле сразу заполнять (или незадействованное, допустим, поле "версия" или ещё какое-то), указывая в нем нужный hex-код цвета. Естественно, если материалов не слишком много, иначе в ручную не поправить, что без такого скрипта не обойтись.

И стоит написать пару слов про установку. Скрипт в отдельный js-файл выделить, подключить перед </body> (или в </head> прописать с атрибутом defer). Можно ещё сам код скрипта минимизировать и упаковать предварительно. Потом у блока, в котором находится ваш постер материала, прописать нужно класс (или к там уже имеющемуся дописать) class="pos$ID$", а далее по аналогии добавить к самой картинке (img) class="blu$ID$" - чтобы скрипт мог получить усредненный цвет постера и задать его блоку.
-SAM-
-SAM- 10 Октября 2025 05:012
0
Переписал изначально выложенный скрипт: повторяющиеся строки были выделены в переменную и введена отдельная функция, а также поменял классы (обратите внимание, что в этом случае ввод $ID$ не имеет смысла).

Короткая версия скрипта:
Код
<script>function getDominantColor(n){return o=(t=document.createElement("canvas")).getContext("2d"),t.width=t.height=1,o.drawImage(n,0,0,1,1),"#"+(16777216+((r=o.getImageData(0,0,1,1).data)[0]<<16)+(r[1]<<8)+r[2]).toString(16).slice(1)}function setPosterBackground(){if(!(e=document.querySelector(".article_image img")))return console.error("img not found");t=()=>{t=getDominantColor(e),(o=document.querySelector(".article_image"))&&(o.style.backgroundColor=t,console.log("Установлен фон:",t))},e.complete?t():e.addEventListener("load",()=>{t(),e.removeEventListener("load",arguments.callee)})}document.addEventListener("DOMContentLoaded",setPosterBackground);</script>
Классы поменял под себя (в коде идёт ".article_image"- этому блоку будет фон задавать, в нем должен быть img).

Оставь свой отзыв

avatar