本文翻译自blog:

https://www.sarasoueidan.com/blog/svg-coordinate-systems/

SVG元素不像其他HTML元素一样受css盒子模型所制约。这个特点导致transform和postioning svg元素显得有些神秘,并且初看起来不是那么浅显易懂。然而,一旦你理解了SVG坐标体系以及transformation是如何工作的,那么操作SVG会变得非常简单。本文中,我们将涵盖控制SVG坐标体系的三个方面内容:viewport, viewBox和preserveAspectRatio

这是包含三篇文章系列中的第一篇:

  • 理解SVG坐标体系和transformations:就是本文
  • 理解svg坐标体系和transformations: transform属性
  • 理解svg坐标体系和transformations: 建立新的viewports

和本文相对应的live demo:

https://www.sarasoueidan.com/demos/interactive-svg-coordinate-system/

SVG Canvas

canvas是SVG内容呈现的区域。概念上说,这个canvas在两个纬度都是无穷大的。也就是说SVG可以为任何次寸。然而,SVG内容只能在有限的screen上(这就是一个有限的区域,并被称为viewport),也就是viewport上显示。SVG中落在这个viewport范围之外的内容将被clipped off并且不可见。

viewport

viewport就是SVG可见的那部分区域。你可以把viewport想象为一扇窗户,通过这个窗户你可就可以看到一个特定区域的风景(SVG部分内容).而这个风景(SVG内容)通过这扇窗户可以全部或者部分地可见。

SVG viewport和浏览器的viewport是类似的。一个web page可以是任何次寸大小,它可以比浏览器的viewport的宽度大,也可以比浏览器viewport的高度高。然而在同一时刻,我们只能看到web page的一部分(就是通过这个viewport)

是整个SVG canvas是否可见,还是仅部分canvas可见这个取决于size of that canvas乘于preserveAspectRation属性的值

你可以通过设定最外层的svg元素的width和height属性来指定这个viewport的次寸大小。

<!-- the viewport will be 800px by 600px -->
<svg width="800" height="600">
<!-- SVG content drawn onto the SVG canvas -->
</svg>

在SVG概念里,属性的值可以有也可以没有对应的单位。A unitless value is said to be specified in user space using user units.如果值被指定为user units,那么这个值就假设为具有"px"单位的值。这意味着上面的例子中我们就指定了viewport为800pxX600px的区域。

你也可以指定对应的单位,在SVG中支持的单位有:em,ex,px,pt,pc,cm,mm,in和百分比。

一旦最外层的SVG元素的width和height被指定了,浏览器将会建立一个initial viewport coordinate system和一个initial user coordinate system.

the initial coordinate system

初始的viewport coordinate system是建立在viewport之上的坐标体系,从viewport左上角(0,0)点开始,正的x-轴往右生长,

正的y-轴向下生长initial coordinate system中的1个单位等于viewport中的一个"pixel".这个坐标体系和通过css盒子模型建立起来的html坐标体系是类似的。

the initial user coordinate system则是在SVG canvas上建立起来的坐标系统。这个坐标系统初始化时是和viewport坐标系统是相等同的。

深入理解SVG坐标体系和transformations- viewport, viewBox,preserveAspectRatio的更多相关文章

  1. SVG 入门——理解viewport,viewbox,preserveAspectRatio

    工欲善其事必先利其器,没有真正搞懂SVG里的viewport,viewbox, preserveAspectRatio这三个属性,就很容易遇到坑,最近写项目用到svg这三个属性被我一眼就略过 ,后来发 ...

  2. 理解SVG的viewport,viewBox,preserveAspectRatio

    万丈高楼平地起,基础很重要. viewport 表示SVG可见区域的大小,或者可以想象成舞台大小,画布大小. <svg width="500" height="30 ...

  3. 理解SVG坐标系和变换:视窗,viewBox和preserveAspectRatio

    SVG元素不像HTML元素一样由CSS盒模型管理.这使得我们可以更加灵活定位和变换这些元素-也许一眼看上去不太直观.然而,一旦你理解了SVG坐标系和变换,操纵SVG会非常简单并且很有意义.本篇文章中我 ...

  4. 理解SVG图片标签的viewport、viewBox、preserveAspectRatio缩放

    一.viewport 表示SVG可见区域的大小,或者可以想象成舞台大小,画布大小. <svg width="></svg> 上面的SVG代码定义了一个视区,宽500单 ...

  5. 理解SVG坐标系统和变换: transform属性

    SVG元素可以通过缩放,移动,倾斜和旋转来变换-类似HTML元素使用CSS transform来变换.然而,当涉及到坐标系时这些变换所产生的影响必然有一定差别.在这篇文章中我们讨论SVG的transf ...

  6. 理解SVG坐标系统和变换: 建立新视窗

    在SVG绘制的任何一个时刻,你可以通过嵌套<svg>或者使用例如<symbol>的元素来建立新的viewport和用户坐标系.在这篇文章中,我们将看一下我们如何这样做,以及这样 ...

  7. Three.js 学习笔记(1)--坐标体系和旋转

    前言 JavaScript 3D library The aim of the project is to create an easy to use, lightweight, 3D library ...

  8. java基础 绘图技术.坦克大战 之java绘图坐标体系(一)

    坐标体系介绍 下图说明了java坐标体系.坐标原点位于左上角,以像素为单位,像素是计算机屏幕上最小的显示单位.在java的坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素:第二个 ...

  9. QT从入门到入土(二)——对象模型(对象树)和窗口坐标体系

    摘要 我们使用的标准 C++,其设计的对象模型虽然已经提供了非常高效的 RTTI 支持,但是在某些方面还是不够灵活.比如在 GUI 编程方面,既需要高效的运行效率也需要强大的灵活性,诸如删除某窗口时可 ...

随机推荐

  1. leetcode--539. Minimum Time Difference

    Given a list of -hour clock time points in "Hour:Minutes" format, find the minimum minutes ...

  2. windows下搭建Cordova安卓环境

    phoneGap 被收购后衍生出了 Cordova Android 的开发工具也由 Eclipse 向 Android Studio 靠拢 行业动态在更新,所以资料也要跟着变化... 在开始之前,作为 ...

  3. Golang 包依赖管理工具

    1.godep:https://studygolang.com/articles/9877 2.dep:https://studygolang.com/articles/10589 3.glide:h ...

  4. InnoSetup打包时出现Interal error: CallSpawnServer: Unexpected response: $0.错误的解决办法

    如果在使用Innosetup打包软件时,如果出现Interal error: CallSpawnServer: Unexpected response: $0.错误, 如下图: 可以查看 Innose ...

  5. python性能对比

    python性能对比之items #1 #-*- coding:utf8-*- import datetime road_nodes = {} for i in range(5000000): roa ...

  6. 百度地图VUE-REACT

    针对目前火热的前端开发框架React和VUE,为了方便使用这两种框架开发的同学们能更好的使用百度地图JSAPI,我们分别开源了基于百度地图JSAPI的React组件库和VUE组件库.VUE:https ...

  7. [转]Asp.net Mvc 与WebForm 混合开发

    本文转自:https://www.cnblogs.com/dooom/archive/2010/10/17/1853820.html 根据项目实际需求,有时候会想在项目中实现Asp.net Mvc与W ...

  8. SqlServer入门学习

    --distinct(去除重复数据)select distinct Time from HightTable--Between select * from HightTable where ID BE ...

  9. Java - 延迟初始化

    延迟初始化(lazy initialization),也就是在真正被使用的时候才开始初始化的技巧. 不论是静态还是实例,都可以进行延迟初始化. 其本质是初始化开销和访问开销之间的权衡. 毕竟是一种优化 ...

  10. MyEclipse中快速查看错误

    当代码中有错误的时候,MyEclipse会用红线标示错误.这个时候在错误地方按下F2就会显示错误详情了.