先看个示例

代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>svg-viewbox</title>
<style>
body {
text-align: center;
}
svg {
margin-top: 100px;
}
</style>
</head>
<body>
<svg width="100px" height="200px" style="background:#889cee">
<circle cx="50" cy="50" r="50" fill="#ff0036"></circle>
</svg>
</body>
</html>

在一个宽为100px,高为200px的画布上,以坐标(50,50)为圆点,50为半径画了一个圆。结果如图所示:

但在实际的过程中,根据不同的业务场景,可以需要对画布的大小做出调整,比如我们把画布大小调整为宽50px,高100px,那实际的效果如图所示:

根据这个结果我们看到里面的内容根据画布的调整被截断了,显然这个不是我们想要的结果,我们想在改变画布的同时,里面的内容也会跟着自动调整缩放,这时viewbox上场了。

用viewbox缩放解决

我们先给初始代码加上viewbox属性,并将viewbox的值设置和画布的大小1:1。

viewBox 的四个参数分别代表:最小X轴数值;最小y轴数值;宽度;高度。

一般情况,前面2个参数不需要调整,为0就可以,除非你需要视口在画布中发生位移。

<svg width="100px" height="200px" viewbox="0 0 100 200" style="background:#889cee">
<circle cx="50" cy="50" r="50" fill="#ff0036"></circle>
</svg>

运行代码后,显示效果跟初始的一张图没有什么区别。

但是当我们把画布修改为宽50px,高100px的时候,显示发生了变化

<svg width="50px" height="100px" viewbox="0 0 100 200" style="background:#889cee">
<circle cx="50" cy="50" r="50" fill="#ff0036"></circle>
</svg>

如图所示,里面的内容跟着画布大小的变化发生了缩放,从而实现了我们的功能。

viewbox分析

之所以能缩放,是因为svg的特性,在默认情况下,会调整viewbox的大小,当画布大小调整时,viewbox会自动缩放正好能放进svg里。

拿上面的例子:



蓝色框是视口的大小,绿色框是内容圆的大小,当画布大小改变的时候,viewbox需要调整到正好大小放到svg里,所以我们整个显示就缩放了。

这就是视口不变,画布发生变化的情况。我们再看下一下画布不变,视口大小发生改变的情况。

<svg width="100px" height="200px" viewbox="0 0 50 100" style="background:#889cee">
<circle cx="50" cy="50" r="50" fill="#ff0036"></circle>
</svg>

如上图,画布的大小是初始大小,视口的大小即是图里面的蓝色框区域,宽50px,高为100px。按照viewbox需要调整到刚好放到svg里,那么蓝色框区域框着的内容区域就会扩大占满画布。也即是如图所示:

viewbox之preserveAspectRatio属性

viewbox 默认这个属性的值为:preserveAspectRatio="xMidYMid meet"

preserveAspectRatio 第一个参数有九个可选值,用来表示视口的对齐方式,以左上角为原点,Min表示靠近原点,Mid表示居中,Max 表示远离原点。

xMinYMin,
xMinYMid,
xMinYMax,
xMidYMin,
xMidYMid,
xMidYMax,
xMaxYMin,
xMaxYMid,
xMaxYMax

上面的例子,当把 viewbox 改为宽高都为100,并且加上 preserveAspectRatio 属性,值为 xMaxYMax:

<svg width="100px" height="200px" viewbox="0 0 100 100" preserveAspectRatio="xMaxYMax" style="background:#889cee">
<circle cx="50" cy="50" r="50" fill="#ff0036"></circle>
</svg>

我们发现视口是离原点最远对齐的,而不是 preserveAspectRatio 的默认值为居中对齐。

第二个参数: meetslice or none

  • meet 就是前面那种自动调整viewbox可以在 svg 画布中完全展示(以画布的最小边为界,不会超过最小边大小)。
  • slice 就是调整viewbox可以撑满 svg 画布(以画布最大边为界,可能会超过最小边,但不会超过最大边)。

改变 preserveAspectRatio 的值为 slice,如下:

<svg width="100px" height="200px" viewbox="0 0 100 100" preserveAspectRatio="xMaxYMax slice" style="background:#889cee">
<circle cx="50" cy="50" r="50" fill="#ff0036"></circle>
</svg>

如上图,对其方式是离原点最远对齐,并且第二个参数为 slice 表示视图会撑满视图最大的边。也就是 viewbox 的高100会以画布的高200做调整。

  • none 表示 viewbox 会被拉伸到和 svg 画布相同尺寸,里面的内容也会被等比拉伸,不能维持原有比例
<svg width="100px" height="200px" viewbox="0 0 100 100" preserveAspectRatio="none" style="background:#889cee">
<circle cx="50" cy="50" r="50" fill="#ff0036"></circle>
</svg>

参考

svg之viewbox缩放的更多相关文章

  1. Art-Directing SVG图像viewBox属性

    Art-Directing SVG图像viewBox属性 作者:彦子 日期:2015-06-02 点击:992 svg 译者注:根据Google Dev文档的解释,Art Direction在这篇文章 ...

  2. svg图片的缩放拖拽

    svg是一种不错的矢量图,有时候我们会使用这样的图片来作为展示图,因为它不会因为放大缩小而失真. 好了,不扯淡了,废话少说,直入主题吧. 首先确定你是要深入学习还是要简单的把遇到的小任务解决一下,以后 ...

  3. HTML5: SVG (可缩放矢量图形)

    ylbtech-HTML5: SVG (可缩放矢量图形) 可缩放矢量图形是基于可扩展标记语言(标准通用标记语言的子集),用于描述二维矢量图形的一种图形格式.它由万维网联盟制定,是一个开放标准. 1. ...

  4. 关于SVG的viewBox

    在SVG中,通过svg标记的 width和height可以规定这段SVG代码所表达的数据在绘制时所占用的空间大小 如下代码svg设置了宽度与高度,rect同样,所以结果自然是全屏 <svg wi ...

  5. SVG(可缩放矢量图形)

        SVG可缩放矢量图形(Scalable Vector Graphics)是基于可扩展标记语言(XML),用于描述二维矢量图形的一种图形格式.SVG是W3C("World Wide W ...

  6. 浅谈SVG(可缩放的矢量图形)

    前一段项目中用到了svg图片就和其他的元素一样 直接引用就可以展示在页面上,因为项目紧张没有仔细的研究,最近在扩展自己的基础知识,偶然看到了这个东西,于是总结了一些博客园中关于这个svg的基础知识,只 ...

  7. [Swift通天遁地]八、媒体与动画-(5)使用开源类库绘制文字、图形、图像、图表、SVG(可缩放矢量图形)

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

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

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

  9. svg的viewport和viewbox

    svg中视区重要的概念 1. viewport  视口,相当于显示器屏幕 2. viewbox   视区,相当于在屏幕上截取一小块,放大到整个屏幕,就是特写的效果 3. preserveAspectR ...

  10. HTML5 可缩放矢量图形(2)—SVG基础

    参考文档——权威 SVG常识 渲染顺序——后来居上:越后面的元素越可见 单位——可以指定,也可以不指定,默认px,其他:em.%.cm.mm... SVG画布——绘制图像的区域,无限大 SVG视窗—— ...

随机推荐

  1. 机器学习策略篇:快速搭建你的第一个系统,并进行迭代(Build your first system quickly, then iterate)

    快速搭建的第一个系统,并进行迭代 如果正在考虑建立一个新的语音识别系统,其实可以走很多方向,可以优先考虑很多事情. 比如,有一些特定的技术,可以让语音识别系统对嘈杂的背景更加健壮,嘈杂的背景可能是说咖 ...

  2. 新一代的团队协作平台-Teamlinker

    Teamlinker是一个集成了不同功能和模块的团队协作平台.你可以联系你的团队成员,分配你的任务,开始一个会议,安排各项事务,管理你的文件等.并且支持线下免费部署,功能和线上版本一致. 主页 对于很 ...

  3. 创建数据库时排序规则utf8_general_ci与utf8_bin的区别

    在MySQL数据库中,字符集(如utf8)定义了字符如何存储,而排序规则(Collation)则定义了字符如何比较.排序和区分大小写.utf8_general_ci和utf8_bin是两种常用的UTF ...

  4. 在Visual Studio Code中,鼠标双击PHP变量的时候,如何选择包括$在内的整个变量名

    依次点击:文件->首选项->设置 并在"editor.wordSeparators"设置中为您的语言指定删除"$"符号:

  5. 操作系统|SPOOLing(假脱机)技术

    什么是假脱机技术,它可以解决什么问题? 什么是脱机技术 要回答什么是假脱机技术,首先我们需要知道什么是脱机技术.<计算机操作系统(第四版)>写道: 为了解决人机矛盾及CPU和I/O设备之间 ...

  6. 在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST

    引言 蛋白质语言模型 (Protein Language Models, PLM) 已成为蛋白质结构与功能预测及设计的有力工具.在 2023 年国际机器学习会议 (ICML) 上,MILA 和英特尔实 ...

  7. .NET 轻量级 命令行工具 CSharpRepl

    前言 当我们需要快速测试代码片段时,常见的做法是启动Visual Studio或使用在线代码编辑器.然而,Visual Studio的启动可能较为缓慢且占用较多系统资源,而在线编辑器则可能遇到语法支持 ...

  8. idea使用git管理项目(Mac版)

    1.本地安装git mac版 breaw install git 查看是否安装成功 git --version 这样就成功了,一般是自带的有 windows版 https://www.cnblogs. ...

  9. springsecurity:权限与异常处理

    权限即不同用户可以使用不同功能 实现前置: 在上一次登录与校验中,我们将authentication存入到SecurityContextHolder中,后续我们需要从FilterSecurityInt ...

  10. Java--普通方法重载

    [转载自本科老师上课课件] 调用一个重载过的方法时,Java编译程序是如何确定究竟应该调用哪一个方法?以下代码定义了三个重载方法: public void f(char ch){ System.out ...