我是通过《SVG精髓》这本书学习的svg,说实话,这本书写的不好,或者说翻译的不好,我没有看过这本书的原版,不知道原文写的怎么样,但是翻译出来的有些句子真的很拗口。以前老师给我们API文档的时候一直是英文的,我们问他为什么不给中文版的,英文版的看起来费劲,老师说原版的你们能看懂,翻译过来就看不懂了,现在是深有领会啊\(^o^)/~

废话说完,来看正事,svg的坐标系统和大多数绘图的坐标系统一样,左上角为原点,从左向右x轴递增,从上到下y轴递增。这本没什么好说的,大家都知道,但是奇葩的是<svg>元素有个属性叫viewbox就比较扯淡了,要是自己研究这个东西真还有点儿费劲,下面开始详谈~~~

<svg>元素的属性width和height分别指定svg的宽和高,值为数字或者是百分比。当值是数字时可以带上单位,有如下可选单位:em(默认字体的大小16px),ex(字母x的高度),px(像素),pt(点 1/72英寸),pc(12点 1/6英寸),cm(厘米),mm(毫米),in(英寸),不带单位时默认为px,当取值为百分比时通过父元素的宽高确定。单位可以混用,也就是说可以指定元素的width单位为px,height为pt;父元素单位为mm,子元素为px。

看一个例子,编写如下的svg:

<svg width="200" height="200" style="border:1px solid #000000">
<rect x="10" y="10" width="100" height="100" style="stroke:blue; fill:blue">
</rect>
</svg>

在网页上会呈现如下效果:

解释下上面的代码,设置<svg>元素的宽和高都为200像素,在网页上就表现为这个svg图像占据网页空间的宽200px高200px,再设置样式:边框样式为1像素黑色实线,<rect>元素嵌套在<svg>元素中,表明svg中绘制一个矩形,设置rect元素的x为10,y为10,表示要绘制的矩形的左上角顶点的坐标为(10,10),设置width为100,height为100,表示矩形的宽高都是100像素,再设置边框和填充颜色都是蓝色。

再来说一下这个viewbox属性,设置这个属性相当于给svg图像设置了一个选区,然后将这个选区填充到整个svg画布中,最后的你看到的结果就是选区中的图像放大或缩小的结果。这个属性有四个值,分别为坐标系统中的x值,y值,宽度,高度,属性值之间用空格或者是逗号合开。实际上这4个值唯一的确定了一个矩形和矩形的位置,x值和y值是矩形左上角顶点的坐标,宽和高分别是矩形的宽和高,单位为像素,这个矩形就是上述的选区。口说无凭,上实例,编写以下的代码:

<!DOCTYPE html>
<html>
<head>
<title>svg</title>
</head>
<body>
<svg width="300" height="300" viewbox="0 0 300 300" style="border:1px solid #000000">
<rect x="10" y="0" width="1" height="1" style="stroke:blue; fill:blue">
</rect> <rect x="10" y="10" width="1px" height="1px" style="stroke:blue; fill:blue">
</rect> <rect x="10" y="20" width="1mm" height="1mm" style="stroke:blue; fill:blue">
</rect> <rect x="10" y="30" width="1cm" height="1cm" style="stroke:blue; fill:blue">
</rect>
</svg>
<svg width="300" height="300" style="border:1px solid #000000">
<rect x="10" y="0" width="1" height="1" style="stroke:blue; fill:blue">
</rect> <rect x="10" y="10" width="1px" height="1px" style="stroke:blue; fill:blue">
</rect> <rect x="10" y="20" width="1mm" height="1mm" style="stroke:blue; fill:blue">
</rect> <rect x="10" y="30" width="1cm" height="1cm" style="stroke:blue; fill:blue">
</rect>
</svg>
</body>
</html>

在网页中呈现如下结果:

以上代码为第一个svg设置了viewbox属性,但是结果并没有不同,这是因为我将第一个svg的viewbox属性设置为了"0 0 300 300",这表示选区是整个svg图像,所以并没有变化,将上述代码中的第一个svg中的viewbox属性设置为"0 0 150 150",结果如下:

很明显第一个图像中的每个矩形的长宽均是第二个图像的两倍,不信你可以把图片保存下来用ps测一下。出现这样的原因是我将第一个图像的选区设置为宽高均为150像素,左上角顶点为坐标原点的矩形,此矩形正好是图像的二分之一,经放大后填充在300×300的图像中,所以图像放大了二倍。再将上述代码中的第一个svg中的viewbox属性设置为"0 0 100 100",结果如下:

如你所料,第一个图像中的每个矩形的长宽均是第二个图像的三倍,好了,吹牛完毕O(∩_∩)O哈哈~

2. svg学习笔记-svg中的坐标系统和viewbox的更多相关文章

  1. SVG 学习<六> SVG的transform

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  2. SVG 学习<八> SVG的路径——path(2)贝塞尔曲线命令、光滑贝塞尔曲线命令

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  3. SVG 学习<七> SVG的路径——path(1)直线命令、弧线命令

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  4. SVG 学习<五> SVG动画

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  5. ArcGIS案例学习笔记-点集中最近点对和最远点对

    ArcGIS案例学习笔记-点集中最近点对和最远点对 联系方式:谢老师,135-4855-4328,xiexiaokui@qq.com 目的:对于点图层,查找最近的点对和最远的点对 数据: 方法: 1. ...

  6. 《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音

    <Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内 ...

  7. 4. svg学习笔记-文档结构元素和样式的使用

    svg除了绘图元素之外还有一部分是专门用于文档结构的,这类元素有<g>,<use>,<defs>,<symbol>等 <g>元素 如果我们仅 ...

  8. SVG中的坐标系统和坐标变换

    视野和世界 2D绘图中很多人会有一个误区,就是我绘图的区域是一个矩形区域.无论新建一个画布还是创建了一个容器,心里都想象里面有一个矩形区域.其实,在SVG当中,矩形区域只是视野,是我们看到的部分.实际 ...

  9. 3. svg学习笔记-基本形状和画笔属性

    svg中可以绘制的基本图形有线段,矩形,多边形,圆,椭圆,分别来看一下这些基本图形: 线段 使用<line>元素创建一条线段,格式如下: <line x1=" start- ...

随机推荐

  1. spring-boot (四) springboot+mybatis多数据源最简解决方案

    学习文章来自:http://www.ityouknow.com/spring-boot.html 配置文件 pom包就不贴了比较简单该依赖的就依赖,主要是数据库这边的配置: mybatis.confi ...

  2. Linux Namespace : User

    User namespace 是 Linux 3.8 新增的一种 namespace,用于隔离安全相关的资源,包括 user IDs and group IDs,keys, 和 capabilitie ...

  3. Mysql加锁过程详解(6)-数据库隔离级别(2)-通过例子理解事务的4种隔离级别

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  4. Python多进程操作同一个文件,文件锁问题

    最近工作当中做了一个项目,这个项目主要是操作文件的. 在操作耗时操作的时候,我们一般采用多线程或者多进程.在开发中,如果多个线程需要对文件进行读写操作,就需要用到线程锁或者是文件锁. 使用fcntl ...

  5. 从2PC到Paxos

    在分布式系统中,一个事务可能涉及到集群中的多个节点.单个节点很容易知道自己执行的事务成功还是失败,但因为网络不可靠难以了解其它节点的执行状态(可能事务执行成功但网络访问超时). 若部分节点事务执行失败 ...

  6. Hystrix降级逻辑中如何获取触发的异常

    通过之前Spring Cloud系列教程中的<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>一文,我们已经知道如何通过Hystrix来保护自己的服务不被外 ...

  7. Python学习总结(一)—— 十分钟入门

    一.Python概要 1.1.语言简介 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,具有20多年的发展历史,成熟且稳定. 用任何编程语言来开发程序,都是为了让计算机干活,比如下 ...

  8. SQL 注入漏洞

    首先要知道sql注入形成的原因:用户输入的数据被sql解释器执行 sql注入又分:数字型,字符型,cookie 注入,post注入,延时注入,搜索注入,base64注入 如何甄别一个模块是否有sql注 ...

  9. python中的property属性

    目录 1. 什么是property属性 2. 简单的实例 3. property属性的有两种方式 3.1 装饰器方式 3.2 类属性方式,创建值为property对象的类属性 4. property属 ...

  10. PNG,GIF,JPG的区别及如何选

    GIF: 1:256色 2: 无损,编辑 保存时候,不会损失. 3:支持简单动画. 4:支持boolean透明,也就是要么完全透明,要么不透明 JPEG: 1:millions of colors 2 ...