svg基础知识梳理

1 基本图形和属性

<rect><circle><ellipse><line><polyline><polygon>
矩形---圆形————椭圆———直线——折线—————多边形
PS:
<path> 用来绘制任意的曲线
<rect> x y width height rx ry

x y 表示左上角的位置


<circle> cx cy r

cx cy表示圆心的位置


<ellipse> cx cy rx ry



<line> x1 y1 x2 y2

<polyline> points=”x1 y1 x2 y2 x3 y3 ….”

<polygon> points=”x1 y1 x2 y2 x3 y3 ….” //多边形 最后会自动封闭图形

2 基本属性

fill:填充色
stroke:边框色
stroke-width:边框宽度
transform:偏移量

3 动态创建svg的基本API

创建图形: document.createElementNS(ns,tagName)
添加图形:element.appendChild(childElement)
设置获取属性:
element.setAttribute(name,value)

element.getAttribute(name)

示例1:各个图像的使用方法

<svg xmlns="http://www.w3.org/2000/svg">
    <rect
        x="10"
        y="10"
        rx="5"
        ry="5"
        width="150"
        height="150"
        stroke="red"
        fill="yellow"
    ></rect>
    <circle
    cx="250"
    cy="60"
    r="50"
    stroke="red"
    fill="green"
    ></circle>
    <line
        x1="20"
        y1="20"
        x2="200"
        y2="200"
        stroke="green"
    ></line>
    <polyline
        points="
        100 100
        200 400
        300 200
        "
        fill="green"
        stroke="red"
        stroke-width="5"
    ></polyline>
    <polygon
        points="
        250 120
        300 220
        200 220
        100 300
        "
        stroke="red"
        stroke-width="5"
    ></polygon>
</svg>

示例2 微笑脸

<svg xmlns="http://www.w3.org/2000/svg"
    width="200" height="200">
    <!--Face-->
    <circle cx="100" cy="100" r="90" fill="#39F" />
    <!--Eyes-->
    <circle cx="70" cy="80" r="20" fill="white" />
    <circle cx="130" cy="80" r="20" fill="white" />
    <circle cx="65" cy="75" r="10" fill="black" />
    <circle cx="125" cy="75" r="10" fill="black"/>
    <!--Smile-->
    <path d="M 50 140 A 60 60 0 0 0 150 140"
        stroke="white" stroke-width="3" fill="none" />
</svg>

示例3: 动态生成SVG图像

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .box{
            width: 200px;
            text-align: center;
            line-height: 60px;
            height: 60px;
            background-color: green;
            color: red;
        }
    </style>
</head>
<body>
    <!--点击按钮动态生成svg-->
    <div class="box">按钮</div>
    <div id="canvas"></div>
    <script>
        var SVG_NS = ‘http://www.w3.org/2000/svg‘;
        var defaultAttrs = {
            rect: {
                x:‘10‘,
                y:‘10‘,
                width:‘200‘,
                height:‘100‘,
                rx:‘10‘,
                ry:‘10‘,
                fill:‘red‘
            },
            circle:{
                cx:"100",
                cy:‘100‘,
                r:‘50‘,
                fill:‘yellow‘
            }
        };
        function createSVG() {
            var svg = document.createElementNS(SVG_NS, ‘svg‘);
            var canvas = document.querySelector(‘#canvas‘);
            svg.setAttribute(‘width‘, ‘100%‘);
            svg.setAttribute(‘height‘, ‘100%‘);
            for (name in defaultAttrs) {
                var shape = document.createElementNS(SVG_NS, name);
                for(key in defaultAttrs[name]){
                    shape.setAttribute(key, defaultAttrs[name][key]);
                    svg.appendChild(shape);
                }
            }
            canvas.appendChild(svg);
        }
        document.querySelector(‘.box‘).addEventListener(‘click‘,function(){
            createSVG();
        },false)
    </script>
</body>
</html>

视野与世界

世界是无穷大的
视野是观察世界的一个矩形区域(viewbox)
width,height—控制视窗,svg用来渲染图像的区域;
SVG代码—定义世界
viewBox preserveAspectORatio—控制视野,也就是决定用户能够观看到的范围;

<svg
 xmlns=""
 width="800"
 height="600"
 viewBox="0 0 400 300"
 preserveAspectORatio = "xMidYMid meet"
>
</svg>

一般来说设置 viewBox=”0 0 400 300”

这里的400 300 就是svg的宽度和高度即可

分组的概念

标签来创建分组
属性继承
transform 属性定义坐标变换
可以嵌套使用

示例:锤子分组

<svg xmlns="http://www.w3.org/2000/svg"
    >
    <line
        x1="0"
        y1="0"
        x2="200"
        y2="0"
        stroke="red">
    </line>
    <g stroke="green" fill="none" transform="translate(50,50)">
        <rect x="100" y="50" width="100" height="50"></rect>
        <rect x="140" y="100" width="20" height="120"></rect>
    </g>
</svg>

笛卡尔直角坐标系

和常规的坐标系是相反的,顺时针角度为正值

transform 属性
rotate(deg)
translate(x,y)
scale(sx,sy)
matrix(a,b,c,d,e,f)

<defs></defs> 标签不会被立即绘出来,但是会在后面被引用,相当于是个组件,提高复用性

<defs>
    <g id="coord">
        <rect></rect>
    </g>
</defs>
<use xlink:href="#coord" stroke="blank"/>
<use xlink:href="#coord" stroke="blank"/>

线性渐变(斜对角线方向)

<linearGradient> 和 <stop>

定义方向
关键点位置及颜色
gradientUnits

<svg xmlns="http://www.w3.org/2000/svg">
<path d="M100,100A200,100,0,1,0,200,200" stroke="red" fill="none"/>
</svg>

===

userSpaceOnUse是真实的宽高/objectBoundingBox是按照比例计算的

 

<svg xmlns="http://www.w3.org/2000/svg">
<defs>
    <linearGradient id="grad1" x1="0" y1="0" x2="1" y2="1">
        <stop offset="0" stop-color="red"/>
        <stop offset="0.5" stop-color="yellow"/>
        <stop offset="1" stop-color="green"/>
    </linearGradient>
</defs>
<rect  x="100" y="100" fill="url(#grad1)" width="200" height="150"></rect>
</svg>

径向渐变(斜对角线方向)

<radialGradient> 和 <stop>

cx1开始位置
定义方向
关键点位置及颜色
gradientUnits
焦点位置fx\fy

<svg xmlns="http://www.w3.org/2000/svg">
<defs>
    <radialGradient id="grad2" cx1="0.5" cy1="0.5"  r="0.5" fx="0.6" fy="0.3">
        <stop offset="0" stop-color="red"/>
        <stop offset="0.5" stop-color="yellow"/>
        <stop offset="1" stop-color="green"/>
    </radialGradient>
</defs>
<rect  x="100" y="100" fill="url(#grad2)" width="200" height="150"></rect>
</svg>

笔刷

绘制纹理

标签
patternUnits
patternContentUnits //内容设置

userSpaceOnUse是真实的宽高/objectBoundingBox是按照比例计算的

<svg xmlns="http://www.w3.org/2000/svg">
<defs>
    <pattern id="p1" x="0" y="0" width="0.2" height="0.2">
        <circle cx="10" cy="10" r="5" fill="red"></circle>
        <polygon points="30 10 60 50 0 50" fill="green"></polygon>
    </pattern>
</defs>
<rect  x="100" y="100" fill="url(#p1)" width="200" height="150" stroke="blue"></rect>
</svg>

patternContentUnits = “userSpacePnUse” 表示按照实际宽高计算的而不是按照比例

<svg xmlns="http://www.w3.org/2000/svg">
<defs>
    <pattern id="p1" x="0" y="0" width="0.2" height="0.2">
        <circle cx="10" cy="10" r="5" fill="red"></circle>
        <polygon points="30 10 60 50 0 50" fill="green"></polygon>
    </pattern>
</defs>
<rect  x="100" y="100" fill="url(#p1)" width="200" height="150" stroke="blue"></rect>
</svg>

Path路径

<path d="M0,0L10,20C30-10,40,20,100,100" stroke="red">

其中L表示命令 数字表示参数
参数之间用空格或者逗号隔开,有一种情况例外,就是下一个数值是负数



列举了相关命令;

区分大小写:大写表示坐标参数为绝对位置,小写为相对位置 最后的参数表示最终要到达的位置
上一个命令结束的位置就是下一个命令开始的位置 命令可以重复参数表示重复执行同一个命令

弧线命令

A(rx,ry,xr,laf,sf,x,y)—绘制弧线


rx 表示弧线所在椭圆的x半轴长
ry 表示弧线所在椭圆的y半轴长
xr 表示弧线所在椭圆的长轴角度,旋转角度
laf 表示是否选择弧长较长的那一段弧线
sf 表示是否选择逆时针方向的那一段弧线
x,y表示弧线要画到那个位置



laf=1的时候选择的是大弧线;
sf=1的时候表示是顺时针


贝塞尔曲线



Q是大写的时候 是相对于坐标系的绝对路径
q是小写的时候 是相对于坐标系的相对路径

M x0 y0 Q x1 y1 x y

<svg xmlns="http://www.w3.org/2000/svg">
<path d="M100,100 Q200,250 300,100" stroke="red" fill="none"/>
</svg>

光滑曲线,无需指定第三个控制点的坐标

T指令自动补全对称的控制点(上图蓝色部分),让曲线平滑起来

<svg xmlns="http://www.w3.org/2000/svg">
<path d="M10,100 Q150,250 300,100 T450,100" stroke="red" fill="none"/>
</svg>

<svg xmlns="http://www.w3.org/2000/svg">
<path d="M250,250 C300,350,400,350,500,250" stroke="red" fill="none"/>
</svg>

<svg xmlns="http://www.w3.org/2000/svg">
<path d="M250,250 C300,350,400,350,500,250 S650,100 700,200" stroke="red" fill="none"/>
</svg>

在SVG中使用文本

原文地址:https://www.cnblogs.com/xiaozhumaopao/p/12151817.html

时间: 2024-11-14 12:38:27

svg基础知识梳理的相关文章

[SQL] SQL 基础知识梳理(一)- 数据库与 SQL

SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 序 目录 What's 数据库 数据库结构 SQL 概要 创建表 删除和更新表 1-1 What's 数据库 1.数据库(Database,DB):将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合.如:大型-银行存储的信息,小型-电话簿. 2.数据库管理系统(Batabase Management Syste

JavaScript基础知识梳理--数组

JavaScript基础知识梳理--数组 1.创建方法 空数组:var obj=new Array(); 指定长度数组: var obj=new Array( size ); 指定元素数组 :  var obj=new Array( 元素1,元素2,....): 单位数组:var obj=new Array[ 元素1,元素2,元素3,...,元素N]; 多维数组:var a=new Array( [数组1],[数组2],[数组3],...,[数组N] ); 2.基本操作 存取数组元素: 单维数组

Java基础知识梳理《一》

一.Java数据类型(简单称之为“四类八种”) java 基本的数据类型长度都是固定的,好处是在实现跨平台时就统一了. 1.整型 byte short int long (分别是1,2,4,8个字节) 类型 存储需求 位数 取值范围 byte 1字节 8位 -128~127 short 2字节 16位 -2^15 ~2^15-1 int 4字节 32位 -2^31~2^31-1 long 8字节 64位 -2^63~2^63-1 当超出int表示范围时,应该使用long型,添加后缀一大写的L 注

[SQL] SQL 基础知识梳理(四) - 数据更新

SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 目录 一.插入数据 1.INSERT 语句的基本语法 --语法: --INSERT INTO <表名>(列1, 列2, ...) VALUES (值1, 值2, ...) INSERT INTO dbo.Shohin ( shohin_id , shohin_mei , shohin_bunrui , hanbai_tanka , s

[SQL] SQL 基础知识梳理(三)- 聚合和排序

SQL 基础知识梳理(三)- 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 目录 一.对表进行聚合查询 1.聚合函数 (1)5 个常用函数: ①COUNT:计算表中的记录(行)数. ②SUM:计算表中数值列的数据合计值. ③AVG:计算表中数值列的数据平均值. ④MAX:求出表中任意列中数据的最大值. ⑤MIN:求出表中任意列中数据的最小值. (2)聚合:将多行汇总成一行. 图1-1 Shohin 表 2.计算

Js基础知识梳理系列

小序:总是感觉自己的技术一直在原地踏步,想学习一些新的技术,但学起来很吃力,而且总是没有什么实际的收获,似乎进入了所谓的“瓶颈期”.问了一些前辈是否也遇到过同样的问题,他们给我的解决方案是,基础不稳固,再把基础巩固一下.然后学起新的技术会轻松一点点.也是,反思自己曾经走马观花式的学习,确实有很多细腻的技术点没有接触到,所以,我还没有做到大神眼里的“精”.抱着这样的目的,再次翻开<JavaScript高级编程设计>,我将按照着书上的内容和顺序,系统化的学习这本书中的知识.并且在学习的过程中会结合

JavaScript基础知识梳理----正则表达式

JavaScript基础知识梳理----正则表达式 1.创建 方式:---字面量:var 变量名=/表达式/模式修饰符 ---构造函数:var 变量名=new RegExp(“表达式”,“模式修饰符”) 说明: 表达式 单个字符和数字 . 匹配除换行符之外的任意字符 [a-z0-9] 匹配方括号中的任意字符 [^a-z0-9] 匹配不在方括号中的任意字符 \d 匹配数字 \D 匹配非数字 \w 匹配字母 \W 匹配非字母 空白字符 \0 匹配null字符 \b 匹配空格符 \f 匹配进纸符 \n

[SQL] SQL 基础知识梳理(七)- 集合运算

SQL 基础知识梳理(七)- 集合运算 目录 表的加减法 联结(以列为单位) 一.表的加减法 1.集合:记录的集合(表.视图和查询的执行结果). 2.UNION(并集):表的加法 -- DDL:创建表 CREATE TABLE Shohin2 (shohin_id CHAR(4) NOT NULL, shohin_mei VARCHAR(100) NOT NULL, shohin_bunrui VARCHAR(32) NOT NULL, hanbai_tanka INTEGER , shiire

[SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式

SQL 基础知识梳理(六)-  函数.谓词.CASE 表达式 目录 函数 谓词 CASE 表达式 一.函数 1.函数:输入某一值得到相应输出结果的功能,输入值称为“参数”,输出值称为“返回值”. 2.函数的种类: (1)算术函数 - 数值计算 (2)字符串函数 - 字符串操作 (3)日期函数 - 日期操作 (4)转换函数 - 转换数据类型 (5)聚合函数 - 数据聚合 3.算术函数(加.减.乘.除):+.-.*./ [备注]数据类型 NUMBERIC(全体位数,小数位数)可以指定数值的大小. C