气泡图, 用图片组成名字,canvas应用demo

本文若对你有用,给个免费 Star 和关注,持续输出前端各种稀奇古怪的问题

这两天学了一下canvas,用气泡画自己(的名字), 做为练习的小demo, 对代码进行了详细的注释

所实现的效果如图

气泡.gif

代码如下,注释齐全, 粘贴即用:

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>顾成才</title>
  <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
  <style type="text/css">
    html,
    body { width: 100%; height: 100%; position: relative; margin: 0; padding: 0; background: #333; }
    .container { width: 100%;height: 100%;position: absolute;z-index: 2; }
    .canvas { width: 100%;height: 100%; position: absolute;z-index: 1;filter: blur(5px);left: 50%; top: 50%; transform: translate(-50%, -50%); }
    .bubble { position: absolute; animation-timing-function: linear; animation-name: floating; animation-iteration-count: infinite; }
    .btn-box { width: 100%; height: 100%; }
    @keyframes floating {
      0% { transform: translateY(0px); }
      50% { transform: translateY(-5px); }
      100% { transform: translateY(0px); }
    }
  </style>
</head>

<body>
  <div class="container-fluid">
    <div class="form-inline row">
      <input id="input1" type="text" class="form-control" style="width: 200px" placeholder="文字(不限,气泡)">
      <div class="glyphicon glyphicon-plus" style="color: white;"></div>
      <input id="input2" type="number" class="form-control" style="width: 200px" placeholder="文字大小(数字,80)">
      <div class="glyphicon glyphicon-plus" style="color: white;"></div>
      <input id="input5" type="text" class="form-control" style="width: 200px" placeholder="字体(不限,楷体)">
      <div class="glyphicon glyphicon-plus" style="color: white;"></div>
      <input id="input6" type="number" class="form-control" style="width: 200px" placeholder="气泡大小(数字, 20)">
      <div class="glyphicon glyphicon-plus" style="color: white;"></div>
      <input id="input3" type="number" class="form-control" style="width: 200px" placeholder="气泡图大小(数字, 5)">
      <div class="glyphicon glyphicon-plus" style="color: white;"></div>
      <input id="input4" type="number" class="form-control" style="width: 200px" placeholder="气泡稀疏程度(数字, 2)">
      <button type="button" class="btn btn-info" onclick="editConfig()">修改</button>
    </div>
    <div id='container'></div>
    <canvas id='canvas'></canvas>
  </div>
</body>

<script type="text/javascript">
  window.onload = function () {
    drawDragonImageInCanvas();
  }
  function drawDragonImageInCanvas(text,fontSize, bubbleNum, bubbleBig, thick, fontFamily) {
    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");
    ctx.fillStyle = "#000"
    console.log('', (fontSize||'80') + "px"+  (fontFamily||'楷体'));
    ctx.font = (fontSize||'80') + "px "+  (fontFamily||'楷体');
    ctx.fillText(text||'气泡', 10, 140);
    // getImageData() 方法返回 ImageData 对象,该对象拷贝了画布指定矩形的像素数据。
    let arr = []
    var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;

    ctx.clearRect(0, 0, canvas.width, canvas.height);
    // 10像素以内相同黑点为一个气泡 gap 越大,气泡越2稀疏
    var gap = thick||3;
    var dragonContainer = document.getElementById("container");
    dragonContainer.innerHTML = ''
    // // 放大 dragonScale 越大气泡图越大
    var dragonScale = bubbleNum||5;
    for (var h = 0; h < canvas.height; h += gap) {
      for (var w = 0; w < canvas.width; w += gap) {
        // imageData 数组,按顺序每四个一组 r g b a 
        // position 为第一层 w*4, 第二层 (canvas.width + w)*4
        var position = (canvas.width * h + w) * 4;
        var r = imageData[position], g = imageData[position + 1], b = imageData[position + 2];
        // 纯黑色, 即rgb(0,0,0)
        if (imageData[position + 3]!==0) {
          var bubble = document.createElement("img");
          bubble.src = "https://upload-images.jianshu.io/upload_images/24042207-fd685c9a66faa4bb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240";
          // 设置 气泡标签 的 bubble 类
          bubble.setAttribute("class", "bubble");
          // 气泡大小 20-30px
          var bubbleSize = Math.random() * 10 + (~~bubbleBig||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
          dragonContainer.appendChild(bubble);
        }
      }
    }
  }
  function editConfig(){
    let input1 = document.getElementById('input1').value
    let input2 = document.getElementById('input2').value
    let input3 = ~~document.getElementById('input3').value
    let input4 = ~~document.getElementById('input4').value
    let input5 = document.getElementById('input5').value
    let input6 = document.getElementById('input6').value
    drawDragonImageInCanvas(input1,input2, input3, input6, input4, input5)
  }
</script>
</html>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容