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…

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…

消息队列-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,这是一个开源的…

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也可以…

共享图片方案

共享图片方案 安装chrome插件 极简图床安装&#xff0c;链接地址 插件使用 使用阿里云 OSS 存储图片 阿里云 OSS 提供了安全、低成本、高可靠的云存储服务&#xff0c;极简图床针对阿里云 OSS 做了整合&#xff0c;通过简单的设置&#xff0c;即可方便地将图片上传到阿里…

javascript复制到黏贴板之完美兼容

javascript复制到黏贴板之完美兼容 很多时候我们需要给用户方便,提供一键复制的功能,但是在实现的过程中遇到各式各样的坑。 原生解决方案 document.execCommand()方法 MDN上的定义&#xff1a; which allows one to run commands to manipulate the contents of the edita…

制作windows启动盘-大于4GB镜像

制作windows启动盘-大于4GB镜像 制作一个 Windows 安装 U 盘是很容易的&#xff0c;使用 UltraISO 这样的刻录工具量产一个 iso 镜像文件到 U 盘即可。然而随着 Windows 10 版本号的提升&#xff0c;镜像变得越来越大&#xff0c;终于 FAT32 文件系统不再能够容纳得下安装镜像…

PC介绍之电脑组成

电脑组成 CPU cpu就是中央处理器&#xff0c;英文为central processing unit。 CPU一般我们需要知道以下几点即可&#xff1a; 主频 CPU的主频&#xff0c;即CPU内核工作的时钟频率&#xff08;CPU Clock Speed&#xff09;&#xff0c;通常所说的某某CPU是多少兆赫的&#xff…

PC介绍之PCIE、总线、内存、电源

PC介绍之PCIE、总线、内存、电源 PCIE降速 PCI-E的总线性能 目前我们所使用的显卡是x16 走 PCIE 3.0,有些显卡虽然插在x16的插槽上&#xff0c;但是速度只有x8的速度&#xff0c;总的来说好的显卡目前都是x16。 主板一般会提供一条x16&#xff0c;x8, x1三个插槽&#xff0c…

PC介绍之显卡

PC介绍之显卡 一、什么是显卡&#xff1f; 显示接口卡&#xff08;Video card&#xff0c;Graphics card&#xff09;、显示器配置卡简称为显卡&#xff0c;是个人电脑基本组成部分之一。 用途是将计算机系统所需要的显示信息进行转换驱动&#xff0c;并向显示器提供信号&…

Sublime Text 3 无法输入中文解决方案

Sublime Text 3 安装及无法输入中文解决方案 安装sublime-text 3 如果是ubuntu系统终端输入&#xff1a; wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add - sudo apt-get install apt-transport-https echo "deb https://download.…

Linux Server 安装 raid 1

Linux Server 安装 raid 1 两组以上的N个磁盘相互作镜像&#xff0c;在一些多线程操作系统中能有很好的读取速度&#xff0c;理论上读取速度等于硬盘数量的倍数&#xff0c;与RAID 0相同。另外写入速度有微小的降低。只要一个磁盘正常即可维持运作&#xff0c;可靠性最高。其原…

0-安装Vagrant和使用

0-安装Vagrant和使用 Vagrant 是一款软件&#xff0c;可以自动化虚拟机的安装和配置流程。用来管理虚拟机&#xff0c;如 VirtualBox、VMware、AWS等&#xff0c;主要好处是可以提供一个可配置、可移植和复用的软件环境&#xff0c;可以使用shell、chef、puppet等工具部署。所以…

什么是分布式系统的CAP理论?

什么是分布式系统的CAP理论&#xff1f; 2000年7月&#xff0c;加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想。2年后&#xff0c;麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP。之后&#xff0c;CAP理论正式成为分布式计算领域的公认定理。 …

1-docker 介绍

1-docker 介绍 由PaaS到Container 2013年2月&#xff0c;前Gluster的CEO Ben Golub 和 dotCloud 的 CEO Solomon Hykes 坐在一起聊天时&#xff0c;Solomon谈到想把 dotCloud 内部使用的Container容器技术单独拿出来开源&#xff0c;然后围绕这个技术开一家新公司提供技术支持…