[趣味代码] 全员恶人闪电文字特效
作者:CC下载站 日期:2018-10-15 04:02:36 浏览:2432 分类:站长帮
效果图:
代码演示:
<!doctype html> <html> <head> <meta charset="utf-8"> <title>闪电绘制文字动画特效</title> <style> .page-thunder-to-text { position: relative; overflow: hidden; } .page-thunder-to-text canvas { display: block; } .page-thunder-to-text input { position: absolute; bottom:50px; left:0; right:0; display: block; outline: none; background-color: rgba(38,50,56,0.2); color:#ffffff; border: none; width:50%; min-width:500px; max-width:100%; margin:auto; height:60px; line-height:60px; font-size:40px; padding:020px; } .page-thunder-to-text input:hover,.page-thunder-to-text input:focus { border:1px solid rgba(38,50,56,0.6); } .page-thunder-to-text input::-webkit-input-placeholder { color: rgba(255,255,255,0.1); } </style> </head> <body> <div class="page page-thunder-to-text"> <input id="input" type="text" maxlength="24" placeholder="星城哈哈 - 一个有温度的资源网站"> <canvas id="canvas"></canvas> </div> <script> let canvas, ctx, w, h, thunder, text, particles, input; functionThunder(options){ options = options ||{}; this.lifespan = options.lifespan ||Math.round(Math.random()*10+10); this.maxlife =this.lifespan; this.color = options.color ||'#fefefe'; this.glow = options.glow ||'#2323fe'; this.x = options.x ||Math.random()* w; this.y = options.y ||Math.random()* h; this.width = options.width ||2; this.direct = options.direct ||Math.random()*Math.PI *2; this.max = options.max ||Math.round(Math.random()*10+20); this.segments =[...newArray(this.max)].map(()=>{ return{ direct:this.direct +(Math.PI *Math.random()*0.2-0.1), length:Math.random()*20+80, change:Math.random()*0.04-0.02 }; }); this.update =function(index, array){ this.segments.forEach(s =>{(s.direct += s.change)&&Math.random()>0.96&&(s.change *=-1)}); (this.lifespan >0&&this.lifespan--)||this.remove(index, array); } this.render =function(ctx){ if(this.lifespan <=0)return; ctx.beginPath(); ctx.globalAlpha =this.lifespan /this.maxlife; ctx.strokeStyle =this.color; ctx.lineWidth =this.width; ctx.shadowBlur =32; ctx.shadowColor =this.glow; ctx.moveTo(this.x,this.y); let prev ={ x:this.x, y:this.y }; this.segments.forEach(s =>{ const x = prev.x +Math.cos(s.direct)* s.length; const y = prev.y +Math.sin(s.direct)* s.length; prev ={ x: x, y: y }; ctx.lineTo(x, y); }); ctx.stroke(); ctx.closePath(); ctx.shadowBlur =0; const strength =Math.random()*80+40; const light = ctx.createRadialGradient(this.x,this.y,0,this.x,this.y, strength); light.addColorStop(0,'rgba(250, 200, 50, 0.6)'); light.addColorStop(0.1,'rgba(250, 200, 50, 0.2)'); light.addColorStop(0.4,'rgba(250, 200, 50, 0.06)'); light.addColorStop(0.65,'rgba(250, 200, 50, 0.01)'); light.addColorStop(0.8,'rgba(250, 200, 50, 0)'); ctx.beginPath(); ctx.fillStyle = light; ctx.arc(this.x,this.y, strength,0,Math.PI *2); ctx.fill(); ctx.closePath(); } this.remove =function(index, array){ array.splice(index,1); } } functionSpark(options){ options = options ||{}; this.x = options.x || w *0.5; this.y = options.y || h *0.5; this.v = options.v ||{ direct:Math.random()*Math.PI *2, weight:Math.random()*14+2, friction:0.88}; this.a = options.a ||{ change:Math.random()*0.4-0.2, min:this.v.direct -Math.PI *0.4, max:this.v.direct +Math.PI *0.4}; this.g = options.g ||{ direct:Math.PI *0.5+(Math.random()*0.4-0.2), weight:Math.random()*0.25+0.25}; this.width = options.width ||Math.random()*3; this.lifespan = options.lifespan ||Math.round(Math.random()*20+40); this.maxlife =this.lifespan; this.color = options.color ||'#feca32'; this.prev ={ x:this.x, y:this.y }; this.update =function(index, array){ this.prev ={ x:this.x, y:this.y }; this.x +=Math.cos(this.v.direct)*this.v.weight; this.x +=Math.cos(this.g.direct)*this.g.weight; this.y +=Math.sin(this.v.direct)*this.v.weight; this.y +=Math.sin(this.g.direct)*this.g.weight; this.v.weight >0.2&&(this.v.weight *=this.v.friction); this.v.direct +=this.a.change; (this.v.direct >this.a.max ||this.v.direct <this.a.min)&&(this.a.change *=-1); this.lifespan >0&&this.lifespan--; this.lifespan <=0&&this.remove(index, array); } this.render =function(ctx){ if(this.lifespan <=0)return; ctx.beginPath(); ctx.globalAlpha =this.lifespan /this.maxlife; ctx.strokeStyle =this.color; ctx.lineWidth =this.width; ctx.moveTo(this.x,this.y); ctx.lineTo(this.prev.x,this.prev.y); ctx.stroke(); ctx.closePath(); } this.remove =function(index, array){ array.splice(index,1); } } functionParticles(options){ options = options ||{}; this.max = options.max ||Math.round(Math.random()*10+10); this.sparks =[...newArray(this.max)].map(()=>newSpark(options)); this.update =function(){ this.sparks.forEach((s, i)=> s.update(i,this.sparks)); } this.render =function(ctx){ this.sparks.forEach(s => s.render(ctx)); } } functionText(options){ options = options ||{}; const pool = document.createElement('canvas'); const buffer = pool.getContext('2d'); pool.width = w; buffer.fillStyle ='#000000'; buffer.fillRect(0,0, pool.width, pool.height); this.size = options.size ||100; this.copy =(options.copy ||`Hello!`)+' '; this.color = options.color ||'#cd96fe'; this.delay = options.delay ||5; this.basedelay =this.delay; buffer.font =`${this.size}px ComicSans MS`; this.bound = buffer.measureText(this.copy); this.bound.height =this.size *1.5; this.x = options.x || w *0.5-this.bound.width *0.5; this.y = options.y || h *0.5-this.size *0.5; buffer.strokeStyle =this.color; buffer.strokeText(this.copy,0,this.bound.height *0.8); this.data = buffer.getImageData(0,0,this.bound.width,this.bound.height); this.index =0; this.update =function(){ if(this.index >=this.bound.width){ this.index =0; return; } const data =this.data.data; for(let i =this.index *4; i < data.length; i +=(4*this.data.width)){ const bitmap = data[i]+ data[i +1]+ data[i +2]+ data[i +3]; if(bitmap >255&&Math.random()>0.96){ const x =this.x +this.index; const y =this.y +(i /this.bound.width /4); thunder.push(newThunder({ x: x, y: y })); Math.random()>0.5&& particles.push(newParticles({ x: x, y: y })); } } if(this.delay--<0){ this.index++; this.delay +=this.basedelay; } } this.render =function(ctx){ ctx.putImageData(this.data,this.x,this.y,0,0,this.index,this.bound.height); } } function loop(){ update(); render(); requestAnimationFrame(loop); } function update(){ text.update(); thunder.forEach((l, i)=> l.update(i, thunder)); particles.forEach(p => p.update()); } function render(){ ctx.globalCompositeOperation ='source-over'; ctx.globalAlpha =1; ctx.fillStyle ='#000000'; ctx.fillRect(0,0, w, h); // ctx.globalCompositeOperation ='screen'; text.render(ctx); thunder.forEach(l => l.render(ctx)); particles.forEach(p => p.render(ctx)); } (function(){ // canvas = document.getElementById('canvas'); input = document.getElementById('input'); ctx = canvas.getContext('2d'); w = window.innerWidth; h = window.innerHeight; canvas.width = w; canvas.height = h; thunder =[]; particles =[]; // text =newText({ copy:'Anh Yêu Em!' }); canvas.addEventListener('click',(e)=>{ const x = e.clientX; const y = e.clientY; thunder.push(newThunder({ x: x, y: y })); particles.push(newParticles({ x: x, y: y })); }); let cb =0; input.addEventListener('keyup',(e)=>{ clearTimeout(cb); cb = setTimeout(()=>{ text =newText({ copy: input.value }); },300); }); // loop(); })() </script> <div style="text-align:center;margin:50px 0; font:normal 14px/24px 'MicroSoft YaHei';"> <p></p> <p></p> </div> </body> </html>
猜你还喜欢
- 06-04 [站长技术] 如何开启WordPress Multisite多站点网络
- 03-29 [环境测试] Hexo部署GitHub Pages
- 03-22 [源码设置] 如何设置Xiuno BBS URL-Rewrite(伪静态设定)
- 03-06 [建站交流] PicGo + smms 构建图床
- 11-18 [emlog技巧] Emlog非插件显示评论者IP属地
- 11-09 [网站维护] WordPress 后台速度慢?加快仪表板速度的 15 种方法
- 11-09 [WordPress插件] 10 个最好用的 WordPress 聊天机器人插件(免费和付费)
- 11-09 [WordPress开发] 探索 WordPress 6.3 中的增强样板(Patterns)
- 11-09 [网站维护] 无需插件即可优化 WordPress 速度的 12 种策略
- 11-09 [网站安全] WordPress 安全统计:WordPress 到底有多安全?
- 09-20 [jsp技术] JSP ssm 特殊人群防走失系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
- 09-15 [Lightsail容器] AWS Lightsail VPS:一种在云中运行容器的简单方法
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[书籍] 【帛书版】合集
[老照片] 一万张珍贵历史老照片【jpg 40.4GB】
[素材] 2024新年春节烟花素材合集【PSD格式+PNG格式】
[美剧] 《生活大爆炸》S01-S12季合集 【1080P 蓝光原盘REMUX】 DTS-HD.MA.5.1 【外挂简英双语字幕】 742.8G
[电影] 茶馆(1982)蓝光原盘REMUX 内封简繁英.简中简繁四字幕【33.9G】本片根据老舍同名原著改编
[电视剧] 永夜星河(2024)【4K 2160P 杜比音效】国语中字【全32集完结】爱情,古装 又名 :黑莲花攻略手册
[影视合集] 《霍比特人》三部曲加长版合集 【4K 蓝光 HDR】 TrueHD.7.1 国语次世代+导评 【国配简繁英特效+导评中字五字幕】134G
[课程] 2024邓诚高三数学视频课【MP4 12.2GB】
[电视剧] 宿敌(2024)【完结】【4K / 臻彩视听 / 杜比音效】【廖凡/朱珠】【17.8G】
[影视合集] 【鹿鼎记 7个版本合集】【1984-2020】【4K、1080P、720P】【中文字幕】【278.5G】
[书籍] 彭子益医书合集 [PDF/DOC]
[动画] 2002《火影忍者》720集全【4K典藏版】+11部剧场版+OVA+漫画 内嵌简日字幕
[剧集] 《斯巴达克斯》1-4季合集 无删减版 1080P 内嵌简英特效字幕
[电影] 《变形金刚系列》七部合集 [4K HDR 蓝光] 国英双语音轨 [内封精品特效字幕]【典藏版】235G
[CG剧情] 《黑神话:悟空》158分钟CG完整剧情合集 4K120帧最高画质
[动画] 收藏版:1996-2024年名侦探柯南全系列1080P,含国配、日配双语版+26部剧场作品
[游戏] 黑神话悟空离线完整版+修改器
[电影] 《神奇动物在哪里三部合集》 4K REMUX原盘 [杜比视界] [国英双语音轨] 特效字幕 [171.1G]
[动画] 西游记 (1999) 动画版 4K 全52集 高清修复版 童年回忆
[电影] 我的阿勒泰 (2024) 4K内封简繁 全8集 9.57G
[电影] 《黄飞鸿》全系列合集
[Android] 开罗游戏 ▎像素风格的模拟经营的游戏厂商安卓游戏大合集
[游戏合集] 要战便战 v0.9.107 免安装绿色中文版
[电影] 【珍藏版】20世纪电影合集从1922年到1990年代,看看爷爷辈的电影是什么样合集约212G
[书籍] 彭子益医书合集 [PDF/DOC]
[系统]【黑果小兵】macOS Big Sur 11.0.1 20B50 正式版 with Clover 5126 黑苹果系统镜像下载
[美图] 【经典收藏美图集合】1500多张韩国美女高清图片让你的收藏夹更加丰富多彩
[瓜] 青岛【路虎女】插队、逆行、追尾、打人未删减【完整版视频】
[电视剧] 灵魂摆渡(1-3季合集)【未删减】【4K.无水印】【剧情/恐怖/惊悚】【豆瓣8.7】
[书籍资料] 《玉房秘诀》《玉房秘典》《古代房中术》
- 最新评论
-
电影很不错谢谢分享贪睡的猫 评论于:11-18 一部不错的经典科幻kelvin 评论于:11-13 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢285552528 评论于:11-09 找了好久的资源bjzchzch12 评论于:11-07 谢谢分享感谢ppy2016 评论于:11-05 谢谢分享感谢ppy2016 评论于:11-05 有靳东!嘻嘻奥古斯都.凯撒 评论于:10-28 流星花园是F4处女作也是4人集体搭配的唯一一部!奥古斯都.凯撒 评论于:10-28 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢AAAAA 评论于:10-26 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢password63 评论于:10-26
- 热门tag