本文摘自《CSS揭秘》中国工信出版集团

难题:

  不论是在网页设计中,还是在其他传统媒介中(比如杂志和墙纸等),各种尺寸、颜色、角度的条纹图案在视觉设计中无处不在。要想在网页中实现条纹图案,其过程还远远不够理想。通常,我们的方法是创建一个单独的位图文件,然后每次需要做些调整时,都用图像编辑器来修改它。可能有人试过用SVG 来取代位图,但这样还是会有一个独立的文件,而且它的语法也远远不够友好。如果可以直接在CSS 中创建条纹图案,那该有多棒啊!你可能会惊讶地发现,我们居然真的可以。

解决方法:

  假设我们有一条基本的垂直性渐变,颜色从▇#fb3过渡到▇#58a

background:linear-gradient(#fb3,#58a);

  现在,让我们试着把这两个色标拉近一点:

background:linear-gradient(#fb3 20%, #58a 80%);

  现在容器顶部的20%区域被填充为▇#fb3实色,而底部20%区域被填充为▇#58a实色。真正的渐变只出现在容器60%的高度区域。如果我们把两个色标继续拉近(分别改为40%和60%),那真正的渐变区域就变得更窄了。

你是不是开始好奇,如果我们把两个色标重合在一起,会发生什么?

background:linear-gradient(#fb3 50%, #58a 50%);

  在上图中可以看到,已经没有任何渐变效果了,只有两块实色,各占据了background-image一半的面积。本质上,我们已经创建了两条巨大的水平条纹。

  因为渐变是一种由代码生成的图像,我们能像对待其他任何背景图像那样对待它,而且还可以通过background-size来调整其尺寸:

background:linear-gradient(#fb3 50%, #58a 50%);
background-repeat: no-repeat;
background-size: 100% 50px;

  上图中可以看到,我们把这两条条纹的高度都缩小到了25px。由于背景在默认情况下是重复平铺的,整个容器其实已经被填满了水平条纹。

  我们还可以用相同的方法来创建不等宽的条纹,只需调整色标的位置值即可。

background:linear-gradient(#fb3 30%, #58a 30%);
background-size: 100% 50px;

  为了避免每次改动条纹宽度时都要修改两个数字,我们可以再次从规范那里找到捷径。

如果某个色标的位置值比整个列表中在它之前的色标位置值都要小,则该色标的位置值会被设置为它前面所有色标位置值的最大值 。---CSS图像(第三版)

  这意味着,如果我们把第二个色标的位置值设置为0,那它的位置就总是被浏览器调整为前一个色标的位置值,这个结果正是我们想要的。因此,下面的代码会产生和上图完全一样的条纹背景,但代码会更加DRY:

background:linear-gradient(#fb3 30%, #58a 0);
background-size: 100% 50px;

  如果要创建超过两种颜色的条纹,也是很容易的。举例来说,下面的代码可以生产三种颜色的水平条纹:

background:linear-gradient(#fb3 33.3%, #58a 66.6%,yellowgreen 0);
background-size: 100% 45px;

垂直条纹

  水平条纹是最容易用代码写出来的,但我们在网页上看到的条纹图案并不都是水平的。有些条纹是垂直的,而且某些形态的斜条纹或许更受欢迎,或者看起来更有趣。幸运的是,CSS渐变同样也能帮助我们创建出这些效果,只是难度稍有不同。

  垂直条纹的代码跟水平条纹几乎是一样的,差别主要在于:我们需要在开头加上一个额外的参数来指定渐变的方向。在水平条纹的代码中,我们其实也可以加上这个参数,只不过它的默认值to bottom本来就跟我们的意图一致,于是就省略了。最后,我们还需要把background-size的值颠倒一下,原因应该不用多说了吧。

background:linear-gradient(to right,#fb3 50%, #58a 0);
background-size: 50px 100%;

斜向条纹

  在完成了水平和垂直条纹之后,我们可能会顺着往下想:如果我们再次改变background-size的值和渐变的方向,是不是就可以得到斜向(比如45%)的条纹图案呢?比如这样:

background:linear-gradient(45deg,#fb3 50%, #58a 0);
background-size: 50px 50px;

  可以发现,这个办法行不通,原因在于我们只是把每个“贴片”内部的渐变旋转了45°,而不是把整个重复的背景都旋转了。试着回忆一下我们以前用位图来生成斜向条纹时是怎么做的吧,做法类似下图:

  单个贴片包含了四条条纹,而不是两条,只有这样才有可能做到无缝拼接。它正是我们需要在CSS代码中实现的贴片,因此我们需要增加一些色标:

background:linear-gradient(45deg,#fb3 25%, #58a 0, #58a 50%,#fb3 0, #fb3 75%,#58a 0);background-size: 50px 50px;
background-size: 50px 50px;

(图a)

更好的斜向条纹

  在前面的段落中展示的方法还不够灵活。假设我们想让条纹不是45°而是60°怎么办?或者是30°?又或者是3.14  592 653  5°?如果我们只是把渐变的角度改一下,那么结果看起来会相当糟糕,比如下图中,我们尝试实现60°条纹,但以失败告终。

background:linear-gradient(60deg,#fb3 25%, #58a 0, #58a 50%,#fb3 0, #fb3 75%,#58a 0);background-size: 50px 50px;
background-size: 50px 50px;

  幸运的是,我们还有更好的办法来创建斜向条纹。一个鲜为人知的真相是linear-gradient() 和radial-gradient() 还各有一个循环式的加强版:repeating-linear-gradient() 和repeating-radial-gradient()。它们的工作方式跟前两者类似,只有一点不同:色标是无限循环重复的,直到填满整个背景。下面是一个重复渐变的例子:

background: repeating-linear-gradient(45deg,#fb3, #58a 50px);

  它相当于下面这个简单的线性渐变:

background: linear-gradient(45deg,
#fb3, #58a 50px,
#fb3 50px, #58a 100px,
#fb3 100px, #58a 150px,
#fb3 150px, #58a 200px,
#fb3 200px, #58a 250px,...);

  重复线性渐变完美适用于条纹效果!这得益于他们可以无限循环的天赋,一个渐变图案就可自动重复并铺满整个背景。因此,我们再也不需要去操心如何创建出无缝拼接的贴片了。

  做个对比,我们在图a中创建的效果也可以由这个重复渐变来生成:

background: repeating-linear-gradient(45deg,#fb3,#fb3 25px,#58a 0,#58a 50px);

(图b)

  第一个明显的好处就是减少了重复:我们要改动任何颜色时只需要修改两处,而不是原来的三处。另外一点也很重要,我们现在是在渐变的色标中指定长度,而不是原来的background-size。这里的background-size是初始值,对渐变来说就是以整个元素的范围进行填充。这意味着代码中的长度值更加直观,因为这些长度是直接在渐变轴上进行度量的,直接代表了条纹自身的宽度。

  不管这还不是最大的好处。最大的好处在于,现在我们可以随心所欲地改变渐变的角度了,指哪儿打哪儿,再也不需要苦苦思索如何生成一个无缝贴片。举例来说,我们苦苦追寻的60°条纹只需这样写即可:

background: repeating-linear-gradient(60deg,#fb3,#fb3 25px,#58a 0,#58a 50px);

  这简单到只需要改变角度就可以了!请注意,在这个方法中,不论条纹的角度如何,我们在创建双色条纹时都需要用到四个色标。这意味着,我们最好用前面的方法来实现水平或垂直的条纹,而用这种方法来实现斜向条纹。另外,在处理45°条纹时,我们甚至可以把这两种方法结合起来,本质上是通过重复线性渐变来简化贴片的代码:

background: repeating-linear-gradient(45deg,#fb3 0,#fb3 25%,#58a 0,#58a 50%);
background-size: 42.4264px 42.4264px;

灵活的同色系条纹

  在大多数情况下,我们想要的条纹图案并不是由差异极大的几种颜色组成的,这些颜色往往属于同一色系,只是在明度方面有着轻微的差异。举个例子,我们来看看这个条纹图案:

background: repeating-linear-gradient(30deg,#79b 0,#79b 25px,#58a 0,#58a 50px);

  在上图中,条纹由一个主色调▇#58a和它的浅色变体所组成的。但是这两种颜色之间的关系在代码中并没有体现出来。此外,如果我们想要改变这个条纹的主色调,甚至需要修改四处!

  幸运的是,还有一种更好的方法:不在为每种条纹单独指定颜色,而是把最深的颜色指定为背景色,同时把半透明白色的条纹叠加在背景色之上来得到浅色条纹。

background: #58a;
background-image: repeating-linear-gradient(50deg,
hsla(0, 0%, 100%, .1),
hsla(0, 0%, 100%, .1) 25px,
transparent 0, transparent 50px);

  结果看起来跟上图是一模一样的,但我们现在只需要修改一个地方就可以改变所有颜色了。我们还得到了一个额外的好处,对于那些不支持CSS渐变的浏览器来说,这里的背景色还起到了回退的作用。

利用CCS3渐变实现条纹背景的更多相关文章

  1. 用css实现条纹背景

    我先额外的说一下怎么用CSS绘制三角形: 绘制三角形是把边框加粗,将元素的宽高都设为0,让其余的边框颜色透明,下面我们来看实现的代码: 先把边框的颜色设置成不同颜色: #div{ border-col ...

  2. 《CSS3揭秘》上(边框,投影,渐变,条纹效果,蚂蚁行军)

    最近看了<CSS3揭秘>一书,里面真的是干货满满呀,现将常用到的一些技巧归纳总结,便于日后用到查找.不得不感叹学无止境哦~ 1.边框与背景 半透明边框 .demo{ background- ...

  3. CSS揭秘 技巧(五):条纹背景

    条纹背景 https://github.com/FannieGirl/ifannie/问题:条纹背景 在设觉设计中无处不在,我们真的可以用css 创建图案吗? 这一章相对还是比较复杂的哦!一起get. ...

  4. css条纹背景

    一. 水平条纹 1. 两种颜色: html <div class="stripe"></div> css .stripe{ width: 250px; he ...

  5. [css 揭秘] :CSS揭秘 技巧(五):条纹背景

    条纹背景 https://github.com/FannieGirl/ifannie/问题:条纹背景 在设觉设计中无处不在,我们真的可以用css 创建图案吗? 这一章相对还是比较复杂的哦!一起get. ...

  6. css条纹背景样式、及方格斜纹背景的实现

    一.横向条纹如下代码: background: linear-gradient(#fb3 %, #58a %) 上面代码表示整个图片的上部分20%和下部分20%是对应的纯色,只有中间的部分是渐变色.如 ...

  7. 借助Html制作渐变的网页背景颜色

    借助Html制作渐变的网页背景颜色 <html> <head> <title>制作渐变背景</title> <meta http-equiv=&q ...

  8. CSS3利用背景渐变和background-size配合完成渐变与条纹效果[持续更新中...]

    1.不等垂直条纹. <!-- 不等垂直条纹 --> <div class="div1"></div>div1 div{ width: 200px ...

  9. css 条纹背景

    先介绍文章用到的二个知识点 background-size 属性 语法 background-size: length|percentage|cover|contain; css线性渐变 linear ...

随机推荐

  1. 《从Lucene到Elasticsearch:全文检索实战》学习笔记三

    今天我给大家讲讲倒排索引. 索引是构成搜索引擎的核心技术之一,它在日常生活中是非常常见的,比如我看一本书的时候,我首先会看书的目录,通过目录可以快速定位到具体章节的页码,加快对内容的查询速度. 文档通 ...

  2. solr 学习笔记(一)--搜索引擎简介

    一 搜索引擎是什么一套可对大量结构化.半结构化数据.非结构化文本类数据进行实时搜索的专门软件最早应用于信息检索领域,经谷歌.百度等公司推出网页搜索而为大众广知.后又被各大电商网站采用来做网站的商品搜索 ...

  3. django 生产环境部署建议

    参考django官方建议 一种优秀的作法是使用前缀/ws/来区分WebSocket连接和普通HTTP连接,以便修改配置后,使Channels更容易部署到生产环境中. 特别是对于大型站点,可以配置像ng ...

  4. VS2010+WPF+LINQ for MySQL

    学习wpf,连接数据库和linq for mysql 1.参考以前博文,恢复在 Vs2010+linQ for Mysql的环境. 2.建立 wpf工程,参照1,生成 datacontext.cs , ...

  5. C# Windows Service 基础

    Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的.所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Window ...

  6. Browser Render Engine & Javascript Engine

    Browser Render Engine Programming Language Open Source Javascript Engine Comparation for CSS Compati ...

  7. Android SurfaceView及TextureView对比

    SurfaceView是什么? 它继承自类View,因此它本质上是一个View.但与普通View不同的是,它有自己的Surface.有自己的Surface,在WMS中有对应的WindowState,在 ...

  8. 使用IDE之webstorm

    最近打算试试用webstorm,今天从vscode换成了webstorm. 官方下载webstorm 1.下载之后安装,我全部选择默认,因为webstorm是付费ide,到启动面板时,选择激活选项. ...

  9. 采用ddt 可以把ddt获取的数据 塞进测试用例里面的备注里面去展示 (还没有试)

  10. 廖雪峰Java6 IO编程-2input和output-7序列化

    1.序列化 序列化是指把一个Java对象变成二进制内容byte[] 序列化后可以把byte[]保存到文件中 序列化后可以把byte[]通过网络传输 一个Java对象要能序列化,必须实现Serializ ...