Skip to main content

Command Palette

Search for a command to run...

시맨틱하게 다이얼로그 만들기

Published
2 min readView as Markdown

웹에서 양식을 제출하기 위한 다이얼로그를 작성할 때 시맨틱 태그를 무시하고 div 태그를 활용해 css로 스타일링을 하는 경우가 많다.

이렇게 작성할 경우, 동작에는 전혀 무리가 없지만 하지 않아도 될 스타일링 작업을 하는 데 시간을 쏟을 수 있고 웹접근성 측면에도 좋지 않다.

웹에서 다이얼로그는 모달, 대화상자, 알림창, 검사기와 같은 상호작용 가능한 컴포넌트를 말한다.

HTML에서는 dialog 라는 태그를 사용하면 핵심적인 다이얼로그의 기능을 사용할 수 있다.

아래 코드는 가장 좋아하는 동물을 선택한 후 제출하는 양식의 다이얼로그를 나타낸다.

<dialog id="favDialog">
  <form>
    <p>
      <label>
        가장 좋아하는 동물:
        <select>
          <option value="default">선택</option>
          <option>토끼</option>
          <option>고양이</option>
          <option>강아지</option>
        </select>
      </label>
    </p>
    <div>
      <button value="cancel" formmethod="dialog">취소</button>
      <button id="confirmBtn" value="default">저장</button>
    </div>
  </form>
</dialog>
<p>
  <button id="showDialog">다이얼로그 열기</button>
</p>
<output></output>

dialog 태그를 통해 다이얼로그 영역을 만들어 주고, form 태그를 자식에 넣어 폼 역할을 나타낸다.

다이얼로그는 보통 싱글버튼 또는 더블버튼으로 이루어진다.

다이얼로그만 닫고 아무런 이벤트를 발생하지 않는 버튼에는 formmethod="dialog” 속성을 부여한다.

다이얼로그가 닫힐 때 이벤트도 함께 발생하는 버튼은 자바스크립트로 기능을 수행하도록 한다.

const showButton = document.getElementById("showDialog");
const favDialog = document.getElementById("favDialog");
const outputBox = document.querySelector("output");
const selectEl = favDialog.querySelector("select");
const confirmBtn = favDialog.querySelector("#confirmBtn");

// 버튼 클릭 시 다이얼로그 열림
showButton.addEventListener("click", () => {
  favDialog.showModal();
});

// 선택하지 않고 저장 클릭 시 '선택하지 않음' 반환
// 선택한 후 저장 클릭 시 선택한 동물 반환
// 선택하지 않고 저장 클릭 시 'cancel' 반환
favDialog.addEventListener("close", (e) => {
  outputBox.value =
    favDialog.returnValue === "default"
      ? "선택하지 않음"
      : `ReturnValue: ${favDialog.returnValue}.`;
});

// 저장 클릭 시 다이얼로그 닫힘 호출
confirmBtn.addEventListener("click", (event) => {
  event.preventDefault();
  favDialog.close(selectEl.value);
});

다이얼로그가 열리는 이벤트나 다이얼로그가 닫힌 이후에 발생하는 이벤트는 자바스크립트로 작성한다.

showModal() 함수를 통해 다이얼로그를 열고 close() 함수를 통해 다이얼로그를 닫을 수 있다.

close() 안에는 특정 값을 넣어서 닫힌 이후 발생하는 이벤트에서 활용할 수 있다.

More from this blog

[JavaScript] 이미지 사이즈 압축해서 용량 줄이기

이미지를 받아서 저장하는 기능을 구현하고 며칠이 지난 후 한 가지 이슈를 발견하였다. 바로 이미지 업로드가 되지 않는 아주 치명적인 문제였다! 분명 테스트도 수 없이 진행하고 배포한 후에도 잘만 동작했는데 갑자기 이런 일이 왜 벌어진걸까? 문제 해결의 원인을 찾기 위해 다양한 방법을 시도하였다: 갤럭시의 갤러리에 있는 이미지 업로드 갤럭시의 카메라로 직접 찍어서 업로드 아이폰의 갤러리에 있는 이미지 업로드 아이폰의 카메라로 직접 찍어서 ...

Nov 16, 20242 min read
[JavaScript] 이미지 사이즈 압축해서 용량 줄이기

[JavaScript] 이미지 수정 시 브라우저 캐싱 방지하기

웹 개발을 하면서 한 번쯤 겪어볼 수 있는 이슈가 있다. A 사용자가 이미지를 업로드하면 B 사용자가 그 이미지를 확인하고, 재업로드를 요청하는 플로우다. A 사용자가 새로운 이미지를 업로드 했는데도 B 사용자는 여전히 처음 이미지를 볼 수 있다. 이 문제는 서버 측에서 "이미지 경로는 그대로 유지하고 이미지를 덮어씌운다"는 구조와 관련이 있다. 브라우저는 URL이 동일하면 캐싱된 이미지를 가져와 네트워크 요청을 줄인다. 따라서 새로운 이미지가...

Oct 3, 20242 min read
[JavaScript] 이미지 수정 시 브라우저 캐싱 방지하기

[React] 렌더링 관점에서 보는 react-hook-form (feat. useRef)

평소 한땀한땀 기능을 만들어나가는 걸 좋아해서 유명한 라이브러리들을 사용해보지 않았는데, 회사에서 프로젝트를 진행하며 다양한 라이브러리를 사용해보았다. 그 중 React-Hook-Form을 사용하며 평소에 리액트로 폼을 작성하며 겪은 불편한 점을 많이 해소했다. 코드 길이, 예외 처리, 렌더링 등 다양한 관점에서 개선할 수 있게 되었다. 오늘은 다양한 폼 상태 관리 방법을 비교하여 React-Hook-Form의 장점을 알아보자. useState...

Sep 5, 20243 min read
[React] 렌더링 관점에서 보는 react-hook-form (feat. useRef)

Untitled Publication

53 posts