svg mask和stroke冲突问题

目录

  • 先说结论
  • 各种样例
    • 首先是水平、垂直的线
    • 然后是斜线
    • 如果是图形加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.rhkb.cn/news/101490.html

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

相关文章

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知)

STM32 CubeMX STM32 CubeMX ____Freertos任务通信&#xff1a;队列、信号量、互斥量&#xff0c;事件组&#xff0c;任务通知 STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1&#xff08;不要选择滴答定时器&#xff1b;滴答定时器留给OS系统做时基&#xff09;使用…

苍穹外卖 day3 实现登录过程中MD5加密

一 原来是明文存的 密码可见度太高&#xff0c;MD5加密为密文图像 效果 二 密文实现步骤 修改明文密码&#xff0c;改成密文 123456 密文值&#xff1a;e10adc3949ba59abbe56e057f20f883e代码如下所示 在这里插入代码片 package com.sky.service.impl;import com.sky.con…

Vue使用Animate.css

说一下Animate.css这个动画库&#xff0c;很多的动画在这个库里面都定义好了&#xff0c;我们用的时候可以直接使用里面的类名就可以了&#xff0c;就是直接目标元素绑定对应的类名就可以实现动画效果&#xff0c;非常方便&#xff0c;库其实也相对简单&#xff0c;使用起来也简…

数据结构(3)

线性表是多个具有相同特征的数据的有限序列。 前驱元素&#xff1a;A在B前面&#xff0c;称A为B的前驱元素。 后继元素&#xff1a;B在A后面&#xff0c;称B为A的后继元素。 线性表特征&#xff1a; 1.一个元素没有前驱元素&#xff0c;就是头结点&#xff1b; 2.最后一个…

法线矩阵推导

法线矩阵推导 https://zhuanlan.zhihu.com/p/72734738 https://juejin.cn/post/7113952418613690382 https://blog.csdn.net/wangjianxin97?typeblog 1、为什么需要法线矩阵 vec3 normalEyeSpace modelViewMatrix * normal;如果模型矩阵执行了非等比缩放, 顶点的改变会导致法…

PSP - 蛋白质结构预测 AlphaFold2 的结构模版 (Template) 搜索与特征逻辑

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132427617 结构模版 (Template) 是一种已知的蛋白质结构&#xff0c;可以作为 AlphaFold2 蛋白质结构预测的参考&#xff0c;AlphaFold2 可以从多…

springMVC 已解密的登录请求

问题描述&#xff1a; 解决方案&#xff1a; 1.对用户所输入的密码在页面进行MD5加密并反馈至密码输入框。 2. 手动生成SSL安全访问证书&#xff1b;在此不做介绍&#xff0c;相关方法可通过网上查找&#xff1b; 3. 将产品HTTP访问方式改为SSL安全访问方式&#xff1b;在Ap…

【C++】STL——map的介绍和使用、map的构造函数、map的迭代器、map的容量和访问函数、map的增删查改函数

文章目录 1.map的介绍2.map的使用2.1map的构造函数2.2map的迭代器2.3map的容量和访问函数2.4map的增删查改函数 1.map的介绍 map的介绍 &#xff08;1&#xff09;map是关联容器&#xff0c;它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。 &#xff…

【React学习】React组件生命周期

1. 介绍 在 React 中&#xff0c;组件的生命周期是指组件从被创建到被销毁的整个过程。React框架提供了一系列生命周期方法&#xff0c;在不同的生命周期方法中&#xff0c;开发人员可以执行不同的操作&#xff0c;例如初始化状态、数据加载、渲染、更新等。一个组件的生命周期…

C# 使用递归方法实现汉诺塔步数计算

C# 使用递归方法实现汉诺塔步数计算 Part 1 什么是递归Part 2 汉诺塔Part 3 程序 Part 1 什么是递归 举一个例子&#xff1a;计算从 1 到 x 的总和 public int SumFrom1ToX(int x) {if(x 1){return 1;}else{int result x SumFrom1ToX_2(x - 1); // 调用自己return result…

Vim学习(四)——命令使用技巧

命令模式 打开文本默认模式&#xff0c;按**【ESC】**重新进入 【/关键字】&#xff1a;搜索匹配关键字 G&#xff1a;最后一行 gg&#xff1a;第一行 hjkl:左下右上 yy: 复制一行 dd&#xff1a;删除一行 p:粘贴 u: 撤销插入模式 按**【i / a / o】**键均可进入文本编辑模式…

2023年国赛 高教社杯数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…

uniapp 回退到指定页面 保存页面状态

uniapp 历史页面回退到指定页面。 getCurrentPages() 内容如下 let delta getCurrentPages().reverse().findIndex(item > item.route "pages/popularScience/daodi") if(delta-1){uni.navigateTo({url: /pages/popularScience/daodi,success: res > {},fa…

Python编程基础-文件的打开和读取

文件的访问 使用 open() 函数 打开文件 &#xff0c;返回一个 file 对象 使用 file 对象的读 / 写方法对文件进行读 / 写的 操作 使用 file 对象的 close() 方法关闭文件 打开文件 open()方法&#xff0c;需要一个字符串路径&#xff0c;并返回一个文件对象&#xff0c;默认是”…

2023年国赛数学建模思路 - 案例:退火算法

文章目录 1 退火算法原理1.1 物理背景1.2 背后的数学模型 2 退火算法实现2.1 算法流程2.2算法实现 建模资料 ## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&a…

【分享】华为设备登录安全配置案例

微思网络www.xmws.cn&#xff0c;2002年成立&#xff0c;专业IT认证培训21年&#xff0c;面向全国招生&#xff01; 微 信 号 咨 询&#xff1a; xmws-IT 华为HCIA试听课程&#xff1a;超级实用&#xff0c;华为VRP系统文件详解【视频教学】华为VRP系统文件详解 华为HCIA试听课…

原生轮播图的实现

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>轮播图</title><style>* {margin: 0;pad…

WGS84地球坐标系,GCJ02火星坐标系,BD09百度坐标系简介与转换 资料收集

野火 ATGM332D简介 高性能、低功耗 GPS、北斗双模定位模块 STM32 GPS定位_为了维护世界和平_的博客-CSDN博客 秉火多功能调试助手上位机开源&#xff01;共六款软件&#xff0c;学到你吐... , - 电脑上位机 - 野火电子论坛 - Powered by Discuz! https://www.firebbs.cn/for…

jenkins 是什么?

一、jenkins 是什么&#xff1f; Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;起源于Hudson&#xff0c;主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。Jenkins用Java语言编写&#xff0c;可在Tomcat等流行的servlet容器中运行&#…

Tomcat线程池梳理

Tomcat梳理 文章目录 Tomcat梳理1.问题2.监控tomcat线程池springboot1.xspringboot2.x转为json格式打印输出 3.SpringBoot内置线程解析测试controlleryaml配置可知ThreadPoolExecutor有如下五种线程池状态。线程池监控指标并发测试并发请求数 < Tomcat最大线程数20并发请求数…