Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CSS和jQuery模拟时钟-平滑动画

CSS和jQuery模拟时钟-平滑动画
EN

Stack Overflow用户
提问于 2014-05-24 16:29:44
回答 3查看 4.9K关注 0票数 2

我的CSS3/jQuery模拟时钟出了点小问题。

时钟指针所走的每一步,都是非常困难的。相反,我希望移动/动画是平滑的。我已经试过使用transition: all .1s了,但是当时钟指针到达顶端时,它就会乱七八糟。

我正在使用transform: rotate()来旋转每只手。每移动一次,它就旋转6度。

也许解决方案可能是,不是仅仅旋转指针,每秒钟、每分钟和每小时旋转6度,秒针每1/6秒旋转1度,分针每10秒旋转一次,时针每10分钟旋转一次。我认为它可以创建一个更流畅的手动画,但我不知道怎么做。

这是我的JavaScript代码:

代码语言:javascript
运行
AI代码解释
复制
$(function() {

      setInterval( function() {
      var seconds = new Date().getSeconds();
      var sdegree = seconds * 6;
      var srotate = "rotate(" + sdegree + "deg)";

      $("#sec").css({ "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({ "transform": hrotate});

      }, 1000 );

      setInterval( function() {
      var mins = new Date().getMinutes();
      var mdegree = mins * 6;
      var mrotate = "rotate(" + mdegree + "deg)";

      $("#min").css({"transform" : mrotate });

      }, 1000 );

});

jsFiddle Demo

希望你能理解这个问题,并能帮助我:)

EN

回答 3

Stack Overflow用户

发布于 2014-05-24 17:17:42

为手设置线性过渡:

代码语言:javascript
运行
AI代码解释
复制
#clock div {
    -moz-transition: all 1s linear;
    -webkit-transition: all 1s linear;
    -o-transition: all 1s linear;
    transition: all 1s linear;
}

为了避免指针倒转到零的奇怪行为,您应该将JS更改为在毫秒内工作。这样,旋转值(度数)只会一直递增。CSS旋转可以做到这一点:

代码语言:javascript
运行
AI代码解释
复制
$(function() { 
     var i=0;
    setInterval( function() {
        //get time since midnight in milliseconds
         var now = new Date(),
        then = new Date(
        now.getFullYear(),
        now.getMonth(),
        now.getDate(),
        0,0,0),
        mil = now.getTime() - then.getTime(); // difference in milliseconds

          var h = (mil/(1000*60*60));
          var m = (h*60);
          var s = (m*60);
          //console.log(h+":"+m+":"+s);   


      var sdegree = (s * 6);
      var srotate = "rotate(" + sdegree + "deg)";  
      $("#sec").css({ "transform": srotate });

      var hdegree = h * 30 + (h / 2);
      var hrotate = "rotate(" + hdegree + "deg)";
      $("#hour").css({ "transform": hrotate});

      var mdegree = m * 6;
      var mrotate = "rotate(" + mdegree + "deg)";      
      $("#min").css({ "transform" : mrotate });

         if(i>0){
             $("#clock").addClass("transform");       
         }
         i++;

      }, 1000 );

});

http://jsfiddle.net/FHNJf/10/

更新:

这里有一个纯粹的JS解决方案,用于平滑地扫手。它使用requestAnimationFrame对循环进行计时,因为它不使用CSS转换,所以当你将焦点返回到浏览器选项卡时,它不会出现指针必须“赶上”的奇怪行为。

代码语言:javascript
运行
AI代码解释
复制
//use requestAnimationFrame for smoothness (shimmed with setTimeout fallback)
window.requestAnimFrame = (function(){
  return  window.requestAnimationFrame       ||
          window.webkitRequestAnimationFrame ||
          window.mozRequestAnimationFrame    ||
          function( callback ){
              window.setTimeout(callback, 1000 / 60);
          };
})();

//initialize the clock in a self-invoking function
(function clock(){ 
    var hour = document.getElementById("hour"),
        min = document.getElementById("min"),
        sec = document.getElementById("sec");
    //set up a loop
    (function loop(){
        requestAnimFrame(loop);
        draw();
    })();
    //position the hands
    function draw(){
        var now = new Date(),//now
            then = new Date(now.getFullYear(),now.getMonth(),now.getDate(),0,0,0),//midnight
            diffInMil = (now.getTime() - then.getTime()),// difference in milliseconds
            h = (diffInMil/(1000*60*60)),//hours
            m = (h*60),//minutes
            s = (m*60);//seconds
        //rotate the hands accordingly
        sec.style.webkitTransform = "rotate(" + (s * 6) + "deg)";
        hour.style.webkitTransform = "rotate(" + (h * 30 + (h / 2)) + "deg)";
        min.style.webkitTransform = "rotate(" + (m * 6) + "deg)";
    } 
})();

http://jsfiddle.net/FHNJf/13/

票数 3
EN

Stack Overflow用户

发布于 2014-05-24 16:37:46

您只需在hand元素上指定过渡持续时间。试试这个:

代码语言:javascript
运行
AI代码解释
复制
#clock div {
    -webkit-transition-duration: 1.0s;
    -moz-transition-duration: 1.0s;
    -o-transition-duration: 1.0s;
    transition-duration: 1.0s;
}
票数 0
EN

Stack Overflow用户

发布于 2014-05-24 16:37:54

你想让第二只手(和其他所有手)平稳地移动吗?尝试将以下css添加到#sec div:

代码语言:javascript
运行
AI代码解释
复制
[prefix-]transition: all 1.00s linear 0.0s;

这只会让你走到那里的一部分,你必须聪明地告诉转换如何旋转,因为它可能会导致12c时钟标记附近的bug。

不管它有什么价值,你可能有一个单独的setInterval(...),它创建一个单独的new Date()并相应地更新指针。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23847310

复制
相关文章
[Cocos Creator] 围绕物体旋转
在游戏开发过程中,可能会有让一个物体围绕另一个物体旋转的需求,就比如月球围绕着地球旋转,同时地球也在围绕着太阳旋转。
陈皮皮
2020/07/10
3.8K0
[Cocos Creator] 围绕物体旋转
HTML元素
注意:一些 HTML 元素没有内容(如 <br> 元素)。这些元素称为空元素。空元素没有结束标签!
玖柒的小窝
2021/09/24
1.4K0
HTML 元素
注释: 您将在本教程的下一章中学习更多有关属性的内容。 嵌套的 HTML 元素 大多数 HTML 元素可以嵌套(HTML 元素可以包含其他 HTML 元素)。 HTML 文档由相互嵌套的 HTML 元素构成。 HTML 文档实例
用户6884826
2021/07/07
1.3K0
HTML 元素
HTML 元素 开始标签 * 元素内容 结束标签 * <p> 这是一个段落 </p> <a href="default.htm"> 这是一个链接 </a> <br> 换行 HTML 元素语法 HTML 元素以开始标签起始 HTML 元素以结束标签终止 元素的内容是开始标签与结束标签之间的内容 某些 HTML 元素具有空内容(empty content) 空元素在开始标签中进行关闭(以开始标签的结束而结束) 大多数 HTML 元素可拥有属性
用户8442333
2021/08/21
1.5K0
HTML 元素
Web浏览器(如谷歌浏览器,Internet Explorer,Firefox,Safari)是用于读取HTML文件,并将其作为网页显示。
用户8442333
2021/08/21
1.3K0
Flash:DisplayObject的矩阵旋转(移动/修改注册点,修改旋转点)
简单来说,原理就是利用matrix运算,先把旋转点移到原点位置,旋转变换后再恢复到原来的位置 var a:Sprite = new Sprite(); a.graphics.beginFill(0); a.graphics.drawRect(0,0,100,100); a.graphics.drawCircle(0,0,6); a.graphics.endFill(); addChild(a); a.x = a.y = 100; trace (a.transform.matrix); var m:Matr
用户1258909
2018/07/04
9500
多个扇形元素绕圆旋转
这种效果有很多方案,最后选择了一个比较简单的方案,就是一个position: relative;的 div 。包裹5个position: absolute;的div。 通过旋转,调整5个div的 top 与 left,而产生弧度,并使中心点都指向圆心。 黄色扇形与文字 都是在5个div内部。
拿我格子衫来
2023/10/19
3060
多个扇形元素绕圆旋转
html元素(标签)
html元素(标签) <!DOCTYPE html> <html> <head> <!-- 头标签用于存放<meta><title>等标签 --> <meta charset="utf-8"> <!-- 设置编码 --> <title>html5</title> <!-- 设置标题 --> <link rel="stylesheet" type="text/css" href="mystyle.css"><!-- 定义了外部文件 --> <style type="t
IT架构圈
2018/05/31
2K0
认识html元素
前端现在越来越火,可以用去年热门的词语来形容——“风口上的猪”。希望这个系列的文集能够给“毫无任何基础,但是想转到前端的人”一点帮助。 认识一个html文档的基本结构: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Here is title</title></head><body> Here is content.</body></html> HTML 文档是由 HTML 元素 定义的,而HT
用户1667431
2018/04/18
2.3K0
认识html元素
认识html元素
前端现在越来越火,可以用去年热门的词语来形容——“风口上的猪”。希望这个系列的文集能够给“毫无任何基础,但是想转到前端的人”一点帮助。 认识一个html文档的基本结构: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Here is title</title></head><body> Here is content.</body></html> HTML 文档是由 HTML 元素 定义的,而HT
用户1667431
2018/04/18
2.4K0
认识html元素
HTML DOM - 元素
如需向 HTML DOM 添加新元素,您首先必须创建该元素,然后把它追加到已有的元素上。
陈不成i
2021/07/21
2.3K0
HTML的行元素和块元素
本博客所有文章如无特别注明均为原创。作者:十月梦想 ,复制或转载请以超链接形式注明转自 十月梦想博客 。 原文地址《HTML的行元素和块元素》
十月梦想
2018/08/29
3.4K0
HTML块级元素和行内元素
块级元素(block-level) 每个块元素通常都会独自占据一整行或多整行,可以对其设置宽度、高度、对齐等属性,常用于网页布局和网页结构的搭建。 常见的块元素有<h1>~<h6>、<p>、<div>、<ul>、<ol>、<li>等, 其中<div>标签是最典型的块元素。 块级元素的特点: (1)总是从新行开始 (2)高度,行高、外边距以及内边距都可以控制。 (3)宽度默认是容器的100% (4)可以容纳内联元素和其他块元素。 行内元素(inline-level) 行内元素(内联元素)不占有独立的区域,仅
秋白
2018/05/24
3.5K0
嵌套的 HTML 元素
<!DOCTYPE html> <html> <body> <p>这是第一个段落。</p> </body> </html>
用户8442333
2021/08/21
2.1K0
html 元素左移右移
Title div{ width: 200px; float: left; text-align: center; } select{ width: 100px; height: 140px; } $(function (){ $("#left button:eq(0)").click(function (){ // alert($
await
2021/09/23
3K0
html 元素左移右移
Title div{ width: 200px; float: left; text-align: center; } select{ width: 100px; height: 140px; } $(function (){ $("#left button:eq(0)").click(function (){ // alert($
await
2021/09/23
2.6K0
cefsharp修改html元素,CefSharp网页元素点击
代码完美地点击了开发人员控制台上的确切按钮,但没有点击CEF。只是出于某种原因忽略了它。。。
全栈程序员站长
2022/10/05
4.3K0
cefsharp修改html元素,CefSharp网页元素点击
HTML锚点
        以前只是知道有锚点这么个东西,一直没有用到,昨天做毕设用到了锚点,现在总结一下控制锚点的几种情况:         1. 在同一页面中 <a name="add"></a><!-- 定
高爽
2017/12/28
3.8K0
【HTML】HTML5 <div>元素布局的使用
标签可以把文档分割为独立的、不同的部分。它可以用作严格的组织工具,并且不使用任何格式与其关联。
梦溪
2021/08/09
4.2K0
JavaScript HTML DOM 元素 (节点)
要创建新的 HTML 元素 (节点)需要先创建一个元素,然后在已存在的元素中添加它。
陈不成i
2021/07/20
2.3K0

相似问题

旋转点围绕枢轴点?

12

围绕原点旋转点

20

方法围绕一个点旋转,html画布

10

围绕任意点旋转SKShapeNode

11

围绕轴心点旋转图像

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档