svg

位图和矢量图

  • 位图由像素点组成,每个像素点都有自己的颜色
  • 矢量图以数学向量方式记录图像,内容以线条和色块为主,矢量图和分辨率无关,可以任意放大且清晰度不变,也不会出现锯齿状边缘


svg

  • svg是基于xml的技术

svg使用方式

  • 浏览器直接打开svg文件
  • 在HTML中使用<img>标签引入
  • 直接在HTML中使用svg标签
  • 作为css背景
  • iframe引入
  • 浏览器直接打开svg文件
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
    <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/>
</svg>
//以上为后缀为.svg文件内容(这里我是命名为test.svg)

代码解释:
第一行包含了 XML 声明。请注意 standalone 属性!该属性规定此 SVG 文件是否是“独立的”,或含有对外部文件的引用。
standalone="no" 意味着 SVG 文档会引用一个外部文件 - 在这里,是 DTD 文件。
第二和第三行引用了这个外部的 SVG DTD。该 DTD 位于 “http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd”。该 DTD 位于 W3C,含有所有允许的 SVG 元素。
SVG 代码以 <svg> 元素开始,包括开启标签 <svg> 和关闭标签 </svg> 。这是根元素。width 和 height 属性可设置此 SVG 文档的宽度和高度。version 属性可定义所使用的 SVG 版本,xmlns 属性可定义 SVG 命名空间。
SVG 的 <circle> 用来创建一个圆。cx 和 cy 属性定义圆中心的 x 和 y 坐标。如果忽略这两个属性,那么圆点会被设置为 (0, 0)。r 属性定义圆的半径
stroke 和 stroke-width 属性控制如何显示形状的轮廓。我们把圆的轮廓设置为 2px 宽,黑边框。
fill 属性设置形状内的颜色。我们把填充颜色设置为红色。
关闭标签的作用是关闭 SVG 元素和文档本身。


  • 在HTML中使用<img>标签引入
<img src="test.svg" alt="">
  • 直接在HTML中使用svg标签
<div id="div1">
  <svg xmlns="http://www.w3.org/2000/svg">
    <circle cx="100" cy="100" r="40" fill="#f00"></circle>
  </svg>
</div>
  • 作为css背景
<div class="mydiv"></div>
.mydiv {
    width: 200px;
    height: 200px;
    background: url("../test.svg") no-repeat;
}
  • iframe引入
<iframe src="test.svg" frameborder="0"></iframe>

基本图形和属性

  • 基本图形
    <rect>、<circle>、<ellipse>、<line>、<polyline>、<polygon>
  • 基本属性
    fill、stroke、stroke-width、transform
  • <rect>


    <rect>
<!--如果ry没有指定,ry的值将保持和rx一致-->
<rect width="200" height="200" x="100" y="100" fill="#f00" rx="30" ry="50"></rect>
  • <circle>


    <circle>
<!--fill="none"或者fill="transparent"表示内部透明,不填充颜色-->
<circle cx="100" cy="100" r="40" fill="#f00" stroke="#000" stroke-width="5"></circle>
<!--一些样式设置也可以用style的方式指定-->
<!--<circle cx="200" cy="200" r="40" style="fill: #f00;stroke: #000;stroke-width: 5;"></circle>-->
  • <ellipse>


    <ellipse>
  • <line>


    <line>
<line x1="50" y1="50" x2="200" y2="300" stroke="#000"></line>   
<!--stroke-opacity,设置stroke的透明度-->
<line x1="50" y1="50" x2="200" y2="300" stroke="#000" stroke-width="10" stroke-opacity=".5"></line>
  • <polyline>
    点之间可以用空格或者逗号隔开


    <polyline>
  • <polygon>
    和<polyline>的区别就是<polygon>形成闭合

填充、描边和变换


<g>标签

  • 是一个容器(分组)标签,用来组合元素
  • 共用属性 transform="translate(0,0)"
<div class="oDiv">
    <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
        <!--g标签上可以指定id,用于后面的js操作-->
        <g transform="translate(200,200)" cx="200" cy="200" stroke="#333" stroke-width="5">
            <circle r="40" fill="none"></circle>
            <circle r="30" fill="none"></circle>
            <circle r="20" fill="none"></circle>
            <circle r="10" fill="none"></circle>
        </g>
    </svg>
</div>

<text>标签

  • x y text-anchor
<div class="oDiv">
    <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
        <circle cx="200" cy="200" r="50" fill="none" stroke="#f00" stroke-width="5"></circle>
        <text x="200" y="200" font-size="20">前端svg</text>
    </svg>
</div>
可以看到文字左下角才对应text指定的坐标点

<div class="oDiv">
    <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
        <circle cx="200" cy="200" r="50" fill="none" stroke="#f00" stroke-width="5"></circle>
        <!--text-anchor的值为start、middle、end,用来指定文字的水平对齐方式-->
        <text x="200" y="200" font-size="20" text-anchor="middle">前端svg</text>
    </svg>
</div>
文字水平居中了,但是竖直还没居中

<div class="oDiv">
    <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
        <!--给g标签设置cursor: pointer,使里面的标签鼠标经过时都是手型-->
        <g style="cursor: pointer">
            <!--这里的fill不能设置为none-->
            <!--fill设置为"transparent",经过里面的白色部分时才也是手型-->
            <circle cx="200" cy="200" r="50" fill="transparent" stroke="#f00" stroke-width="5"></circle>
            <text x="200" y="200" font-size="20" text-anchor="middle">前端svg</text>
        </g>
    </svg>
</div>

<image>标签

  • x y width height
  • xlink: href
<div class="oDiv">
    <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
        <g style="cursor: pointer">
            <image x="200" y="200" width="100" height="103" xlink:href="images/timg.jpg"></image>
            <text x="200" y="200" font-size="20" text-anchor="middle">前端svg</text>
        </g>
    </svg>
</div>

实例:

<div class="oDiv">
    <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
        <g style="cursor: pointer">
            <line x1="100" y1="100" x2="390" y2="200" stroke="#ccc"></line>
            <!--加一条透明的线,增大线的可指范围,增加用户体验-->
            <line x1="100" y1="100" x2="390" y2="200" stroke="transparent" stroke-width="10"></line>
            <!--x:100+(390-100)/2=245 245-10=235-->
            <!--y:100+(200-100)/2=150 150-10=140-->
            <rect x="235" y="140" fill="#999" width="20" height="20" rx="5"></rect>
            <text x="245" y="158" fill="#fff" font-size="20" text-anchor="middle">?</text>
        </g>
        <g style="cursor: pointer">
            <circle cx="100" cy="100" r="40" fill="#fff" stroke="#f00" stroke-width="3"></circle>
            <text x="100" y="108" font-size="20" text-anchor="middle">svg</text>
        </g>
        <g style="cursor: pointer">
            <circle cx="390" cy="200" r="60" fill="#fff" stroke="#f00" stroke-width="3"></circle>
            <text x="390" y="208" font-size="20" text-anchor="middle">前端</text>
        </g>
    </svg>
</div>

基本操作API

  • 创建图形
    document.createElementNS(ns, tagName) //ns-命名空间,tagName-标签名
  • 添加图形
    element.appendChild(childElement)
  • 设置/获取属性
    element.setAtrribute(name, value)
    element.getAttribute(name)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 1. SVG 简单介绍 1.1 是什么 SVG是指可伸缩矢量图形 (Scalable Vector Graphic...
    皇马船长阅读 7,452评论 0 7
  • 一、相关概念 1、位图与矢量图概念及对比 位图 :又叫点阵图或像素图,计算机屏幕上的图你是由屏幕上的发光点(即像素...
    sean92_阅读 4,739评论 1 2
  • VectorDrawable 与 SVG Android 5.0(Lollipop, API 21)后,新增了<v...
    Wavky阅读 9,953评论 2 22
  • 一、背景 由于android 碎片化严重,对于不同型号手机、不同屏幕分辨率的适配,就显得异常艰难了。一般的做法是切...
    corabsins阅读 3,173评论 1 2
  • 今天我在看某脑SVG视频和网上查资料时,发现了和某位大佬的写文章的某种巧合(报以微妙的笑容)。因为强迫症,所以我想...
    仁昌居士阅读 4,634评论 0 11