
В этой статье, мы расскажем вам, как создать красочные и анимированные jQuery/CSS часы в стиле “Halo”, которые помогут вам следить за драгоценным временем.
Шаг 1 – XHTML
Как обычно, мы начинаем с разметки XHTML. Хитрость состоит в том, что XHTML не содержится в demo.html, но динамически вставляется в страницу с помощью jQuery.
Это избавляет нас от необходимости вручную вводить блоки кода для каждого из циферблатов (их у нас три: для часов, минут и секунд). В этом разборе кода мы будем предполагать, что дисплеи у наших часов будут трех разных цветов, но в демо-версии я упростил все до одного цвета. Просто мне так больше нравится! ))
Давайте взглянем на XHTML, который вставляется jQuery:
<!-- Первый класс (зеленый в данном случае) выделяется динамически --> <div class="green clock"</div> <!-- Этот div хранит значение единиц, - секунд, минут или часов --> <div class="display"></div> <!-- Черная область, которая скрывает основной фон --> <div class="front left"></div> <!-- Левая часть фона: --> <div class="rotate left"> <div class="bg left"></div> </div> <!-- Правая часть фона: --> <div class="rotate right"> <div class="bg right"><div id="fcbg"></div></div> </div> </div>
Этот код содержится в jquery.tzineClock / jquery.tzineClock.js. Он генерируется три раза: первый для часов, второй для минут, и третий для секунд. Затем, они анимируются и обновляются каждую секунду.
Существуют три класса, которые присваиваются самому верхнему контейнеру в процессе генерации – зеленый, синий и красный. Мы меняем цвет циферблата путем присвоения того или инного класса.
Переходим к следующему шагу…

Шаг 2 – CSS
Прежде, чем наши стили будут иметь какое либо влияние на страницу, мы должны включить их в head часть нашего файла:
demo.html
<link rel="stylesheet" type="text/css" href="styles.css" /> <link rel="stylesheet" type="text/css" href="jquery.tzineClock/jquery.tzineClock.css" />
Эти строки кода, импортируют styles.css и jquery.tzineClock.css на страницу. Первый, стилизует демо страницу, а второй, красочные циферблаты (они являются частью плагина).
Теперь мы можем более внимательно взглянуть на правила CSS:
styles.css
body,h1,h2,h3,p,quote,small,form,input,ul,li,ol,label{
/* Простой сброс страницы */
margin:0;
padding:0;
}
body{
/* Установка по умолчанию цвет текста, фона и шрифта */
color:#fff;
font-size:13px;
background: #222;
font-family:Arial, Helvetica, sans-serif;
}
#fancyClock{
height:200px;
width:600px;
position:absolute;
top:50%;
left:50%;
margin:-100px 0 0 -300px;
}Это все, что необходимо для стилизации демо страницы. Сначала, мы делаем простой сброс CSS, который будет гарантировать, что элементы на странице выглядят одинаково в разных браузерах.
Затем, мы стилизуем body страницы и fancyClock div, в который, мы позже вставим три циферблата. Также центрируем его на экране за счет абсолютной позиции и смещения величины margin.
jquery.tzineClock.css
.clock{
/* .clock div Динамически создан jQuery */
background-color:#222;
height:200px;
width:200px;
position:relative;
overflow:hidden;
float:left;
}
.clock .rotate{
/* Есть два .rotate divs - один для каждый половины фона-подложки */
position:absolute;
width:200px;
height:200px;
top:0;
left:0;
}
.rotate.right{
display:none;
z-index:11;
}
.clock .bg, .clock .front{
width:100px;
height:200px;
background-color:#222;
position:absolute;
top:0;
}
.clock .display{
/* Содержит число секунд, минут или часов */
position:absolute;
width:200px;
font-family:"Lucida Sans Unicode", "Lucida Grande", sans-serif;
z-index:20;
color:#F5F5F5;
font-size:60px;
text-align:center;
top:65px;
left:0;
/* CSS3 text shadow: */
text-shadow:4px 4px 5px #333333;
}
/* Левая часть бэкграунда */
.clock .bg.left{ left:0; }
/* Индивидуальная стилизация каждого цвета : */
.orange .bg.left{ background:url(img/bg_orange.png) no-repeat left top; }
.green .bg.left{ background:url(img/bg_green.png) no-repeat left top; }
.blue .bg.left{ background:url(img/bg_blue.png) no-repeat left top; }
/* Правая часть бэкграунда */
.clock .bg.right{ left:100px; }
.orange .bg.right{ background:url(img/bg_orange.png) no-repeat right top; }
.green .bg.right{ background:url(img/bg_green.png) no-repeat right top; }
.blue .bg.right{ background:url(img/bg_blue.png) no-repeat right top; }
.clock .front.left{
left:0;
z-index:10;
}
#fcbg{ background:url(img/bg_grey.png)
repeat-x; width:600px;height:200px;z-index:11;position:absolute;}jquery.tzineClock.css является частью нашего плагина (наряду c jquery.tzineClock.js) и он стилизирует красочные циферблаты . Контейнер #fcbg является нашей подложкой под циферблаты и показывает границы циферблата.
Одним из наиболее интересных моментов, является использование отдельных правил для стилизации цвета циферблатов.
Шаг 3 – jQuery
Перенос всего JavaScript в плагин делает очень легким повторное использование кода, и в то же время позволяет нам использовать возможности jQuery селекторов и методов.
Чтобы была возможность использовать jQuery библиотеку, мы сначала должны, включить пару скриптов в страницу:
demo.html
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <script type="text/javascript" src="jquery.tzineClock/jquery.tzineClock.js"></script> <script type="text/javascript" src="script.js"></script>
Первым файлом, является сама библиотека, включена из Google CDN. Затем, у нас есть плагин и скрипт-файл, который запускает демо.
script.js
$(document).ready(function(){
/* Этот код выполняется после того, как DOM был полностью загружен */
$('#fancyClock').tzineClock();
});Давайте копнём немного глубже в плагин:
jquery.tzineClock.js – Часть 1
(function($){
// Глобальный объект используемый функцией плагина:
var gVars = {};
// Продление основы jQuery:
$.fn.tzineClock = function(opts){
// "this" содержит элементы, которые были выбраны при вызове плагина:
$('elements').tzineClock();
// Если селектор вернул более одного элемента, мы используем первый:
var container = this.eq(0);
if(!container)
{
try{
console.log("Invalid selector!");
} catch(e){}
return false;
}
if(!opts) opts = {};
var defaults = {
/* Дополнительные опции будут добавлены в будущих версиях плагина. */
};
/* Слияние предоставленых параметров с параметрами по умолчанию,
(будет использоваться в будущих версиях плагина): */
$.each(defaults,function(k,v){
opts[k] = opts[k] || defaults[k];
});
// Вызов функции setUp и передача container,
// будет доступна для setUp функции, как "this":
setUp.call(container);
return this;
}
function setUp()
{
// Цвета циферблата:
var colors = ['orange','blue','green'];
var tmp;
for(var i=0;i<3;i++)
{
// Создание нового элемента и установка цвета, как имя класса:
tmp = $('<div>').attr('class',colors[i]+' clock').html(
'<div class="display"></div>'+
'<div class="front left"></div>'+
'<div class="rotate left">'+
'<div class="bg left"></div>'+
'</div>'+
'<div class="rotate right">'+
'<div class="bg right"></div>'+
'</div>'
);
// Присоединение к fancyClock контейнеру:
$(this).append(tmp);
// Назначение некоторых элементов как переменных, для скорости:
tmp.rotateLeft = tmp.find('.rotate.left');
tmp.rotateRight = tmp.find('.rotate.right');
tmp.display = tmp.find('.display');
// Добавление циферблата, как глобальной переменной.
Будет доступна в качестве gVars.colorName
gVars[colors[i]] = tmp;
}
//Настройка интервала, выполняемого каждые 1000 миллисекунд:
setInterval(function(){
var currentTime = new Date();
var h = currentTime.getHours();
var m = currentTime.getMinutes();
var s = currentTime.getSeconds();
animation(gVars.green, s, 60);
animation(gVars.blue, m, 60);
animation(gVars.orange, h, 24);
},1000);
}Создание плагина для jQuery сводится к определению пользовательской функцию с помощью метода jQuery.fn. Таким образом, ваша функция доступна на любых элементах, которые вы обычно используете на jQuery.
Например, в script.js, мы выбираем div ширину id fancyClock и используем tzineClock () метод: $ (‘# FancyClock’) tzineClock ();. Элементы, которые мы выбрали, позже передаются tzineClock функции и доступны через “this” свойство.
Поскольку, там может быть выбран более чем один элемент, мы извлекаем только первый из множества с помощью eq(0) метода. Позже, у нас есть setUp() функция, которая вставляет разметки для циферблатов и настраивает интервал, который будет обновлять цифры каждую секунду.
jquery.tzineClock.js – Часть 2
function animation(clock, current, total)
{
// Расчет текущего угла:
var angle = (360/total)*(current);
var element;
if(current==0)
{
//Скрытие правой половины background:
clock.rotateRight.hide();
// Сброс вращения левой части:
rotateElement(clock.rotateLeft,0);
}
if(angle<=180)
{
// Левая часть вращается, а правая, в настоящее время, скрыта:
element = clock.rotateLeft;
}
else
{
// Первая часть вращения завершен, поэтому начинает вращаться
правая часть:
clock.rotateRight.show();
clock.rotateLeft.show();
rotateElement(clock.rotateLeft,180);
element = clock.rotateRight;
angle = angle-180;
}
rotateElement(element,angle);
// Настройка текста внутри элемента, вставки нуля, если необходимо:
clock.display.html(current<10?'0'+current:current);
}
function rotateElement(element,angle)
{
// Вращение элемента, в зависимости от браузера:
var rotate = 'rotate('+angle+'deg)';
if(element.css('MozTransform')!=undefined)
element.css('MozTransform',rotate);
else if(element.css('WebkitTransform')!=undefined)
element.css('WebkitTransform',rotate);
// Версия для Internet Explorer с помощью фильтров, работает,
но немного с багами:
else if(element.css("filter")!=undefined)
{
var cos = Math.cos(Math.PI * 2 / 360 * angle);
var sin = Math.sin(Math.PI * 2 / 360 * angle);
element.css("filter","progid:DXImageTransform.Microsoft.Matrix
(M11="+cos+",M12=-"+sin+",M21="+sin+",M22="+cos+",SizingMethod='auto expand',
FilterType='nearest neighbor')");
element.css("left",-Math.floor((element.width()-200)/2));
element.css("top",-Math.floor((element.height()-200)/2));
}
}
})(jQuery)Последние две функции, используемые плагином, это animation и rotateElement. Первая функция обновляет циферблат, в соответствии с переданными значениями (мы также передаем параметр с максимальным значением, для того, чтобы функция могла вычислить вращение).
Вторая функция – вращает переданный элемент. Вращение работает только для Firefox, Safari, Chrome и IE6 +. Internet Explorer не поддерживает CSS3 rotation, используемый другими браузерами, но предоставляет фильтр, который позволяет сделать подобное преобразование.
На этом, наши красочные часы jQuery готовы! Высоких вам конверсий!





