前面的话

  SVG中坐标系统非常关键,但在介绍坐标系统之前,首先要了解视野。本文将详细介绍SVG视野

视野

  下面来区分视窗、世界和视野

【视窗】

  SVG的属性width、height来控制视窗的大小,也称为SVG容器

【世界】

  SVG里面的代码,就是对SVG世界的定义

【视野】

  世界是无穷大的,视野是观察世界的一个矩形区域。如下图所示

  世界不可变,而视野是可以改变的。在SVG中,提供了viewBox和preserveAspectRatio属性来控制视野

viewBox

  viewBox属性允许指定一个给定的一组图形伸展以适应特定的容器元素

  viewBox属性的值是一个包含4个参数的列表 min-xmin-ywidth and height, 以空格或者逗号分隔开, 在用户空间中指定一个矩形区域映射到给定的元素

【位置】

  首先来介绍下viewBox的位置属性x、y

  将viewBox的尺寸与SVG容器尺寸设置为相同,并且在SVG中绘制占满容器尺寸的一个矩形

<svg version="1.1" id="drawing" width="200" height="150" style="border:1px solid #cd0000;" viewbox="0 0 200 150" xmlns="http://www.w3.org/2000/svg">
<rect x="0" y="0" width="200" height="150" fill="#cd0000" />
</svg>

  结果如下图所示,矩形占满容器

  下面改变x、y属性来查看SVG图形有何变化

  由结果所示,当x值为正值时,视野向右移动,由于世界和视窗都不变。所以,看起来好像是图形向左移动。反之亦然

【尺寸】

  介绍过位置属性后,下面以一个例子的形式来解释viewBox中的width和height属性

<svg version="1.1" id="drawing" width="200" height="150" style="border:1px solid #cd0000;" viewbox="0 0 40 30" xmlns="http://www.w3.org/2000/svg">
<rect x="10" y="5" width="20" height="15" fill="#cd0000"/>
</svg>

  结果如下所示

  如果不看viewBox,一定会觉得诧异。SVG尺寸明明有200*150像素,而小小的<rect>大小只有其1/10,但是显示出来的图形占据了大量的区域

  下面的gif图,解释了这种现象的原因

  因此,SVG里面的图形等元素的尺寸是依据viewBox的width、height设置来布局的。最终,再把viewBox的尺寸放大到视窗的尺寸大小来显示

  下面来解释下,视窗、世界和视野的关系

  世界是无穷大的。viewBox的尺寸设置的越大,即视野越大,则可显示的世界的区域就越大。由于视窗大小是固定的,因此,SVG内部元素尺寸看上去就越小。反之亦然

preserveAspectRatio

  上面的例子,SVG的宽高比正好和viewBox的宽高比是一样的,都是4:3。显然,实际应用viewBox不可能一直跟viewport相同比例。此时,就需要preserveAspectRatio出马了,此属性也是应用在<svg>元素上,且作用的对象都是viewBox

  preserveAspectRatio属性的值为空格分隔的两个值组合而成。第一个值表示,viewBox如何与SVG viewport对齐;第二个值表示,如何维持高宽比(如果有)

  其中,第1个值又是由两部分组成的。前半部分表示x方向对齐,后半部分表示y方向对齐

值      含义
xMin viewport和viewBox左边对齐
xMid viewport和viewBox x轴中心对齐
xMax viewport和viewBox右边对齐
YMin viewport和viewBox上边缘对齐。注意Y是大写。
YMid viewport和viewBox y轴中心点对齐。注意Y是大写。
YMax viewport和viewBox下边缘对齐。注意Y是大写。

  然后,把x和y进行组合,比如xMinYMin、xMidYMin

  preserveAspectRatio属性第二部分的值支持下面3个

值      含义
meet 保持纵横比缩放viewBox适应viewport
slice 保持纵横比同时比例小的方向放大填满viewport
none 扭曲纵横比以充分适应viewport

  [注意]preserveAspectRatio属性第二部分的值设置为none时,第一部分的值必须为空,否则报错

  如果不设置preserveAspectRatio属性,默认是xMidYMid、meet属性

  下面的例子中,视窗设置为200*150,视野设置为200*100,矩形占满整个视野

  由结果所示,设置为meet时,视野的宽高通过按比例缩放,都处于视窗范围内;设置为slice时,按比例缩放后发生剪切,有些内容超出视窗范围;设置为none时,视野宽高缩放到视窗的尺寸

SVG视野的更多相关文章

  1. SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组

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

  2. SVG坐标系统及图形变换

    前面的话 前面介绍过SVG视野后,本文将开始介绍SVG坐标系统及图形变换 坐标定位 对于所有元素,SVG使用的坐标系统或者说网格系统,和Canvas用的差不多(所有计算机绘图都差不多).这种坐标系统是 ...

  3. svg的世界、视窗、视野

    刚学svg时 看视频有人说了视窗和视野两个概念.学移动端时,又听说过视口这个概念.感觉还是有点绕的.以此博客来整理记录我查的资料. 1.世界 就是说svg的世界其实可以无限大,你想让它多大就多大,你可 ...

  4. SVG坐标系统

    SVG的画布.画布视区(viewBox).浏览器视窗的概念 画布 画布是绘制SVG内容的一块区域,理论上在所有维度上都是无限的.(也有人称为"SVG世界",但我觉得叫画布比较合适) ...

  5. (转)利用 SVG 和 CSS3 实现有趣的边框动画

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

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

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

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

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

  8. SVG 学习<六> SVG的transform

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

  9. SVG 学习<五> SVG动画

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

随机推荐

  1. 【JAVASCRIPT】React学习-组件生命周期

    摘要 整理组件加载过程,详细见官方文档:https://facebook.github.io/react/docs/react-component.html mount 过程 1)constructo ...

  2. hadoop入门,跑出第一个WordCount

    1.环境准备 下载:http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz 解压:解压后,修改et ...

  3. Swift 细节

    1.swift ?和 !的区别 1.1 Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化.如果在使 ...

  4. oracle 修改表空间文件路径方法

     比如说修改 user01.dbf  文件 的路径 1.先登录sqlplus:    C:\Documents and Settings\chezh>sqlplus  system/passwo ...

  5. Python实现单词查询&文件查找

    最近学C++ Primer,做到第十二章有个习题.要求针对英文文本,对于用户想搜索的单词,打印出该单词在文本中出现的总次数,单词所出现行号及对应的行内容:单词在一行内出现多次,只打印该行一次.C++的 ...

  6. SpringBoot实战总汇--详解

    简介 Spring 诞生时是 Java 企业版(Java Enterprise Edition,JEE,也称 J2EE)的 轻量级代替品.无需开发重量级的 Enterprise JavaBean(EJ ...

  7. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(一)设计一套好的RESTful API

    写在前面的话 看了一下博客目录,距离上次更新这个系列的博文已经有两个多月,并不是因为不想继续写博客,由于中间这段时间更新了几篇其他系列的文章就暂时停止了,如今已经讲述的差不多,也就继续抽时间更新< ...

  8. 七月SSL行业新闻回顾

    大事件一:被泄露的私钥和基于假私钥进行的撤回 上个月,我们报告说Spotify和Cisco在应用程序中捆绑了有效证书的私钥.这些证书将根据基准要求被撤销,但应用程序不是泄露私钥的唯一来源.Koen R ...

  9. 《Java从入门到放弃》入门篇:springMVC数据传递

    springMVC中的数据传递方式与JSP和Struts2相比,更加的简单.具体有什么样的区别呢?我们通过下面这张图来对比就知道了. 随手画的,有些错别字,不用太在意..... 接下来,进入正题,sp ...

  10. mycat学习心得

    最近老大要求我们学习mycat,并运用到实际项目中.现在简单分享下自己的学习心得,也算是只是积累吧. 什么是mycat? 用我的话理解就是:mycat是一种技术,采用mycat后可以提高程序的速度,也 ...