Эффектный переключатель с использованием CSS3 и jQuery
В данном уроке мы создадим плагин jQuery для представления глянцевого переключателя в качестве элемента управления на веб страницах. Названный knobKnob, данный плагин будет использовать трансформации CSS3 и новые методы jQuery для обработки событий, чтобы предоставить пользователю новый способ интерактивного выбора значения из доступного диапазона.
HTML
Разметка HTMLдля страницы достаточно проста и очевидна. Нужно использовать элемент для обозначения места, где будет располагаться переключатель. Весь остальной код будет генерироваться плагином:
index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <!-- Стили CSS --> <link rel="stylesheet" href="/assets/css/styles.css" /> <link rel="stylesheet" href="/assets/knobKnob/knobKnob.css" /> <!--[if lt IE 9]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> </head> <body> <section id="main"> <div id="bars"> <div id="control"> <!-- Разметка переключателя будет вставлена здесь --> </div> <!-- Разметка цветной полосы --> </div> </section> <!-- JavaScript --> <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script> <script src="/assets/knobKnob/transform.js"></script> <script src="/assets/knobKnob/knobKnob.jquery.js"></script> <script src="/assets/js/script.js"></script> </body> </html>
К странице подключается jQuery, transform.js, который обеспечивает поддержку кросс-браузерности свойства CSS3 transform, сам плагин knobKnob и файл script.js, который объединяет все в одно целое.
Элемент div
#control является местом, куда вставляется разметка переключателя. Ниже будет вставлен элемент div
, который представляет цветную полоску вокруг выключателя. Она не является частью плагина KnobKnob, и будет зависеть от устанавливаемого значения. Плагин KnobKnob также использует стили для формирования внешнего вида переключателя.
Теперь перейдем к созданию плагина.
Код jQuery
Исходный код плагина вы можете найти в прилагаемом к уроку архиве.
assets/knobKnob/knobKnob.jquery.js
(function($){ $.fn.knobKnob = function(props){ var options = $.extend({ snap: 0, value: 0, turn: function(){} }, props || {}); var tpl = '<div class="knob">\ <div class="top"></div>\ <div class="base"></div>\ </div>'; return this.each(function(){ var el = $(this); el.append(tpl); var knob = $('.knob',el), knobTop = knob.find('.top'), startDeg = -1, currentDeg = 0, rotation = 0, lastDeg = 0, doc = $(document); if(options.value > 0 && options.value <= 359){ rotation = currentDeg = options.value; knobTop.css('transform','rotate('+(currentDeg)+'deg)'); options.turn(currentDeg/359); } knob.on('mousedown', function(e){ e.preventDefault(); var offset = knob.offset(); var center = { y : offset.top + knob.height()/2, x: offset.left + knob.width()/2 }; var a, b, deg, tmp, rad2deg = 180/Math.PI; knob.on('mousemove.rem',function(e){ a = center.y - e.pageY; b = center.x - e.pageX; deg = Math.atan2(a,b)*rad2deg; // Нужно преобразовать отрицательные значения угла в положительные if(deg<0){ deg = 360 + deg; } // сохраняем начальную позицию перетаскивания if(startDeg == -1){ startDeg = deg; } // Вычисляем текущий поворот tmp = Math.floor((deg-startDeg) + rotation); // Проверяем, что текущий поворот // осуществляется в диапазоне от 0 до 359 градусов if(tmp < 0){ tmp = 360 + tmp; } else if(tmp > 359){ tmp = tmp % 360; } // Переключение в положение "выключено" if(options.snap && tmp < options.snap){ tmp = 0; } // Проверяем, что мы находимся в конечном положении; // в данном случае надо блокировать дальнейшее вращение if(Math.abs(tmp - lastDeg) > 180){ return false; } currentDeg = tmp; lastDeg = tmp; knobTop.css('transform','rotate('+(currentDeg)+'deg)'); options.turn(currentDeg/359); }); doc.on('mouseup.rem',function(){ knob.off('.rem'); doc.off('.rem'); // Сохраняем текущее значение rotation = currentDeg; // Отмечаем стартовый угол как неправильный startDeg = -1; }); }); }); }; })(jQuery);
Плагин имеет несколько опций, которые можно задавать через объект параметров:
- snap - число градусов, которые соответствуют переключению в значение ноль;
- value - начальное положение переключателя (в градусах);
- turn - возвратная функция, которая вызывается каждый раз при переключении значения. Имеет единственный аргумент - коэффициент (от 0 до 1) поворота. Мы буем использовать ее для определения количества цветных полосок, которые надо вывести.
В коде используется функция Math.atan2 для вычисления угла (в радианах) между указателем мыши и центром переключателя. Отслеживая угол в начале и завершении перетаскивания мы можем определить величину поворота переключателя.
Также используются новые методы jQuery 1.7 для манипулирования обработчиками событий – on и off.
Теперь посмотрим, как использовать плагин.
assets/js/script.js
$(function(){ var colors = [ '26e000','2fe300','37e700','45ea00','51ef00', '61f800','6bfb00','77ff02','80ff05','8cff09', '93ff0b','9eff09','a9ff07','c2ff03','d7ff07', 'f2ff0a','fff30a','ffdc09','ffce0a','ffc30a', 'ffb509','ffa808','ff9908','ff8607','ff7005', 'ff5f04','ff4f03','f83a00','ee2b00','e52000' ]; var rad2deg = 180/Math.PI; var deg = 0; var bars = $('#bars'); for(var i=0;i<colors.length;i++){ deg = i*12; // Создаем цветную полоску $('<div class="colorBar">').css({ backgroundColor: '#'+colors[i], transform:'rotate('+deg+'deg)', top: -Math.sin(deg/rad2deg)*80+100, left: Math.cos((180 - deg)/rad2deg)*80+100, }).appendTo(bars); } var colorBars = bars.find('.colorBar'); var numBars = 0, lastNum = -1; $('#control').knobKnob({ snap : 10, value: 154, turn : function(ratio){ numBars = Math.round(colorBars.length*ratio); // Обновляем DOM только тогда, когда изменяется число активных полосок, // вместо реагирования на каждое движение if(numBars == lastNum){ return false; } lastNum = numBars; colorBars.removeClass('active').slice(0, numBars).addClass('active'); } }); });
Цветная полоска выводится вокруг переключателя и не является частью плагина. Плагин реализует только переключатель, который является универсальным элементом.
Выше приведенный код создает набор из 30 элементов div,
которые изменяют цвет от зеленого к красному по градиенту. Они затем поворачиваются с инкрементом в 12 градусов. Благодаря функции turn, мы можем определить, сколько цветных элементов надо выводить. Стили элементов задаются в файле assets/css/styles.css.
Готово!
Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/_hCJY9jY1Yg/lessons.php
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-11-26 » Капитан грузового судна, или Как начать использовать Docker в своих проектах
- 2024-11-26 » Обеспечение безопасности ваших веб-приложений с помощью PHP OOP и PDO
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-15 » Перенос сайта на WordPress с одного домена на другой
- 2024-11-08 » OSPanel 6: быстрый старт
- 2024-11-08 » Как установить PhpMyAdmin в Open Server Panel
- 2024-09-30 » Как быстро запустить Laravel на Windows
- 2024-09-25 » Next.js
- 2024-09-05 » OpenAI рассказал, как запретить ChatGPT использовать содержимое сайта для обучения
- 2024-08-28 » Чек-лист: как увеличить конверсию интернет-магазина на примере спортпита
- 2024-08-01 » WebSocket
- 2024-07-26 » Интеграция с Яндекс Еда
- 2024-07-26 » Интеграция с Эквайринг
- 2024-07-26 » Интеграция с СДЕК
- 2024-07-26 » Интеграция с Битрикс-24
- 2024-07-26 » Интеграция с Travelline
- 2024-07-26 » Интеграция с Iiko
- 2024-07-26 » Интеграция с Delivery Club
- 2024-07-26 » Интеграция с CRM
- 2024-07-26 » Интеграция с 1C-Бухгалтерия
- 2024-07-24 » Что такое сторителлинг: техники и примеры
- 2024-07-17 » Ошибка 404: что это такое и как ее использовать для бизнеса
- 2024-07-03 » Размещайте прайс-листы на FarPost.ru и продавайте товары быстро и выгодно
- 2024-07-01 » Профилирование кода в PHP
- 2024-06-28 » Изучаем ABC/XYZ-анализ: что это такое и какие решения с помощью него принимают
- 2024-06-17 » Зачем вам знать потребности клиента
- 2024-06-11 » Что нового в работе Яндекс Метрики: полный обзор обновления
- 2024-06-11 » Поведенческие факторы ранжирования в Яндексе
- 2024-06-11 » Скорость загрузки сайта: почему это важно и как влияет на ранжирование
Все мы сидим в сточной канаве, но некоторые при этом смотрят на звезды Уайльд Оскар - (1854-1900) - английский писатель |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.