svg 属性详解:填充与边框

svg 属性详解:填充与边框

  • 1 颜色和透明度
  • 2 填充规则 fill-rule
  • 3 边框样式
    • 3.1 stroke-width
    • 3.2 stroke-linecap
    • 3.3 stroke-linejoin
    • 3.4 stroke-dasharray

1 颜色和透明度

颜色和透明度

图像都有颜色,svg 中可以使用属性 fillstroke 来修改图形的颜色。fill 属性设置对象的内部颜色,stroke 属性设置绘制对象的线条的颜色。
颜色的取值可以参考 HTML 中 CSS 颜色命名方案,包括颜色名(比如“blue”),rgb 值(比如 rgb(0,0,255))、十六进制(比如 #0000FF) 等,参考 Colors Home 中颜色的定义。
透明度是另一个常见的图像属性, svg 中可以使用 opacity 属性来控制整个图像的透明度,也可以通过 fill-opacitystroke-opacity 来分别定义填充色和边框的透明度。

<?xml version="1.0" standalone="no"?>
<svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" version="1.1"><g stroke-width="5"> <rect x="70" y="95" width="80" height="90" fill="#FF0000" stroke="#00008B" /><rect x="125" y="145" width="100" height="80"fill="Gold" fill-opacity="0.8" stroke="Lavender" /><rect x="80" y="45" width="140" height="60"fill="rgb(255,102,255)" stroke="rgb(0,0,255)" stroke-opacity="0.4" /><rect x="20" y="150" width="75" height="60"fill="Purple" stroke="DeepPink" opacity="0.5"/>
</g></svg>

上面的代码分别绘制了下面四个矩形,设置边框宽度为 4 以便查看边框透明效果:
在这里插入图片描述

2 填充规则 fill-rule

对于一个简单的、没有交错的路径来说,判断它的内部区域是很容易的。但是一些复杂的路径,比如与自身相交的路径,或者路径的其中一段包围着另一段,要判断它的内部区域,就没那么容易了。
fill-rule 是一个表现属性,用来定义一个多边形内部区域的算法。该属性为如何确定一个图形的内部提供了两个可选值:
fill-rule
下面图示也许更浅显易懂,箭头显示路径的方向:
fill-rule 图形解释
如何为图形设置 fill-rule 属性,这里给出一个例子,绘制上面图示 A 组的两个五角星:

<?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"><path d="M 100 20 L 129.39 110.45 L 52.45 54.55L 147.55 54.55 L 70.61 110.45 Z"fill="Red" stroke="Black" />
<g transform="translate(150,0)"><path d="M 100 20 L 129.39 110.45 L 52.45 54.55L 147.55 54.55 L 70.61 110.45 Z"fill="Red" fill-rule="evenodd" stroke="Black"/>
</g></svg>

3 边框样式

边框除了有颜色属性,还有几何属性,参考下面的表格:
stroke 相关属性

3.1 stroke-width

stroke-width 用来定义边框的宽度,注意,边框的宽度是以路径为中心向两边伸展的,可以参考下面的例子:

<?xml version="1.0" standalone="no"?>
<svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" version="1.1"><circle cx="85" cy="85" r="50" fill="Red"stroke="Blue" stroke-opacity="0.5" stroke-width="20"/></svg>

这里设置了边框不透明度为 stroke-opacity=20,可以清楚得看到边框是如何绘制的:
在这里插入图片描述

3.2 stroke-linecap

stroke-linecap 用于控制边框终点的形状。

<?xml version="1.0" standalone="no"?>
<svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" version="1.1"><rect width="180" height="170" fill="none" stroke-dasharray="3,3" stroke="black" />
<g stroke-width="20" stroke="Darkgray"><line x1="40" y1="40" x2="140" y2="40" stroke-linecap="butt" /><line x1="40" y1="80" x2="140" y2="80" stroke-linecap="square"/><line x1="40" y1="120" x2="140" y2="120" stroke-linecap="round"/>
</g><g stroke="Black"><line x1="40" y1="40" x2="140" y2="40" /><line x1="40" y1="80" x2="140" y2="80" /><line x1="40" y1="120" x2="140" y2="120" />
</g></svg>

为了方便看清效果,这里画出了没有设置 stroke-linecap 属性的线段(中间的黑色线条):

butt 是默认的效果,用直边来结束线段,线段边界 90 度垂直于描边的方向。square 和 butt 的效果差不多,只是两端会稍微超出实际路径的范围,超出的大小取决于 stroke-width。round 用于绘制圆角,圆角的半径也是取决于 stroke-width。

3.3 stroke-linejoin

stroke-linejoin 用于表达两段路径之间用什么方式来连接。

<?xml version="1.0" standalone="no"?>
<svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" version="1.1"><g stroke-width="16" stroke="Darkgray" fill="none"><path d="M 20 60 L 100 60 A 40 40 0 0 0 180 60" stroke-linejoin="miter" /><path d="M 20 160 L 100 160 A 40 40 0 0 0 180 160" stroke-linejoin="round"/><path d="M 20 260 L 100 260 A 40 40 0 0 0 180 260" stroke-linejoin="bevel"/><rect x="260" y="40" width="100" height="70" stroke-linejoin="miter" /><rect x="260" y="140" width="100" height="70" stroke-linejoin="round" /><rect x="260" y="240" width="100" height="70" stroke-linejoin="bevel" />
</g><g stroke="Black" fill="none"><path d="M 20 60 L 100 60 A 40 40 0 0 0 180 60" /><path d="M 20 160 L 100 160 A 40 40 0 0 0 180 160" /><path d="M 20 260 L 100 260 A 40 40 0 0 0 180 260" /><rect x="260" y="40" width="100" height="70" /><rect x="260" y="140" width="100" height="70" /><rect x="260" y="240" width="100" height="70" />
</g></svg>

在不显式指定 stroke-linejoin 的值时,默认使用 miter。miter 表示用方向笔在连接处形成尖角,round 表示用圆角连接,实现平滑效果。bevel 会在连接处形成一个斜接。需要注意的是,stroke-linejoin 不仅可以用于path,也可以用于 rect 元素。

与 stroke-linejoin 相关的还有 stroke-miterlimit 属性,我们已经知道,miter 会在路径的连接处形成一个尖角,尖角的样式取决于 stroke-width 和两路径的夹角。
stroke-miterlimit
参考下面图示:
斜接和夹角
事实上,没有显式指定 stroke-miterlimit 的情况下,在 stroke-linejoin=“miter” 时,默认 stroke-miterlimit=4,如果需要在任意情况下保留斜接,可以给 stroke-miterlimit 赋一个很大的值。
关于如何设置斜接限制,这里给了一个例子:

<?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">
<rect width="275" height="200" fill="none" stroke-dasharray="3,3" stroke="black" />
<path d="M 40 40 L 20 100 H 100 A 50 50 30 0 0 85 163.3" fill="none" stroke-width="10" stroke="DimGray" stroke-linejoin="miter" stroke-miterlimit="2" />
<rect x="170" y="40" width="80" height="100"fill="none" stroke-width="10" stroke="DimGray" stroke-linejoin="miter" stroke-miterlimit="1" /></svg>

上面的代码绘制了如下两个图形,可以看到,同一个 path 的多个路径连接处,storke-miterlimit 只对符合限制条件的斜接转换为斜角。stroke-miterlimit 也同样适用于 rect 元素。

3.4 stroke-dasharray

stroke-dasharray 用于将虚线类型应用与边框上。通过用一组以逗号分隔的数字来定义虚线的样式(注意与 path 的 d 属性进行区分,path 中 d 的参数用空格来进行区分)。每一组数字,第一个数字用来表示填色区域的长度,第二个用来表示非填色区域的长度,若还有其他数字,则跟前两个数字代表的含义一致。参考下面一个简单的例子:

<?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"><line x1="20" y1="50" x2="220" y2="50" stroke-dasharray="40,20" stroke="Pink"stroke-width="10" /><line x1="20" y1="50" x2="220" y2="50" stroke="Black" />
</svg>

上面的代码在同一位置上绘制了两条线,其中一条设置了虚线样式,下面图示展示了虚线是如何应用到图形上:
设置虚线样式
注意虚线最后一段填充区域,因为图形在这里绘制完毕,所以最后一段只有20。
使用 stroke-dashoffset 可以自定义虚线开始的位置,参考下面的例子:

<?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"><path d="M 40 60 L 180 60 L 250 70" stroke-dashoffset="15" stroke-dasharray="40,25" stroke="Red" stroke-width="4" fill="none" />
<path d="M 40 60 L 180 60 L 250 70" stroke="Black" fill="none" />
<path d="M 40 60 h 50" stroke-width="10" stroke="Green" opacity="0.3" /><path d="M 40 180 L 180 180 L 250 190"stroke-dashoffset="95" stroke-dasharray="40,25"stroke="Red" stroke-width="4" fill="none" />
<path d="M 40 180 L 180 180 L 250 190"stroke="Black" fill="none" />
<path d="M 40 180 h 35" stroke-width="10"stroke="Green" opacity="0.3" /</svg>

下面图示展示 strokke-dashoffset 是如何应用的:
在这里插入图片描述

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

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

相关文章

【RSA加密算法进行数字签名并验签--C++】

RSA加密算法进行数字签名并验签--C 前言RSA加密算法什么是RSA加密算法公钥加密私钥解密or私钥加密公钥解密&#xff1f;公钥加密&#xff0c;私钥解密&#xff08;常见用法&#xff09;&#xff1a;私钥加密&#xff0c;公钥解密&#xff08;较少用法&#xff0c;本次使用&…

自动驾驶的决策层逻辑

作者 / 阿宝 编辑 / 阿宝 出品 / 阿宝1990 自动驾驶意味着决策责任方的转移 我国2020至2025年将会是向高级自动驾驶跨越的关键5年。自动驾驶等级提高意味着对驾驶员参与度的需求降低&#xff0c;以L3级别为界&#xff0c;低级别自动驾驶环境监测主体和决策责任方仍保留于驾驶…

两个近期的计算机领域国际学术会议(软件工程、计算机安全):欢迎投稿

近期&#xff0c;受邀担任两个国际学术会议的Special session共同主席及程序委员会成员&#xff08;TPC member&#xff09;&#xff0c;欢迎广大学界同行踊跃投稿&#xff0c;分享最新研究成果。期待这个夏天能够在夏威夷檀香山或者加利福尼亚圣荷西与各位学者深入交流。 SERA…

专业120+总分400+海南大学838信号与系统考研高分经验海大电子信息与通信

今年专业838信号与系统120&#xff0c;总分400&#xff0c;顺利上岸海南大学&#xff0c;这一年的复习起起伏伏&#xff0c;但是最后还是坚持下来的&#xff0c;吃过的苦都是值得&#xff0c;总结一下自己的复习经历&#xff0c;希望对大家复习有帮助。首先我想先强调一下专业课…

Github 2024-01-27 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-01-27统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目3Jupyter Notebook项目2非开发语言项目2JavaScript项目1Go项目1Rust项目1Shell项目1 Papers We Lo…

【学网攻】 第(9)节 -- 路由器使用以及原理

系列文章目录 目录 系列文章目录 文章目录 前言 一、路由器是什么&#xff1f; 二、实验 1.引入 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan…

精品基于Uniapp+springboot助农管理系统App农产品积分购物商城

《[含文档PPT源码等]精品基于Uniappspringboot助农管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm 安卓…

鸿蒙HarmonyOS获取GPS精确位置信息

参考官方文档 #1.初始化时获取经纬度信息 aboutToAppear() {this.getLocation() } async getLocation () {try {const result await geoLocationManager.getCurrentLocation()AlertDialog.show({message: JSON.stringify(result)})}catch (error) {AlertDialog.show({message…

开源直播电商系统的实现方式(仿抖音电商模式)

当下&#xff0c;传统的图文电商模式正在走向没落&#xff0c;以“抖音”为首的直播电商模式备受用户追捧&#xff0c;它具有直观与互动的特点&#xff0c;拥有传统电商所不具备的优势。而且&#xff0c;当前正是直播电商的红利期&#xff0c;很多主播和品牌商都通过直播电商业…

fatal error:require():Failed opening required

今天部署网站遇到了个错误 fatal error:require():Failed opening required 这个错误经常遇到 大多是网站 是开启了 open_basedir 但今天这个错误很神奇 先说解决方法 1. 检测一下是不是真的 不存在这个文件 即使100%确定 也建议你再仔细看一下 这个文件存不存在 今天我遇…

【Unity3D日常开发】Unity3D中设置Text行首不出现标点符号

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中会遇到Text的文本内容行首出现标点符号的情况&#xf…

CTFshow元旦水友赛web部分题解

1.easy_include 看题目是一个文件包含题 post的内容被过滤掉.&#xff0c;而且开头必须是字母&#xff0c;但是如果想要文件包含需要file:///xxxx,这里开头就是/了&#xff0c;所以需要绕过&#xff0c;file伪协议可以用file://localhost路径让绕过开头必须是字母。 可以看…