Палитра цветов на JS. Часть 1- из HSL в RGB - 8 Апреля 2010 - Блог U.S.F. - U.S.F.
Палитра цветов на JS. Часть 1- из HSL в RGB
08.04.10
Добрый вечер мои дорогие читатели. Идея написать скрипт рисования палитры пришел спонтанно. Тоесть он мне по идее не для каких целей не нужен был, но вот захотелось сделать и все. С чего же начнем?
Сделать палитру можно например взяв один блок и заполнив его маленькими цветными блоками. Ну вот, подумал я, основа уже есть. Тоесть:
Думаю по этому коду все ясно. У нас есть главный DIV и внутри него будут блоки шириной в 1 пиксел. Теперь мне нужно генерировать эти блоки задавая им различный цвет.При этом я могу щелкнув на цвет получить его цвет(сделал через alert(this.style.backgroundColor)) Делает вот так:
Code
function DrawP() { var pal; for(var i=0;i<360;i++) { pal+="<div onClick='alert(this.style.backgroundColor);' style='background-color:"+ТУТ ЦВЕТА ГЕНЕРИРУЕМЫЕ+";'></div>"; } document.getElementById('pal').innerHTML=pal; }
И тут я столкнулся с первыми проблемами. Мне нужно генерировать цвет в RGB и каждый параметр должен успеть пройти от 0 до 255. Это 255*255*255 операций. Натяжно всетаки будет. Да и как это сделать я не понял. Я с успехом могу генерировать отдельные области спектра составляя 2D палитру изменяя только 2 из трех параметров. 3й остается постоянным. Получается что я могу таким образом составить 6 областей которые и дадут мне ВСЮ палитру. Но мне это показалось очень неудобным. 6 разных палитр очень уж громоздко. Да и считает он туговато. Хочу все и сразу. Тут меня осенило! У цветовой схемы HSL за тон цвета отвечает только 1 параметр! Тоесть я могу получить всю палитру просто прогнав по 1 циклу все значения(у HSL их 360). Пришлось искать формулы перевода из HSL в RGB. Нашел конечно тут . Написал код.
Code
function HSLtoRGB(H, S, L) { var H,S,L,Q,P,Hk; T=[ ]; C=[ ];//массив выходных цветов
for(i=0;i<3;i++) { if (T[i]<0) { T[i]+=1 } else if (T[i]>1) { T[i]-=1; } } for(i=0;i<3;i++) { if (T[i]<1/6) { C[i]=P+((Q-P)*6*T[i]); } else if (T[i]<1/2 && T[i]>=1/6) { C[i]=Q; } else if (T[i]>=1/2 && T[i]<2/3) { C[i]=P+((Q-P)*(2/3-T[i])*6); } else C[i]=P; }
for(i=0;i<3;i++) { //перевожу параметры R G и B в диапазон 0:255 т.к я получал от 0:1 C[i]*=255; } return decToHex(C); о функции decToHex(C) и зачем она тут читайте ниже }
Ну тут оказалось что на выходе у меня сразу 3 параметра. И я ломал голову как же мне их три подставлять в бекграунд генерируемого DIVa. Return насколько мне извесно выводит определенное значение(но никак не три сразу, причом мне надо выводить их через запятую). И тут решение нашлось! Зачем мне подставлять туда цвет в формате RGB(r,g,b), если можно ОДНО значение в виде хекса(#rrggbb)?
Code
function decToHex(decArray) { var hex = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']; var out = "#"; for (var i = 0; i < decArray.length; i++) { dec = parseInt(decArray[i]); out += hex[parseInt(dec / 16)] + hex[dec % 16]; } return out;
И теперь я могу записать код рисования палитры так:
Code
function DrawP() { var pal; k=0; for(var i=0;i<360;i++) { pal+="<div onClick='alert(this.style.backgroundColor);' style='background-color:"+HSLtoRGB(i,0.5,0.5)+";'></ div>"; //2й и 3й параметры были взяты со средними значениями } document.getElementById('pal').innerHTML=pal; }
Таким образом я получил полноценную Палитру. Играя со вторым и третьим параметрами HSL мы можем получать различные вариации цветовых схем.
в функции DrawP() объявляется переменная var pal; если объявить ее с инициализацией, вот так: var pal=''; Underfined пропал а так спасибо, хорошая статья
объявляется переменная var pal;
если объявить ее с инициализацией, вот так:
var pal='';
Underfined пропал
а так спасибо, хорошая статья