Стрелочные часы на CSS

24 Янв
2012

Доброго времени суток!
Встретил в интернете стрелочные часы, но решил сделать их с помощью CSS. Вместо цифр решил сделать засечки. Фреймворк для javascripta будем использовать jQuery v1.7.1.

Создадим нашу основу часов:

<!DOCTYPE html>
<html lang="ru">
<head>
	<title>Часы</title>
	<script src="js/jquery-1.7.min.js"></script>
</head>
    
<body>
	<article id="time">
		<div id="center"></div>
		<div id="second"></div>
		<div id="minute"></div>
		<div id="hour"></div>
		<div id="clock">clock</div>
	</article>
</body>

Стрелки делаем на псевдоклассах. CSS для часов выглядит следующим образом, пока без засечек:

*{
    margin: 0;
    padding: 0;
    font: 16px Arial, serif;
}
#time {
    position: relative;
    display: block;
    background: #478FDD;
    width: 120px;
    height: 120px;
    font-size: 20px;
    font-weight: bold;
    text-align: center;
    text-transform: uppercase;
    text-shadow: 1px 1px 1px #ccc;
    margin: 20px auto;
    border: 1px solid #000;
    border-radius: 5px;
    box-shadow: 0 0 8px #000;
}
#center {
    position: absolute;
    left: 58px;
    top: 57px;
    content: "";
    padding: 3px;
    border-radius: 3px;
    background: #000;
    z-index: 5;
}
#second, #minute, #hour, #l1, #l2, #l3, #l4, #l5, #l6 {
    position: absolute;
    display: block;
    content: "";
    padding: 60px 1px;
}
#second:after, #minute:after, #hour:after {
    position: absolute;
    left: 0px;
    content: "";
}
#second { left: 60px; z-index: 4; } 
#second:after {
    top: 20px;
    padding: 20px 1px 20px 0px;
    background: #000;
}
#minute { left: 59px; z-index: 3; }
#minute:after {
    top: 30px;
    padding: 15px 1px;
    background: #F00;
}
#hour {    left: 59px; z-index: 2; }
#hour:after {
    top: 40px;
    padding: 10px 2px 10px 1px;
    border-radius: 2px 2px 0 0;
    background: #FF0;
}
#clock {
    position: absolute;
    left: 43px;
    top: 70px;
    font-size: 10px;
}

Движение часов управляется следующим javascript кодом.

$(document).ready(function($) {
    setInterval( function() {
    var seconds = new Date().getSeconds();
    var sdegree = seconds * 6;
    var srotate = 'rotate(' + sdegree + 'deg)';
    $('#second').css({'-moz-transform' : srotate, '-webkit-transform' : srotate, '-o-transform' : srotate});
    }, 1000 );

    setInterval( function() {
    var hours = new Date().getHours();
    var mins = new Date().getMinutes();
    var hdegree = hours * 30 + (mins / 2);
    var hrotate = 'rotate(' + hdegree + 'deg)';
    $('#hour').css({'-moz-transform' : hrotate, '-webkit-transform' : hrotate, '-o-transform' : hrotate});
    }, 1000 );

    setInterval( function() {
    var mins = new Date().getMinutes();
    var mdegree = mins * 6;
    var mrotate = 'rotate(' + mdegree + 'deg)';
    $('#minute').css({'-moz-transform' : mrotate, '-webkit-transform' : mrotate, '-o-transform' : mrotate});
    }, 1000 );
});

Тем самым мы заставили наши часы ходить. Далее создаем слои с засечками:

$(document).ready(function($) {
    for (i=1;i<=6;i++) {
        $('#center').before('<div id="l'+i+'"></div>');
    }

    for (i=1;i<=30;i++) {
        $('#center').before('<div id="ln'+i+'"></div>');
        $('#ln'+i).css({
            "-moz-transform" : "rotate(" + i*6 + "deg)", 
            "-webkit-transform" : "rotate(" + i*6 + "deg)", 
            "-o-transform" : "rotate(" + i*6 + "deg)", 
            "padding" : "60px 1px 60px 0", 
            "left" : "60px", 
            "position" : "absolute",
            "display" : "block",
            "content" : "",
       });
    }
});

С помощью псевдоклассов :before и :after мы делаем засечки с обоих сторон заполненные цветом.

#l1{ -webkit-transform: rotate(0deg); -moz-transform: rotate(0deg); -o-transform: rotate(0deg); }
#l2{ -webkit-transform: rotate(30deg); -moz-transform: rotate(30deg); -o-transform: rotate(30deg); }
#l3{ -webkit-transform: rotate(60deg); -moz-transform: rotate(60deg); -o-transform: rotate(60deg); }
#l4{ -webkit-transform: rotate(90deg); -moz-transform: rotate(90deg); -o-transform: rotate(90deg); }
#l5{ -webkit-transform: rotate(120deg); -moz-transform: rotate(120deg); -o-transform: rotate(120deg); }
#l6{ -webkit-transform: rotate(150deg); -moz-transform: rotate(150deg); -o-transform: rotate(150deg); }
#l1, #l2, #l3, #l4, #l5, #l6 { left: 59px; z-index: 5; }
#l1:before, #l1:after, #l2:before, #l2:after, #l3:before, #l3:after, #l4:before, #l4:after, #l5:before, #l5:after, #l6:before, #l6:after {
    position:absolute;
    content: "";
    left: 0;
    padding: 5px 2px 5px 1px;
    background: #000;
}
#l1::before, #l2::before, #l3::before, #l4::before, #l5::before, #l6::before { top: 5px; }
#l1::after, #l2::after, #l3::after, #l4::after, #l5::after, #l6::after { bottom: 5px; }
#ln1:before, #ln2:before, #ln3:before, #ln4:before, #ln5:before, #ln6:before, 
#ln7:before, #ln8:before, #ln9:before, #ln10:before, #ln11:before, #ln12:before, 
#ln13:before, #ln14:before, #ln15:before, #ln16:before, #ln17:before, #ln18:before, 
#ln19:before, #ln20:before, #ln21:before, #ln22:before, #ln23:before, #ln24:before, 
#ln25:before, #ln26:before, #ln27:before, #ln28:before, #ln29:before, #ln30:before {
    padding: 5px 1px 5px 0; 
    left: 0px;
    top: 0px; 
    background: #fff;
    position: absolute;
    display: block;
    content: "";
}
#ln1:after, #ln2:after, #ln3:after, #ln4:after, #ln5:after, #ln6:after, 
#ln7:after, #ln8:after, #ln9:after, #ln10:after, #ln11:after, #ln12:after, 
#ln13:after, #ln14:after, #ln15:after, #ln16:after, #ln17:after, #ln18:after, 
#ln19:after, #ln20:after, #ln21:after, #ln22:after, #ln23:after, #ln24:after, 
#ln25:after, #ln26:after, #ln27:after, #ln28:after, #ln29:after, #ln30:after {
    padding: 5px 1px 5px 0; 
    left: 0px;
    bottom: 0px; 
    background: #fff;
    position: absolute;
    display: block;
    content: "";
}


Пример на jsFiddle.
Спасибо за внимание!
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх