JavaScript 30 - 2 学习笔记

学习JavaScirpt30的笔记!

有意思!

2------->   CSS clock

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

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

首先是html部分

<div class="clock">
        <div class="clock-face">
            <div class="hand hour-hand"></div>
            <div class="hand min-hand"></div>
            <div class="hand second-hand"></div>
        </div>
    </div>

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

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

之后就是三个 div指针啦。

下面是CSS 部分

  .clock{

        width: 300px;
        height: 300px;
        border-radius: 50%;
        border:5px solid #dca;

    }

    .clock-face{
        width: 90%;
        margin: 0 auto;
        height: 300px;
        position: relative;
    }

    .hand{
        width: 50%;
        height: 3px;

        position: absolute;
        top: 50%;
        transform: rotate(-90deg);
        transform-origin: 0%;
        left: 50%;

        transition-timing-function: cubic-bezier(0, 1.74, 0.77, 0.87);

    }

    .second-hand{

        transition-duration: .05s;
        background-color:red;
    }

    .min-hand{
        width: 120px;
        transition-duration: .05s;
        background-color:#666;
    }

    .hour-hand{
        width: 100px;
        transition-duration: .05s;
        background-color:gray;
    }

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

   .hand{
        width: 50%;
        height: 3px;

        position: absolute;
        top: 50%;
        transform: rotate(-90deg);
        transform-origin: 0%;
        left: 50%;

        transition-timing-function: cubic-bezier(0, 1.74, 0.77, 0.87);

    }
   transform-origin: 0%;

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

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

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

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

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

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

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

接下来看js

          const secondHand = document.querySelector(‘.second-hand‘);
          const minHand = document.querySelector(‘.min-hand‘);
          const hourHand = document.querySelector(‘.hour-hand‘);

          function setDate(){
                const now= new Date();
                const seconds = now.getSeconds();
                const secondsDegrees = ((seconds/60)*360-90);

                const mins = now.getMinutes();
                const minsDegrees=((mins/60)*360-90);

                const hours = now.getHours();
                const hoursDegrees=((hours/12)*360-90);

               if(seconds==0){
                   secondHand.style.transitionDuration=‘0s‘;

               }
               else{
                   secondHand.style.transitionDuration=‘.1s‘;

               }

               if(mins==0){
                   minHand.style.transitionDuration=‘0s‘;
               }else{
                   minHand.style.transitionDuration=‘.05s‘;
               }

               if(hours==0){
                   hourHand.transitionDuration=‘0s‘;
               }else{
                   hourHand.transitionDuration=‘.05s‘;
               }    

               secondHand.style.transform = `rotate(${secondsDegrees}deg)`;

               minHand.style.transform = `rotate(${minsDegrees}deg)`;

               hourHand.style.transform = `rotate(${hoursDegrees}deg)`;

                console.log(seconds);

          }

          setInterval(setDate,1000);
核心部分是这里
 const now= new Date();
 const seconds = now.getSeconds();
 const secondsDegrees = ((seconds/60)*360-90);

利用了js里的date 直接获取了当前的秒数(简单粗暴..)然后计算出每次 指针的偏移量  (秒数/60s)*360°-90°;为什么要-90°?? 因为如果不-90°,那么这个指针的起始位置就不是12点 ,而是3点! 

视频里面是+90°, 因为他使用的origin 是100%,而我使用的是 0%,两个的圆点不一样,旋转的方向是一样的。相当于我是从3点的位置开始 ,而视频里面是从9点的位置开始,而我们都想要他从12点的位置开始,所以才需要+-90°。

然后用定时器每秒调用 setDate(),大家可能看到了有这样的三个判断。
          if(seconds==0){
                   secondHand.style.transitionDuration=‘0s‘;

               }
               else{
                   secondHand.style.transitionDuration=‘.1s‘;

               }

               if(mins==0){
                   minHand.style.transitionDuration=‘0s‘;
               }else{
                   minHand.style.transitionDuration=‘.05s‘;
               }

               if(hours==0){
                   hourHand.transitionDuration=‘0s‘;
               }else{
                   hourHand.transitionDuration=‘.05s‘;
               }    

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

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

设置回来,就可以了。

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

操作...

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

				
时间: 2024-10-11 01:01:46

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

JavaScript 30 - 1 学习笔记

学习JavaScirpt30的笔记! ...虽然英语不是很好,但是跟着来还是学到了一些东西. 1------->   JavaScirpt Drum Kit 功能是这样的 ,敲击键盘上面的按钮,播放一段打鼓的音乐 . 教程之中是有很多个按键,我的demo只做了4个按钮,实现了就可以啦. 直接贴代码吧. <div class="keys"> <div data-key="65" class="key"> <kbd

JavaScript高级程序设计学习笔记--基本概念

1.语句 ECMAScript中的语句以一个分号结尾:如果省略分号,则由解析器确定语句的结尾,如下例所示: var sum=a+b //即使没有分号也是有效的语句--推荐 var diff=a-b; //有效的语句--推荐 虽然语句结尾的分号不是必需的,但我们建议任何时候都不要省略它.两个原因:1.加上分号可以避免很多错误 2.加上分号也会在某些情况下增进代码的性能,因为这样解析器就不必再花时间 推测应该在哪里插入分号了. 2.变量 var message="hi"; 像这样初始化变量

JavaScript高级程序设计学习笔记--错误处理与调试

try-catch语句 只要代码中包含finally子句,则无论try或catch语句块中包含什么代码--甚至return语句,都不会阻止finally子句的执行,来看下面这个函数: function testFinally(){ try{ return 2; }catch(error){ return 1; }finally{ return 0; } } 调用这个函数会返回0(PS:但我实际执行的时候会先返回0,再返回2) 抛出错误 与try-catch语句相配的还有一个throw操作符,用于

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

放着好好的成熟的AJS 3.19不学,为什么要去碰乳臭未干的AJS 4.2? 诸君,我喜欢嫩的--呸呸呸 诸君,我喜欢3D咋了?新事物会替代旧事物不是~ ArcGIS API for JavaScript 4.2概述 AJS 4.2,即ArcGIS API for JavaScript 4.2,是美国ESRI公司针对WebGIS市场推出的.利用JavaScript和Dojo开发的一款产品,它在2016年12月发布.而AJS 4.0 beta则在一年前就发布了. 关于AJS3和AJS4选择的问题,

JavaScript权威指南学习笔记之一

1.关于分号 javascript里面不强制使用分号来表示一行语句的结束,但是最好能够在写js之前,特别是在原有的js上面新增时,最好前置一个分号.避免这种情况发生:  2.JavaScript类型转换 3.关于=== ①如果类型不同则不等 ②null===null或undefined===undefined ③true===true或false===false ④NaN不等 ⑤0===0 0===-0 ⑥如果是同一个object,array,function则相等 4.关于== ①如果已经==

JavaScript高级程序设计学习笔记--面向对象程序设计

工厂模式 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为解决这个问题,人们开始使用 工厂模式的一种变体. function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); }; return o; } var

Javascript高级程序设计学习笔记

3. 基本概念 基本数据类型:Undefined,Null,Boolean,Number,String. 复杂数据类型:Object. 3.6 语句 switch比较值时用的是全等运算符 “===” ,因此不会进行类型转换.例如 “10” 不等于10. 3.7 函数 ECMAScript函数不介意传递进来多少个参数,也不在乎参数的类型.即使定义的函数只接受两个参数,在调用的时候也可以传递任意多个或者0个.因为ECMAScript的参数在内部是用一个数组表示的,在函数体内部可以通过argument

JavaScript高级程序设计学习笔记--高级技巧

惰性载入函数 因为浏览器之间行为的差异,多数JavaScript代码包含了大量的if语句,将执行引导到正确的代码中,看看下面来自上一章的createXHR()函数. function createXHR(){ if (typeof XMLHttpRequest != "undefined"){ return new XMLHttpRequest(); } else if (typeof ActiveXObject != "undefined"){ if (typeo

JavaScript高级程序设计学习笔记--DOM

DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序接口). Document类型 文档的子节点 虽然DOM标准规定Document节点的子节点可以是DocumentType,Element,ProcessingInstruction或Comment,但还有两个内置的访问其子节点的快捷方式.第一个就是documnetElement属性,该属性始终指向HTML页面中的<html>元素.另一个就是通过childNodes列表访问文档元素,但通过documentElement属性则