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>
目录
相关文章
|
3月前
|
前端开发 开发者 UED
设备像素、css像素、设备独立像素、dpr、ppi之间的区别
【10月更文挑战第24天】在实际应用中,这些概念相互关联,共同影响着网页在不同设备上的显示表现。开发者需要了解它们之间的区别和关系,以便更好地进行网页设计和优化,确保在各种设备上都能提供良好的用户体验。
|
5月前
|
计算机视觉
摄像头的宽度为640 巡线
【9月更文挑战第24天】
48 7
|
9月前
|
移动开发 前端开发 HTML5
使用canvas绘制超炫时钟
使用canvas绘制超炫时钟
40 3
使用canvas绘制超炫时钟
时钟(分针和时针的重合问题)
时钟(分针和时针的重合问题)
111 1
|
前端开发 JavaScript
CSS动画篇之炫酷时钟之时钟墙
CSS动画篇之炫酷时钟之时钟墙
102 1
|
前端开发
WebGL光照、贴图和帧缓冲
WebGL光照、贴图和帧缓冲
|
前端开发
canvas炫酷转盘时钟
canvas炫酷转盘时钟,拿来即用
89 0
canvas炫酷转盘时钟
|
传感器 数据采集
STM32 BMP280模块 获取气压温度高度传感器数据
STM32 BMP280模块 获取气压温度高度传感器数据 TFT显示
345 0
|
移动开发 前端开发 Shell
使用canvas绘制时钟
使用canvas绘制时钟
109 0
|
传感器 算法 物联网
5_3_2_陀螺仪小球_硬件讲解|学习笔记
快速学习5_3_2_陀螺仪小球_硬件讲解。
165 0
5_3_2_陀螺仪小球_硬件讲解|学习笔记