Blog. Just Blog

Эффект цветной волны на JavaScript

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Эффект цветной волны на JavaScript
Эффект цветной волны на JavaScript

Экспериментировал с canvas, и вот что получилось. Простой, но красивый визуальный эффект - цветная волна. На чистом JavaScript и CSS, без внешних библиотек, работает в любом современном браузере. В основе анимация на canvas: вертикальные полоски бегут по экрану, их высота меняется по трем синусоидам с разной частотой, а цвет плавно перетекает по спектру в зависимости от времени и положения полоски.

Также есть адаптация под размер окна, прозрачные блики сверху и легкое затемнение следов - получается плавное, гипнотическое движение. Код полностью самодостаточный, достаточно скопировать и вставить.
  1. <style type="text/css">
  2. body {
  3.     margin:0;
  4.     padding:0;
  5.     height:100vh;
  6.     display:flex;
  7.     justify-content:center;
  8.     align-items:center;
  9.     overflow:hidden;
  10. }
  11.  
  12. #container {
  13.     width:90%;
  14.     height:90%;
  15.     max-width:600px;
  16.     max-height:450px;
  17.     position:relative;
  18. }
  19.  
  20. #wave_canvas {
  21.     width:100%;
  22.     height:100%;
  23.     border-radius:24px;
  24.     box-shadow:0 20px 60px RGBA(0,0,0,0.8);
  25.     background:RGBA(10,10,20,0.3);
  26. }
  27. </style>
  1. <div id="container">
  2.     <canvas id="wave_canvas"></canvas>
  3. </div>
  1. <script type="text/javascript">
  2. const canvas=document.getElementById('wave_canvas');
  3. const ctx=canvas.getContext('2d');
  4.  
  5. // Адаптивный размер
  6. function resize_canvas() {
  7.     canvas.width canvas.offsetWidth*2;
  8.     canvas.height canvas.offsetHeight*2;
  9.     ctx.scale(22);
  10. }
  11. resize_canvas();
  12. window.addEventListener('resize'resize_canvas);
  13.  
  14. let animation_id;
  15. let time=0;
  16.  
  17. function draw_wave() {
  18.     animation_id=requestAnimationFrame(draw_wave);
  19.  
  20.     // Затемнение следа
  21.     ctx.fillStyle='rgba(10,10,20,0.15)';
  22.     ctx.fillRect(0,0,
  23.         canvas.offsetWidth,canvas.offsetHeight
  24.     );
  25.  
  26.     const width=canvas.offsetWidth;
  27.     const height=canvas.offsetHeight;
  28.     const bar_count=120;
  29.     const bar_width=width/bar_count*1.3;
  30.  
  31.     time+=0.03;
  32.  
  33.     for(let i=0i<bar_counti++) {
  34.         const x=i*bar_width;
  35.  
  36.         // Волновая функция
  37.         const wave1=Math.sin((i*0.02+time)*2)*0.5+0.5;
  38.         const wave2=Math.sin((i*0.015+time*1.3)*2)*0.3+0.2;
  39.         const wave3=Math.sin((i*0.03+time*0.7)*2)*0.2+0.1;
  40.  
  41.         const bar_height=(wave1+wave2+wave3)*height*0.7;
  42.  
  43.         // Динамические цвета
  44.         const hue=(i/bar_count*280+time*20+200)%360;
  45.         const saturation=60+Math.sin(time+i*0.1)*20;
  46.         const lightness=35+wave1*25;
  47.  
  48.         const gradient=ctx.createLinearGradient(
  49.             x,height,x,height-bar_height
  50.         );
  51.         gradient.addColorStop(
  52.             0,'hsla('+hue+','+saturation+'%,'+lightness+'%,0.9)'
  53.         );
  54.         gradient.addColorStop(
  55.             0.5,'hsla('+hue+','+saturation+'%,'+lightness+20+'%,1)'
  56.         );
  57.         gradient.addColorStop(
  58.             1,'hsla('+hue+','+saturation+'%,70%,0.6)'
  59.         );
  60.  
  61.         ctx.fillStyle=gradient;
  62.         ctx.fillRect(x,height-bar_height,bar_width,bar_height);
  63.  
  64.         // Блик сверху
  65.         ctx.fillStyle 'hsla('+hue+',80%,90%,0.4)';
  66.         ctx.fillRect(
  67.             x,height-bar_height*0.7,bar_width*0.6,bar_height*0.3
  68.         );
  69.     }
  70. }
  71. // Запуск
  72. draw_wave();
  73. </script>
Готовый пример эффекта цветной волны можно посмотреть на демонстрационной странице.

Поделиться ссылкой ВКонтакте
Просмотров: 265 | Комментариев: 2

Комментарии

Отзывы посетителей сайта о статье
DiPrm (04.05.2026 в 21:43):
Спасибо, очень красиво!
Вспомнился dj smash (из Перми) "я - волна!":)
g0b (21.04.2026 в 14:52):
Красивый эффект. Хорошо бы смотрелось с перемешением R,G,B.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2026
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0035 сек.) / Память: 4.5 Mb
Наверх