使用Canvas绘制背景图

原文  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,具体什么原因就不得而知了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在canvas绘制背景图,你可以使用`drawImage`方法,其中`image`参数是一个图像对象,可以是一个`image`或`canvas`对象。你可以使用`createPattern`方法来设置重复的背景模式。例如,你可以按以下方式设置背景图像: ```javascript var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); var img = new Image(); img.src = 'myBackgroundImage.png'; // 设置背景图像的源地址 img.onload = function() { var pattern = ctx.createPattern(img, 'repeat'); // 创建一个重复的背景图案 ctx.fillStyle = pattern; // 将背景图案作为填充样式 ctx.fillRect(0, 0, canvas.width, canvas.height); // 使用填充样式填充整个画布 } ``` 这段代码将在canvas中创建一个与画布大小相匹配的背景图案,使用`repeat`参数来指定图案的重复方式。你可以根据需要选择其他重复方式,如`repeat-x`、`repeat-y`或`no-repeat`。123 #### 引用[.reference_title] - *1* [canvas绘制图片、背景图【从0开始学习canvas—第4篇】](https://blog.csdn.net/weixin_43586120/article/details/104722771)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *2* *3* [31 canvas使用图片及设置背景](https://blog.csdn.net/u014331138/article/details/109358423)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值