고급 사용자 인터페이스(UI) 컴포넌트를 제작할 때, CSS는 필수적인 도구입니다. CSS를 사용해 복잡한 UI 컴포넌트를 스타일링할 수 있으며, 사용자의 경험을 향상시키는 매력적인 디자인을 구현할 수 있습니다. 이 글에서는 몇 가지 복잡한 UI 컴포넌트를 예시로 들어, CSS를 사용해 스타일링하는 방법을 설명하겠습니다.

1. 드롭다운 메뉴(Dropdown Menu)

드롭다운 메뉴는 사용자 인터페이스에서 널리 사용되는 컴포넌트로, 여러 옵션을 선택할 수 있는 공간 절약형 메뉴입니다.

HTML 구조:

<div class="dropdown">
    <button class="dropdown-toggle">메뉴 선택</button>
    <ul class="dropdown-menu">
        <li><a href="#">옵션 1</a></li>
        <li><a href="#">옵션 2</a></li>
        <li><a href="#">옵션 3</a></li>
    </ul>
</div>

CSS 스타일링:

/* 드롭다운 기본 스타일 */
.dropdown {
    position: relative;
    display: inline-block;
}

.dropdown-toggle {
    background-color: #3498db;
    color: white;
    padding: 10px 20px;
    border: none;
    border-radius: 4px;
    cursor: pointer;
    font-size: 16px;
}

.dropdown-toggle:focus {
    outline: none;
}

.dropdown-menu {
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    background-color: white;
    box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
    border-radius: 4px;
    z-index: 1;
    width: 100%;
}

.dropdown-menu li {
    list-style: none;
}

.dropdown-menu a {
    display: block;
    padding: 10px 20px;
    text-decoration: none;
    color: #333;
    font-size: 16px;
}

.dropdown-menu a:hover {
    background-color: #f1f1f1;
}

/* 드롭다운 메뉴 활성화 */
.dropdown:hover .dropdown-menu {
    display: block;
}

설명:

  • dropdown-toggle: 드롭다운을 열고 닫는 버튼의 스타일을 지정합니다. 여기서는 파란색 배경과 하얀색 텍스트로 설정했습니다.
  • dropdown-menu: 메뉴의 기본 상태는 숨겨져 있으며, 드롭다운이 활성화되면 display: block;으로 표시됩니다.
  • 드롭다운 메뉴 활성화: 마우스를 드롭다운 버튼에 올리면 :hover 상태에서 메뉴가 표시되도록 설정합니다.

2. 모달 창(Modal Window)

모달 창은 사용자에게 중요한 메시지를 전달하거나, 추가적인 작업을 요구할 때 사용됩니다. 모달 창은 일반적으로 화면 중앙에 표시되며, 배경을 흐리게 처리하여 사용자에게 집중된 경험을 제공합니다.

HTML 구조:

<div class="modal-overlay" id="modal-overlay"></div>
<div class="modal" id="modal">
    <div class="modal-header">
        <h2>모달 제목</h2>
        <span class="modal-close" id="modal-close">&times;</span>
    </div>
    <div class="modal-body">
        <p>여기에 내용을 입력하세요.</p>
    </div>
    <div class="modal-footer">
        <button>확인</button>
        <button id="modal-cancel">취소</button>
    </div>
</div>

CSS 스타일링:

/* 모달 오버레이 */
.modal-overlay {
    display: none;
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.5);
    z-index: 999;
}

/* 모달 창 */
.modal {
    display: none;
    position: fixed;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    background-color: white;
    padding: 20px;
    box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
    border-radius: 8px;
    z-index: 1000;
    width: 400px;
    max-width: 80%;
}

/* 모달 헤더 */
.modal-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    border-bottom: 1px solid #ddd;
    padding-bottom: 10px;
}

.modal-close {
    cursor: pointer;
    font-size: 24px;
}

/* 모달 본문 */
.modal-body {
    padding: 20px 0;
}

/* 모달 푸터 */
.modal-footer {
    display: flex;
    justify-content: flex-end;
}

.modal-footer button {
    background-color: #3498db;
    color: white;
    padding: 10px 20px;
    border: none;
    border-radius: 4px;
    cursor: pointer;
    margin-left: 10px;
}

/* 모달 창 활성화 */
.modal.show {
    display: block;
}

.modal-overlay.show {
    display: block;
}

JavaScript로 모달 제어:

const modal = document.getElementById('modal');
const modalOverlay = document.getElementById('modal-overlay');
const modalClose = document.getElementById('modal-close');
const modalCancel = document.getElementById('modal-cancel');

function openModal() {
    modal.classList.add('show');
    modalOverlay.classList.add('show');
}

function closeModal() {
    modal.classList.remove('show');
    modalOverlay.classList.remove('show');
}

modalClose.addEventListener('click', closeModal);
modalCancel.addEventListener('click', closeModal);

// 필요 시 openModal()을 호출하여 모달 열기

설명:

  • modal-overlay: 모달 창이 활성화될 때 배경을 어둡게 처리하는 오버레이입니다.
  • modal: 화면 중앙에 표시되는 모달 창으로, transform: translate(-50%, -50%)를 사용해 중앙에 위치시킵니다.
  • 모달 활성화/비활성화: show 클래스를 추가하거나 제거하여 모달 창을 열고 닫을 수 있습니다.

3. 탭 네비게이션(Tab Navigation)

탭 네비게이션은 여러 콘텐츠를 동일한 영역에서 전환하여 보여줄 수 있는 컴포넌트입니다. 이는 공간을 절약하고, 사용자에게 콘텐츠를 직관적으로 탐색할 수 있게 해줍니다.

HTML 구조:

<div class="tabs">
    <ul class="tab-list">
        <li class="active" data-tab="tab1">탭 1</li>
        <li data-tab="tab2">탭 2</li>
        <li data-tab="tab3">탭 3</li>
    </ul>
    <div class="tab-content active" id="tab1">
        <p>탭 1 내용</p>
    </div>
    <div class="tab-content" id="tab2">
        <p>탭 2 내용</p>
    </div>
    <div class="tab-content" id="tab3">
        <p>탭 3 내용</p>
    </div>
</div>

CSS 스타일링:

/* 탭 리스트 */
.tab-list {
    display: flex;
    list-style: none;
    padding: 0;
    margin: 0;
    border-bottom: 2px solid #ddd;
}

.tab-list li {
    padding: 10px 20px;
    cursor: pointer;
    border: 2px solid transparent;
    border-bottom: none;
    margin-right: 5px;
}

.tab-list li.active {
    border-color: #3498db;
    background-color: #f1f1f1;
}

/* 탭 콘텐츠 */
.tab-content {
    display: none;
    padding: 20px;
    border: 2px solid #ddd;
    border-top: none;
    margin-top: -2px;
}

.tab-content.active {
    display: block;
}

JavaScript로 탭 제어:

const tabs = document.querySelectorAll('.tab-list li');
const tabContents = document.querySelectorAll('.tab-content');

tabs.forEach(tab => {
    tab.addEventListener('click', () => {
        tabs.forEach(item => item.classList.remove('active'));
        tab.classList.add('active');

        const tabId = tab.getAttribute('data-tab');
        tabContents.forEach(content => {
            content.classList.remove('active');
            if (content.getAttribute('id') === tabId) {
                content.classList.add('active');
            }
        });
    });
});

설명:

  • tab-list: 탭 목록을 가로로 배치하고, 활성화된 탭에 스타일을 적용합니다

.

  • tab-content: 탭별로 연결된 콘텐츠 영역이며, 활성화된 탭의 콘텐츠만 표시됩니다.
  • 탭 전환: JavaScript로 클릭한 탭과 연결된 콘텐츠만 활성화하도록 설정합니다.

4. 아코디언(Accordion)

아코디언은 여러 섹션을 포함하며, 하나의 섹션을 클릭하면 해당 섹션이 확장되고, 다른 섹션은 축소되는 UI 컴포넌트입니다.

HTML 구조:

<div class="accordion">
    <div class="accordion-item">
        <button class="accordion-header">아코디언 1</button>
        <div class="accordion-content">
            <p>아코디언 1 내용</p>
        </div>
    </div>
    <div class="accordion-item">
        <button class="accordion-header">아코디언 2</button>
        <div class="accordion-content">
            <p>아코디언 2 내용</p>
        </div>
    </div>
    <div class="accordion-item">
        <button class="accordion-header">아코디언 3</button>
        <div class="accordion-content">
            <p>아코디언 3 내용</p>
        </div>
    </div>
</div>

CSS 스타일링:

/* 아코디언 기본 스타일 */
.accordion {
    border: 2px solid #ddd;
    border-radius: 8px;
    overflow: hidden;
}

.accordion-item + .accordion-item {
    border-top: 1px solid #ddd;
}

.accordion-header {
    background-color: #3498db;
    color: white;
    padding: 15px 20px;
    text-align: left;
    font-size: 16px;
    border: none;
    cursor: pointer;
    width: 100%;
    outline: none;
}

.accordion-content {
    max-height: 0;
    overflow: hidden;
    transition: max-height 0.3s ease;
    background-color: #f1f1f1;
    padding: 0 20px;
}

.accordion-content p {
    margin: 10px 0;
}

/* 아코디언 활성화 */
.accordion-content.active {
    max-height: 200px; /* 적절한 높이 설정 */
    padding: 20px;
}

JavaScript로 아코디언 제어:

const accordionHeaders = document.querySelectorAll('.accordion-header');

accordionHeaders.forEach(header => {
    header.addEventListener('click', () => {
        const content = header.nextElementSibling;

        if (content.classList.contains('active')) {
            content.classList.remove('active');
        } else {
            document.querySelectorAll('.accordion-content').forEach(item => item.classList.remove('active'));
            content.classList.add('active');
        }
    });
});

설명:

  • accordion-header: 아코디언 헤더는 클릭 가능한 버튼으로 설정하며, 클릭 시 해당 섹션의 콘텐츠를 토글합니다.
  • accordion-content: 기본적으로 콘텐츠는 숨겨져 있으며, 활성화되면 max-height와 패딩이 적용됩니다.
  • 아코디언 확장/축소: JavaScript로 각 아코디언 아이템을 클릭할 때마다 콘텐츠의 활성화 상태를 토글합니다.

결론

고급 사용자 인터페이스(UI) 구성 요소를 제작하기 위해서는 CSS와 JavaScript를 결합하여 복잡한 스타일링과 동작을 구현할 수 있습니다. 드롭다운 메뉴, 모달 창, 탭 네비게이션, 아코디언과 같은 컴포넌트들은 사용자 경험을 크게 향상시키며, 다양한 UI 요구사항을 충족할 수 있습니다.

이 글에서 소개한 예시를 바탕으로 복잡한 UI 컴포넌트를 스타일링해보세요. 이를 통해 더욱 세련되고 직관적인 사용자 인터페이스를 구현할 수 있을 것입니다.

+ Recent posts