微信小程序实现圆形菜单弹出选中动画

news2025/1/16 3:41:12

vector-effectSVG中十分冷门的属性,相信大多数小伙伴都没有了解过,说句实话,在这次重学SVG之前,这个属性我连听都没听说过。

不过,冷门不重要,重要的是管用,尤其是以后在面对相应场景下,能够快速的想到还有这么个属性提供了一种解决方案就足矣啦。

OK,老规矩,先来扒一扒这个属性的定义。

vector-effect的定义

MDN

vector-effect: 属性指明绘制对象时要使用的矢量效果。在任何其他合成操作(如滤镜,蒙版和剪辑等)之前,都要应用矢量效果。该属性可以直接在 CSS 样式表中使用。

作为显示性属性,它能被应用到任何元素,但只对以下元素有效果:<circle><ellipse><foreignObject><image><line><path><polygon><polyline><rect><text><textPath><tspan>

总结一下,vector-effect可以指定绘制对象使用的矢量效果,但是只对上述的元素生效,与大多数SVG属性一样,可以在CSS中直接声明。

但是矢量效果又是什么呢?那就要轮到vector-effect的可选值出场了。

vector-effect的可选值

vector-effect可选值有:none(默认) | non-scaling-stroke | non-scaling-size | non-rotation | fixed-position

有点多,不怕,让我们来分而食之。

作为默认值的none

none: 该值指定不应用矢量效果,是默认的渲染行为,即首先用指定的绘画填充几何形状,然后使用指定的绘画来描边轮廓。

作为默认值,none的表现也就是我们没指定vector-effect时的效果,所以也是最常见的,毕竟这么冷门的属性谁会没事去指定一下呢?

.icon {width: 50px; height: 50px;stroke-width: 2px;stroke: #2486ff;fill: none;
}
.scale {width: 100px; height: 100px;
} 
<svg style="display:none;"><symbol id="icon" viewBox="0 0 50 50"><circle cx="25" cy="25" r="20"/><path d="M25 15 L 25 35"/><path d="M15 25 L 35 25"/></symbol></svg>

<div class="wrapper"><p><svg class="icon"><use xlink:href="#icon"></use></svg></p><p><svg class="icon scale"><use xlink:href="#icon"></use></svg></p>
</div> 

可以看到,原本50px * 50px的无填充icon,在vector-effect默认为none时,宽高被放大到100px * 100px后,iconstoke也就是所谓的笔触,也同样被放大了。

其实,仔细想想,这是符合SVG矢量特性的,试想一下,一个stroke-width=1的图形,要是被放大到一个大屏上,那么stroke如果不随着图形的增大而变粗,那么在远处看过去几乎已经无法看清了。

但是,不得不说如此放大之后,在一些小屏幕上看着好突兀,那么有没有什么办法可以在SVG缩放的时候stroke不跟着缩放呢?

当然是有的,下面有请non-scaling-stroke上场。

让stroke跳脱出矢量效果的non-scaling-stroke

non-scaling-stroke: 该值修改了笔触的方式。通常,笔触涉及在当前用户坐标系中计算形状路径的笔触轮廓,并用笔触颜料(颜色或渐变)填充轮廓。该值的最终视觉效果是笔触宽度不依赖于元素的变换(包括非均匀缩放和剪切变换)和缩放级别。

定义是不是依旧看的云里雾里,没关系,一图胜千言:

.icon {width: 50px; height: 50px;stroke-width: 2px;stroke: #2486ff;fill: none;
}
.scale {width: 100px; height: 100px;
}
.plus {vector-effect: non-scaling-stroke;
} 
<svg style="display:none;"><symbol id="icon-plus" viewBox="0 0 50 50"><circle class="plus" cx="25" cy="25" r="20"/><path class="plus" d="M25 15 L 25 35"/><path class="plus" d="M15 25 L 35 25"/></symbol><symbol id="icon" viewBox="0 0 50 50"><circle cx="25" cy="25" r="20"/><path d="M25 15 L 25 35"/><path d="M15 25 L 35 25"/></symbol></svg><p><svg class="icon"><use xlink:href="#icon-plus"></use></svg></p><p><svg class="icon scale"><use xlink:href="#icon-plus"></use></svg></p><p><svg class="icon scale"><use xlink:href="#icon"></use></svg></p> 

结合案例推导的话一下就明朗了,vector-effect: non-scaling-stroke 就是为了解决stroke随着尺寸的增大而变粗的属性,当对icon-plus设置了non-scaling-stroke之后,即使缩放了一倍的宽高,但笔触stroke还是保持着之前的宽度,与没有设置vector-effecticon形成了鲜明的对比。

值得注意的是,无论是<svg>或者<use>元素上设置vector-effect都是无效的,必须直接设置给<circle><path>

那么,到底什么时候会用到non-scaling-stroke的特性呢?

non-scaling-stroke的应用场景

其实,我们在实际的Web开发中用到non-scaling-stroke的机会并不多,因为我们选择使用SVG时,主要就是馋它自身的矢量特性,也就是说尺寸变大时我们就需要它的stroke也相应的变粗。

但是,如果SVG是非等比缩放时,即preserveAspectRatio="none"non-scaling-stroke 就变得相当实用了,例如:

<svg class="icon rect" viewBox="4 4 42 42" preserveAspectRatio="none"><rect x="5" y="5" width="40" height="40"/><path d="M25 15 L 25 35"/><path d="M15 25 L 35 25"/>
</svg> 

对于有审美的前端工程师而言,上图无论如何定义都算的上“丑”了。

可以看到,由于设置为非等比缩放,stroke的宽度受长宽比的影响,使得竖线比横线粗了太多太多,导致严重的比例失调,这时候只需要简简单单的一句vector-effect="non-scaling-stroke" ,比例失调的问题就会被立马解决。

<svg class="icon rect" viewBox="4 4 42 42" preserveAspectRatio="none"><rect x="5" y="5" width="40" height="40"
				vector-effect="non-scaling-stroke"/><path d="M25 15 L 25 35" vector-effect="non-scaling-stroke"/><path d="M15 25 L 35 25" vector-effect="non-scaling-stroke"/>
</svg> 

好了,掌握了nonenon-scaling-stroke,就相当于弄懂了整个vector-effect属性,虽然它还有另外3个看似很厉害的可选值,但那3个值属实是有点“不堪重用”

不堪重用的另外3个可选值

这里的“不堪重用”并不是说他们不好用,而是压根用不了(这里的测试只针对Chrome而言)。

之所以会这样,是因为 Scalable Vector Graphics (SVG) 1.1 (Second Edition)的规范中明确指出这3个属性有可能会从SVG 2的规范中删除,全文如下:

Values of vector-effect other than non-scaling-stroke and none are at risk of being dropped from SVG 2 due to a lack of implementations. Feedback from implementers is requested, regarding the practicality of implementing them as currently specified, during the implementation period.

大概就是说,那哥仨还是有点不靠谱,所以除了nonenon-scaling-stroke 被豁免之外,其他属性都有可能从SVG2的规范中被删除。

所以,Chrome对这种有连坐风险的属性不支持也就变得情有可原了。

虽然,浏览器不支持,规范要删除,但这都不妨碍我们来一窥这哥仨的全貌。

non-scaling-size

non-scaling-size: 该值指定元素及其后代使用的特殊用户坐标系。尽管从宿主坐标空间进行任何转换更改,该用户坐标系的比例也不会更改。但是,它没有指定抑制旋转和偏斜。同样,它也不指定用户坐标系的原点。由于此值抑制了用户坐标系的缩放,因此它还具有non-scaling-stroke的特性。

大概就是说这个属性可以让指定元素不受坐标系缩放效果的影响。

<path id="ve" vector-effect="non-scaling-size" stroke="red" stroke-width="3" fill="none" transform="matrix(1,0,0,1,150,150)" d ="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/> 

从图上可以看出,虽然transform通过矩阵设置了旋转和缩放效果,但是因为设置了non-scaling-size,所以最终渲染只是进行了旋转。

non-scaling-strokenon-scaling-size相比:

non-scaling-stroke:只有stroke描边的宽度不会被缩放,至于fill或图形的宽高依旧会进行缩放。

non-scaling-size: 无论是strokefill宽高都不会进行缩放,也就是说缩放在non-scaling-size面前彻底失效了,换句话说它属于non-scaling-stroke的上位替代。

non-rotation

non-rotation: 该值指定元素及其后代使用的特殊用户坐标系。尽管从宿主坐标空间发生任何变换更改,该用户坐标系的旋转和倾斜仍被抑制。但是,它没有指定抑制缩放。同样,它也没有指定用户坐标系的原点。

有了上面缩放的案例,这里就要好理解多了,顾名思义不旋转

<path id="ve" vector-effect="non-rotation" stroke="red" stroke-width="3" fill="none" transform="matrix(1,0,0,1,150,150)" d=" M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/> 

可以看到,坐标系进行了旋转和放大,但是最终渲染时图形只有放大的效果,旋转效果被non-rotation干掉了。

fixed-position

fixed-position: 该值指定元素及其后代使用的特殊用户坐标系。尽管从宿主坐标空间进行任何转换更改,用户坐标系的位置都是固定的。但是,它没有指定抑制旋转,偏斜和缩放。当同时指定了该矢量效果和 transform 属性, transform 属性将因该矢量效果而被消耗。

看属性名称猜作用,无非就是元素的位置固定,不受transform的效果影响。

可以看到,虽然坐标系被缩放和旋转了,但是箭头图案中的锚点位置是固定的并没有随着坐标系的改变而改变。

vector-effect的属性组合使用

与其他属性不同vector-effect是可以组合使用的,只不过目前只有nonenon-scaling-stroke可用,况且这两货还互相冲突的属性,所以组合的意义不大,但是换成以上那哥仨效果一下就有趣了起来。

试想一下,哥仨同时生效之后,就代表着指定元素不受任何转换旋转缩放位移影响了,简直就是身在三界外,不在五行中,就仿佛vector-effect拥有了自己的领域一般变态。

<path id="ve" vector-effect="non-scaling-size non-rotation fixed-position" stroke="red" stroke-width="3" fill="none" transform="matrix(1,0, 0,1,150,150)" d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/ > 

看看,看看这逆天的效果吧,难怪这厮要被封杀了,这哪是劳什子的矢量效果,这分明是要和无上意志平起平坐啊,这能不灭了你嘛。

结尾

在窥探了vector-effect完全体的能力之后,对这些命运多舛却彪悍如斯的属性,突然多了很多期待,试想一下,若有一天,天下大赦,它们得以含冤昭雪,真到了那时前端世界又会是怎样一番光怪陆离的景象呢?

最后

最近找到一个VUE的文档,它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

RISC-V SIG 推出基于openEuler 的下游发行版 Eulaceura

近日&#xff0c;openEuler RISC-V SIG 推出了一款基于 openEuler 的发行版-Eulaceura。这是首个基于 openEuler 开发的 RISC-V 架构的发行版&#xff0c;给 RISC-V 的开发者开箱即用的 RISC-V 系统环境&#xff0c;方便开发者进行各种创新项目的开发与验证。Eulaceura 目前提供…

【数据结构】队列的实现

目录队列的概念队列的结构声明队列的初始化数据入队判断队列是否为空队列出数据获取队头获取队尾获取队列长度摧毁队列队列的概念 只允许从一端插入数据&#xff0c;另一端出数据。 队头:出数据的一端叫队头。 队尾:入数据的一端叫队尾。 通俗地说&#xff0c;就是把栈的数据结…

用技术记录世界杯2022

用技术记录世界杯【2022】 文章目录用技术记录世界杯【2022】前言1 项目介绍2 实验复现2.1 关于项目2.2 数据准备2.3 特征工程3 我的感受前言 Hi&#xff0c;我是Ding Jiaxiong&#xff0c;好久不见(bushi&#xff0c;早上才更新了博客)&#xff0c; 今天是2022 年12月 8日 2…

未部署ssl证书,您的账号、密码或被窃取!

浏览网页查找信息时&#xff0c;您有没有注意到有些网站的网址是以https&#xff1a;//开头的&#xff0c;有些网址是http&#xff1a;//开头&#xff1f;有时还会显示一个突出的警告页面&#xff0c;表明网站是“不安全的”可能会窃取您的账号、密码&#xff0c;骗取财产等。 …

Mybatis-Plus的@Version注解:使用updateBatchById方法引发的问题

正常情况下&#xff0c;我们想要的是&#xff0c;当乐观锁不对的时候要一个反馈&#xff0c;例如&#xff1a;版本号不一致&#xff0c;请刷新页面重新获取数据。 在没有Version注解的时候&#xff0c;一般我们会进行显示校验。例如下图&#xff1a; updateById方法使用演示 …

数商云SRM供应商系统售后模块解析 | 助力汽修企业打造高效SRM服务管理体系

随着我国汽车保有量的持续增长&#xff0c;汽车维修行业不断地向社会化方向发展&#xff0c;汽修行业从产品型的行业转变为服务型行业&#xff0c;成为一个社会化的、人才专业型、技术密集型的和相对独立的行业&#xff0c;发展势头迅猛&#xff0c;据统计&#xff0c;我国的汽…

跨主机访问——docker

当你有若干个容器之后,你可能就希望实现容器的跨机部署访问了,比如aspnetcore在一台host上,mysql在另外一个host上,如果要实现这样的功能,需要你 借助docker自带的overlay网络模型了。 一: overlay网络模型 要想快速的搭建overlay网络,你可以通过docker默认的swarm集群…

代码随想录Day45|70.爬楼梯(进阶)、322.零钱兑换、279.完全平方数

文章目录70.爬楼梯&#xff08;进阶&#xff09;322.零钱兑换279.完全平方数70.爬楼梯&#xff08;进阶&#xff09; 文章讲解&#xff1a;代码随想录 (programmercarl.com) 题目链接&#xff1a;programmercarl 题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼…

【C#基础学习】第十六章、枚举

目录 枚举 1.枚举的补充 1.1底层类型 1.2 设置显式值 1.3 枚举成员赋值顺序 2.位标志 2.1 Flags特性 枚举 枚举的定义&#xff1a; 枚举是由程序员自定义的值类型。它只有一种类型成员&#xff1a;命名的整数值常量。枚举成员都有一个底层类型的常量值。第一个枚举成员的…

【场景削减】拉丁超立方抽样方法场景削减(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Linux搭建RabbitMQ集群环境

文章目录环境说明Erlang安装下载安装包安装验证RabbitMQ安装下载安装包安装启动RabbitMQ设置开机自动启动安装管理界面创建用户登录管理界面集群配置前提条件构建erlang集群高可用镜像集群配置环境说明 操作系统&#xff1a;CentOS7Erlang版本&#xff1a;21.3RabbitMQ版本&am…

信而泰耦合测试-网络测试仪实操

一、耦合测试原理 1.产生背景​ 常用测试无线设备过程中&#xff0c;将无线设备置于屏蔽箱中&#xff0c;通过无线网卡连接并运行iperf等类似软件的方式检测所述无线设备的吞吐量。 相关技术中将所述无线设备置于所述屏蔽箱中的检测方法&#xff0c;由于所述屏蔽箱存在信号反…

【C语言】字符串函数(二)

目录 一、strncpy函数(字符串拷贝) 1、strncpy函数的用途 2、strncpy函数的使用 二、strncat函数(字符串追加) 1、strncat函数的用途 2、strncat函数的使用 三、strncmp函数(两个字符串比较) 1、strncmp函数的用途 2、strncmp函数的使用 四、strstr函数(查找字符串) 1、strstr函…

2022年底总结(被阿里捞的第1、2、3...次)

前言 自从去年因为个人原因没有去阿里淘系&#xff0c;后面有几次阿里同学问我有没有意向去阿里上班。其实我内心是很激动的&#xff0c;在人才库能被捞也是别人的认可&#xff0c;这个是值得骄傲的&#xff0c;然后需要继续保持自己专研技术的精神以及不断进步的意识。 当然博…

ChatGPT 大智近妖,从宇宙人生到手搓光刻机,从哄女友到写年终总结我们聊得非常开心,反而让人越来越忧心

文章目录宇宙人生问&#xff1a;你觉得人生的意义是什么&#xff1f;问&#xff1a;你觉得思维意识到底是什么问&#xff1a;我之前的两个问题大概有多少人问过你&#xff1f;问&#xff1a;宇宙的边界在哪里&#xff1f;手搓狠活怎么实现量子计算怎么制造一个光刻机怎么制作核…

多谐振荡器

三个非门首尾相接形成环&#xff0c;在理想情况下&#xff0c;无法形成振荡 门一定是存在传输延迟时间的&#xff0c;所以当高电平变成低电平的时候&#xff0c;必然会经过传输延迟时间 所以当反过来发生翻转的时候&#xff0c;经过了三倍的状态延迟时间 震荡的周期是六个传输…

基于SARIMA、XGBoost和CNN-LSTM的时间序列预测对比

利用统计测试和机器学习分析和预测太阳能发电的性能测试和对比 本文将讨论通过使用假设测试、特征工程、时间序列建模方法等从数据集中获得有形价值的技术。我还将解决不同时间序列模型的数据泄漏和数据准备等问题&#xff0c;并且对常见的三种时间序列预测进行对比测试。 介…

RNSScreenStackHeaderConfig“ was not found in the UIManager.解决办法!!亲测有效

Invariant Violation: requireNativeComponent: "RNSScreenStackHeaderConfig" was not found in the UIManager. 原因&#xff1a;RN项目中&#xff0c;开发服务器端已经使用npm i下载了某个模块&#xff0c;但是只有服务器端有&#xff0c;该模块并没有打包安装到手…

Cache与MMU的爱恨纠缠

首先声明本文不准备详细地介绍Cache和MMU的概念和用法&#xff0c;主要是为了厘清两者之间的相互关系和依赖。 1. MMU管理cache访问属性 在没有MMU的时候&#xff0c;cache本身的模型比较简单&#xff0c;如下所示&#xff0c;在使用的时候重点关注Cache数据的一致性问题。 …

linux高可用小知识点汇总-行云管家

不少运维小伙伴对于linux高可用相关知识不是很了解&#xff0c;今天我们小编就给大家汇总了一些&#xff0c;希望可以加深大家的了解。仅供参考哦&#xff01; linux高可用小知识点汇总-行云管家 一、Linux是什么系统&#xff1f; 【回答】&#xff1a;Linux全称GNU/Linux&am…