倒倒苦水

做完这个小玩意之后,我觉得,我一定是闲得蛋疼才做的。嗯,一定是的。

话说昨天今天加班,下午下班前总算把临时变更的需求完成的七七八八了,昨晚又爬了一趟南山,累的不行...

想起某个产品说的,工作累了,就写写代码,休息一下 =_=||

好了,言归正传。下午偶然看到一个jquery+css3实现的时钟,挺漂亮的,突然觉得是不是也可以用纯css3整一个,于是乎...先看看最终效果

或者你也可以直接点这里看代码(因为我太喜欢啰嗦啦...)
more

表盘

好了,先搭个结构,html挺简单的,没几个代码,看看下面:

<div class="clock">
    <div class="clock-dial">
        <span></span>...<span></span>
    </div>
    <div class="clock-pointer">
        <div></div><div></div><div></div><div></div>
    </div>
</div>

嗯,一个整体容器,一个表盘,加上三根指针。 等等,那个省略了的span,你猜有多少个?

那里总共有60个span,没错,是的,60个! 诶,为了表示刻度,咱也没法子呀。

先给 clock 和 clock-dail写上样式,配个色 搞点阴影什么的,哇,帅气!

然后麻烦的刻度定位来了,尝试了几种方式,最终决定给内圆画60个半径,全部排在12点钟的方向,transform-origin设置成最下面((50% 100%) or (center bottom)) 然后按顺序旋转 6弧度(transform:rotate(6deg)),铺满整个圆。 然后用 before 伪对象插入最终显示的刻度。为了定位和演示,暂时把刻度的容器都显示出来了。不了解transform的请看这里(http://www.w3.org/TR/css3-2d-transforms/)

.clock-dial span{
    display: block;
    width: 2px;
    height: 50%;
    position: absolute;
    left: 50%;
    top: 0;
    margin: 0 0 0 -1px;
    -webkit-transform-origin: center bottom;
}
.clock-dial span:before{
    content:' ';
    display: block;
    height: 13px;
    width: 2px;
    background: #353535;
    margin: 10px 0 0 0;
}
/** 四个大刻度 **/
.clock-dial span:nth-child(5n){
    width: 6px;
    margin-left: -3px;
}
.clock-dial span:nth-child(5n):before{
    height: 32px;
    width: 6px;
    border-radius: 0 0 5px 5px;
}
/** end 四个大刻度 **/
/** 各个刻度的定位 **/
.clock-dial span:nth-child(1){
    -webkit-transform: rotate(6deg);
}
.clock-dial span:nth-child(2){
    -webkit-transform: rotate(12deg);
}
/** ...省呀省略呀 **/
.clock-dial span:nth-child(60){
    -webkit-transform: rotate(360deg);
}
/** end 各个刻度的定位 **/

跟你看到的一样, 画刻度的代码可是又臭又长的. 什么? 你手打了60 * 3次(webkit, moz, w3c)? 拜托, 我们是程序员耶. 写个for循环 拼装字符串, 几秒钟搞定(这个代码我就不写了, 程序员都懒嘛~~). 每逢5的倍数, 数到的刻度要粗点, 表示一刻钟, 嗯, 又粗又长.(nth-child 是什么? 看看这里)

指针

指针也是一样操作,先摆到12点钟方向,变形原点放在下面,之后再把第四个div搞成圆形(border-radius等于宽高就行了),盖在中间,是不是一个钟就出来啦。秒针做一下微调,用before和after插入两个节点,做成尾巴。为什么不用标签? 因为刻度已经用了那么多节点,能省就省啦(该死的刻度!)

.clock-pointer{
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
}
.clock-pointer div{
    background: #000;
    position: absolute;
    left: 50%;
    top: 50%;

    -webkit-transform-origin: center bottom;
}
.clock-pointer div:nth-child(1){
    border-radius: 10px 10px 0 0;
    width: 20px;
    height: 110px;
    margin: -110px 0 0 -10px;
    -webkit-animation: hour-update 43200s linear infinite;
}
.clock-pointer div:nth-child(2){
    border-radius: 5px 5px 0 0;
    width: 10px;
    height: 180px;
    margin: -180px 0 0 -5px;
    -webkit-transform: rotate(60deg);
    -webkit-animation: minute-update 3600s linear infinite;
}
.clock-pointer div:nth-child(3){
    border-radius: 5px 5px 0 0;
    width: 6px;
    height: 190px;
    margin: -190px 0 0 -3px;
    background: #AD251E;
    -webkit-transform: rotate(90deg);
    -webkit-animation: second-update 60s step-end infinite;
}
.clock-pointer div:nth-child(3):before{
    content: ' ';
    background: #AD251E;
    display: block;
    width: 6px;
    height: 30px;
    position: absolute;
    left: 0;
    bottom: -30px;
}
.clock-pointer div:nth-child(3):after{
    content: ' ';
    border-radius: 3px;
    background: #AD251E;
    display: block;
    width: 12px;
    height: 40px;
    position: absolute;
    left: -3px;
    bottom: -60px;
}
.clock-pointer div:nth-child(4){
    background: #AD251E;
    position: absolute;
    left: 50%;
    top: 50%;
    width: 24px;
    height: 24px;
    margin: -12px 0 0 -12px;
    border-radius: 12px;
}

数字

是不是漏了什么? 数字,没数字太不直观了。嗯,我们之前已经加了60个刻度,只要在逢5的刻度插入一个数字不就行啦。但是在60个span中找出12个,貌似也很痛苦对吧。

哈哈,如果你还记得大明湖畔的counter-reset和counter-increment, 你一定知道怎么做了(如果你实在不记得, 请看这里)。因为刻度所在的span被旋转过了,导致插入的数字也旋转了,因此要对每个数字再转回来。跟上面一样,这里肯定是用for循环跑出来的啦(别告诉我你又手打了...)

.clock-dial span:nth-child(5n):after{
    content: counter(clockcounter);
    counter-increment:clockcounter;
    font: 50px/1 Georgia;
    font-weight: bold;
    font-style: italic;
    color: #494949;
    position: absolute;
    left: -30px;
    width: 60px;
    text-align: center;
}
.clock-dial span:nth-child(5):after{    -webkit-transform: rotate(-30deg);}
/** ......(无所不在的省略号) **/
.clock-dial span:nth-child(60):after{    -webkit-transform: rotate(-360deg);}

奔跑吧

终于到了最激动人心的时刻啦,接下来让时钟动起来。css3的animation是个好东西,step-end也是个好孩子,如果你没听过,先看看这里那里 ^_^

让秒针的动画60s转一圈, 分针 60分一圈,时针12小时一圈,就能模拟时间的流逝了。 分针和时针的动画没什么好说呃,相当简单。

/************* 时针的动画 ******************/
@-webkit-keyframes hour-update{
    0%{ -webkit-transform: rotate(0deg); }
    100%{ -webkit-transform: rotate(360deg); }
}
/************* 分针的动画 ******************/
@-webkit-keyframes minute-update{
    0%{ -webkit-transform: rotate(0deg); }
    100%{ -webkit-transform: rotate(360deg); }
}

而秒针的有点麻烦, 由于keyframes的进度是0~100%的,而秒针一次动画的时间是60s,就需要把100的区间分成60段。 不过还好咱是程序员, for循环一下不就结了?(悲催的for ^_^)

/************* 秒针的动画 ******************/
@-webkit-keyframes second-update{
    0%{ -webkit-transform: rotate(0deg);}
    1.667%{ -webkit-transform: rotate(6deg);}
    ......
    98.333%{ -webkit-transform: rotate(354deg);}
    100%{ -webkit-transform: rotate(360deg);}
}

最后,上动画,噔噔噔噔~~你看,他动起来了, 啊, 一秒一格,啊,奔跑吧~(请原谅这个2b作者吧...)

.clock-pointer div:nth-child(1){
    -webkit-animation: hour-update 43200s linear infinite;
}
.clock-pointer div:nth-child(2){
    -webkit-animation: minute-update 3600s linear infinite;
}
.clock-pointer div:nth-child(3){
    -webkit-animation: second-update 60s step-end infinite;
}

不足

嗯, 其实我觉得没什么不足的,嘿嘿。太自恋了。

最大的问题在于,因为没有用到丁点儿js,所以不能从系统当前时间开始跑,只能当秒表用用。或者上厕所的时候打开这个页面, 开始计时,看看自己用了多少时间"爆石" _|||

Comments
Write a Comment
  • kk reply

    哈哈,我喜欢你后面的不足

Tags

css3   魅力CSS   nodejs   loading   CSS   疯狂的菊花   html5   animation   compiler   编译脚本   png   WordPress   智能   旅行   优化   模板   历史记录   跨域   manifest   frame   canvas   动画   js   离线应用   codelet   transform   抽取   java   兼容问题   发布脚本   富文本   那一年在他乡   htaccess   iframe   帧动画   加载速度   intelligent   跨浏览器   DNS解析   插件   checkbox   单边   step-start   vary   复选框   自动更新   转换   文本溢出   盒子阴影   menu   blob   西安   滑动背景   box-shadow   内存占用   键盘事件   python   auto   text overflow   background   所见所得   android   rotate   字节数   合并   文本框   slide   字符串连接符   协议   伪类   兄弟选择符   网格   节点位置比较   空白   斜线拼接   自定义命令   溢出   clock   素描   无法更新   分隔符   字符编码   body   下载文件   精灵图   step   nodej   ubuntu   apache   css3选择器   创建文件   多级菜单   编辑状态   ajax   阴影   垂直   chrome   管道   时钟   firefox   背景   文件上传   createobjecturl   游记   下载   放射渐变   版本号   宽高   照片   localStorage   渐变背景   图片   图片拼接   属性值检测   自动生成   计算   返回键   oauth   合图   reset   调用   cavnas   漏洞   按钮   margin   线性渐变   xsrf   被黑   tab   checked   修复   border   消失   step-end   sprite   common-upload   菜单   兄弟选择器   字符串   svn   九寨沟   缩进   css遮罩   svg   添加系统服务   gzip   插入代码   动态   加速   模拟