Одностраничный статический компонент
Простой способ придать вашему веб-проекту немного визуальной глубины - это добавить сверху анимированный слой шума. Недавно я использовал этот трюк для юбилейного приложения Дэвид Боуи Space Oddity, а в прошлом - для детектора звука Тихое место. Я попробовал несколько разных техник, ища наиболее эффективный, например полноэкранный GIF или <video>
. Однако лучшим вариантом был холст HTML. Поскольку в последнее время я использую исключительно Vue.js, вот инструкции по созданию простого одностраничного компонента, который добавит шума в ваше приложение.
Область шаблона просто включает тег <canvas>
с именем noise.
<template> <canvas ref="canvas"></canvas> </template>
И CSS размеры этого холста, чтобы он соответствовал полной ширине и высоте вашей страницы, и фиксирует его с высоким z-индексом, чтобы он покрыл все. Поскольку этот элемент располагается поверх всего, я установил для pointer-events
значение none, чтобы мы могли просмотреть его. Наконец, я решил использовать режим смешивания-смешивания, чтобы шум смешался с любым цветом ниже. При необходимости отрегулируйте opacity
.
<style scoped> canvas{ height: 100%; left: 0; mix-blend-mode: soft-light; opacity: 0.25; pointer-events: none; position: fixed; top: 0; width: 100%; z-index: 100000; } </style>
Теперь мы можем работать с <script>
, который настроим следующим образом. Один метод будет использоваться для создания шума при загрузке страницы, а другой - для перемещения или анимации этого шума. Оба эти метода будут запускаться из ловушки жизненного цикла mounted
.
<script> export default{ methods: { generateNoise() { // generate }, moveNoise() { // noise } }, mounted() { // generate and move } } </script>
Генерация шума включает создание нового закадрового холста, который в два раза больше видимого холста в нашем шаблоне. Затем мы можем использовать метод createImageData для создания массива пустых пикселей, который соответствует размерам нашего холста. Данные изображения этого закадрового холста затем заполняются случайным массивом белых и черных пикселей.
generateNoise() { this.noise = document.createElement('canvas') this.noise.height = window.innerHeight * 2 this.noise.width = window.innerWidth * 2 let noiseContext = this.noise.getContext('2d') let noiseData = noiseContext.createImageData( this.noise.width, this.noise.height ) let buffer32 = new Uint32Array(noiseData.data.buffer) let len = buffer32.length - 1 while (len--) { buffer32[len] = Math.random() < 0.5 ? 0 : -1 >> 0 } noiseContext.putImageData(noiseData, 0, 0) }
Чтобы оживить этот шум, мы просто нарисуем контекст закадрового шума на нашем видимом холсте в случайном месте. Это движение будет постоянно оживлять, создавая иллюзию истинной случайности.
moveNoise() { let canvas = this.$refs.canvas let context = canvas.getContext('2d') let x = Math.random() * canvas.width let y = Math.random() * canvas.height context.clearRect(0, 0, canvas.width, canvas.height) context.drawImage(this.noise, -x, -y) requestAnimationFrame(this.moveNoise) }
Наконец, в ловушке жизненного цикла mounted
мы настроим видимые размеры холста, создадим шум и начнем requestAnimationFrame
цикл анимации.
mounted() { this.$refs.canvas.height = window.innerHeight this.$refs.canvas.width = window.innerWidth this.generateNoise() requestAnimationFrame(this.moveNoise) }
Теперь, когда вы знаете, как был создан шумовой компонент, вы можете взять его копию на этой сути и перенести шум в свой проект. 💥