Html+Css+js实现带有雪花飘落的许愿墙效果

this.canvas = document.createElement(‘canvas’);

this.ctx = this.canvas.getContext(‘2d’);

document.body.appendChild(this.canvas);

window.addEventListener(‘resize’, () => this.onResize());

this.onResize();

this.updateBound = this.update.bind(this);

requestAnimationFrame(this.updateBound);

this.createSnowflakes();

}

onResize() {

console.log(this.width, ‘width’);

console.log(this.height, ‘height’);

this.width = window.innerWidth;

this.height = window.innerHeight;

this.canvas.width = this.width;

this.canvas.height = this.height + 672;

}

createSnowflakes() {

const flakes = window.innerWidth / 4;

this.snowflakes = [];

for (let s = 0; s < flakes; s++) {

this.snowflakes.push(new Snowflake());

}

}

update() {

this.ctx.clearRect(0, 0, this.width, this.height);

for (let flake of this.snowflakes) {

flake.update();

this.ctx.save();

this.ctx.fillStyle = ‘#FFF’;

this.ctx.beginPath();

this.ctx.arc(flake.x, flake.y, flake.radius, 0, Math.PI * 2);

this.ctx.closePath();

this.ctx.globalAlpha = flake.alpha;

this.ctx.fill();

this.ctx.restore();

}

requestAnimationFrame(this.updateBound);

}

}

new Snow();

逻辑文件 (script.js)


//转换时间格式

function formatDated(date) {

var date = new Date(date);

var YY = date.getFullYear() + ‘-’;

var MM = (date.getMonth() + 1 < 10 ? ‘0’ +

(date.getMonth() + 1) : date.getMonth() + 1) + ‘-’;

var DD = (date.getDate() < 10 ? ‘0’ +

(date.getDate()) :

date.getDate());

var hh = (date.getHours() < 10 ? ‘0’ +

date.getHours() :

date.getHours()) + ‘:’;

var mm = (date.getMinutes() < 10 ? ‘0’ +

date.getMinutes() :

date.getMinutes()) + ‘:’;

var ss = (date.getSeconds() < 10 ? ‘0’ +

date.getSeconds() : date.getSeconds());

return YY + MM + DD +" "+hh + mm + ss;

}

function timeChange(){

var datas =[]

var idList=0;

var timer= setInterval(() => {

//控制文字的说明

for( i=0;i<2;i++){

datas.push({

id:idList,

name:“歌谣”,

content:" 在过往的岁月中,我遇到了形形色色的人和事情。有的人坚持,有的人放弃。有的人逆袭,有的人失败。最好的种树是十年前其次是现在。很高兴遇到你,愿你的人生多姿多彩,幸福绵绵,好事连连。歌谣很棒谢谢你的一键三连",

time:formatDated(new Date())

})

}

idList++

console.log(idList,“idList”)

if(idList==5){

clearInterval(timer)

}

var content = document.getElementById(“content”);

var zIndex = 1;

for (var i = 0; i < datas.length; i++) {

var data = datas[i];

var div = document.createElement(“div”);

div.className = “tip1”;

div.id = “cc” + data.id;

content.appendChild(div);

//设置随机数

let num=parseInt(Math.random()*10000)

div.innerHTML = ‘

  • 第’+num+‘条’+ data.time + ‘

  • ×

  • ‘’

  • data.content

  • ‘’

  • ‘’

  • ’ + data.name + ‘

  • ‘’;

// 控制贴纸的位置

var x = parseInt(Math.random() * 1500)+200;

var y = parseInt(Math.random() * 700);

div.style.left = x + “px”;

div.style.top = y + “px”;

div.onclick = function () {

zIndex++;

this.style.zIndex = zIndex;

};

var closeDiv = div.children[0];

closeDiv.ondblclick = function () {

this.parentNode.style.display = “none”;

};

var x = closeDiv.children[1];

x.onclick = function () {

this.parentNode.parentNode.style.display = “none”;

};

}

},2000)

}

window.onload = timeChange;

样式部分(style.css)


body {

margin: 0 auto;

padding: 0px;

font-size: 12px;

background: url(…/images/bg.gif) repeat center 36px;

text-align: center;

background-color: #c30230;

}

#content .tip1, #content .tip2, #content .tip3, #content

.tip4, #content .tip5, #content .tip6, #content .tip7, #content .tip8 {

position: absolute;

width: 227px;

left: 200px;

top: 100px;

}

#content .tip1 .tip_h {

background: url(…/images/tip1_h.gif) no-repeat left top;

}

#content .tip1 .tip_h, #content .tip2 .tip_h, #content .tip3 .tip_h,

#content .tip4 .tip_h, #content .tip5 .tip_h, #content .tip6 .tip_h,

#content .tip7 .tip_h, #content .tip8 .tip_h {

width: 227px;

padding-top: 45px;

height: 23px;

text-align: left;

cursor: move;

}

#content .tip1 .tip_c {

background: url(…/images/tip1_c.gif) repeat-y;

}

#content .tip1 .tip_c, #content .tip2 .tip_c, #content .tip3 .tip_c,

#content .tip4 .tip_c, #content .tip5 .tip_c, #content .tip6 .tip_c,

#content .tip7 .tip_c, #content .tip8 .tip_c {

width: 200px;

padding-left: 12px;

padding-right: 15px;

min-height: 40px;

text-align: left;

line-height: 20px;

max-height: 160px;

word-wrap: break-word;

word-break: break-all;

overflow: hidden;

}

#content .tip1 .tip_f {

background: url(…/images/tip1_f.gif) no-repeat left top;

}

#content .tip1 .tip_f, #content .tip2 .tip_f, #content .tip3 .tip_f,

#content .tip4 .tip_f, #content .tip5 .tip_f, #content .tip6 .tip_f,

#content .tip7 .tip_f, #content .tip8 .tip_f {

width: 227px;

height: 53px;

padding-top: 20px;

}

#content .close, #content .close2 {

float: left;

font-size: 12px;

cursor: pointer;

color: #000000;

}

.clr {

clear: both;

overflow: auto;

display: block;

height: 0px;

}

#content .icon {

float: left;

width: 35px;

padding-left: 15px;

height: 35px;

text-align: center;

}

#content .name {

float: right;

padding-right: 15px;

text-align: right;

font-size: 14px;

line-height: 35px;

color: #C0F;

}

#content .num {

float: left;

padding-left: 7px;

width: 195px;

}

骨架部分(html)


最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-rJ4lnGyw-1715363122469)]

[外链图片转存中…(img-mmk4ShbJ-1715363122470)]

[外链图片转存中…(img-nWaHZRzt-1715363122470)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值