svg mask和stroke冲突问题

news2024/11/25 22:55:46

目录

  • 先说结论
  • 各种样例
    • 首先是水平、垂直的线
    • 然后是斜线
    • 如果是图形加stroke呢
    • 用《g》标签包起来呢
  • 总结

先说结论

实际上svg里,mask对svg内元素起作用的并非元素本身,而是元素几何形状的外包矩形,特别是和stroke有冲突,会产生奇怪的显示效果

各种样例

首先是定义一个普通的svg,包含了渐变的mask

<html>
<body>
<svg width="1000" height="1000" >
    <defs>
		<linearGradient  id="border-with-four-corner-linearGradient1" x1="0%" y1="0%" x2="100%" y2="100%">
			<stop offset="0" stop-color="white" stop-opacity="0"></stop>
			<stop offset="0.5" stop-color="white" stop-opacity="1"></stop>
			<stop offset="1" stop-color="white" stop-opacity="0"></stop>
		</linearGradient>
		<mask  id="border-with-four-corner-mask1">
			<rect  x="0" y="0" width="1000" height="1000" fill="url(#border-with-four-corner-linearGradient1)"></rect>
		</mask>
    </defs>
    这里放后面的各种path
  </svg>
  </body>
 </html>

首先是水平、垂直的线

代码放到上面代码中”这里放后面的各种path“的地方

<path d="M 100 10 l 200 0" stroke="green" stroke-width="20" fill="none" mask="url(#border-with-four-corner-mask1)" />

理论上来说会获取一条渐变的水平线段,宽度20,但是显示是空白
同样的

<path d="M 100 10 l 0 200" stroke="green" stroke-width="20" fill="none" mask="url(#border-with-four-corner-mask1)" />

理论上来说会获取一条渐变的垂直线段,宽度20,但是显示是空白

由上面可以得到,stroke并不会改变mask作用的几何图形的范围,上述的水平或者垂直线的几何图形范围(面积)还是0,因此显示的结果自然是空白的
多点、加z或者fill也一样的

<path d="M 100 10 l 200 0 l 100 0 z" stroke="green" stroke-width="20" fill="red" mask="url(#border-with-four-corner-mask1)" />

然后是斜线

<path d="M 100 10 l 200 1" stroke="green" stroke-width="20" fill="none" mask="url(#border-with-four-corner-mask1)" />

出现了渐变的线了,因为这条线的几何外包矩形不再是面积0了。但是发现线宽度不是20,而是很细,大概只有1

<path d="M 100 10 l 200 5" stroke="green" stroke-width="20" fill="none" mask="url(#border-with-four-corner-mask1)" />

也出现了渐变的线了,因为这条线的几何外包矩形不再是面积0了。但是发现线宽度不是20,而是很细,大概只有5
因此可以得出结论包含stroke的线,在mask下,最终的显示宽度受限制于最小的宽度或者高度

如果是图形加stroke呢

<rect x="100" y="200" width="300" height="50" fill="red" stroke="green" stroke-width="30"  mask="url(#border-with-four-corner-mask1)"/>
		<rect x="100" y="400" width="300" height="50" fill="red" stroke="green" stroke-width="30"/>

两个300*50的长方形,一个加了mask,一个没有加,都是stroke绿色宽30
结果
结果是这样的,加了mask的被拉扁了,没错stroke被拉扁了,几何图形范围没有变化,但是stroke被拉扁了

那改变宽度和高度,改为150*150的正方形

<rect x="100" y="200" width="150" height="150" fill="red" stroke="green" stroke-width="30"  mask="url(#border-with-four-corner-mask1)"/>
		<rect x="100" y="400" width="150" height="150" fill="red" stroke="green" stroke-width="30"/>

结果
渲染是对的,宽度没错了。

用《g》标签包起来呢

将水平和垂直的线,利用group包起来,对group加mask

<g  mask="url(#border-with-four-corner-mask1)">
		<path d="M 100 10 l 200 0" stroke="green" stroke-width="20" fill="none" />
		<path d="M 100 10 l 0 500" stroke="green" stroke-width="20" fill="none" />
	</g>

结果

显然,结果是对的,因为这个group的几何外包矩形是200*500(线的长度不同),显示正常,而且不会像矩形那样stroke被拉扁
这样也不会拉扁矩形的stroke

	<g  mask="url(#border-with-four-corner-mask1)">
		<path d="M 100 10 l 200 0" stroke="green" stroke-width="20" fill="none" />
		<rect x="100" y="200" width="300" height="50" fill="red" stroke="green" stroke-width="30"/>
	</g>

或者这样两个矩形也不会拉扁

<g  mask="url(#border-with-four-corner-mask1)">
		<rect x="100" y="100" width="500" height="50" fill="red" stroke="green" stroke-width="30"/>
		<rect x="100" y="200" width="500" height="50" fill="red" stroke="green" stroke-width="30"/>
	</g>

但单独一个矩形放再group里还是会拉扁的

	<g  mask="url(#border-with-four-corner-mask1)">
		<rect x="100" y="200" width="300" height="50" fill="red" stroke="green" stroke-width="30"/>
	</g>

总结

再说一遍结论
实际上svg里,mask对svg内元素起作用的并非元素本身,而是元素几何形状的外包矩形,特别是和stroke有冲突,会产生奇怪的显示效果
对我们的启示,尽可能不要对包含stroke的元素进行mask操作,如果必须的话,那么用group标签包起来,确保group标签内存在至少两个几何图形

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配)

在计算机视觉领域&#xff0c;从图像中提取和匹配特征的能力对于对象识别、图像拼接和相机定位等任务至关重要。实现这一目标的一种流行方法是 ORB&#xff08;Oriented FAST and Rotated Brief&#xff09;特征检测器和描述符。ORB 由 Ethan Rublee 等人开发&#xff0c;结合了…

工作7年的测试员,明白了如何正确的“卷“

背景 近两年&#xff0c;出台和落地的反垄断法&#xff0c;明确指出要防止资本无序扩张。 这也就导致现在的各大互联网公司&#xff0c;不能再去染指其他已有的传统行业&#xff0c;只能专注自己目前存量的这些业务。或者通过技术创新&#xff0c;开辟出新的行业。 但创新这种…

vmware 虚拟机开机自启动脚本

1、建立一个txt文件 D:\VMware\VMware Workstation\vmrun.exe -T ws start "I:\Documents\Virtual Machines\centos\centos.vmx" nogui 注意&#xff1a;如果路径中有中文需要先转换txt文件编码格式ANSI 2、设置bat开机自启动 winr shell:startup 复制文本文件到…

【uniapp】微信小程序 , 海报轮播图弹窗,点击海报保存到本地,长按海报图片分享,收藏或保存

uivew 2.0 uniapp 海报画板 DCloud 插件市场 第一步&#xff0c;下载插件并导入HbuilderX 第二步&#xff0c;文件内 引入 海报组件 <template><painter ref"haibaorefs"></painter> <template> <script>import painter from /comp…

Docker关于下载,镜像配置,容器启动,停止,查看等基础操作

系列文章目录 文章目录 系列文章目录前言一、安装Docker并配置镜像加速器二、下载系统镜像&#xff08;Ubuntu、 centos&#xff09;三、基于下载的镜像创建两个容器 &#xff08;容器名一个为自己名字全拼&#xff0c;一个为首名字字母&#xff09;四、容器的启动、 停止及重启…

汽车检测报告小程序开发制作方案

传统的车辆检测流程通常繁琐且耗时&#xff0c;用户对更快速、便捷的检测方式有了更高的期望。基于这一需求&#xff0c;开发一款汽车检测报告小程序将成为现实生活中的实用工具。 产品定位为一款提供汽车检测报告查询的小程序&#xff0c;主要服务于需要进行汽车检测的车主、…

【Leetcode】移动零

移动零 题目描述算法描述编程代码 链接: 移动零 题目描述 算法描述 编程代码 class Solution { public:void moveZeroes(vector<int>& nums) {//题目要求不可以复制数组&#xff0c;开辟额外空间int dest -1,curr 0;for(;curr < nums.size();curr){if(nums[cu…

正中优配:股票增发对散户有补偿吗?

股票增发指的是公司发行新的股票&#xff0c;从而添加公司的股本。这通常是为了筹集资金&#xff0c;以用于公司的扩张或其他出资。可是&#xff0c;这种操刁难散户出资者的影响往往被疏忽或被低估。本文将从多个角度剖析股票增发对散户出资者的影响&#xff0c;包含股票价格、…

荣耀重返印度市场,代工订单闻泰承接 | 百能云芯

荣耀宣布将重新进军印度市场&#xff0c;最新的消息显示&#xff0c;荣耀已与闻泰科技达成协议&#xff0c;委托其承接印度手机市场的制造订单。此举旨在通过在闻泰科技的印度工厂进行组装&#xff0c;降低关税&#xff0c;从而提升荣耀产品在印度市场的竞争力。 作为备受瞩目的…

分库分表之拆分键设计 | 京东物流技术团队

众所周知&#xff0c;在现实世界中&#xff0c;每一个资源都有其提供能力的最大上限&#xff0c;当单一资源达到最大上限后就得让多个资源同时提供其能力来满足使用方的需求。同理&#xff0c;在计算机世界中&#xff0c;单一数据库资源不能满足使用需求时&#xff0c;我们也会…

Andorid广播

以下内容摘自郭霖《第一行代码》第三版 文章目录 一、广播机制简介1.1 广播的类型1.1.1 标准广播1.1.2 有序广播 二、接收系统广播2.1 动态注册监听时间变化2.2 静态注册实现开机启动 三、发送自定义广播3.1 发送标准广播3.2 发送有序广播 一、广播机制简介 1.1 广播的类型 A…

EPS倾斜摄影模型测图

1、打开EPS软件&#xff0c;新建工程。 2、加载倾斜摄影模型。在三维测图--倾斜摄影--加载本地倾斜模型中&#xff0c;加载模型到工作空间。 3、加载后的结果如下&#xff1a; 4、开始绘制房屋。选择编码--进入加线模式--开始绘图。 开始绘图图形&#xff0c; 5、绘图按键使用 …

面试题大揭秘!Java中== 与equals的区别?

大家好&#xff0c;我是你们的小米&#xff01;今天我们要来聊一个在Java面试中经常被问到的问题&#xff1a; 与 equals 的区别。这可是一个重要而且常常令人头疼的问题哦&#xff01;废话不多说&#xff0c;咱们马上开启今天的探索之旅吧&#xff01; 背景知识 在开始深入探…

什么是雨量气象站?

过多的强降水会造成重大自然灾害&#xff0c;给我们的生活带来很大影响&#xff0c;实时监测降雨信息&#xff0c;能够及时发布气象预警&#xff0c;防范可能因强降水引起的山洪、泥石流等自然灾害&#xff0c;保护人民群众生命财产安全&#xff0c;提高防灾减灾能力。 雨量气…

【三维重建】【深度学习】NeuS代码Pytorch实现--测试阶段代码解析(下)

【三维重建】【深度学习】NeuS代码Pytorch实现–测试阶段代码解析(下) 论文提出了一种新颖的神经表面重建方法&#xff0c;称为NeuS&#xff0c;用于从2D图像输入以高保真度重建对象和场景。在NeuS中建议将曲面表示为有符号距离函数(SDF)的零级集&#xff0c;并开发一种新的体绘…

springboot+vue实现的智慧学校云平台源码

智慧校园源码 智慧班牌云平台源码 系统架构&#xff1a;Javavue2springbootMySQL elmentuiQuartzjpajwt 智慧校园电子班牌云平台是出于校园考勤管理以及班级校园信息展示为目的的管理系统&#xff0c;电子班牌系统主要用于中小学教育的综合管理平台&#xff0c;融合了多媒体技…

SPSS中级统计--卡方独立性检验之n×c表资料

nc资料表检验 nc资料表分类&#xff1a; ①双向无序的RC表资料 ②单向有序的RC表资料 ③双向有序的RC表资料 1、双向无序RC表资料 多个样本率的比较&#xff08;c2&#xff09; 例1&#xff1a;比较不同污染地区的动物畸形率是否有差异&#xff1f; H0&#xff1a;不同污染…

Android中使用JT808协议进行车载终端通信的实现和优化

JT808是一种在中国广泛应用的车载终端通信协议&#xff0c;用于车辆与监控中心之间的数据通信。下面是关于Android平台上使用JT808协议进行通信的一般步骤和注意事项&#xff1a; 协议了解&#xff1a;首先&#xff0c;您需要详细了解JT808协议的规范和定义。该协议包含了通信消…

iServer通过服务实例动态化管理MongoDB万级瓦片集应用实践

作者&#xff1a;Carlo 文章目录 数据特点项目难点优化方案先了解“服务实例动态化管理”功能特性“服务实例动态化管理”应用场景优化1&#xff1a;开启服务实例动态化管理优化2&#xff1a;同时设置一个特定服务关闭动态管理持续存活优化3&#xff1a;将服务配置信息存储到Po…

React(8)

千锋学习视频https://www.bilibili.com/video/BV1dP4y1c7qd?p72&spm_id_frompageDriver&vd_sourcef07a5c4baae42e64ab4bebdd9f3cd1b3 1.React 路由 1.1 什么是路由&#xff1f; 路由是根据不同的 url 地址展示不同的内容或页面。 一个针对React而设计的路由解决方案…