在生成时钟的过程中自己想到布置表盘的写法由这么几种:

当然利用那种模式都可以实现,所以我们要用一个最好理解,代码有相对简便的方法实现

1、利用三角函数

  用js在三角函数布置表盘的过程中有遇见到这种情况:是在表盘的刻度处,利用三角函数计算具体的值时不能得到整数,需要向上或者向下取整,这样无形中就会存在些许偏差,而且这样的偏差难利用样式来调整到位,即使最终效果都可以实现,但是细微处的缝隙和角度的偏差都会影响整体的视觉体验,作为一名程序开发人员,这样的视觉体验很难让别人认可,放弃。

2、利用遮罩层

  js利用遮罩层,主要还是在表盘的刻度处,表盘的刻度有长和短,每5个刻度都有一根较长的刻度,这样我们利用遮罩层遮住的刻度的长短都是一致的,很难继续调整其余的刻度所以也放弃。

3、利用定位以及(父子级关系)(推荐)

  利用定位以及父子级关系的方法我觉得最好理解和上手,在这里为大家分享一下。下面是实现代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <style media="screen">
      * {
        margin: 0;
        padding: 0;
      }
      #clock {
        width: 600px;
        height: 600px;
        border: 4px solid lightgray;
        margin: auto;
        position: relative;
        border-radius: 50%;
      }
      #scale {
        width: 20px;
        height: 100%;
        position: absolute;
        left: 50%;
        margin-left: -10px;
        /*background: green;*/
      }
      #point {
        width: 4px;
        height: 10px;
        background: lightgray;
        margin: auto;
      }
      #number {
        width: 20px;
        height: 20px;
        margin-top: 5px;
        /*background: red;*/
        font-size: 20px;
        text-align: center;
        line-height: 20px;
      }
      #hour {
        width: 12px;
        height: 180px;
        background: red;
        border-radius: 6px;
        transform-origin: 50% 150px;
        position: absolute;
        top: 150px;
        left: 50%;
        margin-left: -6px;
      }
      #minute {
        width: 8px;
        height: 250px;
        background: orange;
        position: absolute;
        border-radius: 4px;
        transform-origin:  50% 200px;
        top: 100px;
        left: 50%;
        margin-left: -4px;
      }
      #second {
        width: 4px;
        height: 360px;
        background: red;
        border-radius: 2px;
        position: absolute;
        top: 0;
        left: 50%;
        margin-left: -2px;
        transform-origin: 50% 300px;
        z-index: 100;
      }
    </style>
  </head>
  <body>
    <div id="clock">
      <div id="hour">

</div>
      <div id="minute">

</div>
      <div id="second">

</div>
    </div>
  </body>
  <script type="text/javascript">
    var clock = document.getElementById('clock');
    var hour = document.getElementById('hour');
    var minute = document.getElementById('minute');
    var second = document.getElementById('second');

function surface() {
      var currentDate = new Date();
      var hours = currentDate.getHours();
      var minutes = currentDate.getMinutes();
      var seconds = currentDate.getSeconds();

seconds = hours * 3600 + minutes * 60 + seconds;

hour.style.transform = 'rotate('+seconds / 120+'deg)';
      minute.style.transform = 'rotate('+seconds * 0.1+'deg)';
      second.style.transform = 'rotate('+seconds * 6+'deg)';

}
    setInterval('surface()', 1000);

for (var i = 1; i < 61; i++) {
      var scale = document.createElement('div');
      scale.id = 'scale';
      scale.style.transform = 'rotate('+i * 6+'deg)';
      clock.appendChild(scale);

var point = document.createElement('div');
      point.id = 'point';
      scale.appendChild(point);

var number = document.createElement('div');
      number.id = 'number';
      number.style.transform = 'rotate(-'+i * 6+'deg)'
      if (i % 5 == 0) {
        number.innerHTML = i / 5;
        point.style.height = '15px';
      }
      scale.appendChild(number);
    }
  </script>
</html>

校正中需要注意:

1、以下是分步实现的效果图,最后做到细节处紧密贴合,不用其他的方法在对她进行微调,当样式布局全部完成之后就可以获取当前的时间加以校正,在校正的过程中有这样一个问题,希望大家能注意: 时针的转动角度不能以小时为单位来计算,例如:9:58 这时的时针指的位置是9,当10 :00 时,时针以下跳转到10的位置,所以时针的角度要以分钟或者秒来计算,分针的角度跳转要以分钟或者秒来计算,秒针就是每秒跳转6度。

2、还有一点要注意,三个指针的转动圆心问题,利用transform-origin 来定指针转动点一定要定准

浅谈时钟的生成(js手写代码)(非原创)的更多相关文章

  1. 浅谈时钟的生成(js手写代码)

    在生成时钟的过程中自己想到布置表盘的写法由这么几种: 当然利用那种模式都可以实现,所以我们要用一个最好理解,代码有相对简便的方法实现 1.利用三角函数 用js在三角函数布置表盘的过程中有遇见到这种情况 ...

  2. 【转载】浅谈游戏开发之2D手游工具

    浅谈游戏开发之2D手游工具 来源:http://www.gameres.com/459713.html 游戏程序 平台类型: iOS Android  程序设计: 其它  编程语言:   引擎/SDK ...

  3. 谁还没遇上过NoClassDefFoundError咋地——浅谈字节码生成与热部署

    谁还没遇上过NoClassDefFoundError咋地--浅谈字节码生成与热部署 前言 在Java程序员的世界里,NoClassDefFoundError是一类相当令人厌恶的错误,因为这类错误通常非 ...

  4. 2019前端面试系列——JS高频手写代码题

    实现 new 方法 /* * 1.创建一个空对象 * 2.链接到原型 * 3.绑定this值 * 4.返回新对象 */ // 第一种实现 function createNew() { let obj ...

  5. 原生html、js手写 radio与checkbox 美化

    原生html.js手写 radio与checkbox   美化 html <!DOCTYPE html> <html> <head> <meta charse ...

  6. Python测试开发-浅谈如何自动化生成测试脚本

    Python测试开发-浅谈如何自动化生成测试脚本 原创: fin  测试开发社区  前天 阅读文本大概需要 6.66 分钟. 一 .接口列表展示,并选择 在右边,点击选择要关联的接口,区分是否要登录, ...

  7. 常见的JS手写函数汇总(代码注释、持续更新)

    最近在复习面试中常见的JS手写函数,顺便进行代码注释和总结,方便自己回顾也加深记,内容也会陆陆续续进行补充和改善. 一.手写深拷贝 <script> const obj1 = { name ...

  8. 前端面试手写代码——JS函数柯里化

    目录 1 什么是函数柯里化 2 柯里化的作用和特点 2.1 参数复用 2.2 提前返回 2.3 延迟执行 3 封装通用柯里化工具函数 4 总结和补充 1 什么是函数柯里化 在计算机科学中,柯里化(Cu ...

  9. UI到底应该用xib/storyboard完成,还是用手写代码来完成?

    UI到底应该用xib/storyboard完成,还是用手写代码来完成? 文章来源:http://blog.csdn.net/libaineu2004/article/details/45488665 ...

随机推荐

  1. JQuery调用iframe子页面函数/对象的方法例子

    父页面有个ID为mainfrm.name为Iframe1的iframe,iframe连接b.html,该页面有个函数test 在父页面调用b.html的test方法为: $("#mainfr ...

  2. json数据转换异常:net.sf.json.JSONException: java.lang.reflect.InvocationTargetException

    转:json数据转换异常:net.sf.json.JSONException: java.lang.reflect.InvocationTargetException 执行:JSONArray arr ...

  3. jsp:forEach标签

    该标签使用来对一个 Collection 集合中的一系列对象进行迭代输出,并且可以指定迭代次数.一般使用格式如下: <c:forEach items=”collection” var=”varN ...

  4. 常用的linux基础命令

    常用的linux基础命令 1.ls 显示目录属性 -l:(也可以简写成ll),列表显示权限等属性 -a:显示所有文件包括隐藏文件等 -d:只列出目录本身 2.chgrp 改变档案所属群组 eg:chg ...

  5. GEF入门实例_总结_05_显示一个空白编辑器

    一.前言 本文承接上一节:GEF入门实例_总结_04_Eclipse插件启动流程分析 在第三节( GEF入门实例_总结_03_显示菜单和工具栏  ),我们创建了菜单和工具栏. 这一节,我们来实现:点击 ...

  6. Incorrect string value: '\xE7\x8E\x8B\xE4\xBD\xB3' for column 'contact' at row 1

    1 queries executed, 0 success, 1 errors, 0 warnings 查询:INSERT INTO beijing(contact,tel_phone,qq,comp ...

  7. hdoj-1032-The 3n + 1 problem(坑题)

     题目链接 //巨坑的一道题,输入的m,n要判断大小,输出还要按照原来的顺序,范围还是i<=n<=j #include <iostream> #include <cstd ...

  8. Scala极速入门

    摘要 当面向对象遇到函数式编程,这就是Scala.简练的语言描述与简单的例子相辅相成,希望能够对大家学习Scala有所帮助. scala 入门 定义 Scala语言是一种面向对象语言,同时又结合了命令 ...

  9. Linux 获取随机密码

    /****************************************************************************** * Linux 获取随机密码 * 说明: ...

  10. 自定义Django Command

    转: django的command命令是要放在一个app的management/commands目录下.python2环境中,请确保management和management/commands目录内都 ...