1단계에서 구현한 코드를 기반으로 지구 태양 달의 위치를 표시하는 프로램을 작성한다.
3. 생성된 각 객체에 날짜를 입력받고 이동시키는 date 객체
<div class="date__input">
<input
class="date__form__month"
placeholder="ex) 월을 입력하세요."
min="1"
max="12"
type="number"
/>
<input
class="date__form__day"
placeholder="ex) 일을 입력하세요."
min="1"
max="31"
type="number"
/>
<button class="date__form__btn">input</button>
</div>
<main class="space__main">
<div class="object" id="sun"></div>
<div class="orbit earth-orbit"></div>
<div class="earth-spin">
<div class="object" id="earth"></div>
<div class="orbit moon-orbit"></div>
<div class="moon-spin">
<div class="object" id="moon"></div>
</div>
</div>
</main>
// 태양의 경우 예시
.space__main {
background-color: black;
position: relative;
height: 100vh;
margin: auto;
overflow: hidden;
}
#sun,
.orbit,
.orbit + div,
.orbit + div > div {
position: absolute;
}
#sun,
.orbit,
.orbit + div {
top: 50%;
left: 50%;
}
.orbit + div > div {
top: 0;
left: 50%;
}
.orbit,
.orbit + div div {
border-radius: 50%;
}
#sun {
height: 200px;
width: 200px;
margin-top: -100px;
margin-left: -100px;
border-radius: 50%;
box-shadow: 0 0 84px tomato;
}
let space = { sun: [], earth: [], moon: [] };
// Sun, Earth, Moon의 지름 초기값을 입력 해준다.
space.init = function () {
let sunR = 7;
let earthR = 3;
let moonR = 1;
this.planetSize(sunR);
this.planetSize(earthR);
this.planetSize(moonR);
};
// 각 행성의 지름값으로 행성 생성에 필요한 정보를 가져온다.
space.planetSize = function (d) {
let dia = Number(d); // 지름
let radius = Math.floor(d / 2); // 반지름
let centerX = radius;
let centerY = radius;
if (dia === 7) {
this.makeSun(dia, radius, centerX, centerY);
} else if (dia === 3) {
this.makeEarth(dia, radius, centerX, centerY);
} else if (dia === 1) {
this.makeMoon(dia, radius, centerX, centerY);
}
};
// Sun 생성 함수
space.makeSun = function (d, r, x, y) {
this.sun = Array.from({ length: d }, () => Array(d));
for (let i = x - r; i <= x + r; i++) {
for (let j = y - r; j <= y + r; j++) {
if ((i - r) * (i - r) + (j - r) * (j - r) <= r * r) {
this.sun[i][j] = "🔥";
} else {
this.sun[i][j] = "";
}
}
}
this.showTheSun(d);
};
// Sun 호출 함수
space.showTheSun = function (d) {
for (let i = 0; i < d; i++) {
const div = document.createElement("div");
div.innerText = this.sun[i];
sunObject.appendChild(div);
}
};
// 사용자가 입력한 "월" 과 "일" 정보를 브라우저에 표시한다.
date.getDateValue = function (event) {
event.preventDefault();
const selectMonth = inputMonth.value;
const selectDay = inputDay.value;
if (selectMonth < 0 || selectMonth > 12) {
alert("월은 1월~12월만 존재합니다.");
return;
}
if (selectDay < 0 || selectDay > 31) {
alert("일은 1일~31일만 존재합니다.");
return;
}
monthResult.innerText = `${selectMonth.padStart(2, "0")}월`;
dayResult.innerText = `${selectDay.padStart(2, "0")}일`;
inputMonth.value = "";
inputDay.value = "";
this.calculateDate(selectMonth, selectDay);
};
// 사용자가 입력한 date와 디폴트 date값을 초로 환산하여 일수의 차를 구한다.
date.calculateDate = function (mon, day) {
const monthNumber = Number(mon);
const dayNumber = Number(day);
const defaultDate = Date.parse("2022 / 01 / 01");
const userDate = Date.parse(`2022 / ${monthNumber} / ${dayNumber}`);
const onedayMs = 86400000; // 1 day는 86400000 밀리초다.
const movedDay = (userDate - defaultDate) / onedayMs;
this.rotateObject(movedDay);
};
1day 밀리초 | 1day 지구 rotate deg | 1day 달 rotate deg |
---|---|---|
86400000 | 0.98630137 | 13.33333 |
// "일" 수를 토대로 Earth와 Moon이 몇도 이동하는지 계산하고 이동시킨다.
date.rotateObject = function (day) {
const earthOrbit = document.querySelector(".earth-spin");
const moonOrbit = document.querySelector(".moon-spin");
const earthOneDayDeg = 0.98630137;
const moonOneDayDeg = 13.33333;
const earthDeg = day * earthOneDayDeg;
const moonDeg = day * moonOneDayDeg;
earthOrbit.style.transform = `rotate(${earthDeg}deg)`;
moonOrbit.style.transform = `rotate(${moonDeg}deg)`;
};