编写SVG布置画布和坐标系统以及视窗的方法

   2015-09-07 0
核心提示:这篇文章主要介绍了编写SVG布置画布和坐标系统以及视窗的方法,SVG是利用XML语言来编写的矢量图格式,需要的朋友可以参考下

比喻

想象一个无穷大的画布,你可以在画布上的任何地方绘制你想要的任何内容,你也可以以任何你想要的尺寸来绘制。这就是SVG画布。

现在接着想象,有人在你的画布正前方建立了一堵同样的无穷大的墙,墙的宽度和高度也是无限延伸的,把画布全都挡住了。

因为墙都是直接放在画布前面的,所以我们无法看到画布上的内容。但是建墙的人很好,帮我们开了一扇窗户,甚至还给了我们设置这扇窗户大小尺寸的能力。这扇窗户就是SVG视窗。

墙的筑造者并没有在这里停住。他还给我们留下了工具,我们可以用它来移动画布,决定要将画布的哪部分显示在窗口区域,还可以决定要显示的区域的大小。这些工具在SVG元素中是以属性的形式(viewBox和preserveAspectRatio)表现出来的。

我会在接下来的两周讲解这些属性。今天我想将内容集中在画布、墙、视窗上,先从它们使用的坐标系统讲起:
SVG坐标系统

虽然SVG和CSS盒模型的表现形式不一样,但是它们的坐标系统的工作方式是相同的。

所有SVG坐标系的起点(0,0)都是在父元素的左上角,它们的父元素可以是body元素、div元素、或其它的容器。

当你创建了一个新的SVG元素,你也就创建了一个新的坐标系统,即无穷大的SVG画布。起点可能是和父元素的左上角对齐,但是画布在所有方向无限延伸的。x轴的正方向是向右,y轴的正方向是向下。两个坐标轴的负方向也会向左边和上边延伸。

关于SVG有一点需要明白的就是多坐标系统的同时使用。每次你创建一个新的SVG元素,就相当于在它的坐标空间创建了一个新的画布,同时也创建了一个视窗。

每一对画布和视窗的坐标系统都是默认对齐的。它们看起来就像是在同一个系统内,但其实并不是。正如我们接下来要看的,你可以改变它们相互对齐的方式。

在实际中,你在无穷大的画布上创建的元素是放置在画布的原点附近的,但是理论上,它们是可以放在任何地方的。你可以创建一个圆,然后把它放在原点右边四十亿像素远的地方,没人阻止你这样做。

理论上,窗口也可以是接近无穷大的,你可以设置你想要的任何尺寸。但是,你只有固定了窗口的尺寸,它才可以是固定大小的,而且你一旦设置了尺寸,坐标系统将会在空间上保持这个大小。

用户代理程序(即浏览器)会默认对齐这两个坐标系统的原点和坐标轴,但是你可以根据自己的需要改变这种对齐方式。

这两个系统可以设置不同的单位。可以把一个设置为像素,另一个设置为毫米、picas、英寸、点、ems,或者其他任何你想要的单位。百分比%是例外,它不能在这里使用。

再次记住,这两个坐标系统,一个是作用在无穷大的画布上的,另一个是作用于固定窗口的。
SVG视窗

每次你创建了一个新的SVG元素,你也就创建了一个新的SVG视窗。视窗的大小等于你为SVG元素设置的宽度和高度。

CSS Code复制内容到剪贴板
  1. <svg width="600" height="300" style="outline: 5px solid #630">   
  2.   <rect width="200" height="100" fill="#f00" />   
  3. </svg>  

这里,我创建了一个600px宽,300px高的视窗。在视窗内我创建了一个200x100px的红色矩形。因为我没有指定单位,所以默认情况下会使用像素作为单位。因为这和我平时的设置是一样的,所以我倾向于不要指定单位,这样也比较快捷。

为了能够看到视窗的边界,我还为<svg>元素添加了一个outline。这是代码生成的结果。
编写SVG布置画布和坐标系统以及视窗的方法

你可以看到一个5px粗的棕色边框包围着一块宽为600px、高为300px的区域。边框内的内容就是视窗。

视窗内独立出来一个宽为200px、高为100px的红色矩形。默认情况下矩形的左上角是放在SVG画布的原点,和视窗的原点对齐。

我有个问题是,如果你没有为视窗设置宽和高,它的尺寸应该是怎样的呢?我没有找到明确的答案。这是由每个用户代理程序(浏览器)决定的,但是好像一般默认是300px和150px。但是,我不建议是视窗按照默认的尺寸显示,最好还是按你自己的需要来设置尺寸吧。
移动画布上的SVG元素

你可以通过给矩形设置x值和y值,改变它在SVG画布上的位置。这里我把x值和y值都设置为10px,你可以看到矩形离开了视窗左上角的位置。

XML/HTML Code复制内容到剪贴板
  1. <svg width="600" height="300" style="outline: 5px solid #630>  
  2.   <rect x="10" y="10" width="200" height="100" fill="#f00" />  
  3. </svg>  

编写SVG布置画布和坐标系统以及视窗的方法

用这种方法改变x和y坐标的值,就相当于移动了SVG画布上绘制的对象。画布本身没有移动,视窗也没有移动。我只是在画布上的另一个位置绘制了一个同样的红色矩形。

你也可以画一个部分超出了视窗边界的矩形。

XML/HTML Code复制内容到剪贴板
  1. <svg width="600" height="300" style="outline: 5px solid #630>  
  2.   <rect x="-100" y="-50" width="200" height="100" fill="#f00" />  
  3. </svg>  

在这里你可以看到,矩形的大部分都变成不可见的了,只有小部分仍然可以在窗口中看到。其实我只是把它移动了几个像素,所以理论上你可以在这个无穷大的画布上的任何你喜欢的位置绘制矩形。
编写SVG布置画布和坐标系统以及视窗的方法

看到视窗外面的内容

有一个东西我不常见人提到的是:为什么我们看不到视窗之外的内容。因为SVG元素有一个默认值为hidden的overflow属性,所以任何超出视窗的内容都会被隐藏。

当然,overflow属性也可以设置为其它值,比如visible。

XML/HTML Code复制内容到剪贴板
  1. <svg width="600" height="300" style="outline: 5px solid #630; overflow: visible">  
  2.   <rect x="-100" y="-50" width="200" height="100" fill="red" />  
  3. </svg>  

把overflow属性的值改为visible,你可以看到SVG画布上超出视窗的那几部分内容,包括画布上那部分能出现在你屏幕上的内容(你的浏览器创建的另一个视窗)。
编写SVG布置画布和坐标系统以及视窗的方法

现在你可以看到整个红色矩形了,包括超出视窗边界的部分。在使用SVG工作的时候你一般不会这么做,现在这只是一个帮助你理解到底发生了什么东西的方式。
建立一个新的视窗

前面我说过有SVG是多个坐标系是同时作用的。最简单的情况下,也有一个用于画布,一个用于视窗的坐标系。我也提到了你可以创建新的画布,并建立新的窗口。

每次你新建SVG元素,即使是嵌套在另一个SVG元素内,你会用它自己的坐标系统创建新的画布及视窗。只有较少数元素会创建新的画布和视窗:

    <svg>元素
    实例化<use>元素时的<symbol>元素。
    引入SVG文件的<img>元素
    <foreignObject>元素

因为我们还没有开始讨论这些元素(除了SVG元素),我现在只是把它们罗列出来。我现在主要是想强调在同一个HTML文件中创建多个SVG画布和视窗。

 
标签: SVG 画布 坐标 视窗
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Vue封装svg-icon组件使用教程 vue3 svg-icon
    Vue封装svg-icon组件使用教程 vue3 svg-icon
    目录一、SVG可缩放矢量图形二、SVG在vue项目中的配置与使用一、SVG可缩放矢量图形SVG(Scalable Vector Graphics)可缩放矢量图形,是一种用于描述基于二维的矢量图形的 XML 标记语言,其基本矢量显示对象包括矩形、圆、椭圆、多边形、直线、任意曲线等,还能
    03-08
  • Vue.js中动态更改svg的相关属性详解 js 动态修改css
    Vue.js中动态更改svg的相关属性详解 js 动态修
    目录引言怎样将一个远程的svg图标资源"下载"到本地怎样更改svgdom结构里面的相关属性引言 公司项目中有一个关于图标库管理的需求,大致需要在页面能够动态去更改对应svg图标的大小、颜色等(这里的更改颜色限制线性图标)。在网上查找了相关资料,做了技术的预
    03-08
  • vue项目引入svg图标的完整步骤 vue项目使用svg
    vue项目引入svg图标的完整步骤 vue项目使用svg
    目录1. 安装svg依赖2. 创建svg文件夹存放svg图标3. vue.config.js 中配置svg图片4. 创建index.js 导入所有svg图标5. main.js中引入icons/index.js6. 创建SvgIcon公用组件总结1. 安装svg依赖在vue中首先需要安装可以加载svg的依赖。npm安装:npm install svg-s
    03-08
  • 一文详解如何在基于webpack5的react项目中使用svg
    一文详解如何在基于webpack5的react项目中使用s
    本文主要讨论基于webpack5+TypeScript的React项目(cra、craco底层本质都是使用webpack,所以同理)在2023年的今天是如何在项目中使用svg资源的。首先,假定您已经完成基于webpack5+TypeScript的React项目的搭建工作(如果您不太清楚搭建的背景,可以参考这篇
    03-08
  • React优雅的封装SvgIcon组件示例
    React优雅的封装SvgIcon组件示例
    目录React如何优雅的封装SvgIcon组件第一步:安装svg-sprite-loader第二步:配置webpack第三步:创建icons/svg文件夹,并且加载所有svg文件第四步:创建 SvgIcon 组件第五步:在组件中使用 SvgIcon注意可能会遇到的bug总结React如何优雅的封装SvgIcon组件相信
    03-08
  • CSS3/SVG clip-path路径剪裁遮罩属性简介
    一、SVG属性和CSS3属性千丝万缕的关系CSS3新增属性除了我们现在用的比较多的border-radius, box-shadow, gradient, ...之类,还有很重要的一个分支:SVG属性家族!所谓「SVG属性家族」是指原本SVG的标签属性可以直接使用CSS设置。比方说,之前介绍“SVG Sp
    02-08
  • HTML5 学习总结(四)——canvas绘图、WebGL、SVG
    HTML5 学习总结(四)——canvas绘图、WebGL、S
    目录一、Canvas1.1、创建canvas元素1.2、画线1.3、绘制矩形1.4、绘制圆弧1.5、绘制图像1.6、绘制文字1.7、随机颜色与简单动画二、WebGL2.1、HTML5游戏开发2.2.1、Cocos2D-HTML52.2.2、Egret(白鹭引擎)三、SVG3.1、SVG Hello Wrold3.2、多种引入SVG的方法3.3
    02-08
  • 将阿里图库下载的svg格式的图片转换为css
    字体图标--在阿里图库中下载svg格式的https://icomoon.io/ 将svg格式的图片转换为css的字体网站1.点击icomoonAPP2.点击importlicons导入下载好的图片3.选中图片4.点击下方GenerateFont5.下载Download6.解压下载好的---7.style.css和fonts文件重要8.查看demo.h
    02-08
  • 可用于绘制svg中的html标签,但与<use>搭配不生效">WebKit策略:<foreignObject>可用于绘制svg中的html标签,但与<us
    可用于绘制svg中的html标签,但与<use>搭配不生
      在svg里面可以利用foreignObject绘制html标签,原本是我在iconfont采用Font class方式引入svg的无奈之举。  起初的设计是所有icon先在defs中先渲染,以达到icon复用的效果,icon采用Symbol方式引入svg感觉也是比较合适的,比较规范的。templatedefsg v-
    02-07
  • 20 个有用的 SVG 工具,提供更好的图像处理
    20 个有用的 SVG 工具,提供更好的图像处理
      SVG现正在 Web 设计领域变得越发流行, 你可以使用 Illustrator 或者 Inkscape 来创建 SVG 图像。 但当进行 Web 设计时,我们还需要做一些优化来使得 SVG 变得更加轻量。  下面介绍的 20 个工具,可以帮助你快速有效的创建 SVG 图像。现有的在线工具已
    10-13 SVG
点击排行