小tip: SVG和Canvas分别实现图片圆角效果

标签: canvas相关 SVG相关 border-radius canvas SVG | 发表时间:2014-06-30 20:09 | 作者:张 鑫旭
出处:http://www.zhangxinxu.com/wordpress

by zhangxinxu from http://www.zhangxinxu.com
本文地址: http://www.zhangxinxu.com/wordpress/?p=4242

一、图片覆盖和CSS3 border-radius实现圆角

图片覆盖
找个中间镂空的图片覆盖在原始图片上,需要跟网页底色一致。

CSS3 border-radius

.xxx { border-radius: 100px; }

上面两个方法demo有,截图有~

可是demo上的图片素材一不小心放了个大,我不想换图片,地址就不放了,大家可以YY下。截图嘛,最后给~

二、SVG实现图片圆角效果

本处的实现原理适用于各种SVG规则的或不规则的图形。

SVG实现图片圆角关键是借助元素 <pattern>.

举个板栗,如果实现名为test.jpg的图片 圆形效果,大小 100px * 100px, 则SVG代码如下:

<svg width="100" height="100">
    <desc>SVG圆角效果</desc>
    <defs>
        <pattern id="raduisImage" patternUnits="userSpaceOnUse" width="100" height="100">
            <image xlink:href="test.jpg" x="0" y="0" width="625" height="605" />
        </pattern>
    </defs>
    <circle cx="50" cy="50" r="50" fill="url(#raduisImage)"></circle>
</svg>

图形元素都有一个 fill属性,让其值 url锚向 <pattern>的id就可以了。

这个demo有,您可以狠狠地点击这里: SVG实现圆角图片demo

滑动滑块,可以看到水平/垂直方向圆角大小的变化。受制于图片高宽比不一致,圆角的极限就是规矩的椭圆:
SVG实现的截图示意

demo示意的是 <rect>元素,顾名矩形元素,如果想要实现正圆效果,请使用 <circle>元素,如上面示意的SVG的代码。当然,你还可以使用 <path>元素做不规则填充,创建更有意思的图形效果。

三、Canvas实现图片圆角效果

本规则适用于各种Canvas绘制的规则或不规则图形。

Canvas实现图片圆角的关键是使用“纹理填充”。

Canvas中有个名为 createPattern的方法,可以让已知尺寸的图片元素转换成纹理对象,作填充用。

举个板栗,如果实现名为test.jpg的图片 圆形效果,大小 100px * 100px, 则主要JS代码如下:

// canvas元素, 图片元素
var canvas = document.querySelector("#canvas"), image = new Image();
var context = canvas.getContext("2d");

image.onload = function() {
    // 创建图片纹理
    var pattern = context.createPattern(image, "no-repeat");
    // 绘制一个圆
    context.arc(50, 50, 50, 0, 2 * Math.PI);
    // 填充绘制的圆
    context.fillStyle = pattern;
    context.fill();    
};
image.src = "test.jpg";

让Canvas上下文的 fillStyle属性值等于这个纹理对象就可以了。

这个demo有,您可以狠狠地点击这里: Canvas实现圆角图片demo

Canvas自带的矩形绘制API是不带圆角属性的,因此,demo中的圆角矩形使用了自定义方法。我简单瞅了瞅,要实现垂直、水平方向不同圆角大小略折腾,本着示意的目的,就没大动干戈,所以demo的圆角是对称的。

Canvas实现的图片圆角效果

demo示意的是圆角矩形效果,如果想要实现正圆效果,请使用 arc方法绘制,如上面示意的JS的代码。当然,你还可以绘制其他不规则造型做填充,创建更有意思的图形效果。

四、意义何在

CSS3实现圆角效果多简单,同样SVG, Canvas兼容性也不咋滴,那为何还要折腾SVG, Canvas的圆角效果呢?

我只想说:“天生我材必有用,千金散尽还复来”。

五、年中结语

今天6月30号,上半年的最后1天,于是,今天的结语荣升为年中结语。

得弄一句牛逼的结语压场啊,啊,有了:“世界既不是薄的,也不是厚的,归根结底是平的。”。

嗯哪,最后,附上一开始恋恋不舍放置的截图(近70K),涵盖:图片覆盖,CSS3, SVG, Canvas实现效果和代码展示( 点击灰色背景块显示)。
各个方法实现圆角效果以及源代码展示

本文为原创文章,含脚本行为,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址: http://www.zhangxinxu.com/wordpress/?p=4242

(本篇完)

有话要说?点击 这里发表评论。

相关 [tip svg canvas] 推荐:

小tip: SVG和Canvas分别实现图片圆角效果

- - 张鑫旭-鑫空间-鑫生活
本文地址: http://www.zhangxinxu.com/wordpress/?p=4242. 一、图片覆盖和CSS3 border-radius实现圆角. 找个中间镂空的图片覆盖在原始图片上,需要跟网页底色一致. 上面两个方法demo有,截图有~. 可是demo上的图片素材一不小心放了个大,我不想换图片,地址就不放了,大家可以YY下.

小tip: 使用SVG寥寥数行实现圆环loading进度效果

- - 张鑫旭-鑫空间-鑫生活
本文地址: http://www.zhangxinxu.com/wordpress/?p=4889. 设计师设计了一个图片上传圆环loading进度效果. 首先,CSS3是可以实现的,以前写过一篇转大饼的文章:“ CSS3实现鸡蛋饼饼状图loading等待转转转”. 原理跟这个一模一样,两个半区的矩形,然后不同时机巧妙显隐实现.

9款基于HTML5/SVG/Canvas的折线图表应用

- - HTML5资源教程
利用 HTML5制作精美而实用的折线图表比较简单,因为我们除了可以利用HTML/CSS/Javascript外,还可以使用功能强大的SVG和Canvas动画特性,今天我们就来分享9款基于HTML5/SVG/Canvas的折线图表应用. 1、HTML5折线图表Aristochart 图表配置简单. 之前我已经向大家分享了几款HTML5图表应用, HTML5 Canvas图表应用RGraph、 HTML5 Canvas饼状图表.

三天学会HTML5——SVG和Canvas的使用

- - ITeye博客
在第一天学习了HTML5的一些非常重要的基本知识,今天将进行更深层学习. 首先来回顾第一天学习的内容,第一天学习了新标签,新控件,验证功能,应用缓存等内容. 第2天将学习如何使用Canvas 和使用SVG 实现功能. Lab1—— 使用Canvas. Canvas 是指定了长度和宽度的矩形画布,我们将使用新的HTML5 JavaScript,可使用HTML5 JS API 来画出各种图形.

了解SVG

- - CSDN博客推荐文章
语言: JavaScript,HTML, SVG.         SVG- 可缩放矢量图形 ,是一个XML风格标记驱动的矢量图形的浏览器渲染引擎. 除了IE 9.0和Android V3之前版本外的所有浏览器都支持SVG. Canvas也有同样的支持情况,所以问题往往表现为:我们应该使用哪种方案.

SVG的用法

- - WebHek
先让大家感受一下用SVG技术制作的简单动画:. 如果你看不到这个演示,说明你的浏览器不支持SVG,请使用最新版的谷歌浏览器或火狐浏览器. 《 如何画出一条会动的线》这篇文章专门介绍了上面这SVG动画是如何简单的实现的. SVG是 Scalable Vector Graphics三个单词的首字母缩写.

SVG使用示例

- - JavaScript - Web前端 - ITeye博客
当用户在圆上点击时,使用js创建一个元素:. // 更高效的计时器,类似于setTimeout,不会发生丢. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

SVG动画入门

- - Web前端 - ITeye博客
今天我们继续来学习SVG动画方面的知识. 一听到动画效果,你可能就觉的头都打啦. 不要担心,SVG本身提供的动画属性非常容易使用,今天我们就来学习一下基础的知识. SVG中提供了 animate的方法来制作动画属性:. 在上面的代码中,我们在元素里面添加了一个 的标签. 包含了下面的一些属性.

html5 canvas入门

- - Marshal's Blog
可以把canvas看做div,不过,它的长和宽不能通过css来定义,要使用标签属性:. 或者javascript对象属性设置:. 使用canvas,只有一种操作方式,使用javascript. 获得canvas对象的上下文对象,该对象是操作canvas的主要对象:. 使用canvas画最简单的线, 点击运行示例,结果看起来是这样:.

理解SVG的viewport,viewBox,preserveAspectRatio

- - Web前端 - ITeye博客
        一个svg,设置了viewBox之后,viewBox的长宽值如果都小于svg的viewport的长宽值,那么结果一定是放大;但是viewBox的长宽值一旦有一个值大于vewport之后,最后的实际效果就不是放大,而是缩小了.         因为viewBox的目的是要自己设置的长宽范围填满viewport.