zoukankan      html  css  js  c++  java
  • 显示时间特效

    我很早之前2018-6月做了一个钟表显示时间,也发表了博客,当时效果如图:

    手表预览地址:https://wangxiaoer5200.github.io/web_project/web/clock.html

    时间预览地址:https://wangxiaoer5200.github.io/learning/timeRender/index.html
    今天要实现的这个的效果如图:



    今天时间特效我也是从网上找的一个canvas实现 然后自己改了点东西,因为觉得有趣所以记录下来:

    html: <canvas id="canvas" style="height:100%"></canvas>
    js:

    data = [
    [
    [0, 0, 1, 1, 1, 0, 0],
    [0, 1, 1, 0, 1, 1, 0],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 1, 1, 0, 1, 1, 0],
    [0, 0, 1, 1, 1, 0, 0]
    ],
    [
    [0, 0, 1, 1, 0, 0, 0],
    [0, 1, 1, 1, 0, 0, 0],
    [0, 0, 1, 1, 0, 0, 0],
    [0, 0, 1, 1, 0, 0, 0],
    [0, 0, 1, 1, 0, 0, 0],
    [0, 0, 1, 1, 0, 0, 0],
    [0, 0, 1, 1, 0, 0, 0],
    [0, 0, 1, 1, 0, 0, 0],
    [0, 0, 1, 1, 0, 0, 0],
    [1, 1, 1, 1, 1, 1, 0]
    ],
    [
    [0, 1, 1, 1, 1, 1, 0],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 0, 1, 1, 0, 0, 0],
    [0, 1, 1, 0, 0, 0, 0],
    [1, 1, 0, 0, 0, 0, 0],
    [1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1]
    ],
    [
    [0, 1, 1, 1, 1, 1, 0],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 1, 1, 1, 1, 1, 0]
    ],
    [
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 1, 1, 1, 0],
    [0, 0, 1, 1, 1, 1, 0],
    [0, 1, 1, 0, 1, 1, 0],
    [1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1],
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 0, 1, 1, 0]
    ],
    [
    [1, 1, 1, 1, 1, 1, 1],
    [1, 1, 0, 0, 0, 0, 0],
    [1, 1, 0, 0, 0, 0, 0],
    [1, 1, 0, 0, 0, 0, 0],
    [1, 1, 1, 1, 1, 1, 0],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 0],
    [0, 1, 1, 1, 1, 0, 0]
    ],
    [
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 0, 1, 1, 0, 0, 0],
    [0, 1, 1, 0, 0, 0, 0],
    [1, 1, 0, 0, 0, 0, 0],
    [1, 1, 0, 1, 1, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 0, 1, 1, 1, 1, 0]
    ],
    [
    [1, 1, 1, 1, 1, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1]
    ],
    [
    [0, 0, 1, 1, 1, 0, 0],
    [0, 1, 1, 0, 1, 1, 0],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 1, 1, 1, 1, 1, 0],
    [0, 1, 1, 1, 1, 1, 0],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 1, 1, 0, 1, 1, 0],
    [0, 0, 1, 1, 1, 0, 0]
    ],
    [
    [0, 0, 1, 1, 1, 0, 0],
    [0, 1, 1, 0, 1, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 1, 1, 1, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1]
    ],
    [
    [0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 1, 0, 0, 0],
    [0, 0, 1, 1, 1, 0, 0],
    [0, 0, 0, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 1, 0, 0, 0],
    [0, 0, 1, 1, 1, 0, 0],
    [0, 0, 0, 1, 0, 0, 0]
    ]
    ];

    var WINDOW_WIDTH;
    var WINDOW_HEIGHT;
    var R;
    var MAEGIN_TOP;
    var MAEGIN_LEFT;
    var time;
    var year = new Date().getFullYear();
    var month = new Date().getMonth();
    var day = new Date().getDate();
    const nowDate = new Date(year, month, day, 0, 0, 0);
    var curShowTimeSeconds = 0;

    var balls = [];
    const colors = [
    '#409EFF',
    '#67C23A',
    '#E4E7ED',
    '#E6A23C',
    '#909399',
    '#909399',
    '#F56C6C'
    ];

    window.onload = () => {
    Init();
    };

    window.onresize = () => {
    clearInterval(time);
    Init();
    };

    function Init() {
    WINDOW_WIDTH = document.body.clientWidth;
    WINDOW_HEIGHT = document.body.clientHeight;
    MAEGIN_LEFT = Math.round(WINDOW_WIDTH / 10);
    R = Math.round((WINDOW_WIDTH * 4) / 5 / 108) - 1;
    MAEGIN_TOP = Math.round(WINDOW_HEIGHT / 10);

    var canvas = document.getElementById('canvas');
    var context = canvas.getContext('2d');
    canvas.width = WINDOW_WIDTH;
    canvas.height = WINDOW_HEIGHT;
    curShowTimeSeconds = getCurShowTimeSeconds();
    time = setInterval(() => {
    render(context);
    update();
    }, 50);
    }

    function update() {
    var nextShowTimeseconds = getCurShowTimeSeconds();

    var h = parseInt(curShowTimeSeconds / 3600);
    var m = parseInt((curShowTimeSeconds - h * 3600) / 60);
    var s = curShowTimeSeconds % 60;

    var hs = parseInt(nextShowTimeseconds / 3600);
    var ms = parseInt((nextShowTimeseconds - h * 3600) / 60);
    var ss = nextShowTimeseconds % 60;

    if (s != ss) {
    if (parseInt(h / 10) != parseInt(hs / 10)) {
    Addball(MAEGIN_TOP, MAEGIN_LEFT, parseInt(hs / 10));
    }
    if (parseInt(h % 10) != parseInt(hs % 10)) {
    Addball(MAEGIN_TOP, MAEGIN_LEFT + 15 * (R + 1), parseInt(hs % 10));
    }
    if (parseInt(m / 10) != parseInt(ms / 10)) {
    Addball(MAEGIN_TOP, MAEGIN_LEFT + 39 * (R + 1), parseInt(ms / 10));
    }
    if (parseInt(m % 10) != parseInt(ms % 10)) {
    Addball(MAEGIN_TOP, MAEGIN_LEFT + 54 * (R + 1), parseInt(hs % 10));
    }
    if (parseInt(s / 10) != parseInt(ss / 10)) {
    Addball(MAEGIN_TOP, MAEGIN_LEFT + 78 * (R + 1), parseInt(ss / 10));
    }
    if (parseInt(s % 10) != parseInt(ss % 10)) {
    Addball(MAEGIN_TOP, MAEGIN_LEFT + 93 * (R + 1), parseInt(ss % 10));
    }
    curShowTimeSeconds = nextShowTimeseconds;
    }
    updateBalls();
    }

    function Addball(top, left, content) {
    for (let i = 0; i < data[content].length; i++) {
    for (let j = 0; j < data[content][i].length; j++) {
    if (data[content][i][j] == 1) {
    let nums = Math.floor(Math.random() * 4);
    balls.push({
    x: left + 2 * j * (R + 1) + (R + 1),
    y: top + 2 * i * (R + 1) + (R + 1),
    g: 1.5 + Math.random(),
    vx: Math.pow(-1, nums) * 4,
    vy: nums * -4,
    colors: colors[Math.floor(Math.random() * colors.length)]
    });
    }
    }
    }
    }

    function updateBalls() {
    for (let i = 0; i < balls.length; i++) {
    balls[i].x += balls[i].vx;
    balls[i].y += balls[i].vy;
    balls[i].vy += balls[i].g;
    if (balls[i].y >= WINDOW_HEIGHT - R) {
    balls[i].y = WINDOW_HEIGHT - R;
    balls[i].vy = -balls[i].vy * 0.75;
    }
    }
    let cur = 0;
    for (let i = 0; i < balls.length; i++) {
    if (balls[i].x + R > 0 && balls[i].x - R < WINDOW_WIDTH) {
    balls[cur++] = balls[i];
    }
    }

    while (balls.length > cur) {
    balls.pop();
    }
    }

    function getCurShowTimeSeconds() {
    var curTime = new Date();
    var ret = curTime.getTime()-nowDate.getTime();
    ret = Math.round(ret / 1000);
    return ret >= 0 ? ret : 0;
    }

    function render(context) {
    context.clearRect(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
    var h = parseInt(curShowTimeSeconds / 3600);
    var m = parseInt((curShowTimeSeconds - h * 3600) / 60);
    var s = curShowTimeSeconds % 60;
    renderDight(MAEGIN_LEFT, MAEGIN_TOP, parseInt(h / 10), context);
    renderDight(
    MAEGIN_LEFT + 15 * (R + 1),
    MAEGIN_TOP,
    parseInt(h % 10),
    context
    );
    renderDight(MAEGIN_LEFT + 27 * (R + 1), MAEGIN_TOP, 10, context);
    renderDight(
    MAEGIN_LEFT + 39 * (R + 1),
    MAEGIN_TOP,
    parseInt(m / 10),
    context
    );
    renderDight(
    MAEGIN_LEFT + 54 * (R + 1),
    MAEGIN_TOP,
    parseInt(m % 10),
    context
    );
    renderDight(MAEGIN_LEFT + 67 * (R + 1), MAEGIN_TOP, 10, context);
    renderDight(
    MAEGIN_LEFT + 78 * (R + 1),
    MAEGIN_TOP,
    parseInt(s / 10),
    context
    );
    renderDight(
    MAEGIN_LEFT + 93 * (R + 1),
    MAEGIN_TOP,
    parseInt(s % 10),
    context
    );

    for (let s = 0; s < balls.length; s++) {
    context.fillStyle = balls[s].colors;
    context.beginPath();
    context.arc(balls[s].x, balls[s].y, R, 0, 2 * Math.PI);
    context.closePath();
    context.fill();
    }
    }

    function renderDight(x, y, num, cxt) {
    cxt.fillStyle = 'rgb(0,102,153)';
    for (let i = 0; i < data[num].length; i++) {
    for (let j = 0; j < data[num][i].length; j++) {
    if (data[num][i][j] == 1) {
    cxt.beginPath();
    cxt.arc(
    x + j * 2 * (R + 1) + (R + 1),
    y + i * 2 * (R + 1) + (R + 1),
    R,
    0,
    2 * Math.PI
    );
    cxt.closePath();
    cxt.fill();
    }
    }
    }
    }

    具体代码可以看我github的;

  • 相关阅读:
    Apache安装与属性配置
    Web服务及http协议
    转-httpd 2.4.4 + mysql-5.5.28 + php-5.4.13编译安装过程
    LAMP理论整理
    Rhel6-csync配置文档
    转载Eclipse中Maven WEB工程tomcat项目添加调试
    转载--eclipse git插件安装
    l连接远程桌面
    Aphache VFS
    JMS-activeMQ
  • 原文地址:https://www.cnblogs.com/wangxiaoer5200/p/11936607.html
Copyright © 2011-2022 走看看