본문 바로가기
vita_Programing

Javascript 엘리베이터 동작 시뮬레이션

by lemonvita 2024. 5. 28.
728x90
반응형

 

 

 

 

자바스크립트 엘리베이터 동작 시뮬레이션

 

 

 

 

엘리베이터 시뮬레이션
엘리베이터 시뮬레이션

 

먼저 위의 gif 그림을 살펴보자. 웹페이지의 중에 있는 사각형은 5층짜리 건물이다.

이 건물에는 엘리베이터가 설치되어 있고 엘리베이터에서 원하는 층의 버튼을 누르면 해당층으로 이동하는 엘리베이터 시뮬레이션 프로그램인 것을 알 수 있다.

 

html, css, javascript로 위 기능을 하는 웹프로그램을 작성해 보도록 하겠다.

 

728x90

 

엘리베이터 시뮬레이션

 

 

elevator.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>엘리베이터 시뮬레이터</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div id="building">
        <div id="floors">
            <!-- 각 층을 나타내는 요소들 -->
            <div class="floor" data-floor="1">
                <div class="floor-label">1층</div>
            </div>
            <div class="floor" data-floor="2">
                <div class="floor-label">2층</div>
            </div>
            <div class="floor" data-floor="3">
                <div class="floor-label">3층</div>
            </div>
            <div class="floor" data-floor="4">
                <div class="floor-label">4층</div>
            </div>
            <div class="floor" data-floor="5">
                <div class="floor-label">5층</div>
            </div>
        </div>
        <div id="elevator-shaft">
            <!-- 엘리베이터 -->
            <div id="elevator">
                <!-- 엘리베이터 버튼들 -->
                <div id="elevator-buttons">
                    <button data-floor="1">1</button>
                    <button data-floor="2">2</button>
                    <button data-floor="3">3</button>
                    <button data-floor="4">4</button>
                    <button data-floor="5">5</button>
                </div>
            </div>
        </div>
    </div>
    <script src="script.js"></script>
</body>
</html>

 

 

 

 

script.js

 

document.addEventListener('DOMContentLoaded', () => {
    // DOMContentLoaded 이벤트: HTML 문서의 모든 요소가 완전히 로드되고 파싱된 후에 발생하는 이벤트입니다.
    // 여기서는 HTML 문서가 완전히 로드된 후에 JavaScript 코드를 실행하도록 설정합니다.

    // 엘리베이터와 버튼 요소를 DOM에서 찾아 변수에 할당합니다.
    const elevator = document.getElementById('elevator');
    const floorButtons = document.querySelectorAll('#elevator-buttons button');
    const floors = document.querySelectorAll('.floor'); // 각 층 요소를 선택합니다.

    // 현재 엘리베이터의 층, 목표 층, 엘리베이터의 움직임 여부를 추적하기 위한 변수를 초기화합니다.
    let currentFloor = 1;
    let targetFloor = null;
    let moving = false;

    // 엘리베이터가 한 층을 이동할 때 호출되는 함수입니다.
    const moveElevator = (floor) => {
        // 엘리베이터가 이미 움직이고 있는지 확인합니다.
        if (!moving) {
            moving = true; // 엘리베이터가 움직인다는 상태를 나타냅니다.
            targetFloor = floor; // 목표 층을 설정합니다.

            // 각 층의 높이를 계산합니다.
            const floorHeight = floors[0].clientHeight;
            // 엘리베이터가 이동해야 할 위치를 계산합니다.
            const targetPosition = (floor - 1) * floorHeight - 200;

            // 엘리베이터의 위치를 애니메이션 효과와 함께 변경합니다.
            elevator.style.bottom = `${targetPosition}px`;

            // 엘리베이터 이동이 완료된 후에 수행할 작업을 설정합니다.
            setTimeout(() => {
                currentFloor = floor; // 현재 층을 업데이트합니다.
                moving = false; // 엘리베이터의 움직임이 끝났음을 나타냅니다.

                // 목표 층에 도착한 경우 목표 층을 null로 설정합니다.
                if (currentFloor === targetFloor) {
                    targetFloor = null;
                }
            }, Math.abs(currentFloor - floor) * 2000); // 엘리베이터가 이동하는 시간을 계산합니다.
        }
    };

    // 초기 엘리베이터 위치를 설정하는 부분입니다.
    const initialPosition = (currentFloor - 1) * floors[0].clientHeight - 200;
    elevator.style.bottom = `${initialPosition}px`;

    // 각 버튼에 클릭 이벤트를 추가하여 엘리베이터 이동을 호출합니다.
    floorButtons.forEach(button => {
        button.addEventListener('click', () => {
            const floor = parseInt(button.dataset.floor); // 클릭된 버튼에 해당하는 층을 가져옵니다.
            if (targetFloor === floor) {
                targetFloor = null;
            } else {
                moveElevator(floor);
            }
        });
    });
});

 

위 코드를 자세히 이해하는데 도움이 되기 위한 추가 설명은 아래를 참고해 주시기 바란다.

 

document.addEventListener('DOMContentLoaded', () => {

이벤트 리스너를 사용하여 HTML 문서의 로드가 완료되면 실행될 코드 블록을 설정합니다. 이 경우에는 HTML 문서의 DOM 요소들이 모두 로드되고 준비된 상태에서 JavaScript 코드를 실행하도록 합니다.


const elevator = document.getElementById('elevator');

HTML 문서에서 id가 "elevator"인 요소를 찾아 해당 요소를 변수 elevator에 할당합니다. 이 요소는 엘리베이터를 나타냅니다.


const floorButtons = document.querySelectorAll('#elevator-buttons button');

HTML 문서에서 id가 "elevator-buttons"인 요소 안의 모든 button 요소들을 선택하여 해당 요소들을 변수 floorButtons에 할당합니다. 이 요소들은 각 층을 나타내는 버튼입니다.


const floors = document.querySelectorAll('.floor');

HTML 문서에서 클래스가 "floor"인 모든 요소를 선택하여 해당 요소들을 변수 floors에 할당합니다. 이 요소들은 건물의 각 층을 나타냅니다.


let currentFloor = 1;

현재 엘리베이터의 층을 나타내는 변수 currentFloor를 1로 초기화합니다.


let targetFloor = null;

엘리베이터가 이동할 목표 층을 나타내는 변수 targetFloor를 초기화합니다. 초기에는 이동할 목표 층이 없으므로 null로 설정합니다.


let moving = false;

엘리베이터가 움직이고 있는지 여부를 나타내는 변수 moving을 false로 초기화합니다.


const moveElevator = (floor) => {

moveElevator 함수를 정의합니다. 이 함수는 엘리베이터를 특정 층으로 이동시키는 역할을 합니다. 매개변수 floor는 엘리베이터가 이동할 목표 층을 나타냅니다.


if (!moving) {

엘리베이터가 이미 이동 중인지 확인합니다. 만약 엘리베이터가 이동 중이 아니라면 아래의 코드 블록을 실행합니다.

 

moving = true;

moving 변수를 true로 설정하여 엘리베이터가 이동 중임을 나타냅니다.


targetFloor = floor;

targetFloor 변수에 엘리베이터가 이동할 목표 층인 floor를 할당합니다.


const floorHeight = floors[0].clientHeight;

건물의 각 층의 높이를 계산하기 위해 첫 번째 층의 높이를 가져옵니다.


const targetPosition = (floor - 1) * floorHeight - 200;

엘리베이터가 이동할 목표 위치를 계산합니다. 엘리베이터가 이동할 위치는 층의 높이에 따라 결정되며, 건물의 가장 아래 부분에서 200px만큼 위로 올라가는 위치입니다.


elevator.style.bottom = ${targetPosition}px;

계산된 목표 위치를 엘리베이터의 CSS bottom 속성에 적용하여 엘리베이터의 위치를 변경합니다. 이를 통해 엘리베이터가 이동하는 애니메이션 효과가 나타납니다.


setTimeout(() => {

setTimeout 함수를 사용하여 일정 시간이 지난 후에 특정 작업을 수행하도록 설정합니다. 이 경우에는 엘리베이터가 이동하는 동안의 시간을 지연시킨 후에 다음 작업을 수행하도록 합니다.


currentFloor = floor;

현재 층을 업데이트하여 엘리베이터가 도착한 층을 나타냅니다.


moving = false;

moving 변수를 false로 설정하여 엘리베이터의 이동이 완료되었음을 나타냅니다.


if (currentFloor === targetFloor) { targetFloor = null; }

엘리베이터가 목표 층에 도착한 경우 목표 층을 null로 설정하여 엘리베이터가 다시 이동할 수 있도록 합니다.


const initialPosition = (currentFloor - 1) * floors[0].clientHeight - 200;

초기 엘리베이터의 위치를 계산합니다. 이는 엘리베이터가 처음에 어디에 위치해 있는지를 결정합니다.


elevator.style.bottom = ${initialPosition}px;

계산된 초기 위치를 엘리베이터의 CSS bottom 속성에 적용하여 엘리베이터를 초기 위치로 설정합니다.


button.addEventListener('click', () => {

각 버튼 요소에 클릭 이벤트 리스너를 추가합니다. 사용자가 버튼을 클릭하면 이벤트가 발생하고, 클릭된 버튼에 대한 처리를 수행하기 위해 콜백 함수가 실행됩니다.


const floor = parseInt(button.dataset.floor);

클릭된 버튼의 data-floor 속성 값을 가져와서 해당 층을 나타내는 정수형 변수 floor에 저장합니다.

 

if (targetFloor === floor) { targetFloor =null; } else { moveElevator(floor); }


클릭된 버튼이 이미 엘리베이터가 가야할 목표 층이라면 targetFloor를 null로 설정하여 취소하고, 그렇지 않다면 moveElevator 함수를 호출하여 엘리베이터를 해당 층으로 이동시킵니다.

 

 

style.css

/* CSS 영역 */

body {
    font-family: Arial, sans-serif;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    margin: 0;
    background: #f0f0f0;
}

#building {
    display: flex;
    align-items: flex-start;
    width: 300px; /* 건물의 너비를 300px로 설정 */
    height: 200px;
    border: 2px solid #000;
    position: relative;
    background: #fff;
}

#floors {
    display: flex;
    flex-direction: column-reverse;
    justify-content: flex-end;
    width: 50px;
}

.floor {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 30px;
    border-bottom: 1px solid #000;
    padding: 5px;
}

#elevator-shaft {
    flex: 1;
    border-left: 1px solid #000;
    position: relative;
}

#elevator {
    width: 100%;
    height: 30px;
    background: blue;
    position: absolute;
    bottom: 0;
    transition: bottom 2s;
    display: flex;
    justify-content: center;
    align-items: center;
}

#elevator-buttons {
    display: flex;
}

#elevator-buttons button {
    margin: 2px;
    width: 30px;
}

 

 

이상으로 이번 글에서는 엘리베이터 버튼을 누르면 해당 층으로 엘리베이터가 이동하는 재미있는 코드를 작성해 보았다.

 

 

728x90
반응형