SVG精髓(2)

扫花
• 阅读 2811

坐标系统

视口

文档打算使用的画布区域称作视口.
我们可以在<svg>上使用 widthheight 属性确定视口大小.
width height 属性的值 是可以带有单位的数字, 也可以是不带单位, 不带单位时, 该数字会被当做用户坐标下的像素.
属性单位是大多是 css 支持的那几个单位 em, ex, px, pt, pc, cm, mm, in.
也可以指定为百分比.

使用默认的用户坐标

svg 的画布就是一个坐标系统. 水平的 x 轴 向右递增, 垂直的 y 轴 向下递增, 坐标的左上角坐标均为 0 . 这个点写作 (0, 0), 称作原点.

在默认的用户坐标里, 所有没有单位的数值都被视为像素.

为视口指定用户坐标

svg 上有一个 viewBox 属性.
这个属性由 4 个数值组成. 他们分别代表替代默认的用户坐标的 最小 x 坐标, 最小 y 坐标, 宽度 和 高度.

<svg width="4cm" height="5cm" viewBox="0 0 64 80">

这表示 这 4cm * 5cm 的画布上, 每个厘米 有 16 个单位的坐标系统.
如果内部有个 正方形

<rect x="10" y="35" width="40" height="40">

这样表示 从 (10, 35) 单位开始画 一个 长 40个单位 宽 40 个单位 的正方形.

保留宽高比

上一个例子中,宽高比是相同的 (4/5 = 64/80). 但是视口高度的宽高比和viewBox 的宽高比不一样,该怎么办?

svg 为这些情况设置了一个属性 preserveAspectRatio, 用它来指定宽高比不同时的对齐方式。

它的使用的格式是:

preserveAspectRatio="alignment [meet | slice]"

我们先来看一下 alignment , 它是一个组合值, 用来指定轴和位置。
我们看一下 alignment 的基本值。

xMin: 按视口左侧边缘, viewBox 最小 x 值对齐,
xMid: 按视口水平中心, viewBox 中点 x 值对齐,
xMax: 按视口右侧边缘, viewBox 最大 x 值对齐。

yMin: 按视口顶部边缘, viewBox 最小 y 值对齐,
yMid: 按视口垂直中心, viewBox 中点 y 值对齐,
yMax: 按视口底部边缘, viewBox 最大 y 值对齐。

alignment 值是类似: xMinYMax(表示按照左侧边缘和底部边缘对齐)。

它的后面还有两个值 meetslice
我们分别来看一下这两个值:

meet 值: 它会缩小原本的图片以适配闭合的 viewBox。 它会 按照较小的尺寸等比例缩放图形, 以使图形完全填充视口。

slice 值: 它会放大原本的图片以适配闭合的 viewBox。 它会 按照较大的尺寸等比例缩放图形,并且裁剪超出视口的部分。

其实 preserveAspectRatio 还有一个单独的 none 值, 表示 图形并不会被等比缩放, 而适应完全填充视口。

如果viewBox 的宽高比不同,也没有给定 preserveAspectRatio 的值, 那么就会默认给一个 xMidYMid meet值。

演示链接: http://oreillymedia.github.io...

嵌套坐标系统

我们可以将额外的<svg> 元素插入到文档中来建立新的视口和坐标系统。这样我们可以在这个新创建的元素内绘制图形了。

例如以下代码:

<svg width="200px" height="200px" viewBox="0 0 200 200">
    <svg x="100px" y="5px" width="30px" height="80px" viewBox="0 0 50 50" preserveAspectRatio="xMaxYmMax meet">
        <circle cx="25" cy="25" r="25" style="stroke: black;"></circle>
    </svg>
</svg>

这段代码里有两个 <svg> , 里面的元素比外面多了一个 x属性, 和y属性。
里面这个元素代表着, 我们在外部的元素坐标系统里的 100px 处和 50px处开始, 定义一个 width30pxheight80px 的一个新的画布。它允许我们在内部的元素内部, 用内部的新的坐标系统中定义图形。

如果尝试为一个外部的 <svg> 带有 preserveAspectRatio 属性使用 meet 或者 slice ,而内部 <svg> 使用 preserveAspectRatio 属性是 none。 嵌套元素的宽高比, 将按照父 SVG 被压缩或者拉伸的坐标来求值来适配视口。会产生奇怪的效果(图片拉伸,剪裁或者缩放)。

接下来的 svg精髓 都放入笔记中了。

SVG精髓(2) 完

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
晴空闲云 晴空闲云
3年前
svg中viewbox图解分析
svg中有一个viewbox属性,中文翻译为视区,就是在svg上截取一小块,放大到整个svg显示。这个属性初学的话有点难以理解,这边做一个简单的示例,一看就明白了。1)先来一个svg,宽高各位300,设置一下边框:html运行效果:这边其实就是一个300300的矩形。2)svg里面画一个矩形:html运行效果:3)设置svg的viewbox属性:html先
Stella981 Stella981
3年前
AndroidStudio封装SDK的那些事
<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael
Wesley13 Wesley13
3年前
VSCode配置FiraCode和更纱黑体字体
!(https://oscimg.oschina.net/oscnet/c7bb62d935ceb01d3b7fe176322e84ae00d.png)Fira Code下载到FiraCode字体的GitHub(https://www.oschina.net/action/GoToLink?urlhttps%
Stella981 Stella981
3年前
SVG跟随父级DIV自适应
后台返回过来的是这样的SVG标签<svgwidth"100%"height"100%"version"1.1"xmlns"http://www.w3.org/2000/svg"<gtransform"translate(00)"
Stella981 Stella981
3年前
Graphics View绘图架构(二)
GraphicsView结构的主要类包括:视图类QGraphicsView、场景类QGraphicsScene、和各种图形项类(基类都是QGraphicsItem)1\.QGraphicsView用于观察一个场景的物理窗口  场景小于视图,整个场景在视图中可见;当场景大于视图时,试图自动提供卷滚条  QGraphicsView的视口坐标等
Easter79 Easter79
3年前
SVG跟随父级DIV自适应
后台返回过来的是这样的SVG标签<svgwidth"100%"height"100%"version"1.1"xmlns"http://www.w3.org/2000/svg"<gtransform"translate(00)"
Stella981 Stella981
3年前
Flutter 可滚动组件:简介
前言当组件内容超过当前显示视口(ViewPort)时,如果没有特殊处理,Flutter则会提示Overflow错误。为此,Flutter提供了多种可滚动组件(ScrollableWidget)用于显示列表和长布局。可滚动组件都直接或间接包含一个Scrollable组件,它们包括一些共同的属性,接口如下:Scrollable({
Easter79 Easter79
3年前
SVG的几个标签元素
defssvg允许我们定义以后需要重复使用的图形元素。建议把所有需要再次使用的元素定义在defs元素里面。这样做可以增加svg内容的易读性和可访问性。在defs元素定义的元素不会直接呈现。你可以在你的视口的任意地方利用<use元素呈现这些元素。用法:类别:容器元素,结构元素允许的内容物: 任意数量、任意
Stella981 Stella981
3年前
SVG的几个标签元素
defssvg允许我们定义以后需要重复使用的图形元素。建议把所有需要再次使用的元素定义在defs元素里面。这样做可以增加svg内容的易读性和可访问性。在defs元素定义的元素不会直接呈现。你可以在你的视口的任意地方利用<use元素呈现这些元素。用法:类别:容器元素,结构元素允许的内容物: 任意数量、任意
一行代码修复100vh bug | 京东云技术团队
你知道奇怪的移动视口错误(也称为100vhbug)吗?或者如何以正确的方式创建全屏块?一、100vhbug什么是移动视口错误?你是否曾经在网页上创建过全屏元素?只需添加一行CSS并不难:.mypageheight:100vh1vh是视口高度的1%,正是我们