![HTML5+CSS3从入门到精通(微课精编版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/697/24172697/b_24172697.jpg)
4.5 图形合成
本节将介绍图形合成的一般方法,以及路径裁切的实现。
4.5.1 合成
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P120_6275.jpg?sign=1739589495-lARMiqf8NUDHqrcwRjS5fzkdXTbiWXeA-0-75c6d602f80846e98c80e6c86050f6cd)
视频讲解
当两个或两个以上的图形存在重叠区域时,默认情况下一个图形画在前一个图形之上。通过指定图形globalCompositeOperation属性的值可以改变图形的绘制顺序或绘制方式,从而实现更多种可能。
【示例】下面示例设置所有图形的透明度为1,即不透明。设置globalCompositeOperation属性值为source-over,即默认设置,新的图形会覆盖在原有图形之上,也可以指定其他值,详见表4.1。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P120_78417.jpg?sign=1739589495-4bCqUC8AVNYa8SjwnbPlOrPMf5uAiw77-0-d15d598974faf35d65869ada5a310be4)
在浏览器中的预览效果如图4.39所示。如果将globalAlpha的值更改为0.5(ctx.globalAlpha=0.5;),则两个图形都会呈半透明效果,如图4.40所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P121_6296.jpg?sign=1739589495-WYsTXKQaVrcqxNmlegoNBhb8xmHW4svP-0-c0e83a8939ac981c2861afcab33d3b76)
图4.39 图形的组合
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P121_6297.jpg?sign=1739589495-hQozzmeQmbsa3WKYyaKxOyFm3IJBfdcr-0-3c640b36ab0e2949e0969d7905dd7ae9)
图4.40 半透明效果
表4.1给出了globalCompositeOperation属性所有可用的值。表中的图例矩形表示为B,为先绘制的图形(原有内容为destination),圆形表示为A,为后绘制的图形(新图形为source)。在应用时注意globalCompositeOperation语句的位置,应处在原有内容与新图形之间。Chrome浏览器支持大多数属性值,无效的在表中已经标出。Opera浏览器对这些属性值的支持相对来说更好一些。
表4.1 globalCompositeOperation属性所有可用的值
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-T121_78420.jpg?sign=1739589495-bBFd60o9MFbbFq8eU0gd6N4VnWh8qwcQ-0-5886fef7200a6c85a025016d9cfc9533)
4.5.2 裁切
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P122_6550.jpg?sign=1739589495-V3WxRE0yf13GAQ7HEVqoLzpUlgmn9aPx-0-4d591c65cb9f95afeedd2770e9bd6f75)
视频讲解
使用clip()方法能够从原始画布中剪切任意形状和尺寸。其原理与绘制普通canvas图形类似,只不过clip()的作用是形成一个蒙版,没有被蒙版的区域会被隐藏。
提示:一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内,不能访问画布上的其他区域。用户也可以在使用clip()方法前,通过使用save()方法对当前画布区域进行保存,并在以后的任意时间通过restore()方法对其进行恢复。
【示例】如果绘制一个圆形,并进行裁切,则圆形之外的区域将不会绘制在canvas上。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P122_78423.jpg?sign=1739589495-W57bxlbSFszw4C5Prks1vvGOQfmxPtxL-0-30545bfc60d251c34d694ce38ae5c521)
可以看到只有圆形区域内螺旋图形被显示了出来,其余部分被裁切掉了,效果如图4.41所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P123_6633.jpg?sign=1739589495-FF7ehjozddbMbdiqAekoDuqMdtxEe8N0-0-872461a18c7bbb64a578c0aadd80db49)
图4.41 裁切图形