SVG蒙版(mask)的基础使用教程

位流星轨
• 阅读 8435

蒙版工作原理

设计师或者会用Sketch、Photoshop一类设计工具的朋友应该都了解蒙版(mask)这个东西。接下来我先以Photoshop为例,简单解释蒙版的工作原理。
SVG蒙版(mask)的基础使用教程
上图中我创建了两个图层——蓝色的背景和红色的前景,并且在红色前景上应用了一个蒙版(右边红圈)。正常情况下红色前景应该完全遮盖住蓝色背景,但是请注意红圈中的蒙版,我在这个蒙版上画了一个黑色的矩形。

蒙版中黑色代表不可见(opacity: 0),白色代表可见(opacity: 100%),将蒙版对应到红色图层后就很容易理解:黑色矩形在红色图层上对应的区域变成了不可见,所以下层的蓝色会显示出来。

基本用法:显示与隐藏

还是以上面Photoshop中的图为例子,我们用SVG来一步一步地创建一个这样的图形。

  1. 先创建红色前景和蓝色背景

    <svg width="400" height="300">
      <rect id="back" x="0" y="0" width="400" height="300" fill="#d4fcff"></rect>
      <rect id="front" x="0" y="0" width="400" height="300" fill="#fcd3db"></rect> 
    </svg> 
  2. 在SVG中使用蒙版需要在使用前在<defs>中定义<mask>并为其设置一个唯一id,然后在需要应用蒙版的元素上添加一条属性mask="url(#id)"

    <svg width="400" height="300">
      <defs>
         <mask id="opacity"></mask> 
      </defs>
      <rect id="back" x="0" y="0" width="400" height="300" fill="#d4fcff"></rect> 
      <rect id="front" x="0" y="0" width="400" height="300" fill="#fcd3db"
      mask="url(#opacity)"></rect> 
    </svg>
  3. 光有了蒙版没有用,我们还需要在蒙版中添加图形元素并指定黑白颜色。

    <svg width="400" height="300">
      <defs>
          <mask id="small-rect">
              <rect x="0" y="0" width="400" height="300" fill="white"></rect>
              <rect width="100" height="100" fill="black" x="200" y="100"></rect>
          </mask>
      </defs>
      <rect id="back" x="0" y="0" width="400" height="300" fill="#d4fcff"></rect>
      <rect id="front" x="0" y="0" width="400" height="300" fill="#fcd3db" mask="url(#small-rect)"></rect>
    </svg>

    至此一个基本的蒙版就完成了,https://codepen.io/LuXuanqing...

进阶用法:透明度渐变

之前在讲蒙版原理的时候说到:

黑色代表不可见(opacity: 0),白色代表可见(opacity: 100%)。

那么黑白之间的灰色代表什么呢? 聪明的同学已经想到了,从0%到100%是一个线性的变化,所以黑白中间的灰色会是半透明,而且不同灰度代表不同程度的半透明,越趋近白色可见度越高。在蒙版中的黑白渐变,应用到彩色图层上就会产生透明度的渐变。
SVG蒙版(mask)的基础使用教程

<svg width="400" height="300">
    <defs>
        <linearGradient id='white2black'>
            <stop offset="0" stop-color="white"></stop>
            <stop offset="100%" stop-color="black"></stop>
        </linearGradient>
        <mask id="small-rect">
            <rect x="0" y="0" width="400" height="300" fill="url(#white2black)"></rect>
        </mask>
    </defs>
    <rect id="back" x="0" y="0" width="400" height="300" fill="#d4fcff"></rect>
    <rect id="front" x="0" y="0" width="400" height="300" fill="#fcd3db" mask="url(#small-rect)"></rect>
</svg>

https://codepen.io/LuXuanqing...

总结与讨论

掌握上述两种用法基本上就足够应对日常需求了,但是<mask>还有另外几个专有属性maskUnits, maskContentUnits, x, y, width, height我现在完全搞不懂该怎么用,希望有所了解的朋友不吝指教。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
4年前
AndroidStudio封装SDK的那些事
<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael
Wesley13 Wesley13
4年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Stella981 Stella981
4年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
流浪剑客 流浪剑客
2年前
Lumenzia for mac(ps亮度蒙版插件)仅支持ps2023以上
Lumenziaformac是一款功能强大非常好用的ps亮度蒙版辅助工具。lumenzia亮度蒙版工具在Photoshop中最有力的方法是创建一个专业的效果。同时提供了新的工具和完整的灵活性,拥有先进的JavaScript引擎,使光度掩蔽比以往更容易和更强
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这