Disclaimer: The graphic and model materials involved in this article are only for personal study, research and appreciation. Please do not re-modify, illegally spread, reprint, publish, commercialize, or conduct other profit-making activities.
background
Adding noise texture to an illustration can create a natural atmosphere. Noise texture can be used to shape shadows, highlights, depth, and more details, and optimize the texture of the illustration. The way of applying noise texture is very popular in flat illustrations.
In the front-end development process, we may also encounter design drafts in the style of noise illustrations. Applying the basic knowledge of front-end development, can we realize the style of noise styles? The main content of this article is to achieve several kinds of noise effects through several examples.本文包含的知识点包括: CSS
mask
607faca5f17d2696045507f8524d56b8---遮罩、 SVG
6271ec3b310cddb64d4daafa8a98622c feTurbulence
、 CSS
filter
、 CSS
mix-blend-mode
、 CSS
属性---cb20f32136f6d7749b6a1914c15dd47a image-rendering
。
Before getting into the main content of this article, let’s take a look at some excellent examples of designers using noise textures in their illustrations.
Works link dribbble.com
Works link dribbble.com
Works link dribbble.com
Knowledge summary
PS implementation
The basic operation method of adding noise effect in Photoshop
:
- Blend Mode (Dissolve) + Soft Brush (make dark gray light)
- Add Material (Multiply)
- Layer styles (inner shadow, drop shadow, etc.)
- Noise brush painting
Knowledge point
The following CSS
features will be used in this article. Before the official development, let's briefly understand them.
💡
mask
CSS
Attribute mask
Allows the user to hide part or all of the visible area of an element by masking or cropping a specific area of the image.
Basic usage :
// 使用位图来做遮罩
mask: url(mask.png);
// 使用 SVG 图形中的形状来做遮罩
mask: url(masks.svg#star);
🔗
detailed usage, please visit: MDN
💡
feTurbulence
The SVG
中,feTurbulence
filter creates an image using the Perlin
noise function. It realizes the synthesis of artificial textures such as moiré and marble. This filter will be used in this article to generate a noisy background image.
🔗
detailed usage, please visit: MDN
💡
filter
CSS
Properties filter
Apply graphic effects such as blur or color shift to the element. You can add filter effects to elements, which are mainly used in this article to enhance the visual effect of noise.
🔗
detailed usage, please visit: MDN , or visit my other article "What are the magical uses of CSS filter" , which has a detailed introduction to the application offilter
.
💡
mix-blend-mode
CSS
Attribute mix-blend-mode
describes how the content of the element should blend with the content of the element's immediate parent and the background of the element.
Basic syntax :
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;
Different mix-blend-mode
Effect:
🔗
detailed usage, please visit: MDN
💡
image-rendering
CSS
Attribute image-rendering
used to set the image scaling algorithm. It applies to the element itself, to images in other attributes of the element, and to child elements as well.
Basic syntax :
image-rendering: auto;
image-rendering: crisp-edges;
image-rendering: pixelated;
in:
-
auto
: Automatic, sinceGecko 1.9
, use bilinear algorithm for resampling. -
crisp-edges
: The image must be scaled using an algorithm that effectively preserves contrast and edges in the image, and that neither smoothes colors nor introduces blur to the image during processing. -
pixelated
: When zooming in on the image, the nearest neighbor algorithm is used, so the image appears to be composed of large blocks of pixels. When scaling down the image, the algorithm is the same asauto
.
🔗
detailed usage, please visit: MDN
Effect
The following pages are the various noise effects implemented in this article.
-
👀
Online preview: https://codepen.io/dragonir/full/rNdrmzB -
👀
Online preview: https://dragonir.github.io/noise/
accomplish
Define CSS
global variable.
:root {
--black: #000000;
--blue: #0072ff;
--green: #03c03c;
--yellow: #fffc00;
--red: #ff4b2b;
--orange: #f5af19;
--pink: #ee9ca7;
--purple: #a770ef;
}
Create a SVG
noise background, and then use the created SVG
element as the noise background for other elements.
<svg viewBox="0 0 200 200" xmlns='http://www.w3.org/2000/svg'>
<filter id='noise'>
<feTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch' />
</filter>
<rect width='100%' height='100%' filter='url(#noiseFilter)' />
</svg>
Type 0 🌚
Gradient noise effect can be achieved by adding ---ba2bd5fe45b2f97509f1df5b41e3ced5--- to background
linear-gradient
and a noise image background.
<div class="noise_0"></div>
.noise_0 {
background: linear-gradient(to right bottom, var(--black), rgba(0, 0, 0, 0)), url(#noise);
}
Type 1 🌑
On the basis of the above, by modifying the filter
attribute of the contrast contrast
and the brightness brightness
, the contrast of the noise effect is enhanced.
<div class="noise_1"></div>
.noise_1 {
filter: contrast(200%) brightness(150%);
}
Type 2 🌒
Use mix-blend-mode: multiply
to achieve the noise effect of the mixed two-color gradient.
<div class="noise noise_2">
<div class="isolate">
<div class="gradient"></div>
<div class="overlay"></div>
</div>
</div>
.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);
}
Type 3 🌓
Circular noise element.
<div class="noise_3">
<div class="gradient"></div>
</div>
.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%);
}
Type 4 🌔
Spherical noise elements, adding ground shadows and lighting effects to circular noises can form a three-dimensional sphere effect.
<div class="noise noise_5">
<div class="ground"><div class="ground-shadow"></div></div>
<div class="ball">
<div class="isolate">
<div class="ball-shadow"></div>
<div class="ball-light"></div>
</div>
</div>
</div>
<style>
.noise_5 {
position: relative;
}
.noise_5 .ball {
position: relative;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
border-radius: 50%;
overflow: hidden;
z-index: 20;
}
.noise_5 .isolate {
isolation: isolate;
position: absolute;
top: 0;
height: 100%;
width: 100%;
}
.noise_5 .ball-shadow {
height: 100%;
background: radial-gradient(circle at 65% 35%, rgba(0, 0, 0, 0), mediumblue), url(#noise);
filter: contrast(120%) brightness(900%);
}
.noise_5 .ground {
position: absolute;
width: 150%;
height: 140px;
bottom: -10px;
left: -65%;
transform: rotateZ(7deg);
mix-blend-mode: multiply;
}
.noise_5 .ground-shadow {
width: 95%;
height: 140px;
border-radius: 50%;
background: radial-gradient(ellipse at 70%, navy, rgba(0, 0, 0, 0)), url(#noise);
filter: contrast(150%) brightness(700%);
}
.noise_5 .ball-light {
position: absolute;
top: 0;
width: 100%;
height: 100%;
mix-blend-mode: multiply;
background: radial-gradient(circle at 67% 30%, #ccc, var(--black));
}
</style>
Type 5 🌕
其他3D
立体形状,包括球体、布丁🍮
、水滴💧
、 🏺
、鸡蛋🥚
、 RBC 💉
etc., 🖱
Hover the mouse over the element to see the 3D rotation effect.
<div class="item item--sphere item--color1"></div>
<div class="item item--pudding item--color5"></div>
<div class="item item--droplet item--color6"></div>
<div class="item item--vase item--color7"></div>
<div class="item item--egg item--color8"></div>
<div class="item item--cell"></div>
.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%);
}
Type 6 🌝
The superposition of multiple noise elements can produce very stunning effects. For example, by layering three noise elements together, the optical three primary colors RGB
can be achieved.
<div class="noise_6">
<div class="circle noise-1"></div>
<div class="circle noise-2"></div>
<div class="circle noise-3"></div>
</div>
.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);
}
Type 7 🌙
What else can be achieved with the noise element? Center diffuse effects, sun, ripples, poached eggs…
<div class="noise_7">
<div class="noise"></div>
<div class="center">
<div class="circle">
</div>
</div>
</div>
<style>
.noise_7 {
position: relative;
width: 1000px;
height: 1000px;
margin: 0 auto;
}
.noise_7 .noise {
width: 100%;
height: 100%;
background: radial-gradient(circle at 50% 50%, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)), url(#noise);
filter: contrast(145%) brightness(650%) invert(100%);
mix-blend-mode: screen;
}
.noise_7 .center {
position: absolute;
top: 0;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
.noise_7 .circle {
width: 200px;
height: 200px;
background-color: beige;
border-radius: 50%;
}
</style>
Background noise 🌜
If you look closely, the black background of the page is also applied with a noise effect. Is there a retro feeling of the snowflake screen of a black and white TV 😂
.
<div class="bg"></div>
.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) }
}
📥
full code: https://github.com/dragonir/noise
Summarize
The main points of knowledge included in this article include:
-
CSS
propertiesmask
mask -
SVG
FilterfeTurbulence
-
CSS
propertiesfilter
filters -
CSS
Attributemix-blend-mode
Element Mix -
CSS
propertiesimage-rendering
image scaling
If you want to know other front-end knowledge or WEB 3D
development technology related knowledge, you can read my previous articles. Please indicate the original address and author when reprinting . If you think the article is helpful to you, don't forget to click three links 👍 .
appendix
- [1]. 🌊 Use front-end technology to achieve partial flow effect of static images
- [2]. 📷 The front-end implements a very impressive browser-side scanning function
- [3]. 🌏 The Legend of Zelda: Breath of the Wild
- [4]. 🆒 Realize cyberpunk 2077 style visual effects with CSS only a few steps
-
...
- [1]. 🌐 Use Three.js to achieve a cool cyberpunk style 3D digital earth screen
- [2]. 🦊 Three.js implements a 3D open world game: Ali's multiverse
- [3]. 🔥 Three.js flame effect to realize the dynamic logo of Aerden's Ring
- [4]. 🐼 Three.js Realize the 2022 Winter Olympics theme 3D fun page, including Bing Dun Dun
-
...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。