- HTML-in-Canvas는 웹에서
<canvas>요소 내에 HTML 요소/콘텐츠를 직접 그릴 수 있는 새로운 표준 API를 제안하는 WICG 프로젝트임 - 복잡한 텍스트 레이아웃, 접근성, 인터내셔널라이제이션, 품질/성능 문제를 해결하기 위해 등장했으며, 차트·UI·게임 메뉴 등 다양한 Canvas 활용 케이스에서 HTML 스타일링을 직접 활용 가능
drawElement,texElement2D,setHitTestRegions등의 신규 메서드를 통해 HTML 요소를 Canvas 2D 또는 WebGL 컨텍스트에 그대로 렌더링 및 텍스처화 가능- 상호작용 영역, 접근성 개선, 3D 장면 내 2D UI, CSS/HTML 기반 레이아웃 등 실질적 웹앱 개발자 니즈 반영
- 현재 Chrome Canary(138.0.7175.0 이상)에서 실험적 플래그로 활성화 가능하며, 주요 피드백·버그 리포트 환영
개요 및 중요성
- HTML 요소를 직접적으로
<canvas>에 그릴 수 있는 새로운 API를 제안 - 기존에는 복잡한 레이아웃 및 텍스트, HTML 기반 콘텐츠를
<canvas>에 쉽게 렌더링하는 방법이 부재해, 접근성·국제화·퍼포먼스·품질 측면에서 한계가 있었음 - HTML-in-Canvas는 이러한 보완책으로, 2D 캔버스 및 WebGL 내에서 HTML 렌더링을 지원해, 차트 도구, 리치 텍스트 상자, 게임 UI 등 다양한 영역에서의 적용성을 높임.
활용 사례
- 스타일이 적용된 텍스트 및 레이아웃 콘텐츠의 캔버스 내 표현
- 예: 차트의 범례, 축, 리치 에디터 상자, 게임 내 메뉴 등
- 접근성 강화
- 기존 캔버스의 대체 콘텐츠와 실제 렌더링된 내용의 불일치 문제 해소
- 새 API로 접근성 정보의 싱크 맞춤 가능
- HTML와 WebGL 셰이더의 결합
- CSS filter 효과를 넘어, 일반 WebGL 셰이더와 HTML의 결합 니즈 대응
- 3D 컨텍스트 내 HTML 렌더링
- 게임/사이트의 3D 영역에 리치 2D 콘텐츠 삽입 가능
제안 API 및 주요 기능
<canvas layoutsubtree>속성으로 canvas 하위 HTML 요소의 레이아웃 활성화(단, 기본적으로 시각적으로만 렌더, 페이지 탐색 등 UA 알고리즘엔 비노출)- CanvasRenderingContext2D.drawElement(element, x, y, options)
- canvas의 자식 HTML 요소를 지정 위치에 렌더링
options.allowReadback로 개인정보 유출 방지 제어(향후 tainting 정책 적용)- dwidth/dheight 파라미터로 원하는 사이즈로 리사이즈 가능
- WebGLRenderingContext.texElement2D(...)
- 지정 HTML 요소를 WebGL 텍스처로 직접 그려 3D 씬에 활용
- setHitTestRegions
- 특정 영역에 그려진 요소와 캔버스 이벤트(hit test)를 연동하여, 마우스/터치 이벤트를 자동 리다이렉트
- fireOnEveryPaint 옵션(ResizeObserver)
- HTML 변경/재배치 시 canvas의 리렌더 타이밍을 자동 감지해 재그리기 트리거
동작 및 한계
- drawElement 호출 시, canvas transform matrix(CTM) 반영, 요소의 border box 내에만 이미지 클립
- canvas에 그려진 이미지는 정적(렌더 이후 요소가 변하면 다시 drawElement 필요)
- 오프스크린/DOM에 없는 canvas에는 미지원(기술적 한계)
- 상호작용 요소(버튼, 폼 등)는 그릴 수 있으나, 자동으로 상호작용되지는 않음
- 크로스오리진 iframe, SVG foreignObject 등은 미지원
- 접근성, 보안·프라이버시(PII) 관련 이슈가 계속 논의 중
데모 예시
- complex-text 예시: canvas 위에 HTML 스타일 텍스트, 박스 등 복잡한 레이아웃을 drawElement로 직접 그리기
- webGL 예시: texElement2D로 HTML 콘텐츠를 WebGL 텍스처로 만들어 3D 큐브에 맵핑
- text-input 예시: setHitTestRegions, fireOnEveryPaint를 활용해 입력 폼 등 상호작용 가능 영역 표시
개발자 트라이얼 및 유의사항
- Chrome Canary에서
--enable-blink-features=CanvasDrawElement플래그로 활성화 - 캔버스 내용이 tainted 되지 않으므로 개인정보 유출 주의 필수
- API 및 동작은 계속 변화 중이며, 대규모 HTML 테스트 사례는 아직 부족
- 피드백 환영: 호환성, 렌더링 실패 사례, 접근성 문제 등 GitHub Issue로 제보 권장
활용 가치 및 전망
- 차트, 데이터 비주얼라이제이션, in-canvas UI, 3D 게임 내 HUD/메뉴 등 다양한 분야에서 웹의 표현력·생산성 향상
- 기존에는 복잡했던 HTML→Canvas 변환(스타일, 레이아웃, 다국어 지원, 접근성)을 표준 API로 직접 처리 가능
- 웹 기반 그래픽·게임·앱 개발자들에게 강력한 신기술로 기대