使用CSS实现多种Noise噪点效果
创始人
2024-02-26 19:12:08

在插画中添加噪点肌理可以营造出一种自然的氛围。噪点肌理可以用于塑造阴影、高光、深度以及更多细节,并优化插画质感,应用噪点肌理的方式在扁平插画中广受欢迎。

在前端开发过程中,我们也有可能遇到噪点插画风格的设计稿,应用基础的前端开发知识,能不能实现噪点风格的样式呢,本文主要内容主要就是通过几个示例来实现几种噪点效果。本文包含的知识点包括:CSS 属性 mask 遮罩、SVG 滤镜 feTurbulenceCSS 属性 filter 滤镜、CSS 属性 mix-blend-mode 元素混合、CSS 属性 image-rendering 图像缩放等。

开始本文主要内容之前,我们先来欣赏几张设计师在插画作品中应用噪点肌理的优秀例子。

作品链接 dribbble.com

作品链接 dribbble.com

作品链接 dribbble.com

知识汇总

PS 实现

在 Photoshop 中增加噪点效果的基础操作方法:

  • 混合模式(溶解)+ 柔和笔刷(做暗灰亮)
  • 添加材质(正片叠底)
  • 图层样式(内阴影,投影等)
  • 噪点笔刷绘制

知识点

本文中将用到以下几个 CSS 特性,正式开发之前先简单了解下。

💡 mask

CSS 属性 mask 允许使用者通过遮罩或者裁切特定区域的图片的方式来隐藏一个元素的部分或者全部可见区域。

基本用法

// 使用位图来做遮罩
mask: url(mask.png);
// 使用 SVG 图形中的形状来做遮罩
mask: url(masks.svg#star);

🔗 详细用法可访问:MDN

💡 feTurbulence

在 SVG 中,feTurbulence 滤镜利用 Perlin 噪声函数创建了一个图像。它实现了人造纹理比如说云纹、大理石纹的合成。本文中将利用该滤镜生成噪点背景图片。

🔗 详细用法可访问:MDN

💡 filter

CSS 属性 filter 将模糊或颜色偏移等图形效果应用于元素。可以为元素添加滤镜效果,本文中主要应用它来增强噪点视觉效果。

🔗 详细用法可访问:MDN,也可访问我的另外一篇文章《CSS filter 有哪些神奇用途》,其中有 filter 应用的详细介绍。

💡 mix-blend-mode

CSS 属性 mix-blend-mode 描述了元素的内容应该与元素的直系父元素的内容和元素的背景如何混合。

基本语法

mix-blend-mode: normal;
mix-blend-mode: multiply;
mix-blend-mode: screen;
mix-blend-mode: overlay;
mix-blend-mode: darken;
mix-blend-mode: lighten;
mix-blend-mode: color-dodge
mix-blend-mode: color-burn;
mix-blend-mode: hard-light;
mix-blend-mode: soft-light;
mix-blend-mode: difference;
mix-blend-mode: exclusion;
mix-blend-mode: hue;
mix-blend-mode: saturation;
mix-blend-mode: color;
mix-blend-mode: luminosity;
mix-blend-mode: initial;
mix-blend-mode: inherit;
mix-blend-mode: unset;

不同 mix-blend-mode 效果:

🔗 详细用法可访问:MDN

💡 image-rendering

CSS 属性 image-rendering 用于设置图像缩放算法。它适用于元素本身,适用于元素其他属性中的图像,也应用于子元素。

基本语法

image-rendering: auto;
image-rendering: crisp-edges;
image-rendering: pixelated;

其中:

  • auto:自动,自 Gecko 1.9 起,使用双线性算法进行重新采样。
  • crisp-edges:必须使用可有效保留对比度和图像中的边缘的算法来对图像进行缩放,并且,该算法既不会平滑颜色,又不会在处理过程中为图像引入模糊。
  • pixelated:放大图像时,使用最近邻居算法,因此,图像看着像是由大块像素组成的。缩小图像时,算法与 auto 相同。

🔗 详细用法可访问:MDN

效果

以下页面是本文实现的多种噪点效果。

  • 👀 在线预览: https://codepen.io/dragonir/full/rNdrmzB
  • 👀 在线预览: NOISE 噪点

实现

定义 CSS 全局变量。

:root {--black: #000000;--blue: #0072ff;--green: #03c03c;--yellow: #fffc00;--red: #ff4b2b;--orange: #f5af19;--pink: #ee9ca7;--purple: #a770ef;
}

创建一个 SVG 噪点背景,后续将使用创建的 SVG 元素作为其他元素的噪点背景。



类型0 🌚

通过给 background 添加 linear-gradient 和噪点图片背景,就可实现渐变的噪点效果。

.noise_0 {background: linear-gradient(to right bottom, var(--black), rgba(0, 0, 0, 0)), url(#noise);
}

类型1 🌑

在上面的基础上,通过修改 filter 属性的对比度 contrast 和亮度 brightness,增强噪点效果得对比度。

.noise_1 {filter: contrast(200%) brightness(150%);
}

类型2 🌒

使用 mix-blend-mode: multiply 实现混合双色渐变的噪点效果。

.noise_2 {position: relative;
}
.noise_2 .isolate {isolation: isolate;position: relative;width: 100%;height: 100%;
}
.noise_2 .overlay {position: absolute;top: 0;width: 100%;height: 100%;background: var(--purple);mix-blend-mode: multiply;
}
.noise_2 .gradient {height: 100%;width: 100%;filter: contrast(200%) brightness(150%);background: linear-gradient(to right bottom, var(--black), rgba(0, 0, 0, 0)), url(#noise);
}

类型3 🌓

圆形的噪点元素。

.noise_3 {border-radius: 50%;
}
.noise_3 {background: var(--black);
}
.noise_3 .gradient {width: 100%;height: 100%;background: radial-gradient(circle at 100% 0, transparent 20%, #cccccc 80%);mask: url(#noise), radial-gradient(circle at 100% 0, transparent 10%, #000 60%);
}

类型4 🌔

球形的噪点元素,给圆形噪点添加地面阴影和光照效果就能形成立体的球体效果。


类型5 🌕

其他 3D 立体形状,包括球体、布丁 🍮、水滴 💧、花瓶 🏺、鸡蛋 🥚、红细胞 💉等,🖱 鼠标悬浮到元素上面可以看到三维旋转效果。

.item {background-color: #ffecd2;box-shadow: -5px 18px 25px -15px;overflow: hidden;transition: all 0.2s ease-out;image-rendering: pixelated;
}
.item::before {content: "";position: absolute;display: block;top: 0;left: 0;height: 100%;width: 400%;mask: url(#noise), radial-gradient(circle at 50% 0, transparent 5%, #000 80%) 0 0/50% 100%;
}
.item:hover {transform: scale(1.05);
}
.item:hover.item::before, .item:hover.item::after {animation: spin-round 3.5s linear infinite;
}
.item:active {animation: hue-rotate 7s infinite;
}
.item--sphere {border-radius: 50%;
}
.item--egg {width: 100.1px;border-radius: 50% 50% 50% 50%/60% 60% 40% 40%;
}
.item--pudding {width: 130px;height: 130px;border-radius: 50% 50% 10% 10%;
}
.item--pudding::after {content: "";position: absolute;top: 0;display: block;top: 0;left: 0;height: 100%;width: 400%;mask: url(#noise), radial-gradient(circle at 50% 0, transparent 55%, #000 85%) 0 0/50% 100%;
}
.item--droplet {width: 100.1px;height: 100.1px;border-radius: 5% 100% 50% 65%/5% 65% 50% 100%;transform: rotate(45deg);box-shadow: 5px 18px 25px -15px;
}
.item--droplet:hover {transform: rotate(45deg) scale(1.05);
}
.item--vase {position: relative;width: 80px;height: 130px;border-radius: 40% 40% 70% 70%/100%;
}
.item--vase::after {content: "";position: absolute;top: 0;display: block;top: 0;left: 0;height: 100%;width: 400%;mask: url(#noise), radial-gradient(circle at 50% 0, transparent 55%, #000 90%) 0 0/50% 100%;
}
.item--cell {width: 130px;height: 130px;border-radius: 50%;color: #ff4d5d;background: radial-gradient(circle at 100% 0, #ffa878 5%, transparent 75%), #ff4d5d;
}
.item--cell::before {top: 50%;left: 50%;transform: translate(-50%, -50%);width: 90px;height: 90px;border-radius: 50%;background: radial-gradient(circle at 0 75%, transparent 20%, #98000e 65%);mask: url(#noise), radial-gradient(circle at 50%, transparent 25%, #000 75%);
}
.item--cell:hover {animation: spin-flat-thick 3.5s linear infinite;
}
.item--cell:hover.item--cell::before {animation: spin-flat 3.5s linear infinite;
}
.item--cell:hover:active {animation: spin-flat-thick 3.5s linear infinite, hue-rotate 7s linear infinite;
}
.item--color1 {color: #7f5fff;
}
.item--color1::before {background: repeat-x 100% 0/50% 100% radial-gradient(circle at 50% 0, transparent 25%, #7f5fff 65%);
}
.item--color5 {color: #3d1635;background-color: #ffecd2;
}
.item--color5::before {background: repeat-x 100% 0/50% 100% radial-gradient(circle at 50% 0, transparent 15%, #e7627d 45%);
}
.item--color5::after {background: repeat-x 100% 0/50% 100% radial-gradient(circle at 50% 0, transparent 50%, #3d1635 75%);
}
.item--color6 {background-color: #72f9c1;color: #5193ff;
}
.item--color6::before {background: repeat-x 100% 0/50% 100% radial-gradient(circle at 50% 0, transparent 25%, #5193ff 65%);
}
.item--color7 {color: #5e21d6;background-color: #fec440;
}
.item--color7::before {background: repeat-x 100% 0/50% 100% radial-gradient(circle at 50% 0, transparent 15%, #fd2472 45%);
}
.item--color7::after {background: repeat-x 100% 0/50% 100% radial-gradient(circle at 50% 0, transparent 50%, #5e21d6 75%);
}
.item--color8 {color: #222;
}
.item--color8::before {background: repeat-x 100% 0/50% 100% radial-gradient(circle at 50% 0, transparent 25%, #222 65%);
}

类型6 🌝

多个噪点元素地叠加可以生成非常惊艳的效果,比如通过将三个噪点元素层叠在一起可以实现光学三原色 RGB 效果。

.noise_6 .circle {filter: contrast(145%) brightness(650%) invert(100%);mix-blend-mode: screen;
}
.noise_6 .noise-1 {position: absolute;top: 0;left: -10%;background: radial-gradient(circle at 50% 50%, rgba(0,255,255,1), rgba(0,0,0,0)), url(#noise);
}
.noise_6 .noise-2 {position: absolute;left: 10%;top: -30px;background: radial-gradient(circle at 50% 50%, rgba(255,0,255,1), rgba(0,0,0,0)), url(#noise);
}
.noise_6 .noise-3 {position: absolute;top: 50px;left: 4%;background: radial-gradient(circle at 50% 50%, rgba(255,255,0,1), rgba(0,0,0,0)), url(#noise);
}

类型7 🌙

利用噪点元素还可以实现什么呢?中心扩散效果,太阳,涟漪,荷包蛋……


背景噪点 🌜

如果仔细观察的话,页面黑色背景也应用了噪点效果,是不是有一种黑白电视机的雪花屏复古感 😂

.bg {position: fixed;top: -50%;left: -50%;right: -50%;bottom: -50%;width: 200%;height: 200vh;background: transparent url(#noise) repeat 0 0;background-repeat: repeat;animation: bg-animation .2s infinite;opacity: .9;visibility: visible;
}
@keyframes bg-animation {0% { transform: translate(0,0) }10% { transform: translate(-5%,-5%) }20% { transform: translate(-10%,5%) }30% { transform: translate(5%,-10%) }40% { transform: translate(-5%,15%) }50% { transform: translate(-10%,5%) }60% { transform: translate(15%,0) }70% { transform: translate(0,10%) }80% { transform: translate(-15%,0) }90% { transform: translate(10%,5%) }100% { transform: translate(5%,0) }
}

📥 完整代码:GitHub - dragonir/noise: noise 噪点效果

总结

本文主要包含的知识点包括:

  • CSS 属性 mask 遮罩
  • SVG 滤镜 feTurbulence
  • CSS 属性 filter 滤镜
  • CSS 属性 mix-blend-mode 元素混合
  • CSS 属性 image-rendering 图像缩放

相关内容

热门资讯

应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...