canvas颗粒时钟

简介: 使用canvas做一个颗粒时钟,附带动态效果
<!doctypehtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><metahttp-equiv="X-UA-Compatible"content="ie=edge"><title>颗粒时钟</title></head><style>* {
margin: 0;
padding: 0;
    }
html,body{
overflow: hidden;
    }
canvas {
background: radial-gradient(#fff, #8c738c);display: block;
    }
</style><body><canvas></canvas></body></html><script>constcanvas=document.querySelector('canvas')
constctx=canvas.getContext('2d', {
willReadFrequently: true    })
//颗粒数量constPARTICLE_NUM=15000//绘制的文本lettext=''//绘制的文本字体大小constFONT_SIZE=140;
//颗粒对象形成的数组constparticles=newArray(PARTICLE_NUM)
//颗粒颜色constCOLOR='#5445544d';
//随机尺寸范围constSIZES= [2, 7];
//开始移动时间letstartMoveTime=0;
//获取【min,max】范围内的随机整数functiongetRandom(min, max) {
returnMath.floor(Math.random() * (max+1-min) +min);
    }
//初始化functioninit() {
//初始话画布canvas.width=window.innerWidth;
canvas.height=window.innerHeight;
//初始化颗粒对象数组constcx=canvas.width/2,
cy=canvas.height/2;
for (leti=0; i<particles.length; i++) {
constrad=Math.random() *2*Math.PI;
constsize=getRandom(SIZES[0], SIZES[1]);
constr=canvas.height/2;
particles[i] = {
sx: cx+Math.cos(rad) *r,
sy: cy+Math.sin(rad) *r,
x: cx+Math.cos(rad) *r,
y: cy+Math.sin(rad) *r,
size            };
drawParticle(particles[i])
        }
    }
//刷新绘制functionfps() {
requestAnimationFrame((time) => {
//要绘制的文本constcurText=getText();
if (curText!==text) {
text=curText;//更新文本//文本发生变化,颗粒开始移动//更新颗粒的起始坐标for (constpofparticles) {
p.sx=p.x;
p.sy=p.y;
                }
startMoveTime=Date.now()
            }
//获取像素点constimgData=getBMP();
//更新绘制update(imgData);
fps()
        })
    }
fps()
functiondrawParticle(p) {
ctx.fillStyle=COLOR;
ctx.beginPath();
ctx.arc(p.x, p.y, p.size, 0, Math.PI*2,true)
ctx.closePath();
ctx.fill()
    }
functiongetText() {
// console.log(new Date().toLocaleString())// let day = Date().toLocaleDateString()+ '-' + Date().toLocaleTimeString()// return new  day;varnow=newDate();
varyear=now.getFullYear();       //年varmonth=now.getMonth() +1;     //月varday=now.getDate();            //日varhh=now.getHours();            //时varmm=now.getMinutes();          //分varss=now.getSeconds(); //获取当前秒varclock=year+"-";
if(month<10)
clock+="0";
clock+=month+"-";
if(day<10)
clock+="0";
clock+=day+" ";
if(hh<10)
clock+="0";
clock+=hh+":";
if (mm<10) clock+='0';
if (ss<10) clock+='0';
clock+=mm+":"+ss;
return(clock);
    }
functiongetBMP() {
const {width, height} =canvas;
clear()
ctx.fillStyle='#fff';
ctx.textBaseline='middle';
ctx.font=`${FONT_SIZE}px '手札体-简', sans-serif`;
consttextWidth=ctx.measureText(text).width;
ctx.fillText(text, (width-textWidth) /2, height/2);
constimgData=ctx.getImageData(0, 0, width, height)
returnimgData    }
functionupdate(imgData) {
clear();
const {width, height, data} =imgDataconstdis=4constpxls= [];
for (letw=0; w<width; w+=dis) {
for (leth=0; h<height; h+=dis) {
consti= (w+h*width) *4;
if (data[i] >10) {
pxls.push([w, h]);
                }
            }
        }
constcount=Math.min(particles.length , pxls.length)
constduration=400;
consttimeSpan=Date.now() -startMoveTimefor (leti=0; i<count; i++) {
constp=particles[i];
constsx=p.sx;
constsy=p.sy;
consttx=pxls[i][0];
constty=pxls[i][1];
constdisX=tx-sx,
disY=ty-sy;
letmoveX= (disX/duration) *timeSpan,
moveY= (disY/duration) *timeSpan;
if (Math.abs(moveX) >Math.abs(disX)){
moveX=disX            }
if (Math.abs(moveY) >Math.abs(disY)){
moveY=disY            }
p.x=sx+moveX;
p.y=sy+moveY;
drawParticle(p)
        }
    }
functionclear() {
const {width , height} =canvas;
ctx.clearRect(0,0,width,height);
    }
init();
</script>
目录
相关文章
|
6月前
BJT放大电路
BJT放大电路是指使用双极型晶体管(BJT)作为主要放大元件的电路。BJT是一种常见的活性元件,具有放大信号的能力,因此广泛应用于各种放大电路中。
96 0
|
6月前
放大电路频率响应
放大电路的频率响应是指输入信号在不同频率下经过放大电路后的输出信号的变化情况。频率响应通常以幅频特性和相频特性表示。
64 0
|
5月前
时钟(分针和时针的重合问题)
时钟(分针和时针的重合问题)
38 1
|
6月前
场效应管及其放大电路
场效应管(Field Effect Transistor,简称FET)是一种三端器件,由栅极、漏极和源极组成。它的工作原理是利用栅极电压控制漏极-源极电流,从而实现信号的放大和开关控制。
50 0
|
6月前
BJT的三种基本放大电路和复合管
BJT的三种基本放大电路是共发射极放大电路(Common Emitter Amplifier)、共集电极放大电路(Common Collector Amplifier)和共基极放大电路(Common Base Amplifier)。
147 0
|
6月前
|
传感器
反相放大电路的介绍
一、反相放大电路的原理 反相放大电路是基于放大器的输入端和输出端之间的差动运算实现的。它的基本原理是将输入信号通过电阻网络输入到放大器的反相输入端,经过放大后,再输出到放大器的输出端。放大器的作用是将输入信号放大,并输出其相反的信号。 二、反相放大电路的特点 1. 放大倍数可调:反相放大电路可以通过调整电阻值来改变放大倍数,满足不同应用场景的需求。 2. 相位反转:反相放大电路可以将输入信号进行相位反转,输出其相反的信号,适用于需要反向控制或反向操作的应用。 3. 简单实用:反相放大电路的结构简单,易于实现和调试,成本较低。 4. 高稳定性:反相放大电路具有较高的稳定性和线性度,能够准确地放大
239 1
|
8月前
|
前端开发 JavaScript
CSS动画篇之炫酷时钟之时钟墙
CSS动画篇之炫酷时钟之时钟墙
57 1
|
10月前
|
C++
几种基本放大电路详解
几种基本放大电路详解
181 0
|
10月前
|
传感器 数据采集
STM32 BMP280模块 获取气压温度高度传感器数据
STM32 BMP280模块 获取气压温度高度传感器数据 TFT显示
205 0
|
12月前
|
移动开发 前端开发 Shell
使用canvas绘制时钟
使用canvas绘制时钟
59 0