学习JavaScirpt30的笔记!

有意思!

2------->   CSS clock

效果是这样的.... 这是改良过后的 版本....

话不多说,直接来看代码。

首先是html部分

  1. <div class="clock">
  2. <div class="clock-face">
  3. <div class="hand hour-hand"></div>
  4. <div class="hand min-hand"></div>
  5. <div class="hand second-hand"></div>
  6. </div>
  7. </div>

最外层的  clock 来作为底部的圆环。

变化都是在 clock-face 里面的。

之后就是三个 div指针啦。

下面是CSS 部分

  1.   .clock{
  2.  
  3. width: 300px;
  4. height: 300px;
  5. border-radius: 50%;
  6. border:5px solid #dca;
  7.  
  8. }
  9.  
  10. .clock-face{
  11. width: 90%;
  12. margin: 0 auto;
  13. height: 300px;
  14. position: relative;
  15. }
  16.  
  17. .hand{
  18. width: 50%;
  19. height: 3px;
  20.  
  21. position: absolute;
  22. top: 50%;
  23. transform: rotate(-90deg);
  24. transform-origin: 0%;
  25. left: 50%;
  26.  
  27. transition-timing-function: cubic-bezier(0, 1.74, 0.77, 0.87);
  28.  
  29. }
  30.  
  31. .second-hand{
  32.  
  33. transition-duration: .05s;
  34. background-color:red;
  35. }
  36.  
  37. .min-hand{
  38. width: 120px;
  39. transition-duration: .05s;
  40. background-color:#666;
  41. }
  42.  
  43. .hour-hand{
  44. width: 100px;
  45. transition-duration: .05s;
  46. background-color:gray;
  47. }

最需要关注的地方就是这里

  1. .hand{
  2. width: 50%;
  3. height: 3px;
  4.  
  5. position: absolute;
  6. top: 50%;
  7. transform: rotate(-90deg);
  8. transform-origin: 0%;
  9. left: 50%;
  10.  
  11. transition-timing-function: cubic-bezier(0, 1.74, 0.77, 0.87);
  12.  
  13. }
  1. transform-origin: 0%;

transform-Origin属性允许您更改转换元素的位置。

2D转换元素可以改变元素的X和Y轴。 3D转换元素,还可以更改元素的Z轴。

  1. transform-origin: 0%;设置为0 其实就是以hand的开始部分为圆点来旋转指针。
    如果我们将transform-origin 设置为50%,看看是什么样子的效果。

..整指针都是以width = 50% 的地方开始旋转的。

视频里面的  transform-origin 是100%。 因为他没有设置每个指针的长度,默认都是一样长的。所以设置为100%的话是没有什么影响的。

但是如果想要设长度,考虑到div 的  position: absolute;  的时候。 他是自动向左靠拢的。如果我们以100%的origin来设置他的话,就会出现这样的情况。

指针们并没有共用圆心。所以给origin 设置为0%,(同时要调整圆心的位置 left:50%)。

接下来看js

  1. const secondHand = document.querySelector('.second-hand');
  2. const minHand = document.querySelector('.min-hand');
  3. const hourHand = document.querySelector('.hour-hand');
  4.  
  5. function setDate(){
  6. const now= new Date();
  7. const seconds = now.getSeconds();
  8. const secondsDegrees = ((seconds/60)*360-90);
  9.  
  10. const mins = now.getMinutes();
  11. const minsDegrees=((mins/60)*360-90);
  12.  
  13. const hours = now.getHours();
  14. const hoursDegrees=((hours/12)*360-90);
  15.  
  16. if(seconds==0){
  17. secondHand.style.transitionDuration='0s';
  18.  
  19. }
  20. else{
  21. secondHand.style.transitionDuration='.1s';
  22.  
  23. }
  24.  
  25. if(mins==0){
  26. minHand.style.transitionDuration='0s';
  27. }else{
  28. minHand.style.transitionDuration='.05s';
  29. }
  30.  
  31. if(hours==0){
  32. hourHand.transitionDuration='0s';
  33. }else{
  34. hourHand.transitionDuration='.05s';
  35. }
  36.  
  37. secondHand.style.transform = `rotate(${secondsDegrees}deg)`;
  38.  
  39. minHand.style.transform = `rotate(${minsDegrees}deg)`;
  40.  
  41. hourHand.style.transform = `rotate(${hoursDegrees}deg)`;
  42.  
  43. console.log(seconds);
  44.  
  45. }
  46.  
  47. setInterval(setDate,1000);
  1. 核心部分是这里
  1. const now= new Date();
  2. const seconds = now.getSeconds();
  3. const secondsDegrees = ((seconds/60)*360-90);
  4.  
  5. 利用了js里的date 直接获取了当前的秒数(简单粗暴..)
    然后计算出每次 指针的偏移量 (秒数/60s)*360°-90°;
    为什么要-90°?? 因为如果不-90°,那么这个指针的起始位置就不是12 ,而是3点!
  6.  
  7. 视频里面是+90°, 因为他使用的origin 100%,而我使用的是 0%,两个的圆点不一样,旋转的方向是一样的。相当于我是从3点的位置开始 ,而视频里面是从9点的位置开始,
    而我们都想要他从12点的位置开始,所以才需要+-90°。
  8.  
  9. 然后用定时器每秒调用 setDate(),大家可能看到了有这样的三个判断。
  1.          if(seconds==0){
  2. secondHand.style.transitionDuration='0s';
  3.  
  4. }
  5. else{
  6. secondHand.style.transitionDuration='.1s';
  7.  
  8. }
  9.  
  10. if(mins==0){
  11. minHand.style.transitionDuration='0s';
  12. }else{
  13. minHand.style.transitionDuration='.05s';
  14. }
  15.  
  16. if(hours==0){
  17. hourHand.transitionDuration='0s';
  18. }else{
  19. hourHand.transitionDuration='.05s';
  20. }

这其实是对视频里面代码的改进...因为 每次从59s-->60s 的这个时候,其实second 的值是 59-->0.而这个时候如果 继续让 transition-Duration 有值的话。

就会出现指针快速的绕了一圈的效果,影响视觉体验,所以在0s的时候把 transition-Duration 设置为0 ,可以跳过这个旋转的动画,直接过渡,之后再将其

设置回来,就可以了。

但是我觉得....这样的判断和操作会不会对浏览器的性能是一种消耗,因为其实只需要在0s的时候设置1次,1s的时候再设置回来。之后的58s内都不需要对其进行

操作...

如果有大佬有更好的写法,希望告知,谢谢~!!

  1.  

JavaScript 30 - 2 学习笔记的更多相关文章

  1. JavaScript 30 - 1 学习笔记

    学习JavaScirpt30的笔记! ...虽然英语不是很好,但是跟着来还是学到了一些东西. 1------->   JavaScirpt Drum Kit 功能是这样的 ,敲击键盘上面的按钮, ...

  2. JavaScript 30 - 3 学习笔记

    今天学习的是JavaScript 30-3 ---css Variables 实现的效果如下图所示. 废话不多,我们直接来看代码. html: <h1>大家好,这个一个<span c ...

  3. ArcGIS API for JavaScript 4.2学习笔记[0] AJS4.2概述、新特性、未来产品线计划与AJS笔记目录

    放着好好的成熟的AJS 3.19不学,为什么要去碰乳臭未干的AJS 4.2? 4.2全线基础学习请点击[直达] 4.3及更高版本的补充学习请关注我的博客. ArcGIS API for JavaScr ...

  4. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  5. JavaScript 权威指南-学习笔记(一)

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! ## JavaScript 权威指南-学 ...

  6. ArcGIS API for JavaScript 4.2学习笔记[1] 显示地图

    ArcGIS API for JavaScript 4.2直接从官网的Sample中学习,API Reference也是从官网翻译理解过来,鉴于网上截稿前还没有人发布过4.2的学习笔记,我就试试吧. ...

  7. JavaScript权威设计--JavaScript函数(简要学习笔记十一)

    1.函数调用的四种方式 第三种:构造函数调用 如果构造函数调用在圆括号内包含一组实参列表,先计算这些实参表达式,然后传入函数内.这和函数调用和方法调用是一致的.但如果构造函数没有形参,JavaScri ...

  8. JavaScript权威设计--JavaScript函数(简要学习笔记十)

    1.函数命名规范 函数命名通常以动词为前缀的词组.通常第一个字符小写.当包含多个单词时,一种约定是将单词以下划线分割,就像"like_Zqz()". 还有一种就是"lik ...

  9. 《你不知道的 JavaScript 上卷》 学习笔记

    第一部分: 作用域和闭包 一.作用域 1. 作用域:存储变量并且查找变量的规则 2. 源代码在执行之前(编译)会经历三个步骤: 分词/此法分析:将代码字符串分解成有意义的代码块(词法单元) 解析/语法 ...

随机推荐

  1. KMP算法 --- 在文本中寻找目标字符串

    KMP算法 --- 在文本中寻找目标字符串 很多时候,为了在大文本中寻找到自己需要的内容,往往需要搜索关键字.这其中就牵涉到字符串匹配的算法,通过接受文本和关键词参数来返回关键词在文本出现的位置.一般 ...

  2. C语言基础 - 输出1-100万之间的素数

    其实这个很简单 代码 网上也一大堆... //判断素数 BOOL isPrime(int num) { for (int i = 2; i <= sqrt(num); i++) { //能整除则 ...

  3. 【PHP】数组用法(转)

    摘要: 说明数组遍历方法foreach,while,for,推荐使用foreach(PHP内部实现,简单速度最快,还可以遍历类属性).以及一些常用方法current,prev,next,end,key ...

  4. web前端开发面试题(未完待续)

    一.HTML与XHTML的不同:1)XHTML元素必须被正确地嵌套 2)元素必须被关闭   如:<h1>--</h1>关闭 3)标签名必须用小写字母 4)XHTML文档必须有根 ...

  5. 移动端https抓包那些事--初级篇

    对于刚刚进入移动安全领域的安全研究人员或者安全爱好者,在对手机APP进行渗透测试的时候会发现一个很大的问题,就是无法抓取https的流量数据包,导致渗透测试无法继续进行下去. 这次给大家介绍一些手机端 ...

  6. iptables中DNAT的配置方法

    1.一对一流量完全DNAT 首先说一下网络环境,普通主机一台做防火墙用,网卡两块 eth0 192.168.0.1  内网 eth1 202.202.202.1 外网 内网中一台主机 192.168. ...

  7. Web测试与APP测试有哪些异同?

    1.相同点 不管是传统行业的web测试,还是新兴的手机APP测试,都离不开测试的基础知识,即是不管怎么变,测试的原理依然会融入在这两者当中. 1)设计测试用例时,依然都是依据边界值分析法.等价类划分等 ...

  8. 一步一步学习Vue(十)

    本篇说一下组件通信的问题,父子组件通信,前面的博客中已有说明,vue也推荐props in,event out:兄弟节点通信如何做呢?官方其实也给出了实现方式,我们以下面的场景来实现一下: 上图中,实 ...

  9. Vue学习-01

    1.vue 学习 v-bind:title 数据绑定 v-if 判断显示或者隐藏 <div id="app-3"> <p v-if="seen" ...

  10. react - 解刨组件的多种写法

    一,原始的createClass写法 对于写react组件,很多人第一印象往往是createClass,这是因为createClass是react组件最原始的写法,基本每个学react的人都是接触这种 ...