Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >带你轻松打开svg滤镜的大门

带你轻松打开svg滤镜的大门

原创
作者头像
练小习
发布于 2017-11-30 11:47:22
发布于 2017-11-30 11:47:22
1.4K0
举报
文章被收录于专栏:ThinksThinks

上次和大家一起,用最简单直白,轻松粗暴的方式学习了一遍SVG动画,这次我们再一起来搞点不一样的东西,SVG滤镜的实现。

SVG滤镜绝对称得上是他最强大的功能之一,在不影响任何文档结构的前提下,允许你给你的矢量图形添加各种专业视觉效果,我个人给他的定义就是,把PS装到了网页上。

一 SVG滤镜的原理

基本原理描述太多明显有违我们 “轻松打开” 的目的,这里简单的描述一下,SVG在使用了滤镜的元素里,不会将原始图形直接渲染出来,而是会将原始图形的像素信息渲染到临时位图中,然后由 filter元素指定的操作会被应用到这个临时位图,最终把计算结果渲染为最终图形输出。

举个例子,我们用腾讯云的CVM图标来做一个最简单,最常见的滤镜效果——投影。

首先我把图标画出来,

demo1

然后放到一个defs里,没有被引用之前你肯定是什么都看不到的。

接着写filter,尝试使用feGaussianBlur给logo生成阴影效果

<filter id="shadow"> <feGaussianBlur in="SourceAlpha" stdDeviation="5"></feGaussianBlur> </filter>

用stdDeviation 来指定模糊程度,值越大,模糊效果越强,并且可以接受两个数字,分别为X Y方向的模糊度。 然后指定SourceAlpha为他的输入源,如果不指定将在原色值上做模糊。

现在我们看一下效果截图,好像有哪里不对劲?

demo2

这是什么黑乎乎的一坨?原因是滤镜返回的是一个模糊过的阿尔法通道,并不是原始图形。

那么现在我们改进一下写法

<filter id="shadow"> <feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"></feGaussianBlur> <feOffset in="blur" dx="4" dy="4" result="offset"></feOffset> <feMerge> <feMergeNode in="offset"></feMergeNode> <feMergeNode in="SourceGraphic"></feMergeNode> </feMerge> </filter>

result属性指定当前的输出结果,你可以在当前的filter里边通过in调用,而且只能在当前的filter里调用,相当于输出一个局部变量。

改进后的代码,就是通过feMerge把输出的阿尔法通道和原始图形堆叠,来产生投影效果。具体的模糊度可以在stdDeviation里设置,具体的投影位置可以通过offset调整。

现在我们看一下最终的投影效果

demo3

这个实现思路是不是很眼熟?不负责任的说,CSS3的box-shadow,虽然实现有区别,但是原理和这里是一模一样的。

现在,你就可以在任何图形上调用这个投影的滤镜了.

二 创建另一个滤镜

上面我通过一个黑色投影的例子简单的说了一下SVG滤镜的原理,但是那个黑色的投影实在太单调了啊。能不能再给投影来点颜色?

这时候另一个强大的元素 feColorMatrix 就可以出场了。

我们把上边的投影稍微修改一下

<filter id="shadow"> <feColorMatrix type="matrix" result="color" values="            0 0 0 0   0            0 0 0 0.9 0            0 0 0 0.9 0            0 0 0 1   0            " ></feColorMatrix> <feGaussianBlur in="color" stdDeviation="4" result="blur"></feGaussianBlur> <feOffset in="blur" dx="0" dy="0" result="offset"></feOffset> <feMerge> <feMergeNode in="offset"></feMergeNode> <feMergeNode in="SourceGraphic"></feMergeNode> </feMerge> </filter>

feColorMatrix 允许我们修改任意像素点的颜色或阿尔法值,当type= matrix的时候,value 为20个数字信息,把这些数字信息按照4行5列来组合,从上到下每一行代表一个方程式,数字分别乘以RGBA和常量1,代表如何计算 R G B A,如图

我们这里简化一下,将所有不透明区域设置为相同,可以忽略输入颜色和常量,只设置透明度的值

这个矩阵模型最终计算结果是 red(R)0,green(G)0.9,blue(B)0.9,alpha(A)1,生成一个明亮的青色。

然后我们调整了dx和dy,让他从投影变成了发光。

demo4

如果要不同颜色,我们只需要调整这里的RGBA值。

feColorMatrix 的type值还有hueRotate(色相旋转),saturate(饱和度)等,在此不一一列举,详细的用法下一次单独讲一下。

三 来张位图试试?

到目前为止我们只是把一个路径作为滤镜的输入源,SVG的 feImage 元素允许我们使用JPG PNG以及其他SVG文件,现在我们给logo加个背景

<filter id="shadow"> <feImage xlink:href="img/bg.png" result="bg"></feImage> <feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"></feGaussianBlur> <feOffset in="blur" dx="4" dy="4" result="offset"></feOffset> <feMerge> <feMergeNode in="bg"></feMergeNode> <feMergeNode in="offset"></feMergeNode> <feMergeNode in="SourceGraphic"></feMergeNode> </feMerge> </filter>

demo5

背景加进来之后,先把图标拿掉,我们用一个新的元素来处理一下——feComponentTransfer

<feComponentTransfer in="bg" result="bg"> <feFuncR type="linear" slope="1.5" intercept="0.8"></feFuncR> <feFuncG type="linear" slope="1.5" intercept="0.2"></feFuncG> <feFuncB type="linear" slope="3" intercept="0"></feFuncB> </feComponentTransfer>

可以在feComponentTransfer 里调整 feFuncR feFuncG feFuncB feFuncA,每个子元素都可以单独指定一个type属性,slope是个比例因子,intercept是基准值,具体的计算方式这里不详细讲解,毕竟是轻松打开系列,后面单独谈那些内容吧。

然后我们改变三个通道的值来看看效果

demo6

feFunc的type属性还有另外的几个值,gamma,table等等,用法上大同小异,不同的是参数和算法,这里就不一一列举。

然后我们回到上面的logo,现在都是针对一个输入源在操作,下面我们同时操作两个源。

feComposite元素接受两个源,分别指定在in和in2属性中,他的operator属性的值来决定如何合并两个源。

常用的值有

over 生成的结果就是a层叠在b上面,和我们上面用的mergenode效果是一样的

in 典型的蒙版效果

out 反转蒙版的效果

atop a的一部分在b里面,b的一部分在a外面

xor 包含b的外面的a的部分和a的外面的b的部分

arithmetic 最灵活的一个值,可以提供4个参数,k1 k2 k3 k4,每个像素的每个通道结果按照这个方式计算: k1*a*b + k2*a +k3*b +k4

现在我们拿最常用的蒙版效果来举例用法:

<filter id="in"> <feImage xlink:href="img/bg2.jpg" result="bg"></feImage> <feComposite in="bg" in2="SourceGraphic" operator="in"></feComposite> </filter> <filter id="out"> <feImage xlink:href="img/bg2.jpg" result="bg"></feImage> <feComposite in="bg" in2="SourceGraphic" operator="out"></feComposite> </filter>

效果如下图,其他的值推荐大家自己去尝试一下

demo7

四 其他一些效果

svg瘦身效果

<filter id="erode"> <feMorphology operator="erode" radius="1"></feMorphology> </filter> <filter id="dilate"> <feMorphology operator="dilate" radius="1"></feMorphology> </filter>

feMorphology可以通过erode与dilate的值来对我们的SVG图像进行瘦身和加厚,效果如下

demo8

不过效果里可以清晰的看出,对线条进行瘦身效果会造成严重破坏。

浮雕效果

feConvolveMatrix元素允许我们按照他临近的像素计算像素新值,于是这个滤镜就可以生成 模糊,锐化,浮雕这些效果。他的原理就是合并像素和他临近的像素,生成结果像素。

demo9

小结

filter元素包含一系列滤镜基元,每个都接受一个或者多个输入,同时提供唯一的结果供其他基元使用,这就是SVG滤镜工作的方式。篇幅有限,并没有把SVG滤镜的知识全部详细的介绍,后面会另外单独介绍一些知识点。

附 几种SVG图像的fallbacks

使用svg必然要因为兼容性等因素考虑好fallbacks,常用的有几种方式:

1.通过alt或者文本标签的方式做提示 2.通过判断或者查询显示一张图片

通常都不会选择第一种。

第二种,也有多种方案,下面我们列举几个:

1.html的source标签属性 type=”image/svg+xml” 方式,在支持的浏览器里使用SVG,在不支持的浏览器里显示PNG,优点是type灵活,可用于SVG,WEBP等,而且保持了img标签的特性,方便做布局操作。缺点兼容性要求高,ios9+,安卓5+,微软Edge+

<picture> <source type="image/svg+xml" srcset="svg.svg"> <img src="svg.png" alt=""> </picture>

2.srcset=”svg.svg 2X” 方式,在2倍屏显示SVG,在其他显示PNG,缺点同上

<picture> <source srcset="svg.svg 2X"> <img src="svg.png" alt=""> </picture>

3.svg标签方式,缺点必须指定宽高,没有图片的保持款高比例特性,优点兼容性好,兼容所有主流浏览器

<svg width="200" height="200"> <image xlink:href="svg.svg" src="svg.png" width="200" height="200" /> </svg>

点击查看DOME集合

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
有意思!强大的 SVG 滤镜
想写一篇关于 SVG 滤镜的文章已久,SVG 滤镜的存在,让本来就非常强大的 CSS 如虎添翼。让仅仅使用 CSS/HTML/SVG 创作的效果更上一层楼。题图为袁川老师使用 SVG 滤镜实现的云彩效果 -- CodePen Demo -- Cloud (SVG filter + CSS)。
Sb_Coco
2021/03/30
1.9K0
有意思!强大的 SVG 滤镜
带你轻松打开svg滤镜的大门
SVG滤镜绝对称得上是他最强大的功能之一,在不影响任何文档结构的前提下,允许你给你的矢量图形添加各种专业视觉效果,我个人给他的定义就是,把PS装到了网页上。 一、 SVG滤镜的原理 基本原理描述太多明显有违我们 “轻松打开” 的目的,这里简单的描述一下,SVG在使用了滤镜的元素里,不会将原始图形直接渲染出来,而是会将原始图形的像素信息渲染到临时位图中,然后由 filter元素指定的操作会被应用到这个临时位图,最终把计算结果渲染为最终图形输出。 举个例子,我们用腾讯云的CVM图标来做一个最简单,最常见的滤镜效
腾讯ISUX
2018/06/29
7430
一篇文章带你了解SVG 阴影
所有互联网的SVG滤镜定义在<defs>元素中。<defs>元素定义短并含有特殊元素(如滤镜)定义<filter>标签用来定义SVG滤镜。
前端进阶者
2021/03/03
9770
一篇文章带你了解SVG 阴影
前端-SVG 实现动态模糊动画效果
今天我们将向大家展示如何制作SVG动态模糊效果,并将其应用于HTML元素的常规JS或CSS动画。
grain先森
2019/03/29
2.7K0
前端-SVG 实现动态模糊动画效果
Power BI 图表立体阴影效果
Power BI 内置了阴影效果,使得视觉对象看上去立体,但是目前没有视觉对象上的内容立体功能(截止本文发稿日)。
wujunmin
2024/02/28
2910
Power BI 图表立体阴影效果
不借助 Javascript,利用 SVG 快速构建马赛克效果
之前在公众号转发了好友 Vajoy 的一篇文章 -- 巧用 CSS 把图片马赛克风格化。
Sb_Coco
2022/04/28
8280
不借助 Javascript,利用 SVG 快速构建马赛克效果
有意思!不规则边框的生成方案
本文完整的 DEMO,你可以戳这里:transparent 配合 SVG feMorphology 滤镜生成不规则边框
Sb_Coco
2021/04/01
1.1K0
有意思!不规则边框的生成方案
CSS 奇技淫巧 | 巧妙实现文字二次加粗再加边框
emm,不考虑兼容性的话,答案是可以利用文字的 -webkit-text-stroke 属性,给文字二次加粗。
Sb_Coco
2021/10/29
1.5K0
CSS 奇技淫巧 | 巧妙实现文字二次加粗再加边框
CSS3魔法堂:CSS3滤镜及Canvas、SVG和IE滤镜替代方案详解
一、前言                                  IE特有的滤镜常常作为CSS3各种新特性的降级处理补充,而Adobe转向HTML5后与Chrome合作推出CSS3的Filter特性,因此当前仅Webkit内核的浏览器支持CSS3 Filter,而FF和IE10+则需要使用SVG滤镜(svg effects for html)或Canvas作为替代方案处理了,而IE5.5~9则使用IE滤镜、JS+DIV或VML处理!本篇为先占个坑,以后慢慢填^_^!!!   CSS3 Filter
^_^肥仔John
2018/01/18
2K0
CSS3魔法堂:CSS3滤镜及Canvas、SVG和IE滤镜替代方案详解
巧用 SVG 滤镜还能制作表情包?
本文将介绍一些使用 SVG feTurbulence 滤镜实现的一些有趣、大胆的的动效。
Sb_Coco
2021/04/02
1.2K0
filter: contrast() 配合 filter: blur() 的奇妙化学作用
好,那如果,不再是直线,而是一条曲线,希望曲线两端,带有圆角,像是这样,又该怎么办呢:
Sb_Coco
2022/09/16
1.5K0
filter: contrast() 配合 filter: blur() 的奇妙化学作用
CSS + HTML <水滴按钮效果>
Tweenlite,是 webgame 开发人员比较常用的一个缓动库。 官方网站:http://www.greensock.com/tweenlite/ 可以去 https://www.tweenmax.com.cn/start/ 下载 TweenMax.min.js 并引入
网罗开发
2021/04/26
2K0
CSS + HTML <水滴按钮效果>
CSS 3.0结合SVG实现水滴穿透加载动画
给大家分享一个用CSS 3.0结合SVG实现一个水滴穿透加载动画,效果如下:  以下是代码实现,欢迎大家复制、粘贴和收藏。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>CSS 3.0结合SVG实现水滴穿透加载动画</title> <style> :root { --blue: #0a2bc5;
越陌度阡
2022/05/10
8990
CSS 3.0结合SVG实现水滴穿透加载动画
有趣的倒计时(可复制源代码)
半夜喝可乐
2024/10/21
1340
有趣的倒计时(可复制源代码)
如何使用ChatGPT和Claude创建软件图表
在我之前的文章中,关于ChatGPT 和 Claude 可以看到你屏幕上的什么内容以及开发者如何利用它,我提到过一个浏览器扩展,它使用从完整 CNN 网站获取的图像来增强纯文本的lite.cnn.com。它运行良好,但是使用了已弃用的Manifest V2。当我让 Claude 将其更新到 V3 时,我想要绘制一些架构更改图。因此,在这篇文章中,我将回顾一下这个绘图过程。
云云众生s
2024/12/24
2980
如何使用ChatGPT和Claude创建软件图表
你所不知道的 CSS 滤镜技巧与细节
承接上一篇你所不知道的 CSS 动画技巧与细节,本文主要介绍 CSS 滤镜的不常用用法,希望能给读者带来一些干货! 系列 CSS 文章汇总在我的 Github ,持续更新,欢迎点个 star 订阅收藏。 OK,下面直接进入正文。本文所描述的滤镜,指的是 CSS3 出来后的滤镜,不是 IE 系列时代的滤镜,语法如下,还未接触过这个属性的可以先简单到 MDN -- filter 了解下: { filter: blur(5px); filter: brightness(0.4); filt
Sb_Coco
2018/06/21
1.6K0
通过 SVG 使用 AI 生成理想图片:技术实现与实践指南
在现代开发中,SVG(可缩放矢量图形)因其矢量特性、可编程性和跨平台兼容性,成为生成动态图形的优选工具。结合人工智能(AI)的代码生成能力,我们可以通过简单描述快速创建符合需求的理想图片。本文将深入探讨 SVG 与 AI 的结合原理,提供实现步骤,并以一个完整的“科技感封面图”为例,展示如何生成可用且美观的 SVG 图形,助力开发者掌握这一技术。
码事漫谈
2025/03/17
5750
通过 SVG 使用 AI 生成理想图片:技术实现与实践指南
带你了解SVG标签
✍️ 作者简介: 前端新手学习中。 💂 作者主页: 在主页中查看更多前端教学,可接大学生前端作业单。 🎓 专栏分享:css重难点教学 Node.js教学 从头开始学习 ajax学习 js学习 目录 初始SVG 矩形,圆形和椭圆型  矩形  圆形  椭圆形 绘制线条 多边形 连续线条  线条  多边形  连续线条 绘制文本 绘制路径 阴影和模糊 初始SVG SVG是一种图形文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基于XML(Ext
坚毅的小解同志的前端社区
2023/01/13
2.2K0
带你了解SVG标签
SVG基础知识
之前有提到过SVG描边动画,可以实现很神奇的手写签名动画效果,当然,理论上可以用来实现任意不规则路径填充动画
ayqy贾杰
2019/06/12
2.3K0
Vue3.x+ElementPlus桌面版聊天实例
2021让vue3生态越来越好,让更多的开发者参与进来。继上次分享了一个vue3移动端聊天实例,这次再给大家分享一个最新开发的vue3.0+饿了么vue3组件库开发的桌面端实例项目。
andy2018
2021/01/25
5.2K0
Vue3.x+ElementPlus桌面版聊天实例
相关推荐
有意思!强大的 SVG 滤镜
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档