产品经理:你能不能用div给我画条龙?

简介: 事情是这样的,前天上午产品经理说想要做一个心愿墙,问我能不能行我心想,这太容易了,但为了多摸一天鱼,我说还是有点挑战的结果下午,产品经理和设计师就给我发来了设计参考

拆解需求


遇到不靠谱的产品经理和设计师,前端工程师真是惨。我们顶着最后交付成品的巨锅,所有deadline感觉都只是用来压榨前端工程师的。


我们只能靠自己,因为


谁都不能阻止我摸鱼


  • 需求1:有鼠标交互效果(太简单)


  • 需求2:气泡要浮动(css动画,easy)


  • 需求3:气泡组成一条龙


此时我脑海里响起这首烂大街的歌


左边跟我一起画个龙,在你右边画一道彩虹~


诶,画个龙

用什么画,canvas

canvas能获得指定区域的像素点阵


卧槽,有招儿了


代码时间


先用图片搜索找一张龙的剪影


image.png


image.png


将图片绘制到canvas中


var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var image = new Image();
image.src = "dragon.jpg";
image.onload = function(){
        canvas.width = image.width;
        canvas.height = image.height;
        ctx.drawImage(image,0,0);
}


获取并裁剪画布的点阵信息


var imageData = ctx.getImageData(0,0,image.width,image.height).data;
ctx.fillStyle = "#ffffff";
ctx.fillRect(0,0,image.width,image.height);
var gap = 6;
for (var h = 0; h < image.height; h+=gap) {
    for(var w = 0; w < image.width; w+=gap){
            var position = (image.width * h + w) * 4;
            var r = imageData[position], g = imageData[position + 1], b = imageData[position + 2];
            if(r+g+b==0){
                    ctx.fillStyle = "#000";
                    ctx.fillRect(w,h,4,4);
                }
    }
}


现在我们获得了这样一条龙的点阵信息


image.png


通过点阵信息生成气泡dom


var dragonContainer = document.getElementById("container");
var dragonScale = 2;
for (var h = 0; h < image.height; h+=gap) {
    for(var w = 0; w < image.width; w+=gap){
            var position = (image.width * h + w) * 4;
            var r = imageData[position], g = imageData[position + 1], b = imageData[position + 2];
            if(r+g+b==0){
                    var bubble = document.createElement("img");
                    bubble.src = "bubble.png";
                    bubble.setAttribute("class","bubble");
                    var bubbleSize = Math.random()*10+20;
                    bubble.style.left = (w*dragonScale-bubbleSize/2) + "px";
                    bubble.style.top = (h*dragonScale-bubbleSize/2) + "px";
                    bubble.style.width = bubble.style.height = bubbleSize+"px";
                    bubble.style.animationDuration = Math.random()*6+4 + "s";
                    dragonContainer.appendChild(bubble);
                }
    }
}


image.png


开心摸鱼吧


本例里使用div绘制大量的dom,仅为阐述思路,没考虑性能。利用一些js游戏引擎,比如pixi等,可以很方便的全部交由canvas去绘制并添加交互。



相关文章
|
10月前
|
小程序
公众号如何添加附传Word、Excel、Pdf、PPT文档
公众号里添加一些文档给公众号粉丝下载,比如课件PPT、申请表Word文档、岗位需求Excel表、大赛入围/获奖名单等。公众号本身是不支持直接上传文件的,但我们可以通过附件小程序“间接”上传文件。
1523 0
|
Python
探索 Python 中链表的实现:从基础到高级
链表是一种由节点组成的基础数据结构,每个节点包含数据和指向下一个节点的引用。本文通过Python类实现单向链表,详细介绍了创建、插入、删除节点等操作,并提供示例代码帮助理解。链表在处理动态数据时具有高效性,适用于大量数据变动的场景。文章为初学者提供了全面的入门指南,助你掌握链表的核心概念与应用。
874 0
|
人工智能
技术心得记录:关于自补图的认识和构造(无证明)
技术心得记录:关于自补图的认识和构造(无证明)
993 0
|
人工智能 程序员 测试技术
AI编程:Coze + Cursor实现一个思维导图的浏览器插件
本文是小卷关于AI编程工具学习的第3篇文章,通过开发一个思维导图生成工具,详细介绍了AI编程的完整流程。从需求分析、插件选择(如Coze的TreeMind),到创建测试工作流、发布API,再到整合API和开发浏览器插件,最终实现了用户选中文字后生成思维导图的功能。文章展示了如何利用现有工具高效开发,并总结了AI编程的优势与未来趋势。
1699 14
|
存储 数据管理 数据安全/隐私保护
云存储:云计算储存
云存储是基于互联网的分布式数据存储服务,允许用户远程存储、访问和管理数据。它通过多台虚拟服务器提供存储空间,支持多种服务模式如对象存储、块存储等,广泛应用于文件共享、数据备份、在线办公等领域,市场规模持续扩大,技术不断进步,未来将更加智能、安全和灵活。
6033 9
|
人工智能 C语言
一则有意思的AI错误
本文记录了豆包AI在回答关于C语言内存分配问题时的错误过程。首次询问时,AI给出了错误的回答;经过两次追问和纠正后,AI才给出正确的答案。文中附有提问过程的完整截图和相关代码,分析了问题的原因,并探讨了AI在处理这类问题时的局限性。
|
编解码 JavaScript
【vue2】vue2 适配pc端,解决浏览器缩放问题,解决电脑显示设置缩放、分辨率问题
【vue2】vue2 适配pc端,解决浏览器缩放问题,解决电脑显示设置缩放、分辨率问题
2243 1
|
定位技术
echarts 地图点位
在使用ECharts的点击事件绑定中,观察到每次点击会递增一次后台请求:首次点击请求1次,第二次点击请求2次,第三次点击请求3次,以此类推。为解决这个问题,尝试在事件绑定前使用`myChart.off(&#39;click&#39;)`移除原有监听器,然后添加新的点击事件处理函数。
464 0
|
机器学习/深度学习 算法 Python
深度学习初遇——自己动手实现三层神经网络
深度学习初遇——自己动手实现三层神经网络
783 4
|
SQL JSON 前端开发
中台框架模块开发实践-用 Admin.Core 代码生成器生成通用代码生成器的模块代码
可以看到这里只生成了后端接口,目前 v8.2.0 还不支持前端代码的生成,所以我们还需要手动去将对应版本的 前端代码 下载一份到项目中(只保留),并调整下目录结构,前端代码放到 admin-ui ,后端代码放到 admin-api 运行前后端项目,确认项目运行没问题后开始添加通用代码生成器模块代码。后续任意模块代码都可以参考步骤 1.后端项目引用关系配置 • 将生成的模块代码 ZhonTai.Module.Dev 拷贝到在新项目中 修改库中的引用,默认生成的 ZhonTai.Module.Dev.csproj 引用是相对源码的路径 • 所以需要修改下,直接引用 ZhonTai.Admin 的包
688 0