css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
29 Сен
С удивлением обнаружил, что до сих пор не коснулся темы выбора цвета. Спешу исправить это недоразумение и расскажу о еще одном плагине к библиотеке jQuery – ColorPicker. Сразу хочу предупредить, плагин использует png-файлы, и в нашем любимом IE6 это аукается небольшими проблемами.
Как обычно, сначала демонстрация примеров, а уже потом будем разбираться, как это использовать.
Нам понадобится библиотека jQuery, сам плагин colorpicker.js, довольно много картинок рабочей панели colorPicker’a (картинки включены в архив).
Нужные файлы Вы сможете найти в этом архиве. Сам плагин colorpicker.js и библиотеку jQuery можно найти в разделе Download.
Для начала подключим в разделе HEAD нашей HTML-страницы нужные файлы, конечно же соблюдая пути к ним (у Вас они могут отличаться).
<script type="text/javascript" src="js/jquery-1.2.6.js"></script> <script type="text/javascript" src="js/colorpicker.js"></script>
Описания стилей colorPicker’a находятся непосредственно в файле примера и в общем лучше всего их и не трогать, разве что вынести в отдельный файл.
А мы разберем первый пример с самым пожалуй, простым вариантом использования – colorPicker как элемент страницы.
HTML-код – проще не бывает:
<div id="colorpickerHolder"></div>
Просто элемент div, который выступает в качестве контейнера для нашего colorPicker’a. А ниже javascript код, который вызовет сам colorPicker.
$(document).ready(function(){
// пример №1
$('#colorpickerHolder').ColorPicker({flat: true});
});
Мы передаем плагину опцию flat со значением true – именно это определяет вариант отображения colorPicker’a.
Следующий вариант использования в примере №2 – мы присоединяем colorPicker к элементу input. HTML-код можно было бы и не приводить:
<input id="colorpickerField" type="text" value="00ff00" />
И более «насыщенный», чем в первом примере javascript-код:
$(document).ready(function(){
// пример №2
$('#colorpickerField').ColorPicker({
onSubmit: function(hsb, hex, rgb) {
$('#colorpickerField').val(hex);
},
onBeforeShow: function () {
$(this).ColorPickerSetColor(this.value);
}
})
.bind('keyup', function(){
$(this).ColorPickerSetColor(this.value);
});
});
Здесь мы вызываем colorPicker и передаем ему две опции – onSubmit и onBeforeShow, в качестве значений которых выступают функции обратного вызова. В onSubmit определяется функция, которая будет вызвана в момент, когда необходимый цвет выбран и нажат значок подтверждения выбора в правом нижнем углу, а в onBeforeShow определяется функция, которая будет вызвана перед тем, как colorPicker будет выбран.
Звучит немного запутано, да к тому же цепочка вызовов дополнена связыванием события keyup с еще одной функцией. Давайте взглянем на это с практической стороны и попробуем описать все это по-русски. Начнем с конца…
Итак, с элементом input, который имеет идентификатор colorpickerField мы связываем событие keyup. Функция, которая будет выполнена при наступлении этого события, установит цвет на котором будет открыт colorPicker – да собственно это видно даже из ее названия.
Теперь про два параметра, которые мы передаем плагину. Перед тем как colorPicker будет показан (onBeforeShow) вызывается таже самая функция, что и по событию keyup, и делает она тоже самое. Ну а после того, как цвет выбран (onSubmit) – его значение в шестнадцатиричном виде записывается в элемент input.
Теперь третий пример – colorPicker «скрывается» за картинкой вставленной в элемент div. Сначала HTML-код:
<div id="colorSelector"><div></div></div>
Здесь с помощью стиля мы задаем фон, который по умолчанию будет «просвечивать» через картинку в формате png (посмотрите в исходном коде соответствующие стили).
И javascript-код для этого примера:
// пример №3
$('#colorSelector').ColorPicker({
color: '#0000ff',
onShow: function (cp) {
$(cp).fadeIn(500);
return false;
},
onHide: function (cp) {
$(cp).fadeOut(500);
return false;
},
onChange: function (hsb, hex, rgb) {
$('#colorSelector div')
.css('backgroundColor', '#'+hex);
}
});
В опции color мы указываем цвет, на котором откроется colorPicker, в опциях onShow и onHide (названия говорят сами за себя, правда?) мы, пользуясь методами библиотеки jQUery задаем некую анимацию, немного оживляя появление и скрытие colorPicker’а.
Немного об onChange – при изменении текущего цвета мы немедленно считываем его и изменяем css-свойство backgroundColor для элемента div, заставляя таким образом изменяться тот фон, который «просвечивает» через png-изображение.
В общем через примеры мы познакомились практически со всеми доступными опциями. Упомяну разве еще eventName – событие, по которому будет вызван colorPicker. По умолчанию это click. И еще livePreview – позволяет отключить изменение цифровых значений в процессе выбора цвета, если установить эту опцию в false. По умолчанию – true.
Ну и конечно ссылка на первоисточник: http://eyecon.ro/colorpicker/
Да, и еще. Может кто-то встречал colorPicker для jQuery в другом исполнении – было бы любопытно посмотреть…
Отзывов (26) на «jQuery ColorPicker – выбираем цвет.»
Глючит.
В показанном примере выбранный цвет не устанавливается в поле.
FF 3.0.3
Уважаемый, тот же FF и у меня – работает прекрасно (в отличие от IE6). Прежде, чем писать – разберитесь хотя бы малость – нажимаем кнопочку в правом нижнем углу и цвет устанавливается.
Очень интересно и познавательно! Спасибо!
Подтверждаю, некоторую странность поведения в FF3.
Цвет как на большой диаграмме так и на полосе справа выбирается не по щелчку, а по движению мышкой. То есть надо щелкнуть и не много пошевелить мышкой, иначе не сработает.
Добрый день!
Я очень тесно общался по долгу службы с этим виджетом. По сему есть, что сказать:
1. фикс для png есть: http://docs.jquery.com/Tutorials:PNG_Opacity_Fix_for_IE6
Работает нормально.
2. много минусов: не пашет в Safari, т.к. ивэн вешаеццо не на тот элемент ДОМа. Нада повесить на window. Также происходит пересчет значений: попробуйте ввести в РГБ значение 170,170,170. Прибавит единицу. В результате получаем колорПикер с safe web colors. Также стоит обратить внимание на ивэнты blur, change. Не везде они одинаково работают…
Бета, что скажешь.
Подскажите пожалуйста, а если на странице несколько полей и у каждого свой колорпикер – какой должен быть код, чтобы работал для всех, а не для одного?
Проследите логику: указывая в селекторе #colorpickerField мы связываем функциональность плагина с конкретным элементом, имеющим идентификатор. Если же в селекторе указать input.colorpickerField (это для примера конечно, предполагая, что у нас есть инпуты с таким классом), тогда со всеми найденными элементами и будет связаны возможности плагина.
Почитайте про селекторы в jQuery:
базовые и иерархические селекторы, базовые фильтры
фильтры контента, visibility-фильтры, фильтры атрибутов, child-фильтры
селекторы форм и фильтры форм
хм…есть идеи как самому сделать нечто подобное… сегодня посижу может че получится =)
Каким образом можно узнать в javascript или с ипользованием jquery
в какую сторону движется курсор мыши?
Собираетесь colorpicker делать?
Можно отслеживать текущие координаты указателя мыши:
$(document).mousemove(function(e){ ... });внутри функции обращаетесь к свойствам объекта события e.pageX, e.pageY или e.clientX, e.clientY и на основании изменения значений делаете вывод о направлении движения…
спс, может че нить получится
=)
можно ли указывать с какой стороны сверху или снизу от кнопки показывать панель выбора или это происхоит автоматически?
Специальных опций в плагине для этого нет, так что – автоматически. Если хотите что-то поменять – можно попробовать вносить изменения в стилевой файл.
Как сделать закрытие палитры при нажатии на рисунок когда она уже открыта?
Подскажите, а как сделать так, чтобы данный плагин срабатывал для всех элементов input, при условии что я их добавляю при клике по кнопке?!
Т.е. в начальный момент у меня на странице имеется одни input, а при необходимости я нажимаю на кнопку и добавляется еще одни input!
Как показано у Вас в примере, срабатывает только первый input!
Что необходимо подправить?!
Спасибо!
Почему именно это у Вас происходит, поможет понять статья Обработка событий для элементов DOM, загружаемых через ajax. Ну, а оттуда и решение «выплывет».
Спасибо, получилось!
а у кто нить знает как например менять цвет текстбокса на событие onchange, причем каждый colorpicker меняет его для своего текстбокса? т.е. должно происходить изменение цвета в одном текстбоксе, а не в нескольких. Вот примерный код(неработающий)
$(function($) {
$(‘input.color’).each(function() {
$(this).ColorPicker({
color: $(this).attr(‘value’),
onChange: function(hsb, hex, rgb) {
debugger;
$(this).css(‘backgroundColor’, ‘#’ + hex);
} });}) });
сори,проблема решилась)
А можно совмещать несколько примеров в одном?!
Я имею ввиду, например, при использовании 3 примера, устанавливалось значение еще и в input?!
установка в инпут -
onChange: function (hsb, hex, rgb) { $(’#inputId’).val(’#'+hex); }У меня проблема в IE6. В опере и мазиле все отлично, но в эксплорере, при подключении colorpicker’a слетает все! Даже главная таблица на странице не выводится. Видна только кнопка,которая идет уже после колорпикера. Т.е. как-то не отображается все содержимое до вывода колорпикера. Ну и собсно его тоже не видно. Может кто сталкивался?
Извините, дело было не в колорпикере. Просто в одном месте кавычки лишние стояли. У меня так часто бывает, из-за одной буковки все слетает)))
Да, jQuery это особая магия. Спасибо за примеры.
Люди…
Такой вопросик..
Тот же 2-ой пример…
тоже самое(связать значение цвета с инпутом…)
вот токо чтобы колор пикер не появлялся при нажатии, а уже БЫЛ на странице…
Подскажите код плз… а то я с квери 3-ий раз в жизни работаю
Все технические вопросы на форуме jQuery, пожалуйста…
Оставьте отзыв