用css画图标

摘要:
css3的属性transform(转换)用途很广泛,功能也很强大,为了熟悉它的各种转换方式,我做了一些平常常用的一些简单的图标。.bottomLeftRotate{width:0;height:0;border-width:2em1em;border-style:solid;border-color:transparenttransparent#000#000;transform:rotate;}好了,进入正题,用css画一些常见的图标,目的有五个:1.熟悉三角形的画法;2.熟悉transform的使用;3.回顾数学角度计算;4.回顾定位布局方法;5.回顾居中显示方法。

css3的属性 transform(转换) 用途很广泛,功能也很强大,为了熟悉它的各种转换方式(平移 translate,旋转 rotate,扭曲 skew,放缩 scale),我做了一些平常常用的一些简单的图标。

这些图标很多是通过三角形来拼贴起来的,所以我们需要知道怎么样画三角形。

1. 我们要将该 div 的 width 和 height 都设置为 0,三角形是通过设置 border 来实现;

2. 通过我们需要画成的三角形的目标分析,这个三角形的朝向(只针对规则的朝向:上、右、下、左、上左、上右、下右、下左,不规则的朝向可以通过旋转来实现);

3. 如果是上、右、下、左四种中的一种,将朝向的对面的 border-color 设置为我们需要的颜色,该朝向的这一边不设置 border,其它两边的 border-color 设置为 transparent;

4. 如果是上左、上右、下右、下左中的一种,以上右为例,设置相关的两边:上和右的 border-color 设置成我们想要的颜色,其它两边的 border-width 设置成 transparent。

5. border-width 的值就是底边长和高。

看几个例子:

例1:

图形:

用css画图标第1张

该图形中,只有上方位有边,这个边就是三角形的底边了,底边长为 3.6em(左右相加),高为 2em。右、下、左没有边。于是 border-top-color: #000; | border-right-color: transparent; | border-left-color: transparent; | border-top- 2em; | border-right- 1.8em; | border-left- 1.8em;

.bottom {width:0;height:0;border-top:2em solid #000;border-right:1.8em solid transparent;border-left:1.8em solid transparent;
}

例2:

用css画图标第2张

该图形中,左和下上方位有边,朝向为下左,底边长为 2em(左右相加),左边长为 4em(上下相加)。

.bottomLeft {width:0;height:0;border-width:2em 1em;border-style:solid;border-color:transparent transparent #000 #000;
}

例3:

用css画图标第3张

该图形中,它的朝向并不是上面提到的那八种,实际上它可以通过例 2 顺时针旋转 60° 得到。

.bottomLeftRotate {width:0;height:0;border-width:2em 1em;border-style:solid;border-color:transparent transparent #000 #000;transform:rotate(60deg);
}

好了,进入正题,用 css 画一些常见的图标,目的有五个:1. 熟悉三角形的画法;2. 熟悉 transform 的使用;3. 回顾数学角度计算;4. 回顾定位布局方法;5. 回顾居中显示方法。

所有的 dom 都基于一个 div,比如下面第一个实例“向上”:

<div class="top"></div>

第二个实例“向右”:

<div class="right"></div>

1. 向上

用css画图标第4张

.top {box-sizing:border-box;position:relative;width:0;height:0;border-right:.9em solid transparent;border-bottom:.9em solid #000;border-left:.9em solid transparent;
}.top:after {content:""; /*针对before,after必须加上*/position:absolute;left:50%;top:.7em;margin-left:-.45em; /*宽度的一半,结合 left: 50%; 使用*/width:.9em;height:1.3em;background-color:#000;
}

2. 向右

用css画图标第5张

.right {box-sizing:border-box;position:relative;width:1.3em;height:.9em;background-color:#000;
}.right:after {content:"";position:absolute;top:50%;left:1.1em;margin-top:-.9em;width:0;height:0;border-top:.9em solid transparent;border-bottom:.9em solid transparent;border-left:.9em solid #000;
}

3. 向下

用css画图标第6张

.bottom {box-sizing:border-box;position:relative;width:.9em;height:1.3em;background-color:#000;
}.bottom:after {content:"";position:absolute;left:50%;top:1.1em;margin-left:-.9em;width:0;height:0;border-right:.9em solid transparent;border-top:.9em solid #000;border-left:.9em solid transparent;
}

4. 向左

用css画图标第7张

.left {box-sizing:border-box;position:relative;width:0;height:0;border-top:.9em solid transparent;border-right:.9em solid #000;border-bottom:.9em solid transparent;
}.left:after {content:"";position:absolute;top:0;bottom:0; /*在绝对定位中,top: 0; bottom: 0; margin: auto; 结合使用能竖直居中*/left:.7em;margin:auto;width:1.3em;height:.9em;background-color:#000;
}

以上四个图标由三角形和长方形拼贴而成。

5. 正确

用css画图标第8张

.true {position:relative;width:1.2em;height:.3em;background-color:#000;transform:rotate(60deg);transform-origin:right center;border-radius:.15em;
}.true:after {content:"";position:absolute;top:.1em;left:-.85em;width:2em;height:.3em;background-color:#000;transform:rotate(60deg);transform-origin:right center;border-radius:.15em;
}

将 transform-origin 设置为 right center; 是为了好计算相对于它做绝对定位的 after 伪元素的位置。其实根据计算 .true:after 的 top: .15em; left: -.8em; 设置成上面的 top: .1em; left: -.85em; 能让两根线的连接处拼贴得更好。

6. 错误

用css画图标第9张

.false {position:relative;width:2em;height:.3em;background-color:#000;transform:rotate(45deg);border-radius:.15em;
}.false:after {content:"";position:absolute;width:2em;height:.3em;background-color:#000;transform:rotate(90deg);border-radius:.15em;
}

transform-origin 的值默认为 center center 0; 因此只需旋转 90deg 即可。旋转也是相对于相对定位的元素,所以这里只需要在原基础上旋转 90deg。

7. 菜单

用css画图标第10张

.menu {box-sizing:border-box;position:relative;width:2em;height:2em;background-color:#000;border-radius:.3em;
}.menu:before {box-sizing:border-box;content:"";position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;width:1.2em;height:.15em;background-color:#fff;
}.menu:after {box-sizing:border-box;content:"";position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;width:1.2em;height:.9em;border-width:.15em;border-style:solid none;border-color:#fff;
}

8. 菜单2

用css画图标第11张

.menu2 {box-sizing:border-box;position:relative;width:.5em;height:.5em;background-color:#000;border-radius:50%;cursor:pointer;
}.menu2:before {box-sizing:border-box;content:"";position:absolute;top:0;left:-.75em;width:.5em;height:.5em;background-color:#000;border-radius:50%;
}.menu2:after {box-sizing:border-box;content:"";position:absolute;top:0;left:.75em;width:.5em;height:.5em;background-color:#000;border-radius:50%;
}

9. 下载

用css画图标第12张

.download {box-sizing:border-box;position:relative;width:2em;height:.8em;border-width:.3em;border-style:none solid solid;border-color:#000;
}.download:before {content:"";position:absolute;right:0;bottom:.7em;left:0;margin:auto;width:.3em;height:1em;background-color:#000;
}.download:after {content:"";position:absolute;right:0;bottom:.2em;left:0;margin:auto;width:0;height:0;border-right:.6em solid transparent;border-top:.6em solid #000;border-left:.6em solid transparent;
}

箭头下面的“框”,设置 border-top-style:none; 而不是设置 border-top-color: transparent; 这样做就能实现,应该与上边框连接处的线那里不会出现线条变细的情况,如下:

用css画图标第13张

这里只是将 border-style 和 border-color 的值换成了 solid 和 transparent #000 #000.

10. 上传

用css画图标第14张

.upload {box-sizing:border-box;position:relative;width:2em;height:.8em;border-width:.3em;border-style:none solid solid;border-color:#000;
}.upload:before {content:"";position:absolute;right:0;bottom:.2em;left:0;margin:auto;width:.3em;height:1em;background-color:#000;
}.upload:after {content:"";position:absolute;right:0;bottom:1.1em;left:0;margin:auto;width:0;height:0;border-right:.6em solid transparent;border-bottom:.6em solid #000;border-left:.6em solid transparent;
}

11. 视频

用css画图标第15张

.video {box-sizing:border-box;position:relative;width:1.5em;height:1.2em;background-color:#000;border-radius:.3em;
}.video:after {content:"";position:absolute;top:50%;left:1.4em;margin-top:-.7em;width:0;height:0;border-top:.7em solid transparent;border-right:.6em solid #000;border-bottom:.7em solid transparent;
}

12. 语音

用css画图标第16张

.voice {box-sizing:border-box;position:relative;width:1.4em;height:1em;border-width:.2em;border-style:none none solid;border-color:#000;border-radius:50%;
}.voice:before {content:"";position:absolute;right:0;left:0;bottom:.05em;margin:auto;width:.8em;height:1.3em;background-color:#000;border-radius:.4em;
}.voice:after {content:"";position:absolute;right:0;bottom:-.6em;left:0;margin:auto;width:0;height:0;border-right:.6em solid transparent;border-bottom:.4em solid #000;border-left:.6em solid transparent;
}

13. 播放

用css画图标第17张

.play {box-sizing:border-box;position:relative;width:2em;height:2em;border:.2em solid #000;border-radius:50%;
}.play:after {content:"";position:absolute;top:0;bottom:0;left:50%;margin-top:auto;margin-bottom:auto;margin-left:-.3em; /*没有让其左右居中,因为看起来右边更空一些*/width:0;height:0;border-top:.6em solid transparent;border-bottom:.6em solid transparent;border-left:.9em solid #000;
}

14. 暂停

用css画图标第18张

.pause {box-sizing:border-box;position:relative;width:2em;height:2em;border:.2em solid #000;border-radius:50%;
}.pause:before {box-sizing:border-box;content:"";position:absolute;top:0;bottom:0;left:50%;margin-top:auto;margin-bottom:auto;margin-left:-.35em;width:.2em;height:.9em;background-color:#000;
}.pause:after {box-sizing:border-box;content:"";position:absolute;top:0;bottom:0;left:50%;margin-top:auto;margin-bottom:auto;margin-left:.15em;width:.2em;height:.9em;background-color:#000;
}

15. 上一首(集)

用css画图标第19张

.previous {box-sizing:border-box;position:relative;width:2em;height:2em;border:.2em solid #000;border-radius:50%;
}.previous:before {box-sizing:border-box;content:"";position:absolute;top:0;bottom:0;left:50%;margin-top:auto;margin-bottom:auto;margin-left:-.65em;width:0;height:0;border-top:.45em solid transparent;border-bottom:.45em solid transparent;border-right:.6em solid #000;
}.previous:after {box-sizing:border-box;content:"";position:absolute;top:0;bottom:0;left:50%;margin-top:auto;margin-bottom:auto;margin-left:-.2em;width:0;height:0;border-top:.45em solid transparent;border-bottom:.45em solid transparent;border-right:.6em solid #000;
}

16. 下一首(集)

用css画图标第20张

.next {box-sizing:border-box;position:relative;width:2em;height:2em;border:.2em solid #000;border-radius:50%;
}.next:before {box-sizing:border-box;content:"";position:absolute;top:0;bottom:0;left:50%;margin-top:auto;margin-bottom:auto;margin-left:-.4em;width:0;height:0;border-top:.45em solid transparent;border-bottom:.45em solid transparent;border-left:.6em solid #000;
}.next:after {box-sizing:border-box;content:"";position:absolute;top:0;bottom:0;left:50%;margin-top:auto;margin-bottom:auto;margin-left:.05em;width:0;height:0;border-top:.45em solid transparent;border-bottom:.45em solid transparent;border-left:.6em solid #000;
}

17. 停止

用css画图标第21张

.stop {box-sizing:border-box;position:relative;width:2em;height:2em;border:.2em solid #000;border-radius:50%;
}.stop:after {box-sizing:border-box;content:"";position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;width:.9em;height:.9em;background-color:#000;
}

18. 当前位置

用css画图标第22张

.position {position:relative;width:.6em;height:.6em;border:.4em solid #000;border-radius:50%;
}.position:after {content:"";position:absolute;top:.55em;left:-.4em;width:0;height:0;border-top:1em solid #000;border-right:.7em solid transparent;border-left:.7em solid transparent;border-top-left-radius:50%;border-top-right-radius:50%;
}

勉强看起来像,中间的圆,不圆了。

19. pc

用css画图标第23张

.pc {box-sizing:border-box;position:relative;width:2em;height:1.4em;border-width:.2em .2em .3em;border-style:solid;border-color:#000;border-radius:.2em;background-color:#efefef;
}.pc:before {content:"";position:absolute;top:1.2em;right:0;left:0;margin:auto;width:.6em;height:.4em;background-color:#000;
}.pc:after {content:"";position:absolute;top:1.6em;right:0;left:0;margin:auto;width:1.6em;height:.2em;background-color:#000;
}

20. phone

用css画图标第24张

.phone {box-sizing:border-box;position:relative;width:1.4em;height:2em;background-color:#efefef;border-width:.3em .2em .5em;border-style:solid;border-color:#000;border-radius:.15em;
}.phone:after {content:"";position:absolute;right:0;bottom:-.4em;left:0;margin:auto;width:.5em;height:.3em;background-color:#fff;border-radius:.3em;
}

21. 搜索

用css画图标第25张

.search {box-sizing:border-box;position:relative;width:1em;height:.3em;background-color:#000;border-top-right-radius:.15em;border-bottom-right-radius:.15em;transform:rotate(40deg);transform-origin:right center;
}.search:before {content:"";position:absolute;left:-1.3em;bottom:-.6em;width:1em;height:1em;border:.3em solid #000;border-radius:50%;
} 

22. 五角星

用css画图标第26张

.star {box-sizing:border-box;position:relative;width:0;height:0;border-top:.7em solid #000;border-right:1em solid transparent;border-left:1em solid transparent;
}.star:before {content:"";position:absolute;top:-.7em;left:-1em;width:0;height:0;border-top:.7em solid #000;border-right:1em solid transparent;border-left:1em solid transparent;transform:rotate(72deg);
}.star:after {content:"";position:absolute;top:-.7em;left:-1em;width:0;height:0;border-top:.7em solid #000;border-right:1em solid transparent;border-left:1em solid transparent;transform:rotate(-72deg);
}

根据多边形的内角和公式可知 360*(5-2) / 5 = 72°。剩下的调整一下位置就好了。这个五角星由三个三角形拼贴而成。

23. 电子邮件

用css画图标第27张

.email {box-sizing:border-box;position:relative;width:0;height:0;border-width:.7em 1em;border-style:solid;border-color:transparent transparent #000 #000;
}.email:before {content:"";position:absolute;top:-.7em;left:1em;transform:rotateY(180deg);transform-origin:left center;width:0;height:0;border-width:.7em 1em;border-style:solid;border-color:transparent transparent #000 #000;
}.email:after {content:"";position:absolute;top:-.7em;left:50%;margin-left:-.9em;width:0;height:0;border-top:.6em solid #000;border-right:.9em solid transparent;border-left:.9em solid transparent;
}

24. 眼睛

用css画图标第28张

.eye {box-sizing:border-box;position:relative;width:2em;height:1.2em;background-color:#000;border-radius:50%;
}.eye:before {content:"";position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;width:.8em;height:.8em;background-color:#fff;border-radius:50%;
}.eye:after {content:"";position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;width:.4em;height:.4em;background-color:#000;border-radius:50%;
}

25. 未锁

用css画图标第29张

.unlock {box-sizing:border-box;position:relative;width:1.6em;height:1.4em;background-color:#000;border-radius:.2em;
}.unlock:before {box-sizing:border-box;content:"";position:absolute;top:-.4em;right:-.4em;width:1em;height:.6em;border-width:.2em;border-style:solid solid none;border-color:#000;border-radius:.5em;
}.unlock:after {box-sizing:border-box;content:"";position:absolute;bottom:.2em;left:50%;margin-left:-.15em;width:.3em;height:.5em;border-top-left-radius:.25em;border-top-right-radius:.25em;background-color:#fff;
}

这里 .unlock:before 设置了 border-radius: .5em; 所以导致 被打开的锁下边框位置的部分看起来很细。

26. 杯子

用css画图标第30张

.cup {box-sizing:border-box;position:relative;width:1.3em;height:2em;border-width:.2em .2em 1.2em;border-style:solid;border-color:#000;background-color:#efefef;border-bottom-left-radius:.3em;border-bottom-right-radius:.3em;
}.cup:before {box-sizing:border-box;content:"";position:absolute;top:.1em;left:-.7em;width:.7em;height:1.4em;border-width:.2em;border-style:solid;border-color:#000;border-top-left-radius:.3em;border-bottom-left-radius:.3em;
}

27. 心

用css画图标第31张

.heart {position:relative;width:1.4em;height:2em;background-color:#000;border-top-left-radius:1em;border-top-right-radius:1em;transform:rotate(-45deg);transform-origin:center bottom;
}.heart:after {content:"";position:absolute;top:-.7em;left:-.7em;width:1.4em;height:2em;background-color:#000;border-top-left-radius:1em;border-top-right-radius:1em;transform:rotate(90deg);transform-origin:center bottom;
}

该爱心由两个柱子一样的东西拼贴而成,很粗鲁,所以它是是黑色。

28. 主页

用css画图标第32张

.home {box-sizing:border-box;position:relative;width:1.4em;height:1em;background-color:#000;
}.home:before {content:"";position:absolute;top:-.7em;left:50%;margin-left:-1em;border-left:1em solid transparent;border-right:1em solid transparent;border-bottom:.8em solid #000;
}.home:after {z-index:2;content:"";position:absolute;right:0;bottom:0;left:0;margin:auto;width:.3em;height:.5em;background-color:#fff;
}

29. 密码

用css画图标第33张

.password {box-sizing:border-box;position:relative;width:1.8em;height:1.4em;background-color:#000;border-radius:.2em;
}.password:before {box-sizing:border-box;content:"";position:absolute;top:-.6em;left:50%;margin-left:-.5em;width:1em;height:1em;border:.2em solid #000;border-radius:50%;
}.password:after {box-sizing:border-box;content:"";position:absolute;bottom:.2em;left:50%;margin-left:-.15em;width:.3em;height:.5em;border-top-left-radius:.25em;border-top-right-radius:.25em;background-color:#fff;
}

30. 用户(账号)

用css画图标第34张

.user {box-sizing:border-box;position:relative;width:.9em;height:.9em;background-color:#000;border-radius:50%;
}.user:after {content:"";position:absolute;top:1em;left:50%;margin-left:-.9em;width:1.8em;height:1em;background-color:#000;border-top-left-radius:.9em;border-top-right-radius:.9em;
}

更新:(2017-06-27)

对于菜单的图标,可以不使用生成内容 content 属性及伪元素 before 和 after 。如下面的图标:

用css画图标第35张

可以通过一段很简短的 css 实现:

#menu {color:#000;
display: block; width:50px;height:50px;box-sizing:border-box;border-top:10px solid; /*没有设置颜色值,将同文本颜色一样*/border-bottom:10px solid;padding-top:10px;padding-bottom:10px;background-color:currentColor; /*颜色关键字,将同文本颜色一致*/background-clip:content-box; /*背景将绘制在内容方框内*/ }

上面的代码可以更简短一些,比如不设置 box-sizing 和 height 属性,结果是一样的,三条短横线的高度和它们之间的间距一样均为 10px ,要是在 less 预处理器中可这样写:

#menu {@size:10px;color:#000;
displsy: block; width:@size * 5;
height: @size * 5; border-top:@size solid;border-bottom:@size solid;padding-top:@size;padding-bottom:@size;background-color:currentColor;background-clip:content-box; }

如果需要整体调整图标的大小,改变 @size 变量的值就行了。如果宽度需要稍微宽点,将乘号 “*” 后面的数值变大就行了。

更新:(2019-08-27)

在绘制边框的时候,有一个 border-style 的值为 double 的边框属性,可以据此制作出形如轨道的效果

用css画图标第36张

受这个效果的启发,同样可以仅通过边框就制作出一个菜单图标

用css画图标第37张

<div class="double"></div>
.double {width:50px;height:7px;border-top:21px double #000;border-bottom:7px solid #000;
}

免责声明:文章转载自《用css画图标》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jQuery以Post方式发送请求并获取返回的文件供下载!网页窗口logo图标设置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF border属性

Border 是一个装饰的控件,此控件绘制一个边框、一个背景,在 Border 中只能有一个 子控件,但它的子控件是可以包含多个子控件的 Border 的几个生要的属性: Background:此属性设置 背景颜色 BorderBrush:此属性设置  边框颜色 BorderThickness:此属性设置 边框的宽度 CornerRadius:此属性设置...

uniapp创建项目并引入colorui插件

前言:本文用于备忘; 正文:1、用Hbuilder新建项目,选择uni-app(U) -->uni-ui项目-->创建 2、①进入插件市场,https://ext.dcloud.net.cn/,找到colorui,下载插件,解压 ②复制根目录的/colorui文件夹到你的项目的根目录 ③在App.vue引入关键Cssmain.cssicon.c...

CSS布局之display: tables布局

首先来看看display: table的兼容性: 可以看到,除非你还要跟IE6/7较劲,否则display: table不需考虑兼容性。 接下来看看关于table的display可选值: table:指定对象作为块元素级的表格,相当于html标签<table> inline-table:指定对象作为内联元素级的表格,相当于html标签&l...

element elinput 去掉边框

element样式还是蛮好的,只是有时候我们需要做一些调整,比如,el-input 的边框,官网是这样子的  我们需要去掉这个边框 试了常用的:border: none;  以及:outline:none; 但却没用 tip:将border属性设成0,虽然边框不见了,但是浏览器依然会对border-width和border-color进行渲染,会占用浏览...

CSS3(七) 前端预处理技术(Less、Sass、CoffeeScript)

目录 一、Less 1.1、概要 1.2、变量 1.3、解析Less 1.3.1、在线处理 1.3.2、预处理 1.4、混入(Mixins) 1.5、嵌套    1.6、运算 1.7、函数 1.8、继承     1.9、作用域 1.10、注释 二、Sass 2.1、变量 2.2、嵌套 2.3、导入 2.4、mixin 混入 2.5、扩展/继承...

用CSS开启硬件加速来提高网站性能

1. 何为硬件加速 就是将浏览器的渲染过程交给GPU处理,而不是使用自带的比较慢的渲染器。这样就可以使得animation与transition更加顺畅。 我们可以在浏览器中用css开启硬件加速,使GPU (Graphics Processing Unit) 发挥功能,从而提升性能 现在大多数电脑的显卡都支持硬件加速。鉴于此,我们可以发挥GPU的力量,从而...