原标题:一步步打造自己的纯CSS单标签图标库

作者:深海鱼在掘金

原文:https://juejin.im/post/5a1c21c1f265da430b7af6e5

图标作为网页设计中的一部分,其在凸显网页重要元素特性,视觉交互、引导以及网页装饰等充当的角色作用举足轻重。由于图标普遍具有尺寸小的特点,在项目实践时不宜将每个图标作为单个图片元素进行加载,这会增加Http请求,影响网页的性能。因此,在实际中,我们可能见到以下一些常见的解决方案:

将多个图标按照一定排列顺序合并在一个图片里(即sprite图),再通过CSS设置元素的background-position来为元素设置背景从而展示图标

将单个图标元素转成base64格式,并在CSS声明背景

使用SVG来绘制图标

使用字体图标

使用CSS来绘制图标

...

以上方式都可以很好的实现功能,各有各的优缺点。在移动端的某些情况下,我个人比较偏好使用CSS来实现一些简单的小图标,原因有以下几点:

适应性和定制性强,如可以随意改变颜色,大小

占用空间小

在移动端兼容性高

可以不断使自己熟悉CSS3的各个属性并得以应用

而由于CSS3的普及和在各大浏览器的不断增强支持,使CSS具有更大的可能性和能力去绘制更多样化,更复杂的图标。当然,也有不少人反对web图标使用CSS绘制的,在这里不加以讨论。如果你也反对,不妨以当乐趣的心态去看待。

本文将单独讲解如何用CSS绘制一些图标。而由于用CSS实现图标绘制,偶尔意味着你需要用更复杂的html结构去支持图标的绘制,所以本文讲解的将是单标签CSS图标。这样可以实现类似仅用img标签或者单个标签应用字体库实现图标绘制的效果。讲解如何绘制之前,先给大家看看前阵子得闲绘制的若干个单标签CSS图标。

你需要掌握的CSS属性

绘制图标,单从绘制来讲,无非就是画点、线、面。然后将多个点线面组合得到图标。因此,你至少应该掌握以下CSS属性的应用

盒子模型

border属性的应用(很重要,可以参考)

position的各个属性值的应用

transform变形

outline,box-shadow(常见于多边框绘制)

CSS渐变(常用于图标中透明过渡)

伪类和伪元素的应用

transition,animation(如果要绘制动态图标,本文仅讲解静态图标)

需要掌握的主要为以上内容,有些特殊的处理可能还需要其他一些CSS属性的应用。

几个说明

由于大部分情况下图标的大小按照所处环境上下文的字体大小来决定,所以本文所有例子的大小单位大部分使用em,按照当前字号来设定大小

有些border属性没有指明border-color,如border-top: .4em solid,是因为border-color默认继承了字体颜色

所有图标仅作为例子展示,实现方法多样,不代表最佳实践

CSS图标不适合在实践中大量使用,你可以以当作乐趣和练习CSS属性应用的心态去看待本文

基本元素的绘制用border属性绘制元素border除了作为简单的绘制边框以外,还可以绘制三角形,梯形,星形等任意的多边形,以下为绘制的两个三角形和梯形,更多的应用可以参考《border属性的多方位应用和实现自适应三角形》这篇文章,里面全面详细的介绍了用border绘制各种多边形。

用border-radius绘制元素

border-radius主要用于绘制圆点、圆形、椭圆、圆角矩形等形状,以下为简单绘制的两个图形。

但border-radius属性实际上可以设置最多8个值,通过改变8个值可以得到许多意想不到的图像,如图(该图来源于这里)

更多关于border-radius属性的特点和应用请参考张鑫旭大神写的《秋月何时了,CSS3 border-radius知多少?》

用box-shadow绘制元素对于box-shadow,其完整的声明为box-shadow: h-shadow v-shadow blur spread color inset,各个值表示的意义分别为:水平方向的偏移,垂直方向的偏移,模糊的距离(羽化值),阴影的扩展大小(不设置或为0时阴影大小与主体的大小一致),阴影的颜色和是否使用内阴影。实际应用时可以接收3-6个值,对应分别如下:

3个值: h-shadow v-shadow color

4个值: h-shadow v-shadow blur color

5个值: h-shadow v-shadow blur spread color

6个值: h-shadow v-shadow blur spread color inset

同时,border-shadow接受由多个以上各种值组成的以逗号分隔的值,通过这一特性,我们可以实现如多重边框的等效果。以下我们用该属性来实现一个单标签且不借助伪元素的添加图标和代表目标的的图标。(为方便观察,这里将添加符号的实现部分用红色代替)

结果如下:

以上,添加符号采用多个由四个值组成的以逗号分隔的值来设置加号的四个角达到效果,目标图标则通过多次设置阴影大小大于主体大小的值叠加成了多个圆环来实现。

由于box-shadow不占据空间,实际应用中常常需要设置margin来矫正图标的位置,这和outline属性一致,两个属性最大的不同是outline形成的区域不会因为border-radius而形成圆角。

使用CSS渐变来绘制图标CSS3的渐变属性十分强大,理论上通过渐变可以绘制出任何的图形,渐变的特性和使用足足可以写一篇长文,以下为一个例子

以上将得到如下结果

小试牛刀

有了以上的基础之后,我们就可以一步步打造一个属于自己的单标签CSS图标库。文章最前面提到了下面这些图标

现在抽取其中几个尝试绘制实现一下。

杯子

首先我们对杯子进行拆分,很容易想到将杯子拆分为杯身和杯柄两个部分。拆分之后,应该用两个圆角矩形来实现,至于杯子的轮廓(图中黑色部分),我们可以选择用边框border来实现,border的颜色按实际填充即可(本文未指定时默认为跟随当前字体的颜色)。由于是单标签实现,因此,我们还要借助一个伪元素(杯柄)来实现这个图标。于是就有了以下的样式:

以上便实现了一个杯子的图标,通过调整边框颜色(默认为与当前字体颜色相同)和宽度即可实现不同大小的图标。

心形

仔细观察这个心形,它实际上应该可以近似看做是由以下两个形状按照一定的角度旋转和平移组成。

因此我们可以用两个元素来绘制这两个部分,通过设置背景色和border-radius,然后按照一定的角度旋转并平移则可得到。为了方便定位,这里我们用两个伪元素来绘制这两个部分。为了方便观察,我们先设置如下样式

可以看到,此时两个元素将因为.heart元素的宽度而撑开了一段距离,实际上应该是A点和B点重合于一点。因此,如果我们把.heart的宽高都设为0,则得到如下结果:

到这里为止,已经完成了一个心形的绘制,但是仔细看,左右两侧会有一个边角突出,这是因为旋转的角度不够导致。可以通过调大角度或者设置一个较大的圆角(适应性更高)来修复此问题。这里将旋转的角度调整为48deg。修改颜色和透明度后即得到如下结果:

相机

至于这个相机,由于前面已经介绍了如何用border-radius绘制一个代表目标的图标,问题就变得很简单了。整个相机分为三个部分,通过定位即可实现。以下直接贴实现代码。

月亮

月亮这个图标乍一看似乎挺难实现,但如果掌握了border-radius属性的应用,其实是相当的容易,以下为完整的CSS样式:

其核心是将阴影的模式设置为inset通过调整参数,可以得到不同的月亮形状,如下图:

总结

用CSS绘制图标其实其核心就是将拆分后的多个元素经过旋转和平移得到。归根结底还是要掌握CSS相关属性的应用。一般由以下几个步骤:

分析图标,拆分为小元素

绘制小元素

定位(平移和旋转等)

设置在父级元素的定位(如用margin定位)

如果不限制于单个标签实现,那么可以绘制更多复杂的图标。以下为个人在绘制图标时的一点小体会:

图标的颜色可以使用border属性去绘制

border-color大部分情况下可以不设置,默认跟随图标当前所在文本的字体颜色

图标的大小单位可以使用em,即相对于当前所在文本的字体大小进行计算,这应该符合与大部分场合,适应性也高,复用性强。(以上例子中均仅需要调整父级的字体大小即可以放大或缩小图标)

web前端群:121404239,分享源码、视频、企业级案例、最新知识点,欢迎初学者和在进阶中的小伙伴。

关注公众号→‘学习web前端’跟大佬一起学前端!返回搜狐,查看更多

责任编辑:

css加号图标_一步步打造自己的纯CSS单标签图标库相关推荐

  1. html列表太多转为下滑菜单,利用CSS过渡属性Transition制作缓缓弹出的纯CSS下拉菜单...

    利用CSS过渡属性Transition制作缓缓弹出的纯CSS下拉菜单 以往文章里面讲了使用CSS的position属性定位结合display制作下拉弹出菜单,名为<纯CSS制作下拉导航菜单> ...

  2. 把svg图标制作成字体图标_让我们用SVG符号和CSS变量制作彩色图标

    把svg图标制作成字体图标 by Sarah Dayan 通过莎拉·达扬 让我们用SVG符号和CSS变量制作彩色图标 (Let's make multi-colored icons with SVG ...

  3. html怎么让图标动起来,让ICON生动起来 纯CSS实现带动画的天气图标

    让ICON生动起来 纯CSS实现带动画的天气图标 1月 20, 2016 评论 (1) Sponsor CSS3动画属性并不是很多,但重点其实是你怎样去运用它,从简单的hover状态或复杂的小动画,都 ...

  4. css flexbox模型_如何将Flexbox后备添加到CSS网格

    css flexbox模型 I shared how to build a calendar with CSS Grid in the previous article. Today, I want ...

  5. 修改项目图标_北京2022冬奥会和冬残奥会体育图标发布

    人民日报客户端 12月31日晚,在新的一年即将到来之际,北京2022年冬奥会和冬残奥会体育图标正式发布,标志着北京冬奥会.冬残奥会筹办取得新进展. 体育图标是历届奥运会的"规定动作" ...

  6. css表格布局_布局秘密武器#1:CSS表格属性

    css表格布局 Right now, Flexbox is arguably THE hot new thing for layout building. Flexbox's almost mirac ...

  7. vb.net 获取系统图标_优麒麟19.10.1正式发布:控制面板新增图标主题与字体高级设置...

    今日,Linux开源桌面操作系统优麒麟宣布推出19.10.1版本,内核升级到5.3.0.19.22,火狐浏览器升级到70.0版本,主要修复了用户通过论坛.微信.官网等平台反馈的问题,新增了控制面板中图 ...

  8. css怎样使弹跳的小球旋转,如何使用纯CSS实现小球跳跃台阶的动画效果(附源码)...

    本篇文章给大家带来的内容是关于如何使用纯CSS实现小球跳跃台阶的动画效果(附源码) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 效果预览 源代码下载 https://github ...

  9. 纯css打造菜单响应,纯 CSS 打造标准的导航菜单-1

    本连载分三节讲述如何利用 CSS 打造一个符合标准.兼容各浏览器(IE6 除外.IE7 可以)的导航菜单. 菜单内容全部使用 ul,利用 CSS 将 ul 变成需要的样式,本节讲述最简单的:如何把原本 ...

最新文章

  1. 机器学习(四)——损失函数
  2. #ifndef #define #endif ”防止头文件被重复包 .
  3. Java 8状态更新
  4. 一款简单微信小程序个人博客
  5. 有序二叉树c语言,二叉搜索树(BST)的实现(C语言)(原创)
  6. 力扣——无重复字符的最长子串
  7. 笔记本连网线显示服务器拒绝连接怎么办,笔记本插上网线没反应怎么办【解决方法】...
  8. Java的switch是否支持String作为参数,还支持哪些类型?
  9. Ubantu指令收藏
  10. 毕业论文选题方法和论文各部分写作技巧
  11. 永中word页码怎么从第二页开始_Word文档”双面打印“全攻略,解决打印难题!...
  12. 创业36条军规值得一读
  13. Excel加密如何破解
  14. 买了新手机却不适应?教你一步克隆旧手机信息
  15. logout命令详解
  16. CSP题目:小明种苹果树
  17. 教你如何学模电——三极管篇
  18. 长安链---从零到一部署Chainmaker-2.0.0
  19. 【HAL库】HAL库STM32cubemx快速使用
  20. el-table 排序

热门文章

  1. 空调器制冷系统故障-蒸发器反面脏堵
  2. 福大软工1816 · 第三次作业 - 结对项目1
  3. 基于51单片机的智能遥控晾衣架温度湿度光强检测proteus仿真原理图PCB
  4. 英语读书笔记-Book Lovers Day 07
  5. 如何根据实际需求选择合适的三维实景建模方式?
  6. html翻译系统,如何实现网页自动翻译成终端系统的文字?
  7. 字符串双引号表示c语言,c语言中单引号和双引号的区别(顺利解决从字符串中提取IP地址的困惑)...
  8. C语言之单引号和双引号
  9. php源码二次开发的技术,Thinkphp二次开发威客RW平台源码详细搭建教程(技术分享帖)-一颗优雅草科技yungui...
  10. centos mysql安装mysql-devel报错