SVG图形引用、裁切、蒙版

摘要:
SVG图形引用、剪切和掩码使用三个标签:1.<use>标签创建图形引用2.<clipPath>标签剪切图形3.<mask>标签创建掩码<use><use>标记使用URI引用<g>、<SVG>或具有唯一ID属性和重复的其他图形元素。DOCTYPEhtml˃SVG演示html,主体{宽度:100%;高度:100%;边距:0;填充:0;}原型简单参考˃将填充更改为绿色设置小宽度和高度设置大宽度和高度=“#rU”x=“120”y=“240”style=“背景:绿色;“/˃设置样式额外边框效果:结论:从以上代码中,我们可以得出一个结论,即原型中设置的属性是通过引用继承的,不能被覆盖,除了x和y。标记标记用于定义切割路径。可以在标记中创建任意数量的基本形状,包括和元素。

SVG图形引用、裁切、蒙版,使用三个标签:

1. <use>标签创建图形引用 
2. <clipPath>标签裁切图形 
3. <mask>标签创建蒙版 

<use>标签

<use>标签使用URI引用一个<g>,<svg>或其他具有一个唯一的ID属性和重复的图形元素。复制的是原始的元素,因此文件中的原始存在只是一个参考,原始影响到所有副本的任何改变。

<use>标签,使用xlink:href属性引用图形,xlink:href="https://tool.4xseo.com/article/257372.html" 。

例子:

<!DOCTYPE html>
<html>
     <head>
          <meta charset="UTF-8">
          <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>SVG-demo</title>
          <style>
               html,body{
                    width:100%;
                    height:100%;
                    margin:0;
                    padding:0;
               }
          </style>
     </head>
<body>   
<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
     <rect id="rU" x="0" y="0" width="100" height="100" fill="red" />
     <text x="50" y="50" text-anchor="middle" fill="white">原型</text>
     <use xlink:href="#rU" y="120"/>
     <text x="50" y="180" text-anchor="middle" fill="white">简单引用</text>
     <use xlink:href="#rU" y="240" fill="green"/>
     <text x="50" y="300" text-anchor="middle" fill="white">改fill绿色</text>
     <use xlink:href="#rU" x="120" y="0" width="50" height="50"/>
     <text x="170" y="50" text-anchor="middle" fill="white">设小宽高</text>
     <use xlink:href="#rU" x="120" y="120" width="200" height="200"/>
     <text x="170" y="180" text-anchor="middle" fill="white">设大宽高</text>
     <use xlink:href="#rU" x="120" y="240" style="background:green;"/>
     <text x="170" y="300" text-anchor="middle" fill="white">设置样式</text>
     <use xlink:href="#rU" x="240" y="0" stroke="blue" stroke-width="2" />
     <text x="290" y="50" text-anchor="middle" fill="white">额外边框</text>
</svg>
</body>
</html>

效果:

SVG图形引用、裁切、蒙版第1张

结论:

从上面代码可以得出,原型已经设置的属性,引用会继承,并且不能覆盖,除了x、y。所以想引用能够设某个属性,那原型就不能设置。

<clipPath>标签
<clipPath>标签用来定义剪切路径,标签内可创建任意数量的基本形状,包括<path>和<text>元素。图形使用clip-path属性来引用clipPath来做裁切 , clip-path="url(#clip-id)" 。
clip-rule
clip-rule = "nonzero(默认值) | evenodd | inherit"
这个属性用于确定哪些点是属于裁剪路劲内部的点。对于简单的封闭图形,这个很好判定,但是对于复杂的内部有洞的图形,就有区别了。这个属性的取值与fill-rule的取值含义是一样的。
PS:fill-rule计算方式可以查看:http://blog.csdn.net/cuixiping/article/details/7848369
例子:
<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
     <defs>
          <clipPath id="c-star">
               <polygon points="150 100 179.389 9.54915 102.447 65.4509
          197.533 65.4509 120.611 9.54915"
/> </clipPath> <clipPath id="c-star-rule"> <polygon points="150 100 179.389 9.54915 102.447 65.4509 197.533
65.4509 120.611 9.54915"
transform="translate(-100)" clip-rule="evenodd"/> </clipPath> <clipPath id="c-two-grap"> <polygon points="150 100 179.389 9.54915 102.447 65.4509
         197.533 65.4509 120.611 9.54915"
transform="translate(0, 100)" /> <rect x="100" y="100" width="50" height="50" /> </clipPath> </defs> <rect x="100" y="0" fill="red" width="100" height="100" clip-path="url(#c-star)"/> <rect x="0" y="0" fill="green" width="100" height="100" clip-path="url(#c-star-rule)"/> <rect x="100" y="100" fill="blue" width="100" height="100" clip-path="url(#c-two-grap)"/> </svg>
效果:
SVG图形引用、裁切、蒙版第2张
结论:
所有在裁剪路径内的图形都可见,所有在裁剪路径外的图形都不可见。

<mask>标签

蒙板(mask)是一种容器,它定义了一组图形并将它们作为半透明的媒介,可以用来组合前景对象和背景。

裁剪路径和其他的蒙板一个重要的区别就是:裁剪路径是1位蒙板,也就是说裁剪路径覆盖的对象要么就是全透明(可见的,位于裁剪路径内部),要么就是全不透明(不可见,位于裁剪路径外部)。而蒙板可以指定不同位置的透明度。

例子:

<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
     <defs>
          <linearGradient id="Gradient" gradientUnits="userSpaceOnUse" 
        x1
="0" y1="0" x2="800" y2="0"> <stop offset="0" stop-color="white" stop-opacity="0" /> <stop offset="1" stop-color="white" stop-opacity="1" /> </linearGradient> <mask id="Mask" maskUnits="userSpaceOnUse" x="0" y="0" width="800" height="300"> <rect x="0" y="0" width="800" height="300" fill="url(#Gradient)" /> </mask> <mask id="Mask2" maskUnits="userSpaceOnUse" x="0" y="0" width="800" height="300"> <rect x="0" y="0" width="800" height="300" fill="red" /> </mask> <text id="Text" x="400" y="200" font-family="Verdana" font-size="100"
        text-anchor
="middle" > Masked text </text> </defs> <rect x="0" y="0" width="800" height="300" fill="none" /> <use xlink:href="#Text" fill="blue" y="-100" /> <use xlink:href="#Text" fill="blue" mask="url(#Mask)" /> <use xlink:href="#Text" fill="blue" mask="url(#Mask2)" y="100" /> </svg>

效果:

SVG图形引用、裁切、蒙版第3张

结论:

蒙板的效果,基本就是根据蒙板中每个点的颜色和透明度计算出一个最终的透明度,然后在渲染对象的时候,在对象上面罩上这个带有不同透明度的蒙板层,体现出蒙板的遮挡效果。

总结

关于蒙板的,我还是有个疑问,就是这个计算透明度的具体方式。这个问题牵涉出每个点的颜色跟最终的透明度的关系,是否存在某些颜色算出的最终的透明度是一样的(我在尝试蒙板代码时,发现Mask2只要不是设置黑白,其他颜色的效果都一样)。

参考文献

1. http://www.jb51.net/html5/72268.html

2. http://blog.csdn.net/cuixiping/article/details/7848369

本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。

本文地址 :http://www.cnblogs.com/lovesong/p/6006264.html

免责声明:文章转载自《SVG图形引用、裁切、蒙版》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇VS2019 实用设置解决小程序弹出层滚动穿透的问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Svg 画图(电池)

公司现在在做充电桩项目,其中要显示充电桩的电池充电情况,功能展示的时候要画图,之前做的时候准备使用HightChar来画,但是,hightchar好像没有这样的电池图形,最后,项目经理要我自己通过svg画,所以到网上找了一些网址学习svg,其中就有:点击这里,下面我就粘贴下代码和显示图片效果,希望能够帮助到一些朋友。 这里显示的是js文件: $(funct...

nodejs之SVG转图片下载方案

本文介绍在nodejs基础上。怎样实现将svg转为png并下载的功能。 所需Webkit和node module简单介绍: phantomjs:一个基于WebKit的server端JavaScript API,它基于 BSD开源协议公布。PhantomJS无需浏览器的支持就可以实现对Web的支持。且原生支持各种Web标准,如DOM 处理、JavaScr...

SVG的几个标签元素

defssvg允许我们定义以后需要重复使用的图形元素。建议把所有需要再次使用的元素定义在defs元素里面。这样做可以增加svg内容的易读性和可访问性。在defs元素定义的元素不会直接呈现。你可以在你的视口的任意地方利用<use>元素呈现这些元素。 用法: 类别: 容器元素,结构元素 允许的内容物:任意数量、任意排序的下列元素:动画元素、描述性元...

SVG SMIL animation动画详解

一、SVG SMIL animation概览 1. SMIL是什么? SMIL不是指「水蜜梨」,而是Synchronized Multimedia Integration Language(同步多媒体集成语言)的首字母缩写简称,是有标准的。本文所要介绍的SVG动画就是基于这种语言。 SMIL允许你做下面这些事情: 动画元素的数值属性(X, Y, …) 动...

svg DOM的一些js操作

这是第一个实例,其中讲了如何新建svg,添加元素,保存svgdocument,查看svg. 下面将附上常用一些元素的添加方法:(为js的,但基本上跟java中操作一样,就是类名有点细微差别) Circle var svgns = "http://www.w3.org/2000/svg";function makeShape(evt) { if ( wi...

使用echarts插件做图表常见的几个问题(五)——图形的两种渲染方式

场景:echarts中图形有两种渲染方式,canvas渲染和svg渲染,分别运用在什么样的场景下 措施:Canvas 更适合绘制图形元素数量非常大(这一般是由数据量大导致)的图表(如热力图、地理坐标系或平行坐标系上的大规模线图或散点图等),也利于实现某些视觉特效;在不少场景中,SVG 具有重要的优势:它的内存占用更低(这对移动端尤其重要)、渲染性能略高、并...