巧用mask属性创建一个纯CSS图标库
说明
mask是CSS中的一个属性,它允许开发者在元素上设置图像作为遮罩层。这个属性的强大之处,在于它可以接受多种类型的值,包括关键字值、图像值、渐变色,甚至可以设置多个属性值。
SVG(Scalable Vector Graphics,可缩放矢量图形)是一种基于 XML 的图像格式,用于定义二维图形。与传统的位图图像(如 PNG 和 JPG)不同,SVG 图像是矢量图形,可以在任何尺寸下保持清晰度,不会失真。
我们将 SVG 代码转换为 data URI,然后在 CSS 中使用,这样我们可以避免多个 HTTP 请求;另一方面,我们使用 mask 来设置 SVG 来作为元素蒙版的图像,然后通过设置元素的 background-color 就可以控制 SVG 显示的颜色。
通过以上两个要素结合,我们就可以创建一个纯CSS图标库:它能通过只设置 class name,就让元素显示出相对应的图标和颜色。
创建图标库
1. 将svg图标对应到class
这里需要注意的是:
- 要确保我们的 SVG 图标是单色的
- 使用 CSS 变量存储 SVG,有便于减少我们的代码,毕竟
mask是一个现代浏览器才支持的属性,需要我们设置不同浏览器前缀
.weiz-icon-web {
--url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Cg fill='none'%3E%3Crect width='40' height='32' x='4' y='8' stroke='%23000' stroke-linejoin='round' stroke-width='4' rx='3'/%3E%3Cpath stroke='%23000' stroke-width='4' d='M4 11a3 3 0 0 1 3-3h34a3 3 0 0 1 3 3v9H4z'/%3E%3Ccircle r='2' fill='%23000' transform='matrix(0 -1 -1 0 10 14)'/%3E%3Ccircle r='2' fill='%23000' transform='matrix(0 -1 -1 0 16 14)'/%3E%3C/g%3E%3C/svg%3E");
}
.weiz-icon-code {
--url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='m16 2l5 5v14.008a.993.993 0 0 1-.993.992H3.993A1 1 0 0 1 3 21.008V2.992C3 2.444 3.445 2 3.993 2zm1.657 10L14.12 8.464L12.707 9.88L14.828 12l-2.12 2.121l1.413 1.415zM6.343 12l3.536 3.536l1.414-1.415L9.172 12l2.12-2.121L9.88 8.464z'/%3E%3C/svg%3E");
}
/*其他的省略,可根据需要自行添加*/
2. 设置公共样式
利用变量来存储颜色,后续我们可以利用修改变量的值来控制图标的颜色
:root {
--weiz-icon-color: #3C3C43;
}
.weiz-icon {
display: inline-block;
background-color: var(--weiz-icon-color);
width: 16px;
height: 16px;
mask: var(--url) no-repeat center center;
-webkit-mask: var(--url) no-repeat center center;
mask-size: cover;
-webkit-mask-size: cover;
}
3. 设置多种颜色
.weiz-icon.main {
--weiz-icon-color: var(--weiz-primary-color);
}
.weiz-icon.white {
--weiz-icon-color: #FFFFFF;
}
.weiz-icon.gray {
--weiz-icon-color: #3C3C43C7;
}
/* 暗黑模式下自动适应 */
.dark {
--weiz-icon-color: #FFFFF5DB;
.weiz-icon.gray {
--weiz-icon-color: #EBEBF599;
}
}
4. 设置多种尺寸
.weiz-icon.m {
width: 12px;
height: 12px;
}
.weiz-icon.l {
width: 24px;
height: 24px;
}
.weiz-icon.xl {
width: 32px;
height: 32px;
}
.weiz-icon.xxl {
width: 40px;
height: 40px;
}
.weiz-icon.xxxl {
width: 48px;
height: 48px;
}
应用
<i class="weiz-icon l weiz-icon-web white"></i>
效果如图:

真实案例请查看:唯知笔记
扩展
推荐一个 SVG 图标网站:icon-sets.iconify.design。找到自己想要的图标后,点击图标,选择下方的 URL 复制即可。

巧用mask属性创建一个纯CSS图标库的更多相关文章
- 一个标签的72变,打造一个纯CSS图标库
每次要用到图标的时候都会到 icono 去copypaste,但每次用到的时候尺寸都各不一样,总是要调整参数,巨烦.当然你可以会想到用zoom.scale来做缩放,但是这样的缩放会使得线宽也变粗了,不 ...
- 手把手教你打造一个纯CSS图标库
来,干了这碗安利 写这篇文章的目的其实就是为了安利一下我的图标库:iconoo,所以,开门见山,star吧少年少妇们!(这样的我是不是应该要加个github互粉的团伙了?) 主题说完了,下面进入正题. ...
- 一个纯CSS DIV天气动画图标【转扒的】
<p> </p> <style><!-- /* SUNNY */ .sunny { -webkit-animation: sunny 15s linear i ...
- 如何使用CSS3创建一个漂亮的图标
演示 下载 今天,我想展示给你一个巧妙的花招.我们将创建一个纯CSS3文本图标.更让人震惊的是,这效果将只需要一个HTML元素. 游戏的计划 创建一个矩形盒子 设置圆角 使用伪类元素创建一个卷角效果 ...
- [译] 通过 contentEditable 属性创建一个所见即所得的编辑器(富文本编辑器)
译者注 这只是一篇入门教程,介绍了一些基础知识,仅供参考,切不可因此觉得富文本编辑器很简单. 创建富文本编辑器是一个非常复杂的工程,需要考虑到方方面面,也有很多坑(请参考原文第一条评论). 为免误导大 ...
- 大神写的一个纯CSS圆角框,膜拜!(支持IE9一下的低版本)
留着提醒自己,底层才是最重要的,不要一直傻瓜的编程下去! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- linq to sql用partial扩展属性,创建一个部分类(用于多表连接)
1.在窗体中创建dataGridView显示表: using System; using System.Collections.Generic; using System.ComponentModel ...
- [git 学习篇]自己在github创建一个远程服务器创库
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举 ...
- 一个纯CSS实现的卡片翻转效果
先上代码 <div id="box"> <div class="front">正面</div> <div class= ...
- [原创]一个纯css实现兼容各种主流移动pc浏览器的时间轴
废话不多说 Demo 高度完全的自适应 中心思想是table 和第二列行高的50%的上下绝对定位竖线 第一次用codepen less完全不能用啊 连node png之类的都是关键词会被去掉... 马 ...
随机推荐
- USB gadget configfs
概述 USB Linux Gadget是一种具有UDC (USB设备控制器)的设备,可以连接到USB主机,以扩展其附加功能,如串口或大容量存储能力. 一个gadget被它的主机视为一组配置,每个配置都 ...
- iOS堆和栈的使用小结
堆和栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.堆,队列优先,先进先出(FIFO-first in first out):栈,先进后出(FILO-Fir ...
- 1. java + react 实现 HRM
1. 云服务的三种方式 1.1 IAAS 基础设施即服务 ,只会提供基础的设施,eg:服务器,网络等 : 1.2 PAAS 平台即服务 ,提供平台,可以把自己写好的代码部署到平台上 : 1.3 SAA ...
- 【信创问题】解决东方通(TongWeb)报错 java.lang.NoClassDefFoundError: javax/persistence/spi/PersistenceProvider
写在前边 今天帮现场同事定位问题,情况是项目同事使用东方通(TongWeb7.0)部署公司项目时,出现以下报错导致服务启动失败. 简单排查了下发现:war包内WEB-INF/lib/javax.per ...
- centos下搭建php开发环境(lamp)
由于个人非常喜欢爱linux系开发php项目. 因为某些原因,经常需要手动搭建环境 经常在网上找到的教程经常不太一样 虽然最终都能完成搭建,但是总是觉得不太爽 还不如自己写一篇,需要的时候肯定能找到 ...
- CentOS7.4 安装 11204 ASM GI 组件时:ohasd failed to start
前段时间某客户要求在CENTOS7上部署Oracle 11.2.0.4 single instance && ASM存储,遇到一个比较头疼的问题,好在已经处理完了. 在图形化执行安装程 ...
- 顺序表(C语言)
文章目录 1.定义顺序表结构体 2.初始化顺序表 3.插入元素 3.1顺序表头插 3.2 顺序表尾插 4.删除顺序表指定元素 5.查找元素 6.输出顺序表 7.销毁顺序表 在数据结构的世界里,顺序表是 ...
- Oracle-表分析和索引分析解读
概述当表没有做分析的时候,Oracle 会使用动态采样来收集统计信息. 获取准确的段对象(表,表分区,索引等)的分析数据,是CBO存在的基石,CBO的机制就是收集尽可能多的对象信息和系统信息,通过对这 ...
- Python 潮流周刊#75:用 Python 开发 NoSQL 数据库(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- 为什么在http协议中使用base64编码方式传输二进制文件
相关: 图解 Base64 实现原理并使用 js 实现一个简单的 Base64 编码器 常用加密方法之Base64编解码及代码实现 一直都知道在http协议中使用base64的方式传递二进制文件,虽然 ...