原文  http://www.imququ.com/post/use-canvas-as-background-image.html

最近iCloud Web的Beta版换了UI,整体风格变得和iOS7一致了。首页图标下方漂浮着若干大小不一的泡泡,十分梦幻。大家可以访问 beta.icloud.com 体验下,如果觉得泡泡不够多,还可以加上 crazyAwesome 参数让泡泡变得更加疯狂。

上面提到的泡泡效果,有许多种实现方案。本文要讨论的是iCloud使用的Canvas绘制背景图方案。这样做的好处是,用代码绘制背景图,相比图片更灵活,也更省流量。另外,不知道大家有没留意到iCloud Web中的日历图标是根据当前日期和星期几动态生成的,下面Demo中有这个图标的实现。

canvas.toDataURL

大家知道,一般我们可以用图片、SVG和颜色渐变来做为元素的背景图(background-image属性)。在Canvas中,可以通过 toDataURL() 方法,把图像导出为 data类型的URL ,这个URL可以直接用做背景图。下面有个简单的例子:

<div style="width:200px;height:200px;" id="cloud">红心是我的背景图!</div>
<canvas style="display:none;" id="can" width="200" height="200"></canvas>
<script>
(function() {var canvas = document.getElementById('can'), context;if(!canvas.getContext) {alert('你的浏览器不支持canvas!');return;}context = canvas.getContext('2d');context.fillStyle = 'red';context.beginPath();context.moveTo(75,40);context.bezierCurveTo(75,37,70,25,50,25);context.bezierCurveTo(20,25,20,62.5,20,62.5);context.bezierCurveTo(20,80,40,102,75,120);context.bezierCurveTo(110,102,130,80,130,62.5);context.bezierCurveTo(130,62.5,130,25,100,25);context.bezierCurveTo(85,25,75,37,75,40);context.fill();document.getElementById('cloud').style.backgroundImage = 'url("' + context.canvas.toDataURL() + '")';
})();
</script>

这是使用本方案实现的 iCloud日历图标 ,支持Canvas的浏览器都可以正常显示。

用Canvas绘制背景图,将Canvas强大的绘图能力与灵活的CSS背景图很好的结合起来,强大但不完美。例如多个元素使用同一个Canvas背景时,无论是分开设置背景图,还是创建临时Style,都很麻烦。如果想把一个Canvas动画作为元素背景,需要不断获取DataURL再赋给元素,更加不方便。

有没有更好的办法可以把一个或多个html元素与Canvas绑定起来,在Canvas内容改变时自动更新html元素呢?答案是肯定的。

-webkit-canvas

对于上面的问题,Webkit提出了一个自己的实现方案:-webkit-canvas。Safari4+、Chrome4+的background-image都支持这个属性值( caniuse ),可以方便的使用CSS Canvas作为元素的背景图,类似这样:

#icon1 {background-image: -webkit-canvas(identifier);
}

区别于在Canvas元素上绘图,-webkit-canvas方案需要用下面的方法获取绘图的Context:

var context = document.getCSSCanvasContext("2d", "identifier", width, height);

创建CSS Canvas时需要指定一个标识,用它的html元素在CSS中指定这个标识就可以了。浏览器会自动将CSS Canvas的改变同步到所有指定了这个标识的元素上,这样就成功解决了上面提出的问题。

具体效果可以继续 看我写的Demo ,Webkit Only。这里还有一个使用-webkit-canvas将Canvas动画作为背景图的例子, 请自备梯子查看 。

-moz-element

Mozilla有个类似的方案,叫 -moz-element 。可以指定任何元素作为另外元素的背景图(实际上,一个元素不能指定父元素作为自己的背景,为什么自己想),Firefox4+开始支持它作为background-image的属性值。下面是它的用法:

<button id='elementID'>this is a element.</button>
<div style='background-image:-moz-element(#elementID);width:300px;height:200px;'></div>

于是,上面的Demo在Firefox下可以改由-moz-element来实现了, 点击查看 。由于本方案支持任何元素作为背景,所以 也可以这么玩 ,纯CSS的有趣效果,Firefox Only。

最后

个人感觉Mozilla的方案略微夸张了点,相比之下Webkit的CSS Canvas更有可能成为标准。另外,iCloud对于不支持-webkit-canvas的浏览器使用的是DataURL方案,并没有使用firefox的-moz-element,具体什么原因就不得而知了。

使用Canvas绘制背景图相关推荐

  1. vue + canvas绘制背景图、矩形

    最近有需求做图片人脸识别,在系统上传图片后,后台返回坐标将识别到的人脸画上矩形. 效果图如下: 实现过程: 1.利用绘制canvas实例 //html <canvas id='imgCanvas ...

  2. 利用Canvas绘制雷达图

    雷达图(蜘蛛网图)是一种常见的数据分析图表,本文采用canvas来绘制雷达图,并最终封装成一个小组件.首先来看一下最终的效果图: 如何画正多边形 以正五边形雷达图为例(其他任意正多边形也一样),如下图 ...

  3. vue3 canvas 星空背景图

    vue3 canvas 星空背景图 页面截图 代码 页面截图 代码 <template><div ref="container" class="cont ...

  4. HTML5 canvas 设置背景图

    页面代码如下 <!DOCTYPE html> <html><head><meta charset="utf-8"><title ...

  5. canvas 绘制八卦图

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. Canvas绘制八卦图

    运用Canvas绘图编写一个八卦图效果. 最终效果如下: 代码实现如下: <!doctype html> <html lang="en"><head& ...

  7. Canvas 绘制背景小球、与鼠标交互的小球

    canvas入门,跟随掘金小册如何使用 Canvas 制作出炫酷的网页背景特效学习,完成一个简单的 canvas demo 下面是代码,操作解释都有注释: <!DOCTYPE html> ...

  8. 微信小程序canvas绘制环形图(含动画)

    页面版 效果图 思路 1.使用一个canvas绘制(带动画): 2.通过画弧线,设置线宽,来实现圆环效果: 3.计算每段圆弧的起始角度和终止角度,用递归做动画: 绘制完第一段圆弧块–>再绘制下一 ...

  9. 前端------ canvas 绘制折线图详解

    canvas时html5新添加的一个画布标签. 他有很多属性,大家可以在下边网址查看: http://www.w3school.com.cn/tags/html_ref_canvas.asp 画布ca ...

最新文章

  1. org.apache.hadoop.security.AccessControlException: Permission denied: user=anonymous, access=EXECUTE
  2. java垃圾回收理解与算法
  3. 10-10-030-简介-Kafka之数据存储
  4. 简单分析2022智能家居现状的优缺点
  5. 解析DeDecms系统的SEO内部优化技巧
  6. js怎么获取扫码枪条码_JS 如何获取扫码枪输入数据
  7. splits——安卓gradle
  8. hdu.6441 Find Integer
  9. 区块链入门教程(6)--配置使用控制台
  10. [Crypto]ECB模式攻击
  11. 调频广播如何发明的?
  12. linux命令行界面鼠标,有趣的Linux命令:小猫咪追鼠标
  13. 从《淘金者》看游戏细节
  14. 1.4 Go开发工具
  15. 网络适配器(SE)通讯调试
  16. 【lintcode】树形数据结构之Maxtree, Tree iterator, remove bst node, 优先队列之动态中位数Median, 矩阵dfs之word search II,最大连
  17. 2022最新<浙江>教师资格证报考条件
  18. N - Cthulhu
  19. Total Commander常见指令与问题总结
  20. 第8次博文;如何将图片导入进pychrm中,我告诉你.

热门文章

  1. java中,饭店里面有五道菜, 黄花鱼 200块, 烤鸭 100块, 红烧肉 60块, 小炒肉 40块, 白水豆腐 10块,一个客人进了饭店, 根据身上的钱来决定最好能吃哪道菜 , 编程模拟。
  2. 763. Partition Labels
  3. 力扣记录:贪心算法3较难(1)区间问题——55 跳跃游戏,45 跳跃游戏II,452 用最少数量的箭引爆气球,435 无重叠区间,763 划分字母区间,56 合并区间
  4. android 友盟原生分享之QQ分享失败2004
  5. Windows实现在桌面上双击图标,自动进入到指定网址
  6. 搏击俱乐部:经典台词
  7. 男程序员思维VS女程序员思维
  8. 【Leetcode刷题记录_C++】【搜索】
  9. 063 使用Qt进行编程
  10. 购买单反相机的注意事项(转载)