《CSS Secrets》是@Lea Verou最新著作,这本书讲解了有关于CSS中一些小秘密。是一本CSSer值得一读的一本书,经过一段时间的阅读,我、@南北和@彦子一起将在W3cplus发布一系列相关的读后感,与大家一起分享。

问题

虽然平铺几何图形很棒,但看起来还是有点乏味。而在自然界中,万事万物皆有不同。即使是在相似中,也充满了变化和随机因素。你可以看一看花圃:虽然花朵具有一致的艳丽,但也各有各的亮点。这个世界上没有任何两朵花是相同的。这就是为什么我们要尝试让背景图案接近真实,而且我们也在尝试让平铺的元素之间尽量减少缝隙,让它们显得浑然天成自成一体,但是这也会让样式文件的大小超出我们的预期。

当你发现了某些独特的特性——比如木头纹理上特定距离就会出现的结,就会打破随机性这种感觉

— Alex Walker, The Cicada Principle and Why It Matters to Web Designers

模拟随机是一件非常具有挑战性的事情,因为 CSS 并没有任何创造随机性的能力。让我们重新拿起条纹这个示例,假设我们想要得到拥有各种颜色和宽度的垂直条纹(让我们简化为四种颜色吧),并且还要让它们之间过渡自然。我们的第一个想法可能就是创建一个渐变:

background: linear-gradient(90deg,

#fb3 15%, #655 0, #655 40%,

#ab4 0, #ab4 65%, hsl(20, 40%, 90%) 0);

background-size: 80px 100%;

就像下图看到的那样

图注:实现伪随机条纹的初次尝试,其中所有的颜色都是由相同的线性渐变生成的

非常明显就分辨出了重复元素,这主要是因为它只重复了 80px(background-size)。我们可以做得更好吗?

解决方案

对于这一问题,我的第一个想法就是将整个的条纹分成不同块,然后增加这些块的随机性:一个基色和三个条纹层,在不同的距离上实现平铺。通过硬编码颜色过渡点的位置,我们可以改变条纹的宽度,通过使用 backgroud-size,我们可以控制间距,最终就能实现上面的初步设想了:

background: hsl(20, 40%, 90%);

background-image:

linear-gradient(90deg, #fb3 10px, transparent 0),

linear-gradient(90deg, #ab4 20px, transparent 0),

linear-gradient(90deg, #655 20px, transparent 0);

background-size: 80px 100%, 60px 100%, 40px 100%;

因为最顶层的平铺将会最容易被注意到(因为它覆盖了所有的图层),所以我们对最上面的一层施加最大的间歇性间距(在本例中,就是桔黄色条纹)。

图注:第二次尝试,通过不同的 background-size 让不同的图层发生重叠;虚线框内的图案是用来平铺的图案

正如上图中所看到的那样,整体看起来随机多了,但如果我们仔细观察,还是能意识到每 240px 就会有一次重复。也就是说,在此类组合中,所有重复块的偏移量就是第一个非重复条纹终点位置的一倍或数倍。也许你还记得在学校里我们学过的最小公倍数(LCM,Least Common Multiple),它是一个整数集合中所有整数的一倍或多倍。因此,这里条纹块的大小就是背景大小的最小公倍数,即 40/60/80,它们的最小公倍数就是 240。

上面的示例就遵循了这一不易察觉的随机性,所以我们需要增大平铺条纹块的大小。感谢数学的存在,无需漫长和痛苦的计算我们就可以实现它,因为我们已经知道了答案。为了达到最大的最小公倍数,那么这些数之间必须互质。在本例中,最小公倍数就是由它们得出来的。比如,3/4/5 就互为质数,所以它们的最小公倍数就是 3 × 4 × 5 = 60。让数值互为质数的最简单方式就是让它们是质数,在数学上质数和其他任何数都互为质数。质数的列表在网络上随处可见。

为了保持最大的随机性,我们甚至使用质数来设计条纹的宽度。这就是我们的代码:

background: hsl(20, 40%, 90%);

background-image:

linear-gradient(90deg, #fb3 11px, transparent 0),

linear-gradient(90deg, #ab4 23px, transparent 0),

linear-gradient(90deg, #655 41px, transparent 0);

background-size: 41px 100%, 61px 100%, 83px 100%;

是的,代码很难看,但是效果如下图所示:

图注:最终的条纹,使用质数来增加随机性

现在我们的条纹至少 41 × 61 × 83 = 207583px 才会平铺一次,完全超出了一个屏幕分辨率所能容纳的数量。

上面的技巧(使用质数增加背景平铺时的随机性)被称为 “The Cicada Principle”,由 Alex Walker 第一次提出。值得注意的是,这不仅仅对背景有用,而且对需要平铺的任何事情都有用。其他的应用包括但不限于:

为一个图库中图片的旋转角度增加一点点随机性,可以使用 :nth-child(an) 选择器,其中 a 为质数。

为动画的运动过程添加一些随机性,那么可以添加多个以质数为时间长度的持续时间(点击这里查看示例)

向提出这一技巧的 Alex Walker 致敬, The Cicada Principle and Why It Matters to Web Designers。 Eric Meyer 随后提出了 Cicadients 这一概念, 其中就包含了将该技巧通过 CSS 渐变添加到背景图片上。Dudley Storey 也就该概念发表了大量非常有价值的文章.

总结

前面介绍的内容,不管是使用渐变实现的线性渐变还是径向渐变,或者说是复杂的纹理背景,都是具有一定的规律性。在这一节中主要向大家阐述了如何实现随机性的背景图效果。

css背景随机,CSS秘密花园:随机背景相关推荐

  1. html图片背景属性,css 背景(background)属性、背景图定位

    background属性: Background属性是css中应用比较多,且比较重要的一个属性,它是负责给盒子设置背景图上和背景颜色的,background是一个复合属性,它可以分解成如下几个设置项: ...

  2. 随机背景在随机位置添加随机颜色的文字

    功能:根据给的中文字符串,取随机的图片为背景,将字符串中的每个字都随机显示在图片上,并偏斜一定的角度. 后端图片处理类,会返回图片对应的宽.高.旋转角度.旋转前起始x.y及文字四个角的x.y坐标: c ...

  3. so easy - CSS实现位置和大小随机的烟花绽放效果

    点击上方关注 前端技术江湖,一起学习,天天进步 最近项目上需要做一个烟花动画,要求是随机大小,不同地方出现,先看效果 Kapture 2021-08-20 at 23.17.31 一.选择合适的动画 ...

  4. 超实用CSS技巧总结(1)——背景和边框

    文章内容来自CSS神书<CSS揭秘>. 献上膝盖就好 1.半透明边框 错误的写法: div {background-color: white;border: 10px solid hsla ...

  5. 有趣的HTML实例(八) 一个很有趣的动态背景(css+js)

    小时候,谁都觉得自己的未来闪闪发光,不是吗?但是一旦长大,没有一件事会遂自己心愿. --<被嫌弃的松子的一生> 目录 一.前言 二.往期作品回顾 三.作品介绍 四.本期代码介绍 五.效果显 ...

  6. CSS background 之设置图片为背景技巧

    首先先来看看background有那些值: 可以按顺序设置如下属性(可点击进入相应的css手册查看使用): background-color 背景颜色 background-image 背景图片 ba ...

  7. 前端笔记(4)css,复合选择器,标签的显示模式,行高,css背景,css三大特性

    css样式表/层叠样式表(2) (1)css复合选择器 后代选择器 子元素选择器 交集选择器(不常用) 并集选择器 链接伪类选择器 (2)标签的显示模式 块级元素block-level 行内元素inl ...

  8. 10_css控制背景与css精灵.txt

    CSS控制背景 1.背景 background:颜色 图片 平铺方式 固定方式 位置 2.背景颜色 background-color:#ccc; 3.背景图片 background-p_w_picpa ...

  9. CSS基础(part9)--CSS背景

    学习笔记,仅供参考,有错必纠 文章目录 CSS CSS背景 背景颜色(color) 背景图片(image) 背景平铺(repeat) 背景位置(position) 背景附着(attachment) 背 ...

  10. vue在html中写style,vue开发之style(六)(CSS页面布局之样式、背景、文字)

    最近在学vue开发,并且将学习笔记与大家一起分享,前面讲了vue环境的搭建: 基于vscode的Vue前端环境搭建问题及解决办法 还有vue的使用,重点就在webpack这个: vue开发之webpa ...

最新文章

  1. 机房配电柜、配电箱在安装时应该注意哪些“禁忌”?
  2. Linux终端光标消失问题
  3. phpstorm9 增加对.vue的支持
  4. 淘宝客程序 —— 突破了传统淘宝客程序对自动采集商品收费的模式
  5. 提升存储设备的吞吐量
  6. vivo又有新机跑分曝光 机海战术要来了?
  7. 我的八年程序之路(二)三月方便面换来800月薪
  8. 引用类型和值类型学习笔记
  9. python可以做什么工作-Python入门后,想要从事自由职业可以做哪方面工作?
  10. vue属性绑定加载图片不成功
  11. SCSA网络安全----信息安全概述
  12. javascript XMLHttpRequest实现下载文件
  13. scratch 极简坦克大战
  14. 32 Pin和 8 Pin(引脚 )flash烧录操作指导
  15. 微信小程序跳转至京东店铺首页
  16. Cannot resolve the name 'repository:auditing-attributes' to a(n) 'attribute grou
  17. PV,UV,VV 含义
  18. 这篇文章来告诉你几个实用的视频转文字的方法
  19. 如何在 ggplot2 中制作饼图(附示例)
  20. 美国犹他大学计算机专业怎么样,犹他大学最热门专业,了解一下?

热门文章

  1. 阿里董事局主席张勇:数字化建设将成为新发展方向
  2. 江哥带你玩转C语言| 12 -二维数组和字符串
  3. 芯片行业模式优缺点及巨头代表梳理
  4. 2023年留学生入户广州户口条件会有哪些
  5. 【Java例题】2.8 解一元二次方程
  6. https://b23.tv/av...【相关研究】
  7. python 基础系列(十二) — python正则
  8. 杜克大学2年前的研究上热搜!单身竟然还老得快?太难了!!!
  9. 红米K20充不进电导致问题扩大手机直接不开机维修方法很简单
  10. 什么是IMEI / MEID?他们有什么不同?