马黑黑 发表于 2022-3-11 11:37

svg:设置path路径画圆形

svg使用xml格式定义图形。svg全称是 Scalable Vector Graphics,意为可缩放矢量图形。svg可以内联到HTML中,可以用CSS定义定义其相关属性。

svg开发之初并不考虑支持人工编写代码,所有它的语法都是对解析器说的,语法很怪异。不过由于它的强大,我们有必要接触一下,并将其应用到HTML中来。在文本效果集中营里,我提供了一个环形文字效果,为了帮助理解那个特效,这里开个帖子专门探讨一下svg的圆形路径。

svg画圆有自己的命令,不过我们这里仅讨论通过设计path路径来画一个圆。相关的svg命令命令有:

M = moveto(移动)
a = arc(画弧)
z = closepath(关闭路径)

在HTML中内联svg的语句:

<div>
    <svg>
    </svg>
</div>

可以看得出来,svg就是一个HTML标签。HTML5对svg完整支持。

现在给svg创建一个路径:

<div>
    <svg>
      <path d="M 50 100 a 50 50 0 1 1 0 1 z" id="yuan" />
    </svg>
</div>


path是svg元素的子元素,是一个自闭合标签,还可以有自己的HTML的 id 标识。这些不是问题,重点看 d="..." 是什么鬼?

d="M 50 100 a 50 50 0 1 1 0 1 z"

d 表示路径,M我们前面介绍了,是“移动到”命令,可大写也可小写,大写表示绝对定位,小写表示相对定位。M 50 100 表示移动到{50,100}坐标,也可以写成 M50 100,就是说M和数字之间可以没有空格。 M 50 100 其实起到的作用是设置圆心位置。

a 50 50,a是画弧命令,弧有两个半径值,我们要画的是圆形,所以两个半径一样,都是 50 像素,我们要画的圆半径为 50 px。

下面的四个参数,0 1 1 0,解释起来很麻烦,不讲,知道画圆就这么用就行。

最后的参数,1 z,表示关闭路径,1是z的参数,为什么这样,鬼才懂,强记就行。

圆形的填充颜色是可以定义的,可用CSS定义,也可直接使用HTML代码定义,都用到 fill 命令:

HTML代码:fill="green"
CSS代码: fill: green;
行内CSS代码:style="fill:green;"

下面给出一个完整实例代码。这个实例,在 200*200 的div盒子内,我们画一个半径为 50px 的圆,圆的填充颜色为 green。请特别注意我们画的圆在div里是居中的,这是尺寸设计得当的缘故:

<div style="margin: auto; width: 200px; height: 200px; border: 1px solid;">
        <svg>
                <path d="M 50 100 a 50 50 0 1 1 0 1 z" id="yuan" fill="green" />
        </svg>
</div>


效果请看楼下。

马黑黑 发表于 2022-3-11 11:38

<div style="margin: auto; width: 200px; height: 200px; border: 1px solid;">
        <svg>
                <path d="M 50 100 a 50 50 0 1 1 0 1 z" id="yuan" fill="green" />
        </svg>
</div>

马黑黑 发表于 2022-3-11 11:38

本帖最后由 马黑黑 于 2022-3-11 13:02 编辑

(接一楼,探讨文字绑定圆环)

svg 标签有 text 子元素,它再通过子元素 textPath 即文本路径来输出文本,代码样纸如下:
<svg>
    <text>
      <textPath xlink="#id">
            输出的文本串写在这里
      </textPath>
    </text>
</svg>

textPath 有一个 xlink 属性,它用来绑定 svg 事先设计的路径id,如一楼的圆形路径id,等号后面id名称之前必须有井号(#)。这样 textPath 标签内的文本就能沿着那个路径呈现。

下面,我们把二楼的效果改装一下,不要圆的填充色,然后加入 text 标签系列代码,形成圆环文本输出效果:

<div style="margin: auto; width: 200px; height: 200px; font-size: 18px; border: 1px solid;">
      <svg style="display: block; overflow: visible;">
                <path d="M 50 100 a 50 50 0 1 1 0 1 z" id="yuan1" fill="none" />
                <text stroke="red"> <!-- 用 stroke 设定文本颜色 -->
                        <textPath xlink:href="#yuan1">ABCDEFGHIJKLMNOPQRSTUVWXYZ12345</textPath>
                </text>
      </svg>
</div>


字体大小我们在父盒子里定义,text标签会继承这个设置;path 元素的id设置为yuan1,因为二楼的path已经用了 yuan;svg 标签的style属性必须写,这样往大里调整字体大小时文字不会被“咬”残。我们故意把输出的字串写多一些,但它们不能全部显示,毕竟圆形环尺寸有限,从中也可以领会在一个圆环之上呈现文字的字数限定。

效果看下楼。

马黑黑 发表于 2022-3-11 12:16

<div style="margin: auto; width: 200px; height: 200px; font-size: 18px; border: 1px solid;">
        <svg style="display: block; overflow: visible;">
                <path d="M 50 100 a 50 50 0 1 1 0 1 z" id="yuan1" fill="none" />
                <text stroke="red">
                        <textPath xlink:href="#yuan1">ABCDEFGHIJKLMNOPQRSTUVWXYZ12345</textPath>
                </text>
        </svg>
</div>

马黑黑 发表于 2022-3-11 12:17

通过以上示例,现在,如果设置一个圆形电子签章,应该可以了吧?

马黑黑 发表于 2022-3-11 12:45

考虑到不同字体它们的实际占位尺寸不一致,所以以上示例,应该定义字体,用 font-family ,可放在 div 或 svg 的style属性内:

font-family: '微软雅黑', '宋体';

马黑黑 发表于 2022-3-11 12:47

如果使用微软雅黑,四楼的效果是,字母刚好能够全部显示,数字一个都没显示出来

马黑黑 发表于 2022-3-11 12:49

装载文字的多少与字体、文字大小、圆环半径有关,做帖用到这个效果是可以依据需要考虑修改相关的值。另外,父盒子div的高宽尺寸设定应根据半径以及字体大小修改。

红影 发表于 2022-3-11 13:27

这个好,可以玩圆环状的文字了。黑黑辛苦了,这个说的特别清楚呢{:4_187:}

红影 发表于 2022-3-11 13:56

<style>
.hxBox { margin-left: 10px; margin-top: 30px; width: 160px; height: 160px; font-family: '楷体','微软雅黑'; font-size: 24px;}
.hxBox path { fill: none; }
.hxBox svg { display: block; overflow: visible; }
</style>

<div class="hxBox">
      <svg viewBox="0 0 100 100">
                <path d="M 0, 50 a 50, 50 0 1, 1 0, 1 z" id="yuan" />
                <text stroke="#330099">
                        <textPath xlink:href="#yuan">
                              中喜庆碧霄明月泛秋馨逸宇庭
                        </textPath>
                </text>
      </svg>
</div>

红影 发表于 2022-3-11 13:58

把樵歌的这个【中秋快乐】转轱辘 喜庆中秋
https://www.huachaowang.com/forum.php?mod=viewthread&tid=52749&fromuid=2
(出处: 花潮论坛)

用这个转圈的方式画出来了,这次真的画得够圆了@樵歌 {:4_173:}

马黑黑 发表于 2022-3-11 16:46

红影 发表于 2022-3-11 13:58
把樵歌的这个【中秋快乐】转轱辘 喜庆中秋
https://www.huachaowang.com/forum.php?mod=viewthread&tid=52 ...

设计成环形也是可以的吧

马黑黑 发表于 2022-3-11 16:46

不过还是圆形好看

马黑黑 发表于 2022-3-11 16:47

红影 发表于 2022-3-11 13:27
这个好,可以玩圆环状的文字了。黑黑辛苦了,这个说的特别清楚呢

有部分参数省略了,反正不会去修改那几个固定画圆的参数,主要是理解圆心位置、半径就好

红影 发表于 2022-3-12 15:49

马黑黑 发表于 2022-3-11 16:46
设计成环形也是可以的吧

还是觉得圆形的好看{:4_173:}

红影 发表于 2022-3-12 15:49

马黑黑 发表于 2022-3-11 16:47
有部分参数省略了,反正不会去修改那几个固定画圆的参数,主要是理解圆心位置、半径就好

嗯嗯,主要是千面6个参数的使用{:4_187:}

马黑黑 发表于 2022-3-12 18:06

红影 发表于 2022-3-12 15:49
嗯嗯,主要是千面6个参数的使用

关键的整明白就好

马黑黑 发表于 2022-3-12 18:06

红影 发表于 2022-3-12 15:49
还是觉得圆形的好看

对,圆满嘛

红影 发表于 2022-3-12 19:22

马黑黑 发表于 2022-3-12 18:06
关键的整明白就好

嗯嗯,基本整明白了,只是位置不知道在哪调,我画的轱辘诗咋那么偏右啊。

红影 发表于 2022-3-12 19:22

马黑黑 发表于 2022-3-12 18:06
对,圆满嘛

从来不知道还可以这样让文字成圆圈的{:4_173:}
页: [1] 2 3 4 5 6 7
查看完整版本: svg:设置path路径画圆形