컴포넌트/아이콘, 이미지

I (아이콘)

VanillaFront 2026. 9. 20. 16:15

Va.I — 아이콘 표시 컴포넌트

VanillaFront 아이콘을 표시하는 전용 컴포넌트입니다. HTML <i> 태그로 렌더링되며, ico_xxx 클래스로 정의된 mask-image 방식 아이콘을 편리하게 배치합니다. Va.Component를 직접 상속합니다.

클래스 정보

Va.I extends Va.Component
tagName: 'i'
isContainer: true

기본 사용법

{
    tagName: 'i',
    icon: 'ico_add'
}

또는 코드로:

let icon = new Va.I({ icon: 'ico_edit_fill' });
parent.append(icon);

VanillaFront 아이콘 시스템

VanillaFront는 CSS mask-image 방식의 SVG 아이콘 시스템을 사용합니다:

  • 각 아이콘은 ico_xxx CSS 클래스로 정의 (va-icons.css)
  • 실제 아이콘 색상은 background-color: var(--colorStroke)  테마별 자동 색상 조정
  • 크기는 CSS 변수 var(--sizeIconM) 등으로 통일

대표 아이콘 예시:

  • ico_add, ico_delete_fill, ico_edit_fill, ico_search
  • ico_star, ico_star_fill, ico_star_half
  • ico_checkmark, ico_checkmark_circle_fill
  • ico_arrow_up, ico_arrow_down, ico_arrow_left, ico_arrow_right
  • ico_caret_up_fill, ico_caret_down_fill
  • ico_close, ico_menu, ico_settings
  • ico_folder_open, ico_document, ico_download
  • ico_bookmark_fill, ico_pen_fill, ico_attach

속성

속성타입기본값설명

icon String 아이콘 클래스명 ('ico_add' 등)
size String (기본) 'xsmall', 'small', 'medium', 'large', 'xlarge'
iconRotate Number 회전 각도 (deg)
stopPropagation Boolean true 이벤트 전파 차단 (기본 true)
layout, style, class, hidden, attributes 공통 속성

size 값별 크기

sizeCSS 변수대략 크기

xsmall --sizeIconXS 12px
small --sizeIconS 16px
medium (기본) --sizeIconM 20px
large --sizeIconL 24px
xlarge --sizeIconXL 32px

이벤트

이벤트발생 시점콜백 인자

click 클릭 시 (sender, element, evt)
dblclick 더블클릭 시 (sender, element, evt)
contextmenu 우클릭 시 (sender, element, evt)

stopPropagation 기본값이 true — 아이콘 클릭이 부모로 버블링되지 않음. 필요 시 stopPropagation: false로 override.

메서드

  • setIcon(icon) — 아이콘 변경 후 업데이트
  • setValue(value) — 아이콘 변경 (setIcon과 동일)
  • Va.Component 공통 메서드

내부 구조

<i class="va-icon icon-only ico_add" tag-name="i"></i>

<!-- size 지정 시 -->
<i class="va-icon icon-only large ico_delete_fill"></i>

va-icon + icon-only + {size} + {icon} 클래스가 조합됩니다.

자동 적용되는 CSS

.va-icon {
    display: block;
    background-color: var(--colorStroke);  /* 테마별 자동 색상 */
    width: var(--sizeIconM);
    height: var(--sizeIconM);
}

색상 커스터마이징은 style: { backgroundColor: ... }로:

{ tagName: 'i', icon: 'ico_star_fill', style: { backgroundColor: 'gold' } }

사용 시점 — 언제 쓰나

  • 버튼 안 아이콘 — Button/MenuButton 등의 icon 속성 대신 인라인 배치 필요할 때
  • 텍스트 옆 데코레이션 — "저장됨 ✓" 같은 강조
  • 상태 표시 — 성공/실패/로딩 아이콘
  • 커스텀 툴바 — 독자적으로 배치되는 아이콘 버튼
  • 아이콘 회전 애니메이션  iconRotate 활용

사용하지 말아야 할 때

  • 버튼 안 아이콘 — 대부분 Button의 icon 속성으로 충분 (Button이 자동 배치)
  • 이미지 파일  Va.Image
  • 텍스트만 필요  Va.Span / Va.Div
  • 입력 필드 안 아이콘 → 각 Field 컴포넌트의 icon 속성 사용

자주 쓰는 조합 예시

텍스트 옆 상태 아이콘

{
    tagName: 'div',
    layout: 'ds-flex fd-row ai-center gap-xs',
    tags: [
        { tagName: 'i', icon: 'ico_checkmark_circle_fill', style: { backgroundColor: 'green' } },
        { tagName: 'span', text: '저장 완료' }
    ]
}

아이콘 크기 조정

{
    tagName: 'i',
    icon: 'ico_settings',
    size: 'large'  // 24px
}

회전 애니메이션 (로딩)

config(){
    return {
        tagName: 'i',
        ref: 'refSpinner',
        icon: 'ico_refresh',
        iconRotate: 0,
        style: { transition: 'transform 1s' }
    };
}
mounted(){
    let angle = 0;
    setInterval(() => {
        angle += 360;
        let spinner = this.getRef('refSpinner');
        spinner.iconRotate = angle;
        spinner.update();
    }, 1000);
}

커스텀 색상

{
    tagName: 'i',
    icon: 'ico_star_fill',
    style: { backgroundColor: 'gold' }
}

인라인 강조 (문장 안)

{
    tagName: 'div',
    layout: 'ds-flex fd-row ai-center gap-xs',
    tags: [
        { tagName: 'span', text: '중요 알림' },
        { tagName: 'i', icon: 'ico_warning_fill', style: { backgroundColor: 'orange' } }
    ]
}

리스트 항목 앞 아이콘

{
    tagName: 'div',
    layout: 'ds-flex fd-column gap-xs',
    tags: items.map(item => ({
        tagName: 'div',
        layout: 'ds-flex fd-row ai-center gap-s',
        tags: [
            { tagName: 'i', icon: item.icon, size: 'small' },
            { tagName: 'span', text: item.text }
        ]
    }))
}

클릭 가능한 아이콘 버튼

{
    tagName: 'i',
    icon: 'ico_close',
    style: { cursor: 'pointer' },
    onClick: 'onClose'
}

실전 예시 — 상태 대시보드

config(){
    return {
        tagName: 'section',
        layout: 'ds-flex fd-row gap-m',
        tags: this.services.map(svc => ({
            tagName: 'div',
            layout: 'ds-flex fd-row ai-center gap-s',
            style: {
                padding: '10px',
                border: '1px solid var(--colorNeutralStroke)',
                borderRadius: 'var(--sizeRadiusM)'
            },
            tags: [{
                tagName: 'i',
                icon: svc.status === 'OK' ? 'ico_checkmark_circle_fill' : 'ico_close_circle_fill',
                size: 'large',
                style: {
                    backgroundColor: svc.status === 'OK' ? 'green' : 'red'
                }
            },{
                tagName: 'div',
                tags: [
                    { tagName: 'title', innerHTML: svc.name },
                    { tagName: 'subTitle', innerHTML: svc.status }
                ]
            }]
        }))
    };
}

주의사항

  • 아이콘 이름은 반드시 ico_ 접두어  va-icons.css에 정의된 것만 사용
  • Font Awesome 등 외부 아이콘 클래스는 지원 안 됨  classList.add()가 공백 있는 문자열 못 받아 예외 발생
  • stopPropagation 기본 true — 부모 클릭 이벤트 안 발생. 부모 이벤트 함께 필요하면 stopPropagation: false
  • 색상은 background-color로 조정 — mask-image 방식이라 color 아닌 backgroundColor 사용
  • 크기는 size 속성 우선, 그 다음 style width/height — style로 override 가능
  • 회전은 iconRotate 속성 — CSS transform 자동 적용
  • isContainer: true but 실제로 자식 넣는 경우 드묾 — 순수 아이콘 표시용

대안 비교

상황추천

독립 아이콘 표시 Va.I
버튼 안 아이콘 Va.Button의 icon 속성
이미지 파일 표시 Va.Image
텍스트 라벨 Va.Label / Va.Span
뱃지 (알림 카운트) Va.Badge
로딩 스피너 Va.Progressbar / Va.I + 회전 애니메이션

참고

'컴포넌트 > 아이콘, 이미지' 카테고리의 다른 글

Avatar (아바타)  (0) 2026.09.20
Image (이미지)  (0) 2026.09.20