January 31, 2022

Эффект анимированного шума на фон... Фон всего

Код шума по примеру: https://targetessa.ru/2021

Сперва добавляем картинку шума с помощью анимированного svg

<svg xmlns="http://www.w3.org/2000/svg">
  <!-- Filter -->
  <!-- Adjust filter size to stop overflow -->
  <filter id="filter" x="0.005" y="0.005" width="100%" height="100%">
    <!-- Noise -->
    <!-- numOctaves for level-of-detail, baseFreq for size/zoom-level of noise -->
    <feTurbulence type="turbulent" seed="1"
                  numOctaves="3" baseFrequency="0.618">
      <!-- Animate Noise -->
      <!-- 12fps default (120 / 10s == 12fps) -->
      <animate attributeName="seed" repeatCount="indefinite"
               dur="10s" from="1" to="120" />
    </feTurbulence>
    <!-- Greyscale -->
    <feColorMatrix type="saturate" values="0" />
    <!-- Blend Output -->
    <!-- Best blend-modes are probably overlay or soft-light -->
    <feBlend in2="SourceGraphic" mode="overlay" />
  </filter>
</svg>

Теперь вы можете двумя строчками кода добавить шум на фон чего угодно в своем таплинке. Например, на фон:

<style>
body::before {
background-color: grey;
  filter: url("#filter") !important;
  content: '';
  position: fixed;
  z-index: -1;
  width:100vw;
  height: 100vh;
  pointer-events: none;
  transform: scale(1.05);
}
  </style>

Также в любом html-коде, где вы видите строчку "background" вы можете заменить этот фон на "шумный" с помощью строки


background-color: grey;
filter: url("#filter");

Вместо "grey" можно использовать и любые другие цвета (но на оттенках серого вид лучше всего)

Альтернативный вариант

<canvas id="canvas"></canvas>
<style>
  #canvas {
      left: 0px;
    top: 0px;
  position: fixed;
  width: 100vw;
  height: 100vh;
/* Прозрачность генератора шума */
opacity: 0.4;
/* Если нужно, чтобы шум не накладывался на элементы, вместо 50 поставьте 1 */
  z-index: 50;
  pointer-events: none;
}
</style>
<script>
  var canvas = document.getElementById('canvas'),
    ctx = canvas.getContext('2d');

function resize() {
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
}
resize();
window.onresize = resize;

function noise(ctx) {
    
    var w = ctx.canvas.width,
        h = ctx.canvas.height,
        idata = ctx.createImageData(w, h),
        buffer32 = new Uint32Array(idata.data.buffer),
        len = buffer32.length,
        i = 0;

    for(; i < len;)
        buffer32[i++] = ((55 * Math.random())|0) << 24;
    
    ctx.putImageData(idata, 0, 0);
}

var toggle = true;

// added toggle to get 30 FPS instead of 60 FPS
(function loop() {
    toggle = !toggle;
    if (toggle) {
        requestAnimationFrame(loop);
        return;
    }
    noise(ctx);
    requestAnimationFrame(loop);
})();

</script>
  <style>
body:before {
background: none !important;
}
/* Цвет фона шума */
  html:before {
background-color: rgba(255,255,255,0.6) !important;
}
</style>