Изменить: решение для публикации
Я хотел создать образцы цветов на основе цвета, выбранного в Farbtastic. Я сделал свои расчеты по значению HSL, потому что это проще и дает лучшие результаты.
Получив значение HSL от Farbtastic, я добавил яркости, чтобы создать новый цвет. Новый цвет находится в формате HSL, и мне нужно переключить его обратно на RGB или Hex, чтобы отобразить его и сохранить для последующего использования. Некоторые браузеры отображают HSL, но я не верю, что все мобильные браузеры и т. д. будут это делать.
Проблема заключалась в том, чтобы преобразовать переменную 'newcolor' обратно в RGB или Hex после завершения вычисления.
// collect parent ids for farb
$(".farbtastic").parent().each(writeColorpanel);
function writeColorpanel (i, elem) {
var picker = $.farbtastic(elem); //farb object
picker.linkTo(onColorChange); //a farb function
}
function onColorChange(color) {
// retrieve hsl value, do calculations and place in hidden input.
var hslcolor = $.farbtastic('#example_colorpicker_picker').hsl;
// brighten by 40%
var brightness = 1.4 * (Math.round(hslcolor[2]*10000)/10000);
if (brightness>1) { brightness = 1 };
if (brightness<0) { brightness = 0; }
// create the new brighter color
var newcolor = hslcolor;
newcolor[2]=brightness;
//convert to rgb (safer than trusting all mobile browsers to display HSL)
var rgb = hsl2rgb(newcolor);
//apply the color to swatches
var firstSwatch = $('#section-example_colorpicker').find('.square1');
firstSwatch.css( {'background-color': color } );
var secondSwatch = $('#section-example_colorpicker').find('.square2');
secondSwatch.css('background-color', 'rgb('+rgb.r+','+rgb.g+','+rgb.b+')');
}
function hsl2rgb(hsl) {
var h = hsl[0], s = hsl[1], l = hsl[2];
var m1, m2, hue;
var r, g, b
h = (Math.round( 360*h )/1);
if (s == 0)
r = g = b = (l * 255);
else {
if (l <= 0.5)
m2 = l * (s + 1);
else
m2 = l + s - l * s;
m1 = l * 2 - m2;
hue = h / 360;
r = Math.round(HueToRgb(m1, m2, hue + 1/3));
g = Math.round(HueToRgb(m1, m2, hue));
b = Math.round(HueToRgb(m1, m2, hue - 1/3));
}
return {r: r, g: g, b: b};
}
function HueToRgb(m1, m2, hue) {
var v;
if (hue < 0)
hue += 1;
else if (hue > 1)
hue -= 1;
if (6 * hue < 1)
v = m1 + (m2 - m1) * hue * 6;
else if (2 * hue < 1)
v = m2;
else if (3 * hue < 2)
v = m1 + (m2 - m1) * (2/3 - hue) * 6;
else
v = m1;
return 255 * v;
}
Обратите внимание, что скрипт, помеченный как ответ, работает для целых чисел. Поскольку Фарб возвращал дробные значения, я внес небольшие правки, опубликованные выше.
Авторы тем Wordpress: если вы используете тему Options Framework для Wordpress и хотите использовать Farbtastic поэтому вы можете использовать значения HSL, см. этот форк от Elihorn, который содержит нужные вам файлы. В этом наборе файлов мне нужно было добавить "wp_enqueue_style('farbtastic');" в строке, где мы поставили скрипт в очередь. Файл .JS для farbtastic не нужно включать, потому что он уже есть в WP. Вам также нужно поставить Jquery в очередь, конечно, вероятно, в верхней части functions.php.
Для части 2 этого вопроса (проблема с дубликатами) см.: значения из функции, используемые несколько раз