svg的viewport和viewBox

简介: svg的viewport和viewBox

viewport


是 svg 图像的可见区域。 svg标签上的width, height表示的就是viewport。如果内部渲染的图标不在这个视口内,他就不会被渲染出来。


viewBox


是用于在画布上绘制 svg 图形的坐标系统。如果不指定viewBox,他就等同于 0 0 svg宽度 svg高度。


<svg width="500" height="200" viewBox="0 0 50 20" style="border: 1px solid #000000">
  <rect x="20" y="10" width="10" height="5" style="stroke: #000000; fill:none;"/>
</svg>      


上述案例中 viewBox 坐标系中,上述代码相当于:


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


所以:图标会根据viewport和viewBox的比值来进行缩放。除了svg的视口宽高不需要通过计算缩放,其他的标签属性和viewBox都需要通过计算来确定图标的位置和大小。


preserveAspectRatio


用于当 viewport 和 viewBox 宽高比不相同时,指定这个坐标系在viewport 中是否完全可见,同时也可以指定它在viewport 坐标系统中的位置。


preserveAspectRatio 是一个较难理解的概念,它相当于在 viewport 内部绘制了一个虚拟内框,它的默认值为:xMidYMid meet


<svg width="500" height="200" viewBox="0 0 200 200" style="border: 1px solid #000000" preserveAspectRatio="xMidYMid meet">
  <rect x="100" y="100" width="100" height="50" stroke-width="10" style="stroke: #000000; fill:none;"/>
</svg>


上述配置的原理如下图:


网络异常,图片无法展示
|

<svg width="500" height="200" viewBox="0 0 200 200" style="border: 1px solid #000000" preserveAspectRatio="xMaxYMin meet">
  <rect x="100" y="100" width="100" height="50" stroke-width="10" style="stroke: #000000; fill:none;"/>
</svg>


上述配置的原理如下图:


网络异常,图片无法展示
|


preserveAspectRatio 第二个参数如下:


  • meet: 保持宽高比并将viewBox缩放为适合viewport的大小


meet 模式下,svg 将优先采纳压缩比较小的作为最终压缩比,meet 是默认参数


  • slice: 保持宽高比并将所有不在viewport中的viewBox剪裁掉


<svg width="500" height="200" viewBox="0 0 200 200" style="border: 1px solid #000000" preserveAspectRatio="xMidYMax slice">
  <rect x="100" y="100" width="100" height="50" stroke-width="10" style="stroke: #000000; fill:none;"/>
</svg>                          


上述代码原理如下图:


网络异常,图片无法展示
|


<svg width="500" height="200" viewBox="0 0 200 200" style="border: 1px solid #000000" preserveAspectRatio="xMaxYMin slice">
  <rect x="100" y="100" width="100" height="50" stroke-width="10" style="stroke: #000000; fill:none;"/>
</svg>                          


上述代码原理如下图:


网络异常,图片无法展示
|


slice 模式下,svg 将优先采纳压缩比较大的作为最终压缩比


  • none: 不保存宽高比。缩放图像适合整个viewbox,可能会发生图像变形


none 模式下,svg 将分别计算 x 和 y 轴的压缩比


<svg width="500" height="200" viewBox="0 0 200 200" style="border: 1px solid #000000" preserveAspectRatio="none">
  <rect x="100" y="100" width="100" height="50" stroke-width="10" style="stroke: #000000; fill:none;"/>
</svg>


相关文章
|
5月前
|
移动开发 前端开发 API
HTML5 Canvas 填充与描边(Fill And Stroke)
HTML5 Canvas 填充与描边(Fill And Stroke)
76 3
|
3月前
|
前端开发
postcss-px-to-viewport
【8月更文挑战第10天】
45 3
|
6月前
|
XML 前端开发 JavaScript
canvas和svg的比较
canvas和svg的比较
|
6月前
|
XML 移动开发 前端开发
Canvas和SVG:你应该选择哪一个?
Canvas和SVG:你应该选择哪一个?
103 2
|
6月前
|
Web App开发 移动开发 前端开发
SVG
这段代码将引用刚才定义的圆形,并将其放置在(20,20)的位置,大小为60x60。 除了<svg>和<use>元素外,SVG还提供了许多其他的元素和属性,可以帮助你创建各种复杂的图形。比如<rect>、<line>、<polygon>等元素,可以用来创建矩形、线条和多边形等。
77 0
|
6月前
|
XML 存储 编解码
svg的viewBox、width和height的设置说明
svg的是没有边界的,svg画布只是用于展示svg世界中某一个范围的内容,而对于超过了svg画布范围的内容,则会被遮挡。默认svg画布默认显示世界坐标下原点坐标的width*height面积的矩形视野。
|
移动开发 前端开发 HTML5
html5 h5使用canvas 画一个圆角矩形
html5 h5使用canvas 画一个圆角矩形
html5 h5使用canvas 画一个圆角矩形
利用Axure RP9 动态面板理解SVG ViewPort和ViewBox
利用Axure RP9 动态面板理解SVG ViewPort和ViewBox
183 0
利用Axure RP9 动态面板理解SVG ViewPort和ViewBox
|
XML 编解码 前端开发
|
Android开发 容器
Horizontal viewport was given unbounded height.width.
Horizontal viewport was given unbounded height.width.
273 0