H1에 대해서 설명합니다.
Va.H1 — HTML5 <h1> 최상위 제목 컴포넌트
페이지나 섹션의 가장 큰 제목을 표시하는 헤딩 컴포넌트입니다. HTML5 <h1> 태그로 렌더링되며, 문서의 정보 계층 구조에서 최상위 레벨을 나타냅니다.

클래스 정보
Va.H1 extends Va.Component
tagName: 'h1'
isContainer: true
Va.Semantic이 아닌 Va.Component를 직접 상속한다는 점에 주의 (Header/Footer/Article 등 시맨틱 컨테이너와 다른 계보).
기본 사용법
{
tagName: 'h1',
innerHTML: 'VanillaFront 시작하기'
}
또는 코드로:
let h1 = new Va.H1({
text: '오늘의 이야기'
});
parent.append(h1);
HTML5 <h1>의 의미
<h1>은 HTML5의 최상위 헤딩 태그로, 문서·섹션의 가장 중요한 제목을 나타냅니다.
- 한 페이지에 원칙적으로 하나 (전통적 SEO 관례) — 다만 HTML5 스펙상 <section>/<article> 안에서는 각 섹션마다 하나씩 두는 것도 허용
- 검색엔진, 스크린 리더가 문서 구조 파악에 핵심적으로 참조
- 브라우저 기본 스타일: 매우 큰 폰트 + 굵은 두께 + 위아래 여백
헤딩 계열 위치
컴포넌트태그용도
| Va.H1 | <h1> | 최상위 제목 (페이지/섹션 타이틀) |
| Va.H2 | <h2> | 큰 소제목 |
| Va.H3 | <h3> | 중간 소제목 |
| Va.H4 | <h4> | 작은 소제목 |
| Va.H5 | <h5> | 더 작은 소제목 |
| Va.H6 | <h6> | 가장 작은 소제목 |
속성
속성타입설명
| text | String | 순수 텍스트 (자동 이스케이프) |
| innerHTML | String | HTML 문자열 |
| layout, style, class, hidden | — | 공통 속성 |
text와 innerHTML을 동시에 지정하면 text가 우선합니다.
이벤트
이벤트발생 시점콜백 인자
| click | 클릭 시 | (sender, element, evt) |
| contextmenu | 우클릭 시 | (sender, element, evt) |
Header/Footer와 달리 이벤트가 명시적으로 정의되어 있어 헤딩 클릭에도 반응할 수 있습니다.
메서드
- setText(text) — 텍스트 변경 후 업데이트
- setInnerHTML(html) — HTML 변경 후 업데이트
- Va.Component 공통 메서드
내부 구조
<h1 class="va-h1">
<!-- text 또는 innerHTML이 들어감 -->
</h1>
사용 시점 — 언제 쓰나
- 페이지의 대표 제목 — 튜토리얼/문서 페이지 상단
- 섹션의 주요 제목 — 게시글(Article) 안 대표 타이틀
- 랜딩 페이지 히어로 문구 — 브랜드 슬로건 등
사용하지 말아야 할 때
- 여러 개 남발 — SEO/접근성 관점에서 한 페이지 1개 원칙 존중 권장
- 단순히 큰 글자가 필요할 때 → div + style: { fontSize: '...' }
- 버튼처럼 강조된 액션 UI → Va.Button
자주 쓰는 조합 예시
페이지 상단 제목
{
tagName: 'page',
tags: [{
tagName: 'article',
tags: [
{ tagName: 'h1', innerHTML: 'VanillaFront 튜토리얼' },
{ tagName: 'section', innerHTML: '<p>본문...</p>' }
]
}]
}
클릭 이벤트 사용
{
tagName: 'h1',
innerHTML: '📌 접기/펼치기 가능한 제목',
style: { cursor: 'pointer' },
onClick: 'onClickTitle'
}
// View 안:
onClickTitle(sender){
console.log('제목 클릭');
}
Header 안에서 로고+타이틀 조합
{
tagName: 'header',
layout: 'ds-flex fd-row ai-center gap-m',
tags: [
{ tagName: 'img', attributes: { src: './logo.png' }, style: { height: '32px' } },
{ tagName: 'h1', innerHTML: 'VanillaFront' }
]
}
HTML 태그 혼합
{
tagName: 'h1',
innerHTML: '오늘의 <em>특별</em> 소식'
}
실전 예시 — 튜토리얼 페이지 시작
config(){
return {
tagName: 'article',
layout: 'ds-flex fd-column ai-stretch gap-m',
style: { maxWidth: '1000px', marginRight: 'auto' },
tags: [{
tagName: 'h1',
innerHTML: 'VanillaFront 기본개념',
style: {
color: 'var(--colorForeground)',
borderBottom: '2px solid var(--colorPrimary)',
paddingBottom: 'var(--sizeSpacingS)'
}
},{
tagName: 'section',
innerHTML: '<p>본문 내용...</p>'
}]
};
}
주의사항
- Va.Semantic이 아니라 Va.Component 상속 — 헤딩 컴포넌트는 시맨틱 계열과 별개 계보
- text vs innerHTML — 텍스트에 HTML 마크업을 넣고 싶으면 innerHTML 사용. XSS 방지를 위해 내부적으로 Va._sanitize()가 적용됨
- 한 페이지에 여러 개 넣을 때는 신중히 — 시맨틱적으로 의도가 있어야 함 (예: 각 <article> 안의 대표 타이틀)
- 스타일은 CSS 변수로 — var(--sizeFontH1) 등의 테마 변수 존재 (테마별로 자동 조정됨)
- layout 속성 사용 시 — H1은 isContainer: true라 자식을 담을 수도 있으나 시맨틱 관점에서 권장되지 않음
대안 비교
상황추천
| 페이지/문서 최상위 제목 | Va.H1 |
| 섹션 대표 제목 | Va.H2 |
| 하위 제목들 | Va.H3 ~ Va.H6 |
| 단순 큰 글씨 (제목 아님) | div + fontSize 스타일 |
| 라벨성 짧은 텍스트 | Va.Label |
참고
- API 문서 페이지: https://vanillafront.com/docs.html?theme=light#main#apih1
- 연관: Va.Component(부모), Va.H2(다음 레벨 헤딩)