[前端Talkking]CSS3系列-css3之线性渐变初探1.写在前面
入行前端一年多的时间,想提高自己的css技术水平,于是在网上看了些关于css的书籍,想买几本比较好的css书籍啃啃,找来找去,终于找到了《CSS揭秘》这本书。入手这本书后,从开始看到后面,发现书中的很多效果都可以使用渐变来实现,于是,我对渐变产生了兴趣,决定好好掌握css3中的这个属性。结合《CSS揭秘》、张鑫旭大神的深入理解CSS3 gradient斜向线性渐变和CSS3 radial-gradient径向渐变语法及辅助理解案例10则以及其他的文章,并总结自己的学习过程,于是诞生了这篇关于css3中的渐变文章。
渐变是是以背景图的形式呈现在页面中的,渐变的本质是background-image。在css3中,渐变可以分为线性渐变(linear-gradient)和径向渐变(radial-gradient)。线性渐变是沿着渐变线进行渐变,而径向渐变则是沿着椭圆或者圆形进行四周渐变。
2.线性渐变linear-gradient2.1 基本语法
background-image: linear-gradient( [,]?[,]+ );
[] 在正则表达式中是一个字符类,这里理解为一个小单元即可;
表示或者的意思,要么选择前面,要么选择后面;
?表示0个或者1个意思。即如果不指定方向,直接可以直接使用渐变色;
+加号, 表示1个或者多个。
2.1.1 角度angle
提问:如果angle是45deg,渐变颜色由到的渐变,请问下面哪副图是正确的?
正确答案:B
这个理解与我们所熟知的css3旋转某一个角度有一定的出入,比如,css3中旋转90度的效果是这样的:
而在线性渐变中,渐变的角度默认是从下到上的垂直方向开始顺时针进行旋转的,我们可以理解为时钟针旋转的方向,如下图所示:
变角度指明了线性渐变的方向,0deg表示从上向下渐变;90deg表示从左向右渐变;180deg表示从下向上渐变;270deg表示从右向左渐变;360deg表示从下向上渐变。渐变的角度效果如图所示:
在上面的这个例子中,0deg->360deg的效果其实就是顺时针旋转一圈。
2.1.2 side-or-corner
side-or-corner的中文意思是边或者角的意思。在垂直方向的可选值有:、、,在水平方向的可选值有、、。默认值为center bottom,即从上向下渐变。可以用to + side-or-corner关键字联合起来使用,如果不加to,则表示渐变的起始点,加上to则表示渐变的方向。例如:to top等价于0deg,to right等价于90deg,to bottom等价于180deg,to left等价于270deg。相关效果如下图所示:
不同版本浏览器中使用注意:
新版浏览器可以直接使用w3c的标准语法,低版本浏览器需要使用各浏览器前缀;
IE10版本以下不支持渐变;
新版chrome和firefox已经去掉了私有前缀,加了私有前缀与不加私有前缀方向有出入(如果加了私有前缀,则right为0deg,然后逆时针转一圈);
oper从37开始支持,没有私有前缀,加了反而不认;
本文将以W3C标准语法讲解线性渐变和径向渐变。
2.1.3 color-stop
[
]
指明线性渐变的颜色、起点、终点。翻译成中文就是:颜色+空格+百分比或者长度值。
现在顶部20%的区域被填充为的实色,底部20%的区域被填充为的实色,真正渐变的区域在20%到80%高度的区域。如果将两个色标拉近,将两个色标重合在一起:
“如果多个色标具有相同的位置,它们会产生一个无限小的过渡区域,过渡的起止色分别是第一个和最后一个指定值。从效果上看,颜色会在那个位置突然变化,而不是一个平滑的渐变过程。”
——CSS 图像(第三版)(http://w3.org/TR/css3-images)
因为渐变是一种由代码生成的图像,我们能像对待其他任何背景图像那样对待它,而且还可以通过background-size 来调整其尺寸:
如果是垂直条纹,代码以及效果如下:
为了避免每次改动条纹宽度时都要修改两个数字,我们可以再次从规范那里找到捷径。
“如果某个色标的位置值比整个列表中在它之前的色标的位置值都要小,则该色标的位置值会被设置为它前面所有色标位置值的最大值。”
——CSS 图像(第三版)(http://w3.org/TR/css3-images)
对于水平和垂直渐变条纹我们很好理解。如果是斜向渐变,我们想得到条纹的宽度为15px,我们可以这样写:
对比想要的图以及实际效果图,为什么得到线条的宽度比我们想要的线条宽度要小,难道是浏览器出问题了,no,是我们自己错了。这就需要深入理解渐变的长度了。
2.2 线性渐变的渐变长度的理解
如何确定渐变线的长度?我们可以从官网的解释中找到答案:
渐变线是过渐变区域中心的一条直线,而渐变的起点和终点是在与渐变线的垂直线上。如果给定渐变的区域和渐变的方向,我们就能够确定渐变的起始点和总长度了。因此在下面的css样式中:
我们可以用下面的这幅图来计算渐变的长度,我们指定了区域的大小时30px,根据,可以计算直角三角形的斜边长度。因此,我们计算得到的条纹的宽度实际是:,比我们需要的宽度15p要小。
15/√2
这就意味着,如果想要让条纹的宽度变化为我们原本想要的15px,就需要将指定为。
我们来看下修改后的效果,修改后,得到了我们想要的效果图。
2.3 线性渐变的案例2.3.1 利用线性渐变生成条纹
在上面的例子中,我们已经使用线性渐变生成了水平和垂直条纹,这里就不在赘述。
2.3.2 利用线性渐变生成多背景图片
在CSS3中,backgrounds支持多背景,越前面的背景越处于上面,也就是背景可以无限累加,而渐变的本质是background-image,所以我们可以实现任意数量的渐变背景图的叠加效果。
有如下图片:
我们添加透明值:
得到的效果如下:
我们可以利用这一点,来给背景添加不同的效果,如让图片不可见(修改为:)。
2.3.3 利用线性渐变生成比例可控的虚线
在实际开发中,如果需要虚线,我们一般会设置,然而这种方法存在一个问题:实线和虚线的比例是一定的。在Chrome和Firefox浏览器下,颜色区的宽高比是,颜色和透明区的宽度比例是:
而在IE浏览器下,颜色区的宽高比是,颜色区和透明区的宽度比例也是:
如果设计师设计的UI中,要求虚线的颜色区的宽高比是,实线与虚线的比例是,此时使用就达不到设计师设计的效果了。有两种方法可以解决这个问题:
要求设计师改UI,这么low X的事难道是我们前端工程师做的吗?
查阅资料,使用其他方法实现设计师想要的效果,正确选择!
这里,我们就可以使用到达设计师想要的效果:
对应的效果如下:
2.3.4 利用线性渐变生成带线框的三角
考虑下面的场景,我们需要生成一个对话框:
我们可能绝大多数使用下面的做法:
如果背景不是白色:
可以看到如果背景色不是白色,旋转后的效果就有一个多余的三角形,不是我们想要的效果,我们可能尝试这样修改css代码:
额,比上面的效果好多了,但是三角与边框交接的区域多了一个线条,与我们想要的效果还是有出入,此时我们使用线性渐变看看,如下css所示:
哇,看起来不错额,今晚可以约起了。。。
2.3.5 利用线性渐变生成加号和减号
考虑有以下需求:
切图,使用小图片;
传统方法,使用和伪元素配合实现;
使用线性渐变实现;
传统方法:
使用线性渐变方法:
这种方法生成加号和等号与传统使用和以及配合和相比,使用渐变背景生成的好处是居中定位方便。
2.3.6 利用线性渐变生成切角效果
直接看代码:
利用线性渐变还可以实现折角效果(计算稍微复杂,详细计算步骤可以看《css揭秘》相关章节),如:
2.3.7 利用线性渐变实现信封效果
2.3.8 利用线性渐变实现裁剪效果
在浏览器中的效果如下:
如果将修改为 ,可以看到下面的效果:
2.4 更多线性渐变的应用
领取专属 10元无门槛券
私享最新 技术干货