利用CSS3的transform做的动态时钟效果


Posted in HTML / CSS onSeptember 21, 2011

1. transform 与 transform-origin 使用说明
目前这两个属性得到了主流浏览器IE,webkit,firefox,opera的支持,属性名分别为-ms-transform -webkit-transform,-moz-transform,-o-transform。可能有人会疑问为什么要加各浏览器的前缀(-ms-),本人认为可能在浏览器新版本发布时,此CSS属性还没有正式被W3组织当标准发布吧,所以加前缀加以区分,以后所有浏览器肯定会统一使用transform 和trandform-origin的。

最新CSS标准参考网站:http://www.w3.org/Style/CSS/current-work
IE9开发人员指导网站:http://msdn.microsoft.com/en-us/ie/ff468705
webkit开发资料:http://www.webkit.org/projects/documentation/index.htmlhttp://developer.apple.com/devcenter/safari/index.action
firefox开发资料:https://developer.mozilla.org/En/Developer_Guide
opera开发资料:http://dev.opera.com/articles/view/wcl-developer-guide/
transform-origin是变形原点,也就是该元素围绕着那个点变形或旋转,该属性只有在设置了transform属性的时候起作用,它接受两个参数,它们可以是百分比,em,px等具体的值,也可以是left,center,right,或者 top,center,bottom等描述性参数 ;它的默认值是50% 50%。
top left | left top 等价于 0 0;
top | top center | center top 等价于 50% 0
right top | top right 等价于 100% 0
left | left center | center left 等价于 0 50%
center | center center 等价于 50% 50%(默认值)
right | right center | center right 等价于 100% 50%
bottom left | left bottom 等价于 0 100%
bottom | bottom center | center bottom 等价于 50% 100%
bottom right | right bottom 等价于 100% 100%
transform属性实现了一些可用SVG实现的同样的功能。它可用于内联(inline)元素和块级(block)元素。它允许我们旋转、缩放和移动元素 ,他有几个属性值参数:
rotate(旋转)允许你通过传递一个度数值来转动一个对象;
scale是一个缩放功能,可以让任一元素变的更大。它使用一个或者两个正数和负数以及小数作为参数;当使用一个参数时表示X轴和Y轴的缩放相同;
translate就是基于X和Y 坐标重新定位元素,当使用一个参数时表示X轴和Y轴的参数相同;
skew倾斜(ps中的斜切),参数是度数,当使用一个参数时表示X轴和Y轴的参数相同;
matrix矩阵变换,就是基于X和Y 坐标重新定位元素,它使用6个参数;
2.动态时钟页面的HTML + CSS
HTML 代码:

复制代码
代码如下:

<div id="clock">
<div id="dot"></div>
<div id="second" class="needle">
<div id="second_needle">
</div>
</div>
<div id="minute" class="needle">
<div id="minute_needle">
</div>
</div>
<div id="hour" class="needle">
<div id="hour_needle">
</div>
</div>
</div>

代码中各个DIV的含义就不解释了,相信大家都看得懂。HTML还是挺简单的,起作用的还得看CSS。
相关CSS代码:
复制代码
代码如下:

<style type="text/css">
#clock{
width: 200px;
height: 200px;
border: 1px solid black;
border-radius: 100px;
position:relative;
margin:0 auto;
background-color:#eee;
}
#dot{
border-radius:2px;
width: 8px;
height: 8px;
position:absolute;
top: 0;
bottom: 0;
margin: auto;
left: 0;
right: 0;
background: black;
}
.needle
{
-ms-transform-origin: 50% 100%;
-webkit-transform-origin: 50% 100%;
-moz-transform-origin: 50% 100%;
-o-transform-origin: 50% 100%;
transform-origin:50% 100%;
}
#second{
position:relative;
z-index:5;
height: 80px;
width: 1px;
margin: 20px auto;
}
#second_needle{
height: 100%;
width: 100%;
position: relative;
background: green;
}
#minute{
z-index:4;
height: 60px;
width: 4px;
position: absolute;
top: 40px;
left: 0px;
right: 0px;
margin: auto;
}
#minute_needle{
height: 100%;
width: 100%;
background: blue;
}
#hour{
z-index:3;
height: 40px;
width: 8px;
position: absolute;
top: 60px;
left: 0px;
right: 0px;
margin: auto;
}
#hour_needle{
height: 100%;
width: 100%;
background: red;
}
</style>

这里说明下几个关键的CSS属性:#clock 里面的块元素的 position:absolute;然后再用top; bottom; margin; left; right; 才能准确定位,各个指钟的旋转原点为底部的中点:transform-origin:50% 100%;
3.页面的Javascript的实现
最为关键的是JS代码了:
复制代码
代码如下:

<script type="text/javascript">
//初始化各指钟的位置
window.onload = function(){
var date = new Date(),
second = date.getSeconds(),
minute = date.getMinutes(),
minuteDeg,
hour = date.getHours(),
hourDeg;
var secondrotate = 'rotate('+second*6+'deg)';
var scss = '-moz-transform:' + secondrotate + ';-o-transform:' + secondrotate + ';-ms-transform:' + secondrotate;
//对?于úwebkit的?浏ˉ览à器÷,要a这a样ù定¨义?
document.getElementById('second').style.cssText = scss;
document.getElementById('second').style.webkitTransform = secondrotate;
minuteDeg = minute*6 + second*6/60;
var minuterotate = 'rotate('+minuteDeg+'deg)';
var minutecss = '-moz-transform:' + minuterotate + ';-o-transform:' + minuterotate + ';-ms-transform:' + minuterotate ;
document.getElementById('minute').style.cssText = minutecss;
document.getElementById('minute').style.webkitTransform = minuterotate; //对?于úwebkit的?浏ˉ览à器÷,要a这a样ù定¨义?
if(hour>12){
hour = hour -12;
}
hourDeg = hour * 30 + minute*30/60;
var hourtrotate = 'rotate('+hourDeg+'deg)';
var hcss = '-moz-transform:' + hourtrotate + ';-o-transform:' + hourtrotate + ';-ms-transform:' + hourtrotate;
document.getElementById('hour').style.cssText = hcss;
document.getElementById('hour').style.webkitTransform = hourtrotate; //对?于úwebkit的?浏ˉ览à器÷,要a这a样ù定¨义?
};
//周ü期ú性?改?变?秒?钟ó的?位?置?
setInterval(function(){
var date = new Date(),
second = date.getSeconds();
var secondrotate = 'rotate('+second*6+'deg)';
var scss = '-moz-transform:' + secondrotate + ';-o-transform:' + secondrotate + ';-ms-transform:' + secondrotate ;
document.getElementById('second').style.cssText = scss;
document.getElementById('second').style.webkitTransform = secondrotate; //对?于úwebkit的?浏ˉ览à器÷,要a这a样ù定¨义?
},1000)
//周ü期ú性?改?变?分?钟ó的?位?置?
setInterval(function(){
var date = new Date(),
second = date.getSeconds(),
minute = date.getMinutes(),
minuteDeg;
minuteDeg = minute*6 + second*6/60;
var minuterotate = 'rotate('+minuteDeg+'deg)';
var minutecss = '-moz-transform:' + minuterotate + ';-o-transform:' + minuterotate + ';-ms-transform:' + minuterotate ;
document.getElementById('minute').style.cssText = minutecss;
document.getElementById('minute').style.webkitTransform = minuterotate; //对?于úwebkit的?浏ˉ览à器÷,要a这a样ù定¨义?
},6000)
//周ü期ú性?改?变?时±钟ó的?位?置?
setInterval(function(){
var date = new Date(),
second = date.getSeconds(),
minute = date.getMinutes(),
hour = date.getHours(),
hourDeg;
if(hour>12){
hour = hour -12;
}
hourDeg = hour * 30 + minute*30/60;
var hourtrotate = 'rotate('+hourDeg+'deg)';
var hcss = '-moz-transform:' + hourtrotate + ';-o-transform:' + hourtrotate + ';-ms-transform:' + hourtrotate;
document.getElementById('hour').style.cssText = hcss;
document.getElementById('hour').style.webkitTransform = hourtrotate; //对?于úwebkit的?浏ˉ览à器÷,要a这a样ù定¨义?
},360000)
</script>

请在支持CSS3的浏览器中查看,如:firefox, Chrome….,但IE9看不到效果,本地单独运行页面能看到效果
HTML / CSS 相关文章推荐
深入浅析css3 中display box使用方法
Nov 25 HTML / CSS
基于CSS3制作立体效果导航菜单
Jan 12 HTML / CSS
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
Aug 15 HTML / CSS
CSS3实现淘宝留白的方法
Jun 05 HTML / CSS
html5/css3响应式页面开发总结
Oct 16 HTML / CSS
HTML5 Web Database 数据库的SQL语句的使用方法
Dec 09 HTML / CSS
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
Jan 31 HTML / CSS
HTML5 预加载让页面得以快速呈现
Aug 13 HTML / CSS
html5 的a标签 Href 拨电话的写法
Nov 04 HTML / CSS
html5使用canvas画一条线
Dec 15 HTML / CSS
HTML5本地存储之Web Storage详解
Jul 04 HTML / CSS
html5写一个BUI折叠菜单插件的实现方法
Sep 11 HTML / CSS
CSS3 border-image详解、应用及jQuery插件
Aug 29 #HTML / CSS
CSS3 特效范例整理
Aug 22 #HTML / CSS
你正在寻找的CSS3 动画技术
Jul 27 #HTML / CSS
IE兼容css3圆角的实现代码
Jul 21 #HTML / CSS
10个很棒的 CSS3 开发工具 推荐
May 16 #HTML / CSS
IE下实现类似CSS3 text-shadow文字阴影的几种方法
May 11 #HTML / CSS
CSS3 Backgrounds属性相关介绍
May 11 #HTML / CSS
You might like
深入理解PHP原理之错误抑制与内嵌HTML分析
2011/05/02 PHP
php+ajax实时刷新简单实例
2015/02/25 PHP
如何写php守护进程(Daemon)
2015/12/30 PHP
Laravel框架实现多个视图共享相同数据的方法详解
2019/07/09 PHP
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
jquery序列化表单去除指定元素示例代码
2014/04/10 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
2015/07/27 Javascript
AngularJs定时器$interval 和 $timeout详解
2017/05/25 Javascript
Angular7创建项目、组件、服务以及服务的使用
2019/02/19 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
2019/11/04 Javascript
Vue插件之滑动验证码用法详解
2020/04/05 Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
2020/04/30 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
2009/04/09 Python
linux下安装easy_install的方法
2013/02/10 Python
python基础教程之数字处理(math)模块详解
2014/03/25 Python
浅析Python中signal包的使用
2015/11/13 Python
python3爬取torrent种子链接实例
2020/01/16 Python
使用pytorch实现论文中的unet网络
2020/06/24 Python
python如何随机生成高强度密码
2020/08/19 Python
python空元组在all中返回结果详解
2020/12/15 Python
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
将一个数的从第5位开始的7个数取出,其余位置0
2016/05/26 面试题
建筑经济管理专业求职信分享
2014/01/06 职场文书
优秀企业获奖感言
2014/02/01 职场文书
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
师德师风建设方案
2014/05/08 职场文书
英语求职信范文
2014/05/23 职场文书
七一建党日演讲稿
2014/09/05 职场文书
股份合作协议书
2014/09/10 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
党员干部学习心得体会
2016/01/23 职场文书
浅谈MySQL 亿级数据分页的优化
2021/06/15 MySQL
python区块链实现简版工作量证明
2022/05/25 Python