SVG入门理解

  • SVG入门
    • SVG 元素
    • 简单的形状
      • rect
      • circle
      • ellipse
      • line
      • text
      • path
    • SVG 样式
    • 分层和绘图顺序
    • 透明度

SVG入门

当我们用SVG生成和操作一些炫酷的效果时,D3是最佳选择。使用div和其他原生HTML元素绘图也是可以的,但是太笨重,而且会受到不同浏览器的限制,传达出的视觉效果会有不一致的影响。使用SVG更可靠,视觉上更一致,最重要的就是方便,快捷。

Illustrator这样的矢量绘图软件可用于生成SVG文件,但我们更需要学习如何使用代码生成它们。

SVG 元素

可缩放矢量图形是基于文本的图像格式。每一个SVG图像都是使用类似HTML的标识代码定义生成的。SVG代码可以直接包含在任何HTML文档中。除了IE 8及更早的版本外,其他每一个Web浏览器都支持SVG

SVG是基于XML的,因此你会注意到没有结束标记的元素必须是自动关闭的,例如:

<element></element>   <!-- 结束标记 -->
<element/>            <!-- 自动关闭标记 -->

在绘制任何SVG图像之前,必须创建一个SVG元素。将SVG元素视为渲染视觉效果的画布。其实这方面,SVG在概念上有点类似于HTML中的canvas元素。SVG是可以指定宽度和高度的,如果不指定那么SVG将在其封闭元素中占用尽可能多的空间大小。

下面是一个指定空间大小的SVG

<svg width="500" height="50">
</svg>

如果你将这段代码放在你的HTML中,会形成一块空白区域,此时你可以鼠标右键选择空白区域,选择检查,将会发现:

image

会看一个SVG元素,它占用了500个水平像素和50个垂直像素。但是看起来不像,下面解释。

浏览器将像素视为默认度量单位。我们指定的尺寸是50050,而不是500px50px。我们可以明确指定px,或者是任意数量的其他被支持的单位,比如:emptincmmm

简单的形状

SVG标记之间包含很多可视化的元素,包括rectcircleellipselinetextpath

如果你比较熟悉计算机图形编程,那么你一定知道通常基于像素的坐标系统,其中(0,0)是我们桌面的最左上角。在(x,y)中,x表示x轴,y代表y轴,此时增加x值向右移动,而增加y值向下移动。

image
图像代码如下:

<svg width="505" height="65"><line x1="5" y1="5" x2="5" y2="50" stroke="gray" stroke-width="1"></line><line x1="5" y1="50" x2="0" y2="45" stroke="gray" stroke-width="1"></line><line x1="5" y1="50" x2="10" y2="45" stroke="gray" stroke-width="1"></line><line x1="5" y1="5" x2="500" y2="5" stroke="gray" stroke-width="1"></line><line x1="500" y1="5" x2="495" y2="0" stroke="gray" stroke-width="1"></line><line x1="500" y1="5" x2="495" y2="10" stroke="gray" stroke-width="1"></line><circle cx="5" cy="5" r="3" fill="#008"></circle><text x="10" y="20">0,0</text><circle cx="105" cy="25" r="3" fill="#008"></circle><text x="110" y="40">100,20</text><circle cx="205" cy="45" r="3" fill="#008"></circle><text x="210" y="60">200,40</text>
</svg>

rect

使用rect绘制一个矩形。使用xy指定左上角的坐标,使用宽度高度指定尺寸。这个矩形填满了SVG整个空间:

<svg width="500" height="50"><rect x="0" y="0" width="500" height="50"/>
</svg>

效果:

image

circle

circle标签可以画一个圆圈。使用cxcy指定中心的坐标,使用r指定半径。这个圆圈位于我们500个像素宽的SVG中间,因为它的cx(center x)值为250。

<svg width="500" height="50"><circle cx="250" cy="25" r="25"/>
</svg>

效果:

image

ellipse

ellipsecircle是类似的,但是每个轴需要单独的半径值,由rxry指定。

<svg width="500" height="50"><ellipse cx="250" cy="25" rx="100" ry="25"/>
</svg>

效果:

image

line

line是画一条直线。使用x1y1指定线一端的坐标,使用x2y2指定另一端的坐标。必须为要显示的线指定画笔颜色。

<svg width="500" height="50"><line x1="0" y1="0" x2="500" y2="50" stroke="black"/>
</svg>

效果:

image

text

text用来渲染文字的。使用x指定左边缘的位置,使用y指定类型基线的垂直位置。

<svg width="500" height="50"><text x="250" y="25">Easy-peasy</text>
</svg>

效果:

image

如果没有有意指定text的字体样式,那么text将继承其父元素的CSS指定字体样式(稍后详细介绍样式文本)。上面的文字样式,我们可以自定义设置,如下:

<svg width="500" height="50"><text x="250" y="25" font-family="sans-serif"font-size="25" fill="gray">Easy-peasy</text>
</svg>

效果:

image

另外注意,当任何可视化元素在SVG的边缘上运行时,它将被剪裁。使用文字时要小心,否则会出现y操作设置无效,当我们将基线y设置为50时,可以看到这种情况发生,与SVG的高度相同。

<svg width="500" height="50"><text x="250" y="50" font-family="sans-serif"font-size="25" fill="gray">Easy-peasy</text>
</svg>

效果:

image

path

path用于绘制比上面的形状更复杂的东西(如地图的国家轮廓),这个后续我们再做介绍,现在暂时使用一些简单的形状入门。

SVG 样式

SVG的默认样式是黑色填充,没有画笔。如果需要其他任何内容,则必须将样式应用于元素。

常见的SVG属性是:

  • fill - 填充的颜色。与CSS一样,颜色可以指定为
    • named colors - orange
    • hex values - #3388aa or #38a
    • RGB values - rgb(10, 150, 20)
    • RGB width alpha transparency - rgba(10, 150, 20, 0.5)
  • stroke - Stroke属性定义一条线,文本或元素轮廓颜色
  • stroke-width - 定义了一条线,文本或元素轮廓厚度
  • opacity - 透明度,一个在0.0-1.0之间的数值

使用text,您还可以使用这些属性,就像在CSS中一样:

  • font-family
  • font-size

其实SVG的样式可以使用CSS样式规则。

以下是一些直接应用于圆形的样式属性作为属性:

<svg width="500" height="50"><circle cx="25" cy="25" r="22"fill="yellow" stroke="orange" stroke-width="5"/>
</svg>

效果:

image

或者,我们可以去除样式属性,为圆圈分配一个class(就像它是一个普通的HTML元素)

<svg width="500" height="50"><circle cx="25" cy="25" r="22" class="pumpkin"/>
</svg>

然后将fillstrokestroke-width规则放入以新类为目标的CSS样式中:

.pumpkin {fill: yellow;stroke: orange;stroke-width: 5;}

CSS方法有一些明显的好处:

  1. 可以同时对多个元素进行样式设定,比如:
<svg width="500" height="50"><circle cx="25" cy="25" r="22" class="pumpkin"/><circle cx="80" cy="25" r="20" class="pumpkin"/>
</svg>.pumpkin {fill: yellow;stroke: orange;stroke-width: 5;}
  1. CSS代码更方便阅读(相比内联属性)
  2. CSS代码可能更易于维护,并且可以更快的实现设计更改要求

但是,使用CSS代码定义SVG的样式可能会让一些人感到不安。毕竟,fillstrokestroke-width不是CSS属性。(与之CSS等价物是背景颜色和边框)。

分层和绘图顺序

Layering and Drawing Order(分层和绘图顺序)。

SVG中没有,也没有真正的深度概念,就好比z-indexSVG不支持CSSz-index属性,因此形状只能排列在二维xy平面内。

然而,如果我们绘制多个形状,它们会发生重叠,如下:

<svg width="500" height="50"><rect x="0" y="0" width="30" height="30" fill="purple"/><rect x="20" y="5" width="30" height="30" fill="blue"/><rect x="40" y="10" width="30" height="30" fill="green"/><rect x="60" y="15" width="30" height="30" fill="yellow"/><rect x="80" y="20" width="30" height="30" fill="red"/>
</svg>

效果:

image

元素编码的顺序决定了对应元素的深度顺序。紫色方块第一个出现,因此第一个被渲染,然后蓝色方块呈现在紫色方块的顶部,接下来就是绿色方块,依此类推。

当有一些不应该被其他元素遮挡的视觉元素时,绘制顺序就变得很重要。例如,在一个散点图上显示轴或值标签,轴和标签应该是最后渲染,所以它们出现在任何其他元素的上层。

透明度

Transparency(透明度)

当可视化中的元素重叠但是又必须保持可见,这时可以使用透明度;或者希望突出显示其他元素和不强调某些元素时,透明度就非常有用。

有两种方法可以应用透明度:

  • 使用带有alphaRGB颜色
  • 设置不透明度值。

可以在任何一个设定颜色的元素中使用rgba(),例如填充或者描边。对于红色,绿色和蓝色,rgba() 需要0到255之间的三个值,以及介于0.0到1.0之间的alpha(透明度)值。

例如:

<svg width="500" height="50"><circle cx="25" cy="25" r="20" fill="rgba(128, 0, 128, 1.0)"/><circle cx="50" cy="25" r="20" fill="rgba(0, 0, 255, 0.75)"/><circle cx="75" cy="25" r="20" fill="rgba(0, 255, 0, 0.5)"/><circle cx="100" cy="25" r="20" fill="rgba(255, 255, 0, 0.25)"/><circle cx="125" cy="25" r="20" fill="rgba(255, 0, 0, 0.1)"/>
</svg>

效果:

image

使用rgba() 时,透明度将独立应用于填充和描边颜色。以下圆圈填充的是75%不透明,而它们的笔画只有25%不透明:

<svg width="500" height="50"><circle cx="25" cy="25" r="20"fill="rgba(128, 0, 128, 0.75)" stroke="rgba(0, 255, 0, 0.25)" stroke-width="10"/><circle cx="75" cy="25" r="20"fill="rgba(0, 255, 0, 0.75)"stroke="rgba(0, 0, 255, 0.25)" stroke-width="10"/><circle cx="125" cy="25" r="20"fill="rgba(255, 255, 0, 0.75)"stroke="rgba(255, 0, 0, 0.25)" stroke-width="10"/>
</svg>

效果:

image

将透明度应用于整个元素,请设置不透明度属性。这是一些完全不透明的圆圈。

效果:

image

下面是不同透明度的圆圈:

<svg width="500" height="50"><circle cx="25" cy="25" r="20" fill="purple" stroke="green" stroke-width="10"opacity="0.9"/><circle cx="65" cy="25" r="20" fill="green"stroke="blue" stroke-width="10"opacity="0.5"/><circle cx="105" cy="25" r="20" fill="yellow"stroke="red" stroke-width="10"opacity="0.1"/>
</svg>

效果图:

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【哈佛幸福课笔记】【1】

【哈佛幸福课笔记】【1】 ​ ​ 一个月的时间看完了哈佛幸福课&#xff0c;正如Tal所说课程的结束才是学习的开始。对于课程观点的思考&#xff0c;对于个人习惯的培养&#xff0c;对于思维模式的转变还需要花大量的时间去练习。这个系列的帖子将作为我个人的读书笔记&#x…

Angular 6+ 之新版service

Angular 6+ 之新版service Angular 6已经发布了,Angular 6中有一些新功能,其中一个就是提供service的共享实例。 回首Angular 5- 下面是一段熟悉的代码,可以为整个应用程序提供服务。我们将它添加到AppModule中的providers[]。 自定义服务类 // data.service.ts export c…

Angular CDK Layoout 检测断点

Angular CDK检测断点 Angular CDK有一个布局包,其服务可以轻松检测窗口大小并与媒体查询匹配。这使得你可以完全控制UI并适应不同的屏幕尺寸。 让我们快速了解一下如何使用CDK的布局模块。 Setup 首先,您需要确保在您的应用中安装了Angular CDK: $ npm install @angular/c…

Angular Render2

Angular Render2 Renderer2类是Angular以service的形式提供的抽象,允许操作应用程序的元素而无需直接触摸DOM。这是推荐的方法,因为它可以更容易地开发可以在没有DOM访问的环境中呈现的应用程序,例如在服务器上,web worker,或者原生移动上。 需要注释的是,现在已弃用原始…

数据分析方法

数据分析方法 什么是数据分析 从数据到信息的这个过程&#xff0c;就是数据分析。数据本身并没有什么价值&#xff0c;有价值的是我们从数据中提取出来的信息。 分类 分类分析的目标是&#xff1a;给一批人(或者物)分成几个类别&#xff0c;或者预测他们属于每个类别的概率…

RAID阵列基础知识

RAID阵列基础知识 独立硬盘冗余阵列 &#xff08;RAID, Redundant Array of Independent Disks&#xff09;,旧称廉价磁盘冗余阵列&#xff08;Redundant Array of Inexpensive Disks&#xff09;&#xff0c;简称磁盘阵列。 RAID的种类 这里我们只介绍比较常用的RAID类型&am…

timeshift备份你的Linux系统

timeshift备份你的Linux系统 安装 打开终端&#xff08;ctrl alt T&#xff09;并逐个执行以下命令 sudo apt-add-repository -y ppa:teejee2008/ppa sudo apt-get update sudo apt-get install timeshift 创建 点击Create按钮 默认不能备份用户下的文件&#xff0c;所以…

Go语言vscode环境配置

Go语言vscode环境配置 此教程在GO已经安装成功的前提下。 安装vscode扩展 在vscode扩展里面搜索go&#xff0c;然后下载扩展。 安装go 插件 在$GOPATH目录下创建bin,pkg,src切换到$GOPATH/bin目录下&#xff0c;打开终端输入以下命令&#xff0c;不需要翻墙&#xff1a; go…

Angular实现悬浮球组件

Angular实现悬浮球组件 在手机 App 上,我们经常会看到悬浮球的东东,用着可能很舒服,但是 web 网页上却很少见,今天我们就通过 Angular 来实现,当然使用其他框架也是可以的。 功能要求: 支持设置直径支持点击触发信号支持设置鼠标按压时间实现的过程中省略的部分天填坑过…

Docker+Nginx部署Angular国际化i18n

Docker+Nginx部署Angular国际化i18n 在Angular项目中添加default.conf文件 default.conf 为了支持局域网,增加一个域名,即本地的局域网ip地址。 server {listen 80;server_name localhost;server_name 192.168.2.172;location / {root /usr/share/nginx/html;lo…

消息队列-Message Queue

消息队列-Message Queue 目前随着互联网的普及以及上网用户的增多&#xff0c;拥有一套 安全、稳定、低耦合、高性能的内部通信工具尤为重要。 什么是消息队列&#xff1f; 消息队列&#xff08;英语&#xff1a;Message queue&#xff09;是一种进程间通信或同一进程的不同线…

Angular 第一章 开始

第一章 开始 用 JavaScript 开发应用程序是一个很大的挑战。由于它的延展性和缺少类型检查,在 JavaScript 中构建一个适当大小的应用程序是很困难的。除此之外,我们对所有类型的处理都使用JavaScript,例如用户界面(UI),操作、客户端-服务器交互和业务处理/验证。因此,我们…

Typescript实现单例之父类调用子类

Typescript实现单例之父类调用子类 设计要求 在程序中,需要一个对象可以全局使用,并且只有一个实例Breakpoint 类是一个可以被继承的类,然后子类必须实现 updateView函数updateView 这个函数可以被自动调用,当窗口发生变化的时候构思 UML 图 Layout 是一个单例类,也就是全局只…

Angular性能优化之脏检测

Angular性能优化之脏检测 当我们在使用 Angular 框架搭建项目时,随着组件越来越多,页面也来越复杂,性能会越来越低,主要表现在 CPU 使用率 很高。所以我们要对项目做一定的优化。 Angular脏检查(Change Detection)机制 Angular 的脏检测主要是指 zone.js,这是一个开源的…

第一章、第一节 Angular基础

第一章、第一节 Angular基础 让我们先来看看Angular是如何实现组件模式的。 组件模式 Angular 应用程序使用组件模式。你可能听说过这个模式&#xff0c;它不仅用于软件开发&#xff0c;还用于制造、建筑和其他领域。简单地说&#xff0c;它涉及到将更小的、离散的构建块组合…

Angular Chart.js第三方库ng-chartjs基础使用

Angular Chart.js第三方库ng-chartjs基础使用 项目github地址 这个项目支持基本的Chart.js图表,并且支持内联插件和全局插件的使用。 Demo地址 支持图表类型 linebarradarpiepolarArea安装 npm install ng-chartjs --save npm install chart.js --save导入 正常导入模块i…

linux一键安装node+npm

分享一个linux下一键安装nodenpm脚本。 使用方式为&#xff1a; ./install-node.sh&#xff0c;然后输入版本号&#xff0c;node.js版本查询 切记不需要加 sudo 执行!!! 默认安装10.15.0。 #! /bin/bash############################################################ # …

Angular Material 阴影使用

Angular Material 阴影使用 依托于 Angular Material 库,可以直接使用通用的符合 Material Design 风格的阴影。 使用 使用方式有两种: 外联样式设定,即在css或scss中设定通过class名称设定,即 元素的class名称方式一:外联样式使用 在scss或css文件中导入@import ~@ang…

typescript或javascript深拷贝Object json

typescript或javascript深拷贝Object json Object的json对象很多时候我们需要深拷贝,我写了两个工具函数,供大家参考。 deepCopyObject 深拷贝一个Object对象&#xff0c;返回深复制的对象。 /** * method 深复制一个json对象 * param source 需要深复制的对象 * return 返…

linux安装zsh终端

linux安装zsh终端 ZSH 已经被收录到了 Ubuntu 18.04 LTS 的官方软件包存储库中了 sudo apt install zshZSH Shell 安装好之后&#xff0c;可以使用如下命令查看其版本&#xff1a; zsh --version取代bash&#xff0c;设为默认shell sudo usermod -s /bin/zsh username也可以…