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

本文深入解析SVG中的viewport、viewbox及preserveAspectRatio属性,通过实例展示这些属性如何影响SVG图形的显示与布局。

工欲善其事必先利其器,没有真正搞懂SVG里的viewport,viewbox, preserveAspectRatio这三个属性,就很容易遇到坑,最近写项目用到svg这三个属性被我一眼就略过 ,后来发现自己并没有理解透,导致写项目产生了奇怪的坑,后面解决了,就是原理没通透,趁着大周末,来一波整理吧


一、这些理论知识必不可少

1.viewport

<svg width="400" height="200"></svg>

上面svg中定义的是一个宽度为400 高度为200 的视口,也就是viewport,我们都知道,SVG标签里接下去嵌套的就是SVG的图形曲线等的代码了,这个viewport就是管SVG里面的元素能显示的在多大的一个面板中的意思,拿PS来理解,就是PS中的一个画板的大小,画出来的东西,就只能在这么大的画板里显示,超出了就看不到

  比如我有这样的一个画板

然后我把蓝色方块往下挪

因为我就设置了200高度的viewport,往下挪后蓝色方块就有一部分没显示出来了

  2.viewbox 

  这个是重头戏哇,注意啦,敲黑板!

viewbox="x, y, width, height"
/*
  x:左上角开始的横坐标点
  y:左上角往下的纵坐标点
  width: viewbox的宽度
  height: viewbox的高度
*/

以上是语法,下面是上一个实例

<svg width="400" heigh="200" viewbox="0 0 200 200">
     <rect x="0" y="0" width="10" height="10">        
</svg>

这段代码会有什么效果呢?实际上viewbox是这样处理的

  ①viewbox="0 0 200 200 "是在宽度为400,高度为200的viewport画板里,从坐标点(0,0)作为viewbox的左上角点,然后再圈出一戈宽度为200 高度为200的viewbox

  ②然后把viewbox中的截屏内容在viewport中显示出来,默认保持纵横比,下面上图

  还没设置viewbox之前

  

 

设置了viewbox

  

然后将这个viewbox进行铺满viewport,上面的我是用PS话的啊,没注意大小 - =

  下面是代码生成的SVG

  橙色是我画的辅助线,原来位置的,红色是加了viewbox后的效果,SVG的viewbox默认是xMid Ymid meet

 

  待更,还有一个属性,以及平时写项目的心得总结,今天先写到这儿~

 

作者:承蒙时光
出处:http://www.cnblogs.com/timetimetime/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

### 使用 SVG `viewBox` 属性实现图形缩放 #### viewBox 基本概念 `viewBox` 是一个重要的属性,用于定义用户坐标系中的矩形区域。此属性允许开发者指定SVG图像的一个特定部分应该如何映射到给定的容器尺寸上[^3]。 对于 `<svg>` 元素来说,当设置了 `width` 和 `height` 后再配合使用 `viewBox` 可以控制SVG内部的内容如何适应这些外部维度。具体而言: - 如果希望保持宽高比例不变并使整个内容可见,则应采用 meet 方式处理 viewport 对齐; - 当需要裁剪部分内容以填充整个视窗时可以选择 slice 方法; 在实际应用中,默认情况下会优先考虑 preserveAspectRatio="xMidYMid meet" 这种方式来确保原始比率得以维持的同时最大化显示范围内的对象大小[^2]。 #### 缩放机制解析 为了达到放大或缩小的效果,可以通过调整 `viewBox` 参数里的最小X轴值(min-x),最小Y轴值(min-y),宽度(width)以及高度(height)[^1]。比如要让画面变大两倍,在原本的基础上将 widthheight 减半即可完成操作。反之亦然,如果想要缩小一倍则需把这两个数值加倍。 下面给出一段简单的 JavaScript 代码用来动态改变 `viewBox` 达成交互式的缩放效果: ```javascript function zoomSvg(zoomLevel, svgElement){ let currentViewBox = svgElement.getAttribute('viewBox').split(' '); // Parse the values into numbers and apply zoom level. const newMinX = parseFloat(currentViewBox[0]) * (1 / zoomLevel); const newMinY = parseFloat(currentViewBox[1]) * (1 / zoomLevel); const newWidth = parseFloat(currentViewBox[2]) * (1 / zoomLevel); const newHeight = parseFloat(currentViewBox[3]) * (1 / zoomLevel); // Set updated viewBox attribute on the element with adjusted dimensions. svgElement.setAttribute('viewBox', `${newMinX} ${newMinY} ${newWidth} ${newHeight}`); } ``` 这段函数接收两个参数:一个是表示缩放级别的浮点数 (`zoomLevel`) ,另一个是要被操纵的目标SVG DOM节点(`svgElement`).它读取当前存在的 `viewBox` 字符串形式的数据,并据此计算新的边界框位置与尺度之后重新赋值回去从而实现了平滑过渡的视觉体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值