본문 바로가기
JavaScript

[Javascript] 무지개 터널 효과 만들기

by teamnova 2022. 5. 15.
728x90

안녕하세요

 

오늘은 자바스크립트로 무지개 효과를 만들어 보겠습니다.

 

*결과

 


1. getContext

이 함수는 어떤 도형을 그리고 싶을 때 사용됩니다. 예제에서는 2d 타입의 인자를 받아옵니다.

 

var c = document.getElementById("c");
var ctx = c.getContext("2d");

 

2. stroke

이 함수를 사용하면 실질적으로 화면에 그림이 그려집니다.

 

function drawParticle(o){
	ctx.fillStyle = "hsla("+o.a+", 90%,60%,"+o.alpha+")";
	ctx.strokeStyle = "hsla("+o.a+", 100%,50%,"+o.alpha+")";
	ctx.beginPath();
	ctx.arc(o.x,o.y, o.r,0,2*Math.PI);
	ctx.fill();
	ctx.stroke();
}

 

3. hsla 모델

hsla 모델은 색상을 아래와 같이 정의합니다.

hsla(hue, saturation, lightness, alpha)

각각 색상, 채도, 명도, 투명도를 뜻합니다.

 

ctx.fillStyle = "hsla("+o.a+", 90%,60%,"+o.alpha+")";
ctx.strokeStyle = "hsla("+o.a+", 100%,50%,"+o.alpha+")";ㅍ

 

[매개변수]

[hue]

색상 (= 색조 = 색깔)

0 ~ 360 (숫자만 기재)

0 (= 360)은 빨간색, 120은 녹색, 240은 파란색

 

[saturation]

채도 (= 컬러 정도)

0 ~ 100 % (% 단위 필수 기재)

0%는 음영, 100%는 컬러 최대치

 

[lightness]

명도 (= 밝기)

0 ~ 100 % (% 단위 필수 기재)

0 %는 검은색이고, 50 %는 보통이며 100 %는 흰색

 

[alpha]

불투명도

0.0 ~ 1.0 (숫자만 기재)

0.0은 완전 투명, 1.0은 완전 불투명

 

 

4. 전체코드

 

<!doctype html>
<html lang="kr">
	<head>
	<meta charset="UTF-8">
	<title>무지개 효과</title>

<style rel="stylesheet">
body {
  margin: 0;
  overflow: hidden;
  background-color: #000;
}

#c {
  display: block;
  margin: 0 auto;
  margin: calc(50vh - 250px) auto;
}
</style>
</head>
<body>

<canvas id='c'></canvas>

<script type="text/javascript">
var c = document.getElementById("c");
var ctx = c.getContext("2d");
var cw = c.width = 500,cx=cw/2;
var ch = c.height = 500,cy=ch/2;

var rad = Math.PI / 180;
var frames = 360;
var r= 150;// trail radius
var p = [];// particles array

ctx.lineWidth = 2;

function Particle(a) {
	this.a = a;
	this.rnd = rnd()
	this.r = 2;
	this.R = r;
	this.x = cx + this.R * Math.cos(this.a * rad);
	this.y = cy + this.R * Math.sin(this.a * rad);
	this.alpha = 1;
}

for (var a = 0; a < 360; a+=1.5) {
  var particle = new Particle(a);
  p.push(particle);
}

function drawParticle(o){
	ctx.fillStyle = "hsla("+o.a+", 90%,60%,"+o.alpha+")";
	ctx.strokeStyle = "hsla("+o.a+", 100%,50%,"+o.alpha+")";
	ctx.beginPath();
	ctx.arc(o.x,o.y, o.r,0,2*Math.PI);
	ctx.fill();
	ctx.stroke();
}

function Draw() {
	frames+=.5;
    ctx.clearRect(0, 0, cw, ch);
	var n = p.length;
	
	for( var i = 0; i < n; i++){
		
	var o = p[(~~frames-i) % n];
	
	o.r = 2 + i/9;
	o.R = r+ i/2 * o.rnd;
	o.x = cx + o.R * Math.cos(o.a * rad);
	o.y = cy + o.R * Math.sin(o.a * rad);
	var l = ~~(3*n/4);
	o.alpha = (l - i)/l;
		
    drawParticle(o);
	}  
    window.requestAnimationFrame(Draw);
}

window.requestAnimationFrame(Draw);

function rnd() {// a @tmrDevelops function
  Math.random = (Math.random * 108013 + 2531011) & 0xffffffff;
  return Math.abs(Math.random >> 16) / 32869;
}
function randomIntFromInterval(mn, mx) {
  return ~~(rnd() * (mx - mn + 1) + mn);
}

</script>
</body>
</html>