的对象就可以显示,不在这个范围内的对象就不显示。具体判定点在不在范围内的算法由\属性指定。
对于图形对象,裁剪路径等于自己clip-path设置的裁剪路径与所有外层元素的裁剪路径(包括clip-path和overflow设置的裁剪路径)的并集。注意几点: 1.clipPath元素自身并不会从外层节点继承clipPath定义的裁剪路径。 2.clipPath元素自身可以设置clip-path属性。效果是两个路径的交集。 3.clipPath元素的子元素可以设置clip-path属性:效果是两个路径的并集。 4.空裁剪路径会裁掉元素内所有的内容。 下面看看几种重要的属性:
clipPathUnits = \默认值) | objectBoundingBox\ 这个属性定义了clipPath元素使用的坐标系统,这两个值我们都很熟悉了,分别是采用引用当前裁剪路径的元素的用户坐标系统和包围盒比例值。
clipPath元素从来不直接渲染,都是通过clip-path被引用,所以设置clipPath元素的display属性没有作用。
clip-path = “
这个属性不用多说了,用于引用裁剪路径,这里需要注意的是,所有的容器元素,基本图形元素和clipPath元素都可以使用这个属性。
clip-rule = \默认值) | evenodd | inherit\
这个属性用于确定哪些点是属于裁剪路劲内部的点。对于简单的封闭图形,这个很好判定,但是对于复杂的内部有洞的图形,就有区别了。这个属性的取值与fill-rule的取值含义是一样的:
nonzero:这个值采用的算法是:从需要判定的点向任意方向发射线,然后计算图形与线段交点的处的走向;计算结果从0开始,每有一个交点处的线段是从左到右的,就加1;每有一个交点处的线段是从右到左的,就减1;这样计算完所有交点后,如果这个计算的结果不等于0,则该点在图形内,需要填充;如果该值等于0,则在图形外,不需要填充。看下面的示例:
evenodd:这个值采用的算法是:从需要判定的点向任意方向发射线,然后计算图形与线段交点的个数,个数为奇数则改点在图形内,需要填充;个数为偶数则点在图形外,不需要填充。看下图的示例:
clip-rule属性只能用于clipPath元素的内部图形元素。例如下面的设置是起作用的:
如果元素不在clipPath中是不起作用的。例如下面的设置是不起作用的:
最后看裁剪路径的一个小例子:
矩形只有左上角10*10的区域是可见的。
蒙板- mask元素
在SVG中,你可以为渲染的对象指定任何的图形元素或者g元素作为蒙板,来将渲染对象组合到背景中。
蒙板用mask元素定义,使用蒙板的时候只需要在对象的mask属性中引用蒙板就可以了。
mask元素可以包含任何的图形元素和容器元素(例如g)。
蒙板的效果其实大家也比较清楚,基本就是根据蒙板中每个点的颜色和透明度计算出一个最终的透明度,然后在渲染对象的时候,在对象上面罩上这个带有不同透明度的蒙板层,体现出蒙板的遮挡效果。对于渲染对象来说,只有在蒙版内的部分会按照蒙板上点的透明度来渲染,不在蒙板内的部分不显示。看下面的例子:
效果如下图所示:
大家可以试着将上面mask元素中的rect元素的width改成500,你会看到Text的一部分不显示了,这就是因为那部分已经超出蒙板的范围了。这里其实也看到了,上面的裁剪路径只不过是一种特殊的蒙板(每个点的透明度要么是0,要么是1)。 蒙板的定义和使用已经介绍了,下面看几个重要的属性:
maskUnits = \默认值)\ 定义了mask元素中坐标(x,y)和长度(width,height)的坐标系统:使用引用该蒙板的元素的用户坐标系,或者是使用相对于引用蒙板的元素的包围盒的相对值。这个值的含义与前面章节中的单位含义是相同的。
maskContentUnits = \默认值) | objectBoundingBox\ 定义了mask元素中子元素的坐标系统。 x, y, width, height
定义了蒙板的位置和大小,在默认的objectBoundingBox坐标下,默认值分别为-10%,-10%,120%,120%。
此外要注意:蒙板不会直接渲染,只会在引用的地方起作用,所以display,opacity等属性对于mask元素来说都是不起作用的。 突袭HTML5之SVG 2D入门10 - 滤镜
滤镜称得上是SVG最强大的功能了,它允许你给图形(图形元素和容器元素)添加各种专业软件中才有的滤镜特效。这样你就很容易在客户端生成和修改图像了。而且滤镜并没有破坏原有文档的结构,所以维护性也很好。
滤镜用filter元素定义;需要使用的时候,在需要滤镜效果的图形或容器上添加filter属性,引用相关滤镜即可。
滤镜元素包含很多的滤镜原子操作;每个原子操作在传入的对象上执行一个基本的图形操作,并产生图形输出。大多数的原子操作生成的结果基本都是一个RGBA图片。每个原子操作的输入既可以是源图形,也可以使其他原子操作的结果。所以引用滤镜效果的过程就是在源图形上应用相关的滤镜原子操作,最后生成一个新的图形并渲染。
当在容器上(例如g元素)使用filter属性的时候,滤镜效果会应用到容器中的所有元素。但是容器中的元素并不会直接渲染到屏幕,而是会被暂时存储起来。然后,图形命令会被当做处理引用的filter元素的过程的一部分被执行,这个时候才会去渲染。这是通过使用SourceGraphic和SourceAlpha来指定的。下面的第二个例子中的第三种情况会演示这
种效果。
有些滤镜效果会生成一些没有定义的像素点,这些点会被处理成透明效果。 先来看一个例子:
d=\ /> d=\ /> 突袭HTML5之SVG 2D入门1 - SVG综述 位图与矢量图 以前,浏览器中显示的图形,例如jpeg、gif等,都是位图,这些图像格式是基于光栅的。在光栅图像中,图像文件定义了图像中每个像素的颜色值。浏览器需要读取这些值并做出相应行动。这种图像的再现能力比较强,但是在某些情形下会显得不足。例如,当浏览器以不同大小显示一副图像时,通常会产生锯齿边缘,这时,浏览器不得不为那些在原始图像中不存在的像素插入或猜测数值;这样会导致图像失真。此外,针对位图进行动画,最多也仅限于生成“翻动书本”类型的动画,即快速连续地显示单独图像。 矢量图通过指定为确定每个像素的值所需的指令而不是指定这些值本身,克服了这些困难中的一部分。例如,向量图形不再为一个直径一英寸的圆提供像素值,而是告诉浏览器创建一个直径一英寸的圆,然后让浏览器(或插件)做其余事情。这消除了光栅图形的许多限制;使用向量图形,浏览器只要知道它必须画一个圆。如果图像需要以正常大小的三倍来显示,那么浏览器只要按正确的大小画圆而不必执行光栅图像通常的插入法。类似地,浏览器接收的指令可以更容易地与外部信息源(如应用程序和数据库)绑定,要对图像制作动画,浏览器只要接收有关如何操纵属性(如半径或颜色)的指令即可。 HTML体系中,最常用的绘制矢量图的技术是SVG和HTML5新增加的canvas元素。这两种技术都支持绘制矢量图和光栅图。 SVG概述 可缩放矢量图形(Scalable Vector Graphics,简称SVG)是一种使用XML来描述二维图形的语言(SVG严格遵从XML语法)。 SVG允许三种类型的图形对象:矢量图形形状(例如由直线和曲线组成的路径)、图像和文本。 可以将图形对象(包括文本)分组、样式化、转换和组合到以前呈现的对象中。 SVG 功能集包括嵌套转换、剪切路径、alpha 蒙板和模板对象。 SVG绘图是交互式和动态的。 例如,可使用脚本来定义和触发动画。这一点与Flash相比很强大。Flash是二进制文件,动态创建和修改都比较困难。而SVG是文本文件,动态操作是相当容易的。而且,SVG直接提供了完成动画的相关元素,操作起来非常方便。 SVG与其他Web标准兼容,并直接支持文档对象模型DOM。这一点也是与HTML5中的canvas相比很强大的地方(这里注意,SVG内部也是用一个类似的canvas这样的东西来展示SVG图形,到后面你会发现很多特性和HTML5的canvas还有点像;文中如果没明确说明是SVG的canvas的话,都代指HTML5中的canvas元素)。因而,可以很方便的使用脚本实现SVG的很多高级应用。而且SVG的图形元素基本上都支持DOM中的标准事件。可将大量事件处理程序(如“onmouseover”和“onclick”)分配给任何SVG图形对象。 虽然SVG的渲染速度比不上canvas元素,但是胜在DOM操作很灵活,这个优势完全可以弥补速度上的劣势。 SVG既可以说是一种协议,也可以说是一门语言;既是HTML的一个标准元素,也是一种图片格式。 SVG并不是HTML5中的东西,但是也算页面时兴的技术之一,姑且也放到这个专题下了。 SVG与其它图片格式的比较 SVG与其它的图片格式相比,有很多优点(很多优点来源于矢量图的优点): ? SVG文件是纯粹的XML, 可被非常多的工具读取和修改(比如记事本)。 ? SVG 与JPEG 和GIF图像比起来,尺寸更小,且可压缩性更强。 ? SVG 是可伸缩的,可在图像质量不下降的情况下被放大,可在任何的分辨率下被高质量地打印。 ? SVG 图像中的文本是可选的,同时也是可搜索的(很适合制作地图)。 ? SVG 可以与 Java 技术一起运行。 ? SVG 是开放的标准。 SVG与Flash的比较 SVG 的主要竞争者是Flash。与Flash相比,SVG 最大的优势是它与其他标准(比如XSL和DOM)相兼容,操作方便,而Flash则是未开源的私有技术。其它的比如存储的格式,动态生成图形等方面,SVG也占有很大的优势。 SVG的呈现方式 关于支持HTML5与SVG的浏览器不是这里讨论的重点,基本上装上最新的Chrome或者FireFox浏览器就差不多了(IE用户请装IE9就对了,至于IE9之前的版本,需要装SVG的插件,这里就直接略过了)。对于直接支持SVG的浏览器,SVG主要采用两面两种呈现的方式。 内联到HTML SVG是标准的HTML元素,直接写到HTML中就可以了,看下面的例子:
请注意开头的部分xml声明,与svg的命名空间xmlns、版本version等部分,主要是考虑兼容性的问题;这些部分在HTML5中基本都可以不用写了(写不写还是自己瞧着办吧)。
独立SVG文件
独立SVG指的是通过使用svg文件扩展名来提供向量图形文件格式。在浏览器中嵌入这个svg文件就可以使用了。
1.独立的SVG文件/页面,定义的模板基本就像下面的一样:
把这样的文本文件保存成以svg为扩展名的文件,例如sun.svg,这样的文件可以直接用浏览器打开浏览,也可以作为引用嵌入到别的页面中。 2.HTML引用外部的SVG文件。
使用object或者img元素嵌入svg图形就可以了,例如下面的小例子:
其实SVG也可以放在其他的XML文档中,也可以像其他的XML文档一样,使用XML相关的技术格式化和验证,这个不是重点,此处略去了。
SVG的渲染顺序
SVG是严格按照定义元素的顺序来渲染的,这个与HTML靠z-index值来控制分层不一样。在SVG中,写在前面的元素先被渲染,写在后面的元素后被渲染。后渲染的元素会覆盖前面的元素,虽然有时候受透明度影响,看起来不是被覆盖的,但是SVG确实是严格按照先后顺序来渲染的。
注意:SVG是以XML定义的,所以是大小写敏感的,这点与HTML不一样。 突袭HTML5之SVG 2D入门2 - 图形绘制 基本形状
SVG提供了很多的基本形状,这些元素可以直接使用,这一点比canvas好多了。废话不说了,直接看例子,这个最直接:
再看脚本的例子:
stroke-width=\ stroke=\
条件处理 - switch元素
条件处理属性是能控制所在元素渲染与否的属性。基本上大多数的元素(特别是图形元素)都可以指定条件处理属性。条件处理属性有3个:requiredFeatures,
requiredExtensions和systemLanguage。这些属性就是一组测试,都允许指定一个值列表(前面两个属性是空格隔开的,语言这个属性是使用逗号隔开的),默认值都为true。 SVG的switch元素提供了按指定条件渲染的能力。switch元素是一个容器元素,可以包含图形元素,解释性元素,动画元素,a,
foreignObject,g,image,svg,switch,text,use等元素。switch元素会按顺序检查直接子元素的条件处理属性,然后渲染满足自身条件的的第一个子元素,其他的子元素都会被忽略。这些属性与display属性一样,只会影响直接使用这些属性的元素的渲染,不会影响引用的元素(比如use引用的元素)。简单的说,这3个属性会影响a, altGlyph, foreignObject, textPath, tref, tspan ,animate, animateColor, animateMotion,
animateTransform, set等元素,不会影响defs,cursor, mask, clipPath, pattern等元素(这些元素那么不是可渲染的,要么就是引用别的元素)。
注意:子元素的display和visibility属性值并不影响switch元素条件判断的结果。 条件处理属性的取值列表参看官方文档,这里就看一个小例子:
x= \ y= \ width= \ height= \ opacity= \6 \ fill= \ stroke= \ filter= \ /> fill= \ stroke= \ /> 这个例子的意思简单的说就是:使用的浏览器支持filter特性,那么就绘制上面的矩形(带filter属性),如果不支持filter特性,就绘制下面的矩形。 其实更多的时候,用的比较多的属性是systemLanguage,就是文本的多语言处理能力。例如: 突袭HTML5之SVG 2D入门9 - 蒙板 SVG支持的蒙板 SVG支持多种蒙板特效,使用这些特性,我们可以做出很多很炫的效果。至于中文中把mask叫做\蒙板\还是\遮罩\就不去区分了,这里都叫做蒙板吧。 SVG支持的蒙板类型: 1. 裁剪路径(cliping path) 裁剪路径是由path, text或者基本图形组成的图形。所有在裁剪路径内的图形都可见,所有在裁剪路径外的图形都不可见。 2. 遮罩/蒙板(mask) 蒙板是一种容器,它定义了一组图形并将它们作为半透明的媒介,可以用来组合前景对象和背景。 裁剪路径和其他的蒙板一个重要的区别就是:裁剪路径是1位蒙板,也就是说裁剪路径覆盖的对象要么就是全透明(可见的,位于裁剪路径内部),要么就是全不透明(不可见,位于裁剪路径外部)。而蒙板可以指定不同位置的透明度。 视窗的裁剪路径 - overflow和clip属性 HTML元素的overflow属性和clip属性共同设置了该元素对内容的剪裁行为。同样的,在SVG中,这2个属性还可以使用。 overflow = visible | hidden | scroll | auto | inherit overflow属性定义了当元素的内容超过元素的边框的时候采取的行为。 这个属性可以用于能创建新视窗的元素 (svg,symbol,image,foreignObject),pattern和marker元素。这个属性的取值含义如下: visible:显示所有内容,即使是内容已经在元素的边框外边,这个是默认值。 hidden:隐藏超出裁剪路径的内容。裁剪路径由clip属性指定。 scroll:采用滚动条的形式,呈现超出的内容。 auto:采用浏览器定义的行为,这个似乎不太可靠。 这个属性和CSS2中的同名属性基本相同,只不过在SVG中,有一些不同的处理过程: 1.overflow属性对于除了创建新视窗的元素 (svg,symbol,image,foreignObject),pattern和marker元素外的元素都没有效果。 2.裁剪路径与视窗是对应的,创建了新的视窗,就创建了新的裁剪路径。默认的裁剪路径就是视窗边界。 clip = (svg,symbol,image,foreignObject),pattern和marker元素。这个属性和CSS2中同名属性有一样的参数。auto代表裁剪路径与视窗边框是一致的。当使用图形作为参数时(设置裁剪矩形的top,right,bottom和left的值), 可以使用用户坐标值(即不带单位的坐标)。例如: P { clip: rect(5px, 10px, 10px, 5px); } 这里注意,默认情况下(overflow和clip都取默认值),裁剪路径是与视窗的边框是一致的。当设置了viewBox和preserveAspectRatio以后,通常也需要把clip裁剪路径的四边映射成viewBox的四边,这样才能保证某些显示效果还是一样的(当然如果都是默认值,就不用设了)。 对象的裁剪路径 - clipPath元素 裁剪路径使用clipPath元素定义,然后使用clip-path属性引用。 clipPath可以包含path元素,text元素,基本的图形元素(circle等)和use元素。如果是use元素,则它必须是直接引用path,text或者基本图形元素,不能引用的是其他的元素。 注意裁剪路径只是一位的遮罩层,该路径是包含的所有的元素的并集。在这个集合中 从结果中,你可以直接看到同样尺寸的矩形,在不同的倾斜变换后,得到的位置和形状。这里注意矩形的起始位置都已经改变了,这是因为在新的坐标系统中,(30,30)已经在不同的位置了。 缩放 - scale 缩放对象由缩放变换完成,该变换接受2个参数,分别指定在水平和竖直上的缩放比例,如果第二个参数省略则与第一个参数取相同的值。看下面的例子: 变换矩阵 - matrix 学过图形学的都知道,所有的变换其实都是由矩阵表征的,所以上面的变换其实都可以用一个3*3矩阵去表示: a c e b d f 0 0 1 由于只有6个值用到了,所以也简写成[a b c d e f]。把matrix(a,b,c,d,e,f)赋给transfrom就可以实施相应的变换。变换会把坐标和长度都转换成新的尺寸。上面各种变换对应的矩阵如下: 平移变换[1 0 1 0 tx ty]: 1 0 tx 0 1 ty 0 0 1 缩放变换[sx 0 0 sy 0 0]: sx 0 0 0 sy 0 0 0 1 旋转变换[cos(a) sin(a) -sin(a) cos(a) 0 0]: cos(a) -sin(a) 0 sin(a) cos(a) 0 0 0 1 沿X轴的倾斜[1 0 tan(a) 1 0 0]: 1 tan(a) 0 0 1 0 0 0 1 沿Y轴的倾斜[1 tan(a) 0 1 0 0]: 1 1 0 tan(a) 1 0 0 0 1 变换本质 前面我们总结canvas的时候,我们知道各种变换都是作用在用户坐标系上的。在SVG中,所有的变换也都是针对两个坐标系(本质上都是\用户坐标系\的。当给容器对象或图形对象指定\属性,或者给\指定 \属性以后,SVG会根据当前的用户坐标系统进行变换,去创建新的用户坐标系,并作用于当前的对象以及它的子对象。该对象中指定的坐标和长度的单位不再是1:1的对应到外围的坐标系,而是随着变形,转换到新的用户坐标系中;这个新的用户坐标系是只作用于当前的元素及其子元素。 变换链 transform属性支持设置多个变换,这些变换只要中间用空格分开,然后一起放到属性中就可以了。执行效果跟按顺序独立执行这些变换是一样的。 上面的效果与下面的一样: 单位 最后说一下单位,任何坐标和长度都可以带和不带单位。 不带单位的情况 不带单位的值被认为带的是\用户单位\,就是当前用户坐标系的单位值。 带单位的情况 svg中相关单位与CSS中是一样的:em,ex,px,pt,pc,cm,mm和in。长度还可以使用\。 相对度量单位:em和ex也与CSS中一样,是相对于当前字体的font-size和x-height来说的。 绝对度量单位:一个px是等于一个\用户单位\的,也就是\与\是一样的。但是一个px是不是对应一个像素,那就看有没有进行过一些变换了。 其他的几个单位基本都是px的倍数: 1pt=1.25px,1pc=15px,1mm=3.543307px,1cm=35.43307px,1in=90px。 如果最外层的SVG元素的width和height没有指定单位(也就是\用户单位\,则这些值会被认为单位是px。 这一篇比较拗口,其实只要记住“图形元素的坐标和长度指的是,经过视窗坐标系变换和用户坐标系变换双重变换后,新用户坐标系的坐标和长度”就可以了。 突袭HTML5之SVG 2D入门7 - 重用与引用 前面介绍了很多的图形元素,如果很多图形本身是一样的,需要每次都去定义一个新的么?我们能否共用一些图形呢?这是这节的重点 - SVG元素的重用。 组合 - g元素 g元素是一种容器,它组合一组相关的图形元素成为一个整体;这样,我们就可以对 这个整体进行操作。这个元素通常可以和desc和title元素配合使用,提供文档的结构信息。结构良好的文档通常可读性和渲染效率都不错。看一个小例子: 注意几点: 1. xmlns=\表明了整个svg元素默认的命名空间是svg。这个在无歧义的时候可以省略。这里由于svg文档是一个XML文档,XML命名空间的相关规则这里都是适用的。例如可以给svg显示的指定命名空间,给命名空间提供别名等。 2. g元素是可以嵌套的。 3. 组合起来的图形元素就和单个的元素一样,可以给id值,这样,需要的时候(例如动画和重用一组元素)只用引用这个id值就可以了。 4. 组合一组图形元素可以统一设置这组元素的相关属性(fill,stroke,transform等),这也是使用组合的一种场景。 模板 - symbol元素 symbol元素用于定义图形模板(模板可以包含很多图形),这个模板可以被use元素实例化。模板的功能与g元素很相似,都是提供一组图形对象,但是也有一些区别。与g元素不同的地方是: 1.symbol元素本身是不会被渲染的,只有symbol模板的实例会被渲染。 2.symbol元素可以拥有属性viewBox和preserveAspectRatio,这些允许symbol缩放图形元素。 从渲染角度来说,与symbol元素相似的元素是marker(定义箭头和标号)和pattern(定义颜色)元素;这些元素不会直接被渲染;他们的使用方式基本都是由use元素去实例化。正是这个原因,对于symbol来说,'display'属性是没有意义的。 下面这个修改过的代码显示了symbol的使用方式: xmlns:xlink=\ version=\ 通常,最外层的svg元素要配以title说明,这样程序可读性更好。 标记 - marker元素 标记定义了附加到一个或者多个顶点(path,line,polyline或者polygon的顶点)上的图形元素(箭头和多点标记)。箭头可以通过把一个标记附加到path,line或者polyline的起点或者终点上。多点标记可以把一个标记附加到path,line,polyline或者polygon的所有顶点上。 标记是由marker元素定义的,然后在path,line,polyline或者polygon中设置相关的属性(marker,marker-start,marker-mid,和marker-end)就可以了。看个例子: viewBox=\ version=\ xmlns=\ viewBox=\ refX=\ refY=\ markerUnits=\ markerWidth=\ markerHeight=\ orient=\ fill=\ stroke=\ stroke-width=\ marker-end=\ /> 下面详细看看marker的相关知识: 1. marker是容器元素,可以存放任意顺序的图形元素,容器元素,动画,渐变元素等。 2. marker元素可以创建新的视窗:设置viewBox的值。 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库突袭HTML5之SVG在线全文阅读。
相关推荐: