之前在 HTML+CSS3再加一点点JS做的一个小时钟 看到的这个问题,觉得很好把代码存下来了,今天突发奇想把它放到hexo的新博客上。
STEP 0
把HTML内容放到新建的模板里,我命名为time.ejs。
<div class="widget-wrap">
<h3 class="widget-title">Time</h3>
<div class="widget time">
<style id="clock-animations"></style>
<div class="clock-wrapper">
<div class="clock-base">
<div class="clock-indicator">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
<div class="clock-hour"></div>
<div class="clock-minute"></div>
<div class="clock-second"></div>
<div class="clock-center"></div>
</div>
</div>
</div>
</div>
原文中<style id="clock-animations"></style>
是放在head区域的,为了减小对全局的影响,我拿到这个挂件中了,实际上并没有影响。
这里要注意挂件的代码结构要尽量与主题自带的结构一致。(仅仅是为了好看,和好整理)
当然了,这个文件要放在layout/_widget
下。
STEP 1
js脚本
由于脚本内容较少,我就直接放在了script.js中,文件位置再source/js。
var now = new Date();
var second = now.getSeconds();
var minute = now.getMinutes();
var hour = now.getHours();
if (hour > 12) {
hour = hour - 12;
}
hourDeg = hour * 30 + now.getMinutes() / 60 * 30;
minuteDeg = now.getMinutes() * 6;
secondDeg = now.getSeconds() * 6;
stylesDeg = [
“@keyframes rotate-hour{ from{transform:rotate(” + hourDeg + “deg);}to{transform:rotate(” + (hourDeg + 360) + “deg);}}”,
“@keyframes rotate-minute{from{transform:rotate(” + minuteDeg + “deg);}to{transform:rotate(” + (minuteDeg + 360) + “deg);}}”,
“@keyframes rotate-second{from{transform:rotate(” + secondDeg + “deg);}to{transform:rotate(” + (secondDeg + 360) + “deg);}}”,
“@-moz-keyframes rotate-hour{ from{transform:rotate(” + hourDeg + “deg);}to{transform:rotate(” + (hourDeg + 360) + “deg);}}”,
“@-moz-keyframes rotate-minute{from{transform:rotate(” + minuteDeg + “deg);}to{transform:rotate(” + (minuteDeg + 360) + “deg);}}”,
“@-moz-keyframes rotate-second{from{transform:rotate(” + secondDeg + “deg);}to{transform:rotate(” + (secondDeg + 360) + “deg);}}”,
“@-webkit-keyframes rotate-hour{from{transform:rotate(” + hourDeg + “deg);}to{transform:rotate(” + (hourDeg + 360) + “deg);}}”,
“@-webkit-keyframes rotate-minute{from{transform:rotate(” + minuteDeg + “deg);}to{transform:rotate(” + (minuteDeg + 360) + “deg);}}”,
“@-webkit-keyframes rotate-second{from{transform:rotate(” + secondDeg + “deg);}to{transform:rotate(” + (secondDeg + 360) + “deg);}}”
].join(“”);
$(‘#clock-animations’).html(stylesDeg);
STEP 2
CSS样式
新建文件time.styl,路径为/source/css/_partial/time.styl
内容略多,主要是给多浏览器写前缀。
.clock-wrapper {
position: relative;
height: 250px;
width: 250px;
background-image: linear-gradient(#f7f7f7,#e0e0e0);
border-radius: 50%;
box-shadow: 0 10px 15px rgba(0,0,0,.15),0 2px 2px rgba(0,0,0,.2);
}
.clock-base {
width: 250px;
height: 250px;
background-color: #eee;
border-radius: 50%;
box-shadow: 0 0 5px #eee;
}
.clock-indicator {
z-index: 1;
position: absolute;
top: 15px;
left: 15px;
width: 230px;
height: 230px;
}
.clock-indicator div {
position: absolute;
width: 2px;
height: 4px;
margin: 113px 114px;
background-color: #a4a4a4;
}
.clock-indicator div:nth-child(1) {
transform:rotate(30deg) translateY(-113px);
-ms-transform:rotate(30deg) translateY(-113px); /* IE 9 */
-moz-transform:rotate(30deg) translateY(-113px); /* Firefox */
-webkit-transform:rotate(30deg) translateY(-113px); /* Safari 和 Chrome */
-o-transform:rotate(30deg) translateY(-113px); /* Opera */ }
.clock-indicator div:nth-child(2) {
transform:rotate(60deg) translateY(-113px);
-ms-transform:rotate(60deg) translateY(-113px); /* IE 9 */
-moz-transform:rotate(60deg) translateY(-113px); /* Firefox */
-webkit-transform:rotate(60deg) translateY(-113px); /* Safari 和 Chrome */
-o-transform:rotate(60deg) translateY(-113px); /* Opera */
}
.clock-indicator div:nth-child(3) {
transform:rotate(90deg) translateY(-113px);
-ms-transform:rotate(90deg) translateY(-113px); /* IE 9 */
-moz-transform:rotate(90deg) translateY(-113px); /* Firefox */
-webkit-transform:rotate(90deg) translateY(-113px); /* Safari 和 Chrome */
-o-transform:rotate(90deg) translateY(-113px); /* Opera */
background-color: #5a5a5a;
}
.clock-indicator div:nth-child(4) {
transform:rotate(120deg) translateY(-113px);
-ms-transform:rotate(120deg) translateY(-113px); /* IE 9 */
-moz-transform:rotate(120deg) translateY(-113px); /* Firefox */
-webkit-transform:rotate(120deg) translateY(-113px); /* Safari 和 Chrome */
-o-transform:rotate(120deg) translateY(-113px); /* Opera */
}
.clock-indicator div:nth-child(5) {
transform:rotate(150deg) translateY(-113px);
-ms-transform:rotate(150deg) translateY(-113px); /* IE 9 */
-moz-transform:rotate(150deg) translateY(-113px); /* Firefox */
-webkit-transform:rotate(150deg) translateY(-113px); /* Safari 和 Chrome */
-o-transform:rotate(150deg) translateY(-113px); /* Opera */
}
.clock-indicator div:nth-child(6) {
transform:rotate(180deg) translateY(-113px);
-ms-transform:rotate(180deg) translateY(-113px); /* IE 9 */
-moz-transform:rotate(180deg) translateY(-113px); /* Firefox */
-webkit-transform:rotate(180deg) translateY(-113px); /* Safari 和 Chrome */
-o-transform:rotate(180deg) translateY(-113px); /* Opera */
background-color: #5a5a5a;
}
.clock-indicator div:nth-child(7) {
transform:rotate(210deg) translateY(-113px);
-ms-transform:rotate(210deg) translateY(-113px); /* IE 9 */
-moz-transform:rotate(210deg) translateY(-113px); /* Firefox */
-webkit-transform:rotate(210deg) translateY(-113px); /* Safari 和 Chrome */
-o-transform:rotate(210deg) translateY(-113px); /* Opera */
}
.clock-indicator div:nth-child(8) {
transform:rotate(240deg) translateY(-113px);
-ms-transform:rotate(240deg) translateY(-113px); /* IE 9 */
-moz-transform:rotate(240deg) translateY(-113px); /* Firefox */
-webkit-transform:rotate(240deg) translateY(-113px); /* Safari 和 Chrome */
-o-transform:rotate(240deg) translateY(-113px); /* Opera */
}
.clock-indicator div:nth-child(9) {
transform:rotate(270deg) translateY(-113px);
-ms-transform:rotate(270deg) translateY(-113px); /* IE 9 */
-moz-transform:rotate(270deg) translateY(-113px); /* Firefox */
-webkit-transform:rotate(270deg) translateY(-113px); /* Safari 和 Chrome */
-o-transform:rotate(270deg) translateY(-113px); /* Opera */
background-color: #5a5a5a;
}
.clock-indicator div:nth-child(10) {
transform:rotate(300deg) translateY(-113px);
-ms-transform:rotate(300deg) translateY(-113px); /* IE 9 */
-moz-transform:rotate(300deg) translateY(-113px); /* Firefox */
-webkit-transform:rotate(300deg) translateY(-113px); /* Safari 和 Chrome */
-o-transform:rotate(300deg) translateY(-113px); /* Opera */
}
.clock-indicator div:nth-child(11) {
transform:rotate(330deg) translateY(-113px);
-ms-transform:rotate(330deg) translateY(-113px); /* IE 9 */
-moz-transform:rotate(330deg) translateY(-113px); /* Firefox */
-webkit-transform:rotate(330deg) translateY(-113px); /* Safari 和 Chrome */
-o-transform:rotate(330deg) translateY(-113px); /* Opera */
}
.clock-indicator div:nth-child(12) {
transform:rotate(360deg) translateY(-113px);
-ms-transform:rotate(360deg) translateY(-113px); /* IE 9 */
-moz-transform:rotate(360deg) translateY(-113px); /* Firefox */
-webkit-transform:rotate(360deg) translateY(-113px); /* Safari 和 Chrome */
-o-transform:rotate(360deg) translateY(-113px); /* Opera */
background-color: #5a5a5a;
}
.clock-hour {
z-index: 2;
position: absolute;
left: 128px;
top: 80px;
width: 4px;
height: 65px;
border-radius: 2px;
background-color: #555;
box-shadow: 0 0 2px rgba(0,0,0,0.2);
transform-origin: 2px 50px;
-moz-transform-origin: 2px 50px;
-ms-transform-origin: 2px 50px;
-o-transform-origin: 2px 50px;
-webkit-transform-origin: 2px 50px;
transition: 1s;
-moz-transition: 1s; /* Firefox 4 */
-webkit-transition: 1s; /* Safari 和 Chrome */
-o-transition: 1s; /* Opera */
animation:rotate-hour 43200s linear infinite;
-webkit-animation: rotate-hour 43200s linear infinite; /* Safari 和 Chrome */
}
.clock-minute {
z-index: 3;
position: absolute;
left: 128px;
top: 60px;
width: 4px;
height: 85px;
border-radius: 2px;
background-color: #555;
box-shadow: 0 0 2px rgba(0,0,0,0.2);
transition: 1s;
-moz-transition: 1s; /* Firefox 4 */
-webkit-transition: 1s; /* Safari 和 Chrome */
-o-transition: 1s; /* Opera */
transform-origin: 2px 70px;
-moz-transform-origin: 2px 70px;
-ms-transform-origin: 2px 70px;
-o-transform-origin: 2px 70px;
-webkit-transform-origin: 2px 70px;
animation:rotate-minute 3600s linear infinite;
-webkit-animation: rotate-minute 3600s linear infinite; /* Safari 和 Chrome */
}
.clock-second {
z-index: 4;
position: absolute;
left: 129px;
top: 15px;
width: 2px;
height: 140px;
border-radius: 2px;
background-color: #a00;
box-shadow: 0 0 1px rgba(0,0,0,0.2);
transform-origin: 1px 115px;
-moz-transform-origin: 1px 115px;
-ms-transform-origin: 1px 115px;
-o-transform-origin: 1px 115px;
-webkit-transform-origin: 1px 115px;
transition: 1s;
-moz-transition: 1s; /* Firefox 4 */
-webkit-transition: 1s; /* Safari 和 Chrome */
-o-transition: 1s; /* Opera */
animation:rotate-hour 60s linear infinite;
-webkit-animation: rotate-second 60s linear infinite; /* Safari 和 Chrome */
}
.clock-second:after {
content: "";
display: block;
position: absolute;
width: 8px;
height: 8px;
border-radius: 50%;
left: -3px;
top:110px;
background-color: #a00;
box-shadow: 0 0 3px rgba(0,0,0,0.2);
}
.clock-center {
z-index: 1;
position: absolute;
left: 55px;
top: 55px;
background-image: linear-gradient(#e3e3e3,#f7f7f7);
border-radius: 50%;
width: 150px;
height: 150px;
box-shadow: inset 0 -1px 0 #fafafa, inset 0 1px 0 #e3e3e3;
}
.clock-center:after{
content: "";
display: block;
width: 20px;
height: 20px;
margin: 65px;
background-color: #ddd;
border-radius: 50%;
}
之后,在sidebar.styl 末尾加入 @import "time"
,这是styl的语法,表示引入一个文件,因为两个文件是同级,所以可以直接这么写,加./
也可以。
STEP 3
最后,在themes的config文件中注册这个挂件。
在_config.yml中,找到widgets
,在你想要加的位置中加入 - time
,即模板文件名。
比如我的widgets变成了这样:
widgets:
- clock
- category
- tag
- tagcloud
- archive
- recent_posts
LAST
至此,就全部完事,可以去hexo generate
或hexo server
了。