본문 바로가기
WEB Basic/JavaScript

HTML, CSS, JavaScript로 아래에서 위로 나타나는 액션시트(Action Sheet) 구현하기

by Devinus 2024. 1. 18.

1. 구현 결과 미리보기

Action Sheet
Close
Option 1
Option 2
Option 3

 

2. 분석 

액션 시트는 모바일 애플리케이션에서 빈번하게 활용되는 사용자 인터페이스 패턴 중 하나로, 여러 선택 옵션을 제공하여 사용자 경험을 향상시키는 역할을 합니다. 이번 글에서는 HTML, CSS, JavaScript를 통해 간결하면서도 효과적인 액션 시트를 만들어보겠습니다.

 

코드 구조

- HTML 구조: 액션시트를 담고 있는 부모 요소와 선택 옵션들을 나타내는 요소들을 구성합니다. 또한, 액션시트를 보여주는 버튼을 추가합니다.

- CSS 스타일링: 액션시트와 선택 옵션들의 스타일을 정의하고, 각 요소에 트랜지션 효과를 부여하여 부드러운 화면 전환을 구현합니다.

- JavaScript 인터랙션: 각 옵션을 클릭했을 때의 동작과 액션시트를 보이거나 감추는 함수를 작성합니다.

 

특징 및 기능

실제 동작: 버튼을 클릭하면 액션시트가 나타나며, 선택 옵션을 클릭하면 해당 옵션에 대한 알림이 표시됩니다. 해당 부분은 기본적인 액션시트 토글에 대한 기능이며, 추가적인 요구사항이 있는 경우 얼마든지 추가구현이 가능합니다.

트랜지션 효과: CSS 트랜지션을 이용하여 액션시트의 나타남과 사라짐에 부드러운 효과를 부여합니다.

사용자 경험 향상: 액션시트는 화면 하단에서 위로 올라오는 디자인으로, 사용자가 명확한 시각적 피드백을 받을 수 있습니다.

 

3. 구현

3.1. HTML

<div class="action-sheet" id="actionSheet" onclick="hideActionSheet()">
    <div class="action-options">
      <div class="option close" onclick="hideActionSheet()">Close</div>
      <!-- 여러 선택 옵션들 -->
      <div class="option" onclick="handleOption('Option 1')">Option 1</div>
      <div class="option" onclick="handleOption('Option 2')">Option 2</div>
      <div class="option" onclick="handleOption('Option 3')">Option 3</div>
    </div>
</div>
<button onclick="showActionSheet()">Show Action Sheet</button>

3.2. CSS

   #actionSheet {
    position: fixed;
    bottom: 0;
    left: 0;
    width: 100%;
    background-color: rgba(0, 0, 0, 0.5);
    height: 100%;
    display: flex;
    flex-direction: column;
    justify-content: flex-end;

    transition: 1s;

    /* 서서히 나타나는 효과 */
    visibility: hidden;
    opacity: 0;
  }
  #actionSheet.active {
    /* 서서히 나타나는 효과 */
    visibility: visible;
    opacity: 1;
  }

  .action-options {
    background-color: #fff;
    border-top-left-radius: 10px;
    border-top-right-radius: 10px;
    /* 세로 컨텐츠가 늘어나는 경우 스크롤이 생기도록 설정 */
    overflow: auto;

    max-height: 300px;
    /* 아래에서 위로 나타나는 효과, max-height과 동일하게 작성 */
    position: relative;
    bottom: -300px;

    transition: 1s;
  }
  #actionSheet.active .action-options {
    /* 아래에서 위로 나타나는 효과, max-height과 동일하게 작성 */
    bottom: 0;
  }

  .option {
    padding: 15px;
    cursor: pointer;
    transition: background-color 0.3s ease;
  }
  .option.close {
    text-align: center;
  }

  .option:hover {
    background-color: #f2f2f2;
  }

3.3. JS

// Action Sheet 보이기
function showActionSheet() {
	document.getElementById("actionSheet").classList.add("active");
}

// Action Sheet 감추기
    function hideActionSheet() {
    document.getElementById("actionSheet").classList.remove("active");
}

// 각 옵션 클릭 시 처리
function handleOption(option) {
    // 여기에 옵션 클릭 시 로직 작성
    alert("Selected Option: " + option);
    // Action Sheet 감추기
    hideActionSheet();
}

3.4. 전체 코드

더보기
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Action Sheet</title>
    <style>
      #actionSheet {
        position: fixed;
        bottom: 0;
        left: 0;
        width: 100%;
        background-color: rgba(0, 0, 0, 0.5);
        height: 100%;
        display: flex;
        flex-direction: column;
        justify-content: flex-end;

        transition: 1s;

        /* 서서히 나타나는 효과 */
        visibility: hidden;
        opacity: 0;
      }
      #actionSheet.active {
        /* 서서히 나타나는 효과 */
        visibility: visible;
        opacity: 1;
      }

      .action-options {
        background-color: #fff;
        border-top-left-radius: 10px;
        border-top-right-radius: 10px;
        /* 세로 컨텐츠가 늘어나는 경우 스크롤이 생기도록 설정 */
        overflow: auto;

        max-height: 300px;
        /* 아래에서 위로 나타나는 효과, max-height과 동일하게 작성 */
        position: relative;
        bottom: -300px;

        transition: 1s;
      }
      #actionSheet.active .action-options {
        /* 아래에서 위로 나타나는 효과, max-height과 동일하게 작성 */
        bottom: 0;
      }

      .option {
        padding: 15px;
        cursor: pointer;
        transition: background-color 0.3s ease;
      }
      .option.close {
        text-align: center;
      }

      .option:hover {
        background-color: #f2f2f2;
      }
    </style>
  </head>
  <body>
      <div class="action-sheet" id="actionSheet" onclick="hideActionSheet()">
        <div class="action-options">
          <div class="option close" onclick="hideActionSheet()">Close</div>
          <!-- 여러 선택 옵션들 -->
          <div class="option" onclick="handleOption('Option 1')">Option 1</div>
          <div class="option" onclick="handleOption('Option 2')">Option 2</div>
          <div class="option" onclick="handleOption('Option 3')">Option 3</div>
        </div>
      </div>
      <button onclick="showActionSheet()">Show Action Sheet</button>
    <script>
      // Action Sheet 보이기
      function showActionSheet() {
        document.getElementById("actionSheet").classList.add("active");
      }

      // Action Sheet 감추기
      function hideActionSheet() {
        document.getElementById("actionSheet").classList.remove("active");
      }

      // 각 옵션 클릭 시 처리
      function handleOption(option) {
        // 여기에 옵션 클릭 시 로직 작성
        alert("Selected Option: " + option);
        // Action Sheet 감추기
        hideActionSheet();
      }
    </script>
  </body>
</html>