zoukankan      html  css  js  c++  java
  • 我们缺的不是技术,而是创意...

      周末闲在家确实无聊。宅的不成样子了。偶然发现国外一个web设计的网站上有一个3D时钟。顿时来了兴趣。其实一看代码,不是svg,也不是canvas,而是简单的利用层级关系,大小关系作了一个视觉差。看起来会有立体运动的感觉。

      于是,借着源码,我稍微把它整理一下,利用闭包规避了它大量的全局变量,稍微封装了一下,增加了几项可配置性。觉得好玩,分享给大家。
      这个效果主要有两个核心的变换,一个是时钟整体圆周的变化,一个是组成时钟的小元素的位置和层级的变化。
    核心变换代码主要有两段:

    mainloop: function () {
    // rotations
    _dir == 'left' ? A-=0.1 : A+=0.1;
    rx
    +=px;
    ry
    +=py;
    crx
    =Math.cos(rx);
    srx
    =Math.sin(rx);
    cry
    =Math.cos(ry+Math.PI/2);
    sry=Math.sin(ry+Math.PI/2);
    // return to the horizontale
    rx*=.9; ry*=.9; px*=.9; py*=.9;
    // refresh time
    .
    .
    .
    // call animation
    for(var i in O){
    for(var j in O[i].O){
    O[i].O[j].anim();
    }
    }
    setTimeout(arguments.callee,
    32);
    }

    然后结合anim(),可以造出圆环的效果。

    // main 3D function
    CObj.prototype.anim=function() {
    // z axis rotation
    var x=Math.sin(A+this.a)*100;
    var y=Math.cos(A+this.a)*100;
    // simple 3D
    var x1=y*crx-this.z*srx;
    var zz=y*srx+this.z*crx;
    var y1=x*cry-zz*sry;
    zz
    =x*sry+zz*cry;
    // 2D projection
    var r=400/(400+zz);
    x=Math.round(150-x1/r);
    y=Math.round(100-y1/r);
    var w=Math.round(2+Math.max(4,zz*.07));
    // leds lighting
    this.alpha(zz);
    // html positioning
    var css = this.o.style;
    css.left
    =x+"px";
    css.top
    =y+"px";
    css.width
    =css.height=w+"px";
    css.zIndex
    =Math.round(1000+zz);
    }

    里面嵌杂了一些亮灰度的变化和层级大小的变化就不细说了。大概思路是这样。

    不仅3D的处理有创意,时间的组成也有创意,用了一个数组模拟了1~9的数字:

    var digits = [
    "##### # ########### ########################## ",
    "# # # # ## ## # ## ## # ",
    "# # # # ## ## # ## ## # # ",
    "# # # ##### ################### ########### ",
    "# # # # # # ## # ## # # # ",
    "# # # # # # ## # ## # # ",
    "##### # ########## ########### ########### "
    ]

    然后可以把组成数字的#号替换成想要的元素,可以是小图片,也可以是其他。然后每次循环的时候根据时间的数字让数组里的#拼凑成当前所需的数字。

    function Cdigit(N,d){
    // digit prototype
    this.O = [];
    for(var i=0;i<7;i++){
    for(var j=0;j<5;j++){
    if(digits[i].charAt(5*d+j)!=" "){
    this.O.push(
    new CObj((
    ...
    )
    );
    }
    }
    }
    }

    基本思路就是这样子,然后在主循环里每次刷新时间的时候移除上一次的元素,重新拼凑就可以了。没有实例上面的话都是白说,还是给大家看看实例吧。(我只是做了稍微的封装,核心代码并没有改动原作者的),代码运行有问题的同学请自行拷到本地运行。(使用chrome的需拷到本地运行)

    调用方式:

    <div id="clock3D"></div>
    <script type="text/javascript"><!--
    new clock3D({
    id:
    'clock3D',
    direction:
    'right' // or 'left'
    });
    // --></script>

    【附赠】

    另外,附赠一个昨晚上随便写的一个仿twitter/新浪微博首页的 自动无缝滚动效果。


    调用方式:

    <script type="text/javascript">
    new slider({
    id:
    'slider', //必选:滚动ul的id
    auto:4 //可选,滚动间隙,默认3秒
    })
    </script>
  • 相关阅读:
    springboot整合mybatisplus
    在layui中使用treetable.js插件
    shiro系列9:基于前端的权限控制和基于后端的权限控制
    springboot文件上传案例
    springboot配置虚拟路径访问上传到磁盘的文件
    springboot文件下载案例
    springboot跨域的处理方式
    springboot上传文件过大的解决方案
    Django与Ajax
    Django查询数据库性能优化
  • 原文地址:https://www.cnblogs.com/hongru/p/1876990.html
Copyright © 2011-2022 走看看