先看个示例

代码如下:

<!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. WebGL管网展示(及TubeGeometry优化)

    前言 管路展示在三维场景中很常见.比如地下管网,建筑里面的水果,暖通管道等等的展示. 建立管路的方式主要两种: 通过3DMax C4D Blender等建模工具进行建模. 通过路径数据,程序生成三维管 ...

  2. TP3.2与TP5.0的区别

    1. 控制器输出return $this->fetch(); ----5$this->display(); ----3.2单字母函数去掉了 如:M() D() U() S() C() 3. ...

  3. Linux自己制作rpm包

    制作rpm包 由源码包---->rpm包 安装制作rpm包工具包rpm-build 在制作过程中需要源码包和配置文件 rpmbuild制作rpm包的原理: 1.首先rpmbuild会先将源码包进 ...

  4. 常见的SQL数值型数据处理函数

    在数据驱动的时代,SQL 已成为数据分析和管理中不可或缺的工具.无论是处理简单的查询还是复杂的数据分析,SQL 都能帮助我们高效地完成任务. 然而,在处理数值型数据时,你是否感到过困惑,不知道如何运用 ...

  5. 机器学习:详解迁移学习(Transfer learning)

    详解迁移学习 深度学习中,最强大的理念之一就是,有的时候神经网络可以从一个任务中习得知识,并将这些知识应用到另一个独立的任务中.所以例如,也许已经训练好一个神经网络,能够识别像猫这样的对象,然后使用那 ...

  6. 洛谷[NOIP2015 普及组] 金币

    [NOIP2015 普及组] 金币 题目背景 NOIP2015 普及组 T1 题目描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之 ...

  7. windows上传ipa到开发者中心(app store)的方法

    假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开发者中心才能在构建版本里选择构建版本上架 ...

  8. RHCA rh442 009 磁盘算法 RAID相关 磁盘压力测试

    磁盘 一个数据在磁盘A位置,一个数据在磁盘B位置,他们如果隔着很远.这对磁盘来说性能很差 (机械盘,磁头来回移动) 一个数据写进来,他会把数据放到缓存中,经过磁盘调度算法来调度,最后写到硬盘 io读写 ...

  9. Docker镜像构建:技术深度解析与实践指南

    本文深入分析了Docker镜像构建的技术细节,从基础概念到高级技术,涵盖了多阶段构建.安全性优化.性能提升及实战案例.旨在为专业人士提供全面的技术洞察和实用指导,以提升Docker镜像构建的效率和安全 ...

  10. Jmeter二次开发函数 - 将指定时间转换为时间戳

    1.达到效果:在jmeter的函数助手增加一个"timeStamp"函数,调用"timeStamp"函数可以将用户传入的时间转换为时间戳. 2.eclipse项 ...