Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 명세는 확장 가능한 벡터 그래픽(SVG) 버전 2의 기능과 구문을 정의합니다. SVG는 2차원 벡터 및 벡터/래스터 혼합 그래픽을 기술하기 위한 XML 기반 언어입니다. SVG 콘텐츠에는 스타일을 적용할 수 있으며, 다양한 디스플레이 해상도에 맞게 확장할 수 있고, 독립적으로 볼 수도 있으며, HTML 콘텐츠와 혼합하거나 다른 XML 언어 내에서 XML 네임스페이스를 사용하여 삽입할 수도 있습니다. SVG는 동적 변경도 지원하며, 스크립트를 사용하여 대화형 문서를 만들 수 있고, 선언적 애니메이션 기능 또는 스크립트를 사용하여 애니메이션을 수행할 수 있습니다.
이 절에서는 이 문서가 발행된 시점의 상태를 설명합니다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있습니다.
이 문서는 SVG 2의 2026년 10월 06일 후보 권고 스냅샷입니다. 이 SVG 버전은 SVG 1.1 제2판을 기반으로 언어의 사용성을 개선하고 작성자가 일반적으로 요청해 온 새로운 기능을 추가합니다. 변경 사항 부록에는 SVG 1.1 제2판 이후 이루어진 모든 변경 사항이 나열되어 있습니다.
이 후보 권고 스냅샷에 대한 의견을 환영합니다.
피드백과 오류 보고서는 Github
이슈를 사용하여 제출할 수 있습니다. 그 밖의 의견은 www-svg@w3.org로 보낼 수
있으며,
이는 웹의 벡터 그래픽 관련 이슈를 위한 공개 이메일 목록입니다. 이 목록은
보관되며
발신자는 첫 번째 게시부터 자신의 메시지가 공개적으로 보관되는 것에
동의해야 합니다. 구독하려면
www-svg-request@w3.org로
제목 줄에 subscribe라는 단어를 넣어 이메일을 보내십시오.
이 명세에는 작업 그룹이 SVG 기능에 관한 특정 결정이 내려진 회의록과 결의에 대한 링크를 기록하기 위해 사용하는 여러 주석이 포함되어 있습니다. 또한 서로 다른 색상을 사용하여 명세 각 절의 성숙도를 표시합니다.
이 후보 권고 스냅샷에서는 기본적으로 절의 성숙도를 나타내는 배경색이 숨겨져 있으며, 요구 사항 수집 작업의 일부로 SVG 2에 대한 특정 요구 사항을 기록하는 주석만 표시됩니다. 절의 성숙도 배경색과 추가 주석을 보려면 "모든 주석" 대체 스타일시트를 사용할 수 있습니다.
이 문서는 SVG 작업 그룹이 권고 트랙을 사용하여 후보 권고 스냅샷으로 발행했습니다.
후보 권고로 발행되었다고 해서 W3C와 그 회원이 이를 승인한다는 의미는 아닙니다. 후보 권고 스냅샷은 폭넓은 검토를 거쳤으며, 구현 경험을 수집하기 위한 것이고, 작업 그룹 구성원은 구현에 대해 로열티 없는 라이선스를 제공하기로 약정했습니다.
이 후보 권고는 2026년 12월 01일 이전에는 권고로 진전되지 않을 것으로 예상됩니다.
이 문서는 W3C 특허 정책에 따라 운영되는 그룹이 작성했습니다. W3C는 이 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지하며, 해당 페이지에는 특허를 공개하는 방법에 대한 지침도 포함되어 있습니다. 자신이 필수 청구항을 포함한다고 생각하는 특허를 실제로 알고 있는 개인은 해당 정보를 W3C 특허 정책 제6절에 따라 공개해야 합니다.
이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받습니다.
이 명세의 모든 기능은 브라우저 또는 저작 도구의 구현에 의존합니다. 기능이 구현될지 확실하지 않은 경우, 해당 기능을 "위험 상태"로 정의합니다. 위험 상태의 기능은 현재 명세에서 제거되며, 향후 버전의 명세에 포함될 수 있습니다. 위험 상태의 기능이 SVG 작성자에게 특히 중요하다면, 해당 작성자는 그 우선순위에 관해 구현자에게 피드백을 제공하는 것이 권장됩니다. 다음 기능은 위험 상태이며 CR 기간 중 삭제될 수 있습니다.
SVG 작업 그룹은 다음 분들께 패치를 제공하거나 문서 변경으로 이어진 토론에 참여하여 이 명세에 기여해 주신 것에 대해 감사드립니다: David Dailey, Eric Eastwood, Jarek Foksa, Daniel Holbert, Paul LeBeau, Robert Longson, Henri Manson, Ms2ger, Kari Pihkala, Philip Rogers, David Zbarsky.
또한 SVG 작업 그룹은 이전 SVG 버전의 편집자와 작성자들의 기여에도 감사를 표하고자 합니다. 이 문서의 많은 텍스트가 이러한 이전 명세에서 유래했으며, 여기에는 다음 분들이 포함됩니다:
마지막으로 SVG 작업 그룹은 SVG 작업 그룹 외부에서 SVG 명세의 개발 과정을 지원해 주신 매우 많은 분들께 감사를 표하고자 합니다. 이분들은 너무 많아서 개별적으로 나열할 수 없습니다. 여기에는 다음을 포함하되 이에 국한되지 않습니다: SVG 1.0 및 1.1 언어의 초기 구현자들(여기에는 뷰어, 저작 도구 및 서버 측 트랜스코더가 포함됨), SVG 콘텐츠 개발자, www-svg@w3.org 및 svg-developers@yahoogroups.com 이메일 목록에 기여한 사람들, W3C의 다른 작업 그룹, 그리고 W3C 팀입니다. SVG 1.1은 진정으로 SVG 작업 그룹, W3C의 나머지 구성원 및 대중이 함께한 협력의 결과이며, 초기 구현자와 콘텐츠 개발자의 선구적인 작업, 대중의 피드백, 그리고 W3C 팀의 도움으로 큰 혜택을 받았습니다.
이 명세는 확장 가능한 벡터 그래픽(SVG)의 기능과 구문을 정의합니다.
SVG는 2차원 그래픽을 기술하기 위한 언어입니다. 독립형 형식으로 사용하거나 다른 XML과 혼합하여 사용할 때는 XML 구문 [xml]을 사용합니다. HTML 문서 내부에서 사용되는 SVG 코드는 HTML 구문 [HTML]을 사용합니다. SVG에서는 세 가지 유형의 그래픽 객체를 사용할 수 있습니다: 벡터 그래픽 도형(예: 직선과 곡선으로 구성된 경로), 이미지 및 텍스트입니다. 그래픽 객체는 그룹화하고, 스타일을 지정하고, 변환하고 합성할 수 있습니다. 기능 집합에는 중첩 변환, 클리핑 경로, 알파 마스크, 필터 효과 및 템플릿 객체가 포함됩니다.
SVG 그림은 대화형이고 동적일 수 있습니다. 애니메이션은 정의하고 트리거할 수 있으며, 선언적으로(즉, SVG 애니메이션 요소를 SVG 콘텐츠에 삽입하여) 또는 스크립팅을 통해 수행할 수 있습니다.
SVG의 고급 응용은 보조 스크립팅 언어를 사용하여 가능하며, 이 언어는 SVG 문서 객체 모델(DOM)에 접근하고, 이는 모든 요소, 속성 및 프로퍼티에 대한 완전한 접근을 제공합니다. 풍부한 이벤트 핸들러 집합을 모든 SVG 그래픽 객체에 할당할 수 있습니다. 웹 페이지 내에서는 동일한 스크립트가 HTML 및 SVG 요소 모두에서 작동할 수 있습니다. 스크립팅.
SVG는 다양한 정보를 풍부한 그래픽으로 표현하는 데 유용하며, 여기에는 여러 올바르게 사용하면 접근성을 높이는 기능이 포함되어 가능한 한 폭넓은 사용자가 콘텐츠를 이용할 수 있도록 보장합니다. 그러나 가능한 경우 원본 데이터에 대한 직접 링크를 제공하면 많은 사람들이 제공된 콘텐츠를 이해하는 데 도움이 됩니다.
SVG는 다른 W3C 명세 및 표준화 활동을 다음과 같이 활용하고 통합합니다:
이 명세에서 핵심 용어 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" 및 "OPTIONAL"은 요구 수준을 나타내기 위해 RFC에서 사용하는 핵심 용어에 설명된 대로 해석해야 합니다 [rfc2119]. 그러나 가독성을 위해 이러한 용어는 이 명세에서 항상 모두 대문자로 표시되지는 않습니다.
경우에 따라 이 명세는 작성자와 사용자 에이전트에 권장되는 모범 사례를 제시합니다.
SVG로 정의된 그래픽은 다양한 용도로 사용됩니다. 따라서 SVG를 사용하는 모든 소프트웨어가 동일한 기능을 가지는 것은 아닙니다. 그러므로 SVG 명세에 대한 적합성은 이분법적인 문제가 아니며, 소프트웨어는 제한된 기능 집합 내에서 적합할 수 있습니다.
또한 SVG는 다른 유형의 문서에 통합되도록 설계되었으며, 통합 유형에 따라 제한된 기능 집합만 적절할 수 있습니다. SVG 문서 조각은 여러 방식으로 다른 문서에서 참조되거나 포함될 수 있으며, 그에 따라 사용자 에이전트에서 처리될 수 있습니다. SVG 문서는 기본 문서로서 직접 볼 수도 있습니다. SVG 문서 조각이 사용되는 각각의 방식은 SVG 문서 조각을 어떻게 처리해야 하는지에 대한 일정한 요구 사항 집합을 의미합니다.
따라서 이 장에서는 여러 처리 모드를 정의하며, 이는 문서에서 활성화하거나 비활성화할 수 있는 여러 기능 조합을 포괄합니다. 또한 SVG 문서가 다른 SVG 문서를 참조하거나 삽입할 때 어떤 처리 모드를 사용해야 하는지에 대한 규범적 요구 사항을 지정합니다. 동일한 처리 모드 집합은 다른 명세에서 참조되어 SVG 문서를 어떻게 처리해야 하는지 설명하는 데 사용될 수 있습니다.
이 문서는 HTML 및 다양한 CSS 명세와 같이 SVG 문서를 참조하거나 포함할 수 있는 다른 명세에 규범적 요구 사항을 부과하지 않습니다. 의도는 이러한 다른 명세가 이 문서의 적절한 처리 모드를 규범적으로 참조하도록 하는 것입니다.
이 장에서는 또한 여러 유형의 SVG 콘텐츠와 SVG를 사용하거나 생성하는 여러 소프트웨어 클래스에 대한 구체적인 적합성 요구 사항을 설명합니다.
이 절에서는 SVG 문서를 위한 표준 처리 모드 집합을 정의합니다. 각 처리 모드는 특정 상위 수준 SVG 기능이 활성화되는지를 지정합니다.
처리 모드에 따라 활성화하거나 비활성화할 수 있는 기능은 다음과 같습니다.
선언적 애니메이션에는 SVG의 애니메이션 요소인 – ‘animate’, ‘animateMotion’, ‘animateTransform’ 및 ‘set’ – 와 CSS 전환 및 애니메이션이 모두 포함됩니다 (자세한 내용은 애니메이션 부록을 참조하십시오). SVG 문서에서 선언적 애니메이션이 비활성화된 경우, 애니메이션 요소 또는 CSS 전환이나 애니메이션을 적용하거나 실행해서는 안 됩니다.
이는 문서의 애니메이션 상태를 문서 시간 0초에서 일시 중지하는 것과는 다릅니다. 애니메이션이 0초에 시작하도록 정의되어 있어도 여전히 적용되지 않습니다.
외부 리소스에 대한 참조는 URL 참조 또는 네트워크 접근 요청으로, 문서에서 사용되는 마크업, 스타일 프로퍼티, 스크립트 또는 기타 웹 플랫폼 기능에 의해 이루어지며, 다음은 제외됩니다:
SVG 문서에서 외부 참조가 비활성화된 경우, 외부 참조를 통해 문서를 가져오려는 모든 시도는 네트워크 오류가 발생하여 데이터를 수신하지 못한 것처럼 처리해야 합니다.
외부 참조가 활성화된 경우, 인터넷에서 외부 파일 요청을 지원하는 사용자 에이전트는 교차 출처 리소스 가져오기에 대한 제한을 준수해야 하며, 이는 링크 장에 설명되어 있습니다.
스크립트 실행은 모든 SVG ‘script’ 요소의 실행, 이벤트 속성에서 발견되는 스크립트(예: SVG 요소의 ‘onclick’) 또는 문서에서 사용되는 다른 웹 플랫폼 기능에 의해 정의된 기타 스크립트, 예를 들어 HTML ‘script’ 요소의 실행을 의미합니다. SVG 문서에서 스크립트 실행이 비활성화된 경우 문서의 어떤 스크립트도 실행해서는 안 됩니다.
상호작용은 DOM 이벤트의 전달 또는 텍스트 선택, 포커스 변경, 링크 이동, 애니메이션 또는 전환 트리거와 같은 사용자 에이전트 고유 UI 동작의 호출을 의미하며, 이러한 동작은 마우스나 키보드 활동과 같은 사용자 입력에 대한 응답으로 수행됩니다. SVG 문서에서 상호작용이 비활성화된 경우 문서 또는 문서 내 요소를 대상으로 하는 모든 사용자 입력 이벤트는 아무런 효과도 가져서는 안 됩니다.
이 처리 모드는 SVG 언어의 어떤 기능에도 제한을 두지 않습니다.
| 동적 대화형 기능 | |
|---|---|
| 스크립트 실행 | 예 |
| 외부 참조 | 예 |
| 선언적 애니메이션 | 예 |
| 상호작용 | 예 |
이 처리 모드는 SVG 문서를 외부 참조를 확인할 수 있는 애니메이션 이미지로 사용하지만 대화형 문서로 사용할 목적은 없는 상황을 위한 것입니다.
| 애니메이션 기능 | |
|---|---|
| 스크립트 실행 | 아니요 |
| 외부 참조 | 예 |
| 선언적 애니메이션 | 예 |
| 상호작용 | 아니요 |
이 처리 모드는 SVG 문서를 외부 참조를 확인할 수 없는 애니메이션 이미지로 사용하며 대화형 문서로 사용할 목적도 없는 상황을 위한 것입니다. 이 모드는 이미지 지원이 전통적으로 래스터 이미지(예: JPEG, PNG 및 GIF)로 제한되었던 경우에 사용할 수 있습니다.
| 보안 애니메이션 기능 | |
|---|---|
| 스크립트 실행 | 아니요 |
| 외부 참조 | 아니요 |
| 선언적 애니메이션 | 예 |
| 상호작용 | 아니요 |
이 처리 모드는 SVG 문서를 외부 참조를 확인할 수 있는 비애니메이션 이미지로 사용하지만 대화형 문서로 사용할 목적은 없는 상황을 위한 것입니다. 예를 들어, 인쇄 문서에 포함할 그래픽을 처리하는 SVG 뷰어는 정적 모드를 사용할 가능성이 높습니다.
| 정적 기능 | |
|---|---|
| 스크립트 실행 | 아니요 |
| 외부 참조 | 예 |
| 선언적 애니메이션 | 아니요 |
| 상호작용 | 아니요 |
이 처리 모드는 SVG 문서를 외부 참조를 확인할 수 없는 비애니메이션 이미지로 사용하며 대화형 문서로 사용할 목적도 없는 상황을 위한 것입니다. 이 모드는 이미지 지원이 전통적으로 비애니메이션 래스터 이미지(예: JPEG 및 PNG)로 제한되었던 경우에 사용할 수 있습니다.
| 보안 정적 기능 | |
|---|---|
| 스크립트 실행 | 아니요 |
| 외부 참조 | 아니요 |
| 선언적 애니메이션 | 아니요 |
| 상호작용 | 아니요 |
SVG 문서를 직접 보는 경우, 사용자 에이전트가 지원하는 가장 포괄적인 처리 모드를 사용하여 표시할 것으로 예상됩니다. 그러나 SVG가 하위 리소스 또는 삽입된 문서로 처리되는 경우 다음 제한을 적용해야 합니다:
‘image’ 요소 내에 삽입된 SVG는 삽입 문서가 선언적 애니메이션을 지원하는 경우 보안 애니메이션 모드로 처리해야 하며, 그렇지 않은 경우 보안 정적 모드로 처리해야 합니다.
래스터 이미지 대신 SVG를 사용하는 다른 경우에도 동일한 처리 모드를 사용할 것으로 예상됩니다. 예를 들어 HTML ‘img’ 요소 또는 <image> 데이터 유형을 받는 모든 CSS 프로퍼티가 이에 해당합니다. 이는 HTML의 요구 사항과 일치하며, 이미지 소스는 "페이지가 나뉘거나 스크립트되지 않은, 비대화형이며 선택적으로 애니메이션되는 이미지 리소스"를 참조해야 합니다 [HTML]
'href'
참조SVG 문서를 ‘use’ 요소 참조 또는 페인트 서버 요소 교차 참조를 통해 로드하는 경우 보안 정적 모드로 처리해야 합니다.
하위 리소스 문서를 처리하는 동안에는 애니메이션이 실행되지 않는다는 점에 유의하십시오. 이는 성능상의 이유와 현재 리소스 문서가 자신의 타임라인을 무엇에 맞춰 참조해야 하는지에 대한 컨텍스트가 정의되어 있지 않기 때문입니다. 그러나 하위 리소스 문서의 요소가 ‘use’ 요소 참조 또는 페인트 서버 교차 참조로 인해 현재 문서에 복제되면, 복제된 요소 인스턴스는 현재 문서의 타임라인에서 애니메이션될 수 있으며, 이는 use 요소 섀도 트리의 애니메이션에 설명되어 있고, 추가 하위 리소스 파일의 로드를 트리거할 수도 있습니다.
SVG 문서를 문서의 특정 요소를 대상으로 하는 스타일 프로퍼티 참조를 통해 로드하는 경우 (이미지 형식으로서의 SVG와는 반대로), 보안 정적 모드로 처리해야 합니다.
하위 리소스 문서에서는 애니메이션이 실행되지 않는다는 점에 유의하십시오. 이는 성능상의 이유와 현재 리소스 문서가 자신의 타임라인을 무엇에 맞춰 참조해야 하는지에 대한 컨텍스트가 정의되어 있지 않기 때문입니다.
일부 스타일 프로퍼티는 특정 요소 또는 전체 이미지 파일을 참조할 수 있으며, 첫 번째 경우에는 처리 모드가 더 제한적입니다. 예를 들어 SVG ‘mask’ 요소에 대한 참조는 애니메이션되지 않지만, 이미지 마스크로 사용되는 전체 SVG 파일은 애니메이션될 수 있습니다.
SVG 파일이 글꼴 참조의 일부로 처리되는 경우, 애니메이션 글리프가 지원되면 보안 애니메이션 모드를 사용해야 하며, 그렇지 않으면 보안 정적 모드를 사용해야 합니다.
이러한 제한은 "SVG" 테이블의 문서를 처리하기 위한 OpenType 명세에 포함되어 있습니다. 또한 OpenType은 추가 제한을 적용하며, 이는 텍스트와 외부 객체의 렌더링을 방지하는 사용자 에이전트 스타일시트 형태입니다 [OPENTYPE].
호스트 문서에 인라인으로 포함된 SVG 문서 조각은 호스트 문서의 처리 모드와 일치하는 처리 모드를 사용해야 합니다. SVG ‘foreignObject’ 요소의 자식으로 포함된 SVG 문서 조각은 주변 SVG 문서의 처리 모드를 사용해야 하며, SVG가 아닌 외부 콘텐츠에는 동등한 제한을 적용하여 처리해야 합니다.
예를 들어 SVG 문서가 HTML ‘img’ 또는 SVG ‘image’ 요소에서 참조되기 때문에 보안 애니메이션 모드로 사용되는 경우, ‘foreignObject’ 요소 내의 모든 콘텐츠는 스크립트, 상호작용 및 외부 파일 참조가 비활성화되어야 하지만, 선언적 애니메이션은 활성화하는 것이 좋습니다.
다음은 참조를 통해 HTML 페이지에 SVG를 삽입하는 여러 방법과, 각 방법에 예상되는 처리 모드 및 허용되는 기능입니다.
"실시간 예제" 행의 각 셀에는 노란색 웃는 얼굴이 표시되어야 합니다. 아래 각 예제에서 눈을 클릭하면 링크 이동을 테스트하고, 얼굴을 클릭하면 선언적 상호작용 및 스크립트 실행을 테스트합니다. 링크는 이미지를 파란색 정사각형으로 바꾸어야 합니다(이를 클릭하면 원래 이미지로 되돌아갑니다). 선언적 상호작용은 ‘set’ 요소를 사용하여 얼굴 색을 노란색 계열에서 녹색 계열로 변경하고, CSS 의사 클래스를 사용하여 대화형 요소에 스트로크를 추가합니다. 스크립트는 미소를 채워야 합니다. 시간 기반(상호작용 기반과 반대) 선언적 애니메이션은 왼쪽 눈이 깜박이는 경우(‘animate’ 요소 사용) 및 눈이 진한 파란색이고 연한 파란색이 규칙적으로 번쩍이는 경우(CSS 키프레임 애니메이션 사용) 지원됩니다.
여기에 설명된 예상 처리 모드 및 기능은 해당 HTML 또는 CSS 명세의 향후 변경에 따라 달라질 수 있습니다.
| 삽입 방법 | 샌드박싱 없는 object | img | CSS 배경 | |
|---|---|---|---|---|
| 예상 처리 모드 | 동적 대화형 | 동적 대화형, 제한 있음 | 보안 애니메이션 | 보안 애니메이션 |
| 선언적 시간 기반 애니메이션 (왼쪽 눈 깜박임, 양쪽 눈의 색상 변경) |
허용됨 | 허용됨 | 허용됨 | 허용됨 |
| 선언적 대화형 애니메이션 및 스타일 변경 (얼굴 색상 변경 클릭 시, 마우스를 올리거나 포커스할 때 얼굴/눈 윤곽 표시) |
허용됨 | 허용됨 | 비활성화됨 | 비활성화됨 |
| 동일한 브라우징 컨텍스트 내에서 동일한 도메인으로 링크 이동 (눈을 클릭하면 이미지 변경) |
허용됨 | 허용됨 | 비활성화됨 | 비활성화됨 |
| 스크립트 기반 상호작용 (얼굴을 클릭하면 미소가 넓어짐) |
허용됨 | 비활성화됨(샌드박싱 때문) | 비활성화됨 | 비활성화됨 |
| 실시간 예제 |
|
SVG는 특정 파일 형식이나 문서 유형이 아니라 문서 객체 모델(DOM)을 기준으로 정의됩니다. 따라서 SVG 콘텐츠의 경우, 이 명세에 대한 적합성은 콘텐츠가 적합한 DOM이거나 이를 생성할 수 있는지에 따라 정의됩니다. 다음 적합성 클래스 중 일부는 콘텐츠가 올바른 형식의 XML인지 여부에 따라 달라집니다 [xml].
주어진 요소를 루트로 하는 DOM 노드 트리 또는 하위 트리는 이 문서에 설명된 명세를 준수하는 SVG 문서 조각을 형성하는 경우 적합한 SVG DOM 하위 트리입니다 (확장 가능한 벡터 그래픽(SVG) 명세). 구체적으로 다음 조건을 충족합니다:
SVG 문서 조각은 XML의 네임스페이스 [xml-names]에 설명된 XML 네임스페이스 기능을 사용하여 상위 XML 문서에 포함할 수 있습니다. 그러나 적합한 SVG DOM 하위 트리는 ‘svg’ 요소를 루트로 가져야 하므로, SVG 네임스페이스의 개별적인 비-‘svg’ 요소를 사용하는 것은 허용되지 않습니다. 따라서 다음 문서의 SVG 부분은 적합하지 않습니다:
<?xml version="1.0" standalone="no"?>
<!DOCTYPE SomeParentXMLGrammar PUBLIC "-//SomeParent" "http://SomeParentXMLGrammar.dtd">
<ParentXML>
<!-- ParentXML의 요소가 여기에 들어갑니다 -->
<!-- 다음은 적합하지 않습니다 -->
<z:rect xmlns:z="http://www.w3.org/2000/svg"
x="0" y="0" width="10" height="10" />
<!-- ParentXML의 추가 요소가 여기에 들어갑니다 -->
</ParentXML>
대신 SVG 부분이 적합한 SVG DOM 하위 트리가 되도록 파일을 다음과 같이 수정할 수 있습니다:
<?xml version="1.0" standalone="no"?>
<!DOCTYPE SomeParentXMLGrammar PUBLIC "-//SomeParent" "http://SomeParentXMLGrammar.dtd">
<ParentXML>
<!-- ParentXML의 요소가 여기에 들어갑니다 -->
<!-- 다음은 적합합니다 -->
<z:svg xmlns:z="http://www.w3.org/2000/svg"
width="100px" height="100px">
<z:rect x="0" y="0" width="10" height="10"/>
</z:svg>
<!-- ParentXML의 추가 요소가 여기에 들어갑니다 -->
</ParentXML>
SVG 언어와 이러한 적합성 기준은 SVG 콘텐츠의 어떤 측면에도 지정된 크기 제한을 두지 않습니다. 요소 수, 문자 데이터의 양 또는 속성 값의 문자 수에는 최댓값이 없습니다.
문서 또는 문서 일부는 문서 MIME 유형에 적합한 파서로 오류 없이(네트워크 오류 제외) 파싱하여 적합한 SVG DOM 하위 트리를 형성할 수 있고, 또한 다음 조건을 충족하는 경우 적합한 SVG 마크업 조각입니다:
적합한 SVG 마크업 조각이 다음 조건을 충족하면 적합한 XML 호환 SVG 마크업 조각이기도 합니다:
<?xml-stylesheet?> 처리 명령이
XML
문서에 스타일시트 연결
[xml-stylesheet]을 준수합니다.
주어진 요소를 루트로 하는 DOM 노드 트리 또는 하위 트리는 XML로 직렬화했을 때 적합한 XML 호환 SVG 마크업 조각을 형성할 수 있다면 적합한 XML 호환 SVG DOM 하위 트리입니다.
예를 들어 ‘id’ 값이 유효한 XML 이름이 아니거나, Comment 노드의 데이터에 부분 문자열 "--"가 포함되는 등 DOM 하위 트리를 변경하지 않고 적합한 XML로 직렬화할 수 없다면, 해당 하위 트리는 적합한 XML 호환 SVG DOM 하위 트리가 아닙니다.
문서는 다음 조건을 충족하면 적합한 SVG 독립형 파일입니다:
SVG 문서 조각이 기술적으로 오류 상태인 여러 상황이 있습니다:
동적 문서는 시간이 지남에 따라 오류 상태에 들어가거나 벗어날 수 있습니다. 예를 들어 SVG DOM에서 발생한 문서 변경 또는 애니메이션으로 인해 문서가 오류 상태가 될 수 있으며, 이후의 변경으로 문서가 다시 올바른 상태가 될 수 있습니다.
문서가 오류 상태일 때마다 사용자 에이전트는 다음 오류 처리 규칙을 사용해야 합니다. 단, 이 명세의 다른 절에서 특정 오류 유형을 처리하기 위한 더 구체적인 규칙을 정의하는 경우는 제외합니다:
일련의 스크립팅 변경으로 인해 특정 SVG 문서 조각이 오류 상태에 들어가거나 벗어날 수 있으므로, 사용자 에이전트는 문서 표시(예: 디스플레이 장치로의 렌더링)가 업데이트되는 시점에만 오류 처리를 적용하는 것이 좋습니다.
소프트웨어의 경우 적합성 요구 사항은 프로그램 범주에 따라 달라집니다:
사용자 에이전트의 일반적인 정의는 텍스트, 그래픽, 소리, 비디오, 이미지 및 기타 콘텐츠 유형을 포함한 웹 콘텐츠를 가져와 렌더링하는 애플리케이션입니다. 사용자 에이전트는 일부 콘텐츠 유형을 처리하는 추가 사용자 에이전트를 필요로 할 수 있습니다. 예를 들어 브라우저는 소리나 비디오를 렌더링하기 위해 별도의 프로그램이나 플러그인을 실행할 수 있습니다. 사용자 에이전트에는 그래픽 데스크톱 브라우저, 멀티미디어 플레이어, 텍스트 브라우저, 음성 브라우저 및 스크린 리더, 화면 확대기, 음성 합성기, 화면 키보드 및 음성 입력 소프트웨어와 같은 보조 기술이 포함됩니다.
일반적인 의미에서 "사용자 에이전트"는 SVG 콘텐츠를 가져와 렌더링할 수 있는 기능이 있을 수도 있고 없을 수도 있습니다. 그러나 컨텍스트에서 다른 해석을 요구하지 않는 한, 이 명세에서 "사용자 에이전트"에 대한 모든 언급은 SVG 콘텐츠를 가져와 렌더링하는 SVG 사용자 에이전트를 가리키는 것으로 간주합니다.
많은 프로그램은 여러 소프트웨어 클래스에 속합니다. 예를 들어 SVG 파일을 가져와 표시하고, 사용자가 이를 수정하도록 허용한 다음, 수정된 그래픽을 파일로 내보낼 수 있는 그래픽 편집기는 SVG 인터프리터, SVG 뷰어, SVG 저작 도구, 그리고 SVG 생성기입니다.
적합한 SVG 생성기란 다음 조건을 충족하는 SVG 생성기입니다:
SVG 생성기는 기본적으로 유니코드 문자 인코딩을 사용하고, 월드 와이드 웹 문자 모델의 다른 지침도 따르는 것이 강력히 권장됩니다 [UNICODE] [charmod].
고정밀 데이터를 처리하는 SVG 생성기는 고정밀 기하 생성에 관한 참고 사항 절의 지침을 따르는 것이 권장됩니다.
저작 도구가 저작 도구 접근성 지침 2.0에 정의된 대로, 적합한 SVG 생성기이고 해당 문서의 모든 관련 레벨 A 요구 사항도 준수하면 적합한 SVG 저작 도구입니다 [atag20]. 레벨 AA 및 레벨 AAA 요구 사항은 권장되지만 적합성을 위해 필수는 아닙니다.
적합한 SVG 서버는 적합한 SVG 생성기의 모든 요구 사항을 충족해야 합니다. 또한
HTTP 또는 인터넷 미디어 유형을 사용하는 다른 프로토콜을 사용하는
적합한 SVG 서버는 SVG 독립형 파일을 미디어
유형 "image/svg+xml"로 제공해야 합니다.
또한 SVG 파일이 gzip 또는 deflate로 압축된 경우 적합한 SVG 서버는 프로토콜이 지원하는 방식에 따라 적절한 헤더로 이를 표시해야 합니다. 구체적으로 서버가 전송 직전에 압축한 콘텐츠의 경우 서버는 적절하게 "Transfer-Encoding: gzip" 또는 "Transfer-Encoding: deflate" 헤더를 사용해야 합니다. 서버에 압축된 형식으로 저장된 콘텐츠(예: 파일 확장자 .svgz)의 경우, 서버는 적절하게 "Content-Encoding: gzip" 또는 "Content-Encoding: deflate" 헤더를 사용해야 합니다.
HTTP에서 저장된 콘텐츠("엔티티")의 압축은 HTTP/1.1 TE/ 전송 인코딩에 정의된 메시지 본문의 자동 압축과 구별됩니다 ([rfc2616], 14.39절 및 14.41절). 이것이 잘못 구성되어 HTTP 헤더에 지정된 압축이 사용된 값과 일치하지 않으면, SVG 사용자 에이전트는 문서를 오류 상태로 처리해야 합니다.
SVG와 SVGZ 파일을 모두 처리하도록 서버를 구성하려면 두 파일 유형에 동일한 미디어 유형을 할당할 수 있어야 하지만 서로 다른 압축 헤더를 사용해야 합니다. 흔히 사용되는 일부 서버는 이러한 구성을 쉽거나 효율적으로 지원하지 않는데, 압축 동작이 미디어 유형을 기준으로 구성되기 때문입니다.
대부분의 최신 웹 서버에서는 SVGZ 파일 대신 압축되지 않은 SVG 파일을 업로드하는 편이 더 쉬운 경우가 많습니다. 그런 다음 서버가 전송을 위해 파일을 압축하고, 향후 요청을 위해 캐시하도록 하며, HTML과 같은 다른 텍스트 기반 파일 형식과 동일한 서버 지침을 사용합니다. 이렇게 하면 서버는 파일을 요청하는 사용자 에이전트가 지원할 때 더 새로운 압축 방법을 사용할 수도 있습니다.
또는 미리 압축된 SVGZ 파일의 이름을 먼저 .svg.gz 복합 파일 확장자를 사용하도록 변경하면 웹 서버가 이를 올바르게 처리할 수 있습니다. 이 경우에도 서버는 정적 gzip 압축 파일을 지원하도록 구성해야 합니다.
SVG 인터프리터는 SVG 문서 조각을 파싱하고 처리할 수 있는 프로그램입니다. SVG 인터프리터의 예로는 서버 측 트랜스코딩 도구 또는 최적화 도구(예: SVG 콘텐츠를 수정된 SVG 콘텐츠로 변환하는 도구)나 분석 도구(예: SVG 콘텐츠에서 텍스트 콘텐츠를 추출하는 도구 또는 유효성 검사기)가 있습니다. SVG를 다른 그래픽 표현으로 변환하는 트랜스코더, 예를 들어 SVG-래스터 트랜스코더는 뷰어에 해당하므로 뷰어 적합성 기준도 적용됩니다.
적합한 SVG 인터프리터는 XML 1.0에 정의된 모든 XML 구문을 파싱하고 처리할 수 있어야 합니다 [xml] 및 XML의 네임스페이스 [xml-names].
적합한 SVG 인터프리터는 모든 적합한 XML 호환 SVG 마크업 조각을 콘텐츠의 DOM 구조 (요소, 속성, 텍스트 콘텐츠, 주석 등)를 올바르게 존중하는 방식으로 파싱해야 합니다. 인터프리터가 모든 기능의 의미를 올바르게 해석할 필요는 없습니다.
SVG 인터프리터가 비XML 구문(예: HTML)을 지원하는 경우, 해당 구문의 모든 적합한 SVG 마크업 조각을 올바르게 파싱해야 합니다.
SVG 인터프리터가 SVG 콘텐츠 처리의 결과로 스크립트를 실행하거나 외부 리소스 파일을 가져오는 경우, SVG 하위 리소스 문서의 처리 모드 및 링크 장에서 사용자 에이전트에 대해 설명한 제한을 따라야 합니다.
| 조치: | 성능 클래스
요구 사항을 검토하고 항목을 제거할지 일반 요구 사항으로 옮길지 결정합니다.
(heycam)
CTM 계산에 배정밀도를 사용해야 한다고 명시합니다. (stakagi) |
|---|---|
| 결의: | SVG 2에서 성능 클래스 요구 사항을 제거합니다. ( ConformingHighQualitySVGViewers ) |
| 목적: | 기술 도면 및 매핑 사용 사례에서 수치 정밀도와 사용자 에이전트 성능 간의 절충을 조정합니다. |
| 담당자: | heycam, stakagi |
SVG 뷰어는 SVG 문서 조각을 파싱하고 처리하여 문서의 콘텐츠를 디스플레이, 프린터 또는 조각기와 같은 그래픽 출력 매체에 렌더링할 수 있는 프로그램입니다. 따라서 SVG 뷰어는 SVG 인터프리터이기도 하지만 (SVG 문서 조각을 파싱하고 처리할 수 있다는 의미에서), 올바른 렌더링이라는 추가 요구 사항이 있습니다.
적합한 SVG 뷰어는 적합한 SVG 인터프리터여야 하며, 이 장에 정의된 처리 모드 중 하나 이상에서 렌더링 출력을 지원할 수 있어야 합니다:
적합한 SVG 뷰어는 해당 처리 모드에서 지원하는 모든 기능에 대해 이 명세에 사용자 에이전트용으로 명시된 모든 규범적 요구 사항을 충족해야 합니다.
모든 적합한 SVG 뷰어에 적용해야 하는 구체적인 기준은 다음과 같습니다:
image/svg+xml인 경우,
처리되려면 올바른 형식의 완전한 SVG 문서여야 합니다.
뷰어가 보안 처리 모드만 지원하더라도 데이터 URL 참조를 처리하려면 이러한 이미지 형식을 지원해야 합니다.
저해상도 디스플레이 장치에서는 앤티앨리어싱 또는 기타 평활화 방법을 지원하는 것이 강력히 권장됩니다. 이는 적합한 고품질 SVG 뷰어의 요구 사항입니다.
$$
(single)
{\large \rm CTM} =
(single)
\left(
(double)
\left[
\begin{matrix}
a_1 & c_1 & e_1 \\
b_1 & d_1 & f_1 \\
0 & 0 & 1
\end{matrix}
\right]
\cdot
(double)
\left[
\begin{matrix}
a_2 & c_2 & e_2 \\
b_2 & d_2 & f_2 \\
0 & 0 & 1
\end{matrix}
\right]
\right)
$$
$$
(single)
\left[
\begin{matrix}
x_{\rm viewport} \\
y_{\rm viewport} \\
1
\end{matrix}
\right]
=
{\large \rm CTM} \cdot (single)
\left[
\begin{matrix}
x_{\rm userspace} \\
y_{\rm userspace} \\
1
\end{matrix}
\right]
$$
상호작용을 포함하는 처리 모드를 지원하는 적합한 SVG 뷰어는 다음 추가 기능을 지원해야 합니다:
스크립트 실행을 포함하는 처리 모드를 지원하는 적합한 SVG 뷰어는 다음 추가 기능을 지원해야 합니다:
사용자 에이전트에 HTML 또는 XHTML 보기 기능이 포함되어 있거나 XML 문서에 CSS 스타일링 프로퍼티를 적용할 수 있는 경우, 적합한 SVG 뷰어는 래스터 이미지 외부 리소스를 사용할 수 있는 모든 위치에서 MIME 유형 "image/svg+xml"의 리소스를 지원해야 합니다. 예를 들어 HTML 또는 XHTML의 ‘img’ 요소 및 래스터 이미지 리소스를 참조할 수 있는 CSS 프로퍼티(예: ‘background-image’)가 이에 해당합니다.
디스플레이 장치에서의 확대/축소와 인쇄를 모두 지원하는 사용자 에이전트의 경우, 기본 인쇄 옵션이 현재 SVG 문서 조각에 대한 디스플레이 장치의 현재 보기를 반영한 인쇄 출력을 생성하도록 하는 것이 권장됩니다(미디어별 스타일링이 없다고 가정). 여기에는 사용자가 수행한 모든 확대/축소 및 이동, 현재 애니메이션 상태 및 DOM 및 스크립팅으로 인한 모든 문서 변경이 고려됩니다.
따라서 사용자가 디스플레이 장치의 지도에서 특정 영역을 확대하고 인쇄본을 요청하면, 인쇄본에는 디스플레이 장치에 표시되는 것과 동일한 지도 보기가 나타나는 것이 좋습니다. 사용자가 애니메이션을 일시 중지하고 인쇄하면, 인쇄본에는 현재 디스플레이 장치에 일시 중지된 그림과 동일한 그래픽이 나타나는 것이 좋습니다. 스크립팅으로 문서에서 요소가 추가되거나 제거되었다면 인쇄본에도 디스플레이에 반영되는 것과 동일한 변경 사항이 반영되는 것이 좋습니다.
SVG의 애니메이션 및 스크립팅 기능을 지원하지 않는 프린터와 같은 정적 전용 장치에서 SVG 문서가 렌더링되는 경우 사용자 에이전트는 문서의 모든 애니메이션 및 스크립팅 요소를 무시하고 나머지 그래픽 요소를 이 명세의 규칙에 따라 렌더링해야 합니다.
적합한 SVG 뷰어가 적합한 고품질 SVG 뷰어로 간주되려면 다음 추가 기능을 지원해야 합니다:
스크립트 실행, 선언적 애니메이션 또는 상호작용을 포함하는 처리 모드를 지원하는 적합한 고품질 SVG 뷰어는 다음 추가 기능을 지원해야 합니다:
상호작용을 포함하는 처리 모드를 지원하는 적합한 고품질 SVG 뷰어는 다음 추가 기능을 지원해야 합니다:
SVG 2 렌더링 모델은 합성 및 블렌딩 명세에 정의된 규칙을 따릅니다.
결의: Seattle/Paris 2012 F2F 3일차.
담당자: Nikos (Action 3332).
상태: 완료.
SVG 구현은 이 장에 설명된 렌더링 모델을 구현해야 하며, 구현이 벗어날 수 있는 상황을 설명하는 적합성 요구 사항 부록의 수정 사항을 따릅니다. 실제로는 출력 장치의 제한 (예: 제한된 범위의 색상만 지원될 수 있음)과 정밀한 수학적 모델 구현의 실질적인 제한(예: 현실적인 성능을 위해 곡선을 직선으로 근사하며, 근사는 적합성 요구 사항을 충족할 만큼 충분히 정확하기만 하면 됨)에 따라 변동이 허용됩니다.
적합성 요구 사항 부록에서는 실제 구현이 이 설명에서 어느 정도 벗어날 수 있는지 설명합니다. 실제로 실제 구현은 출력 장치의 제한(예: 제한된 범위의 색상만 지원될 수 있음)과 정밀한 수학적 모델을 구현하는 데 따른 실질적인 제한(예: 현실적인 성능을 위해 곡선을 직선으로 근사하며, 근사는 적합성 요구 사항을 충족할 만큼 충분히 정확하기만 하면 됨) 때문에 약간 벗어날 수 있습니다.
SVG 문서의 최종 렌더링 표현을 구성하는 요소들은 문서 모델의 기반 요소들과 일대일 관계를 가지지 않습니다. 대신 그래픽의 모습은 병렬 구조인 렌더링 트리를 반영하며, 여기에서는 일부 요소가 제외되고 다른 요소는 반복됩니다.
SVG 네임스페이스의 많은 요소는 그래픽 문서의 구성 요소를 직접 나타내지 않습니다. 대신 그래픽 효과, 메타데이터, 다른 요소를 나타내는 데 사용할 콘텐츠, 또는 특정 조건에서 표시할 대안을 정의합니다. 동적 문서에서는 그래픽의 특정 구성 요소가 상호작용이나 애니메이션에 따라 렌더링되거나 렌더링되지 않을 수 있습니다. 이러한 렌더링되지 않은 요소는 렌더링 트리에 직접 포함되지 않습니다.
SVG는 그래픽 하위 구성 요소의 재사용을 지원하므로, 일부 요소는 여러 번 렌더링됩니다. 개별 렌더링은 컨텍스트에 따른 스타일링을 가질 수 있으며 서로 다른 배율이나 변환으로 래스터화될 수 있습니다.
렌더링 트리는 SVG 문서 조각에서 렌더링되는 요소 집합입니다. 문서 트리에서 렌더링되지 않은 요소를 제외하고 재사용되는 그래픽을 위한 추가 조각을 삽입하여 생성됩니다. 그래픽은 렌더링 트리 순서대로 페인팅되고 합성되며, paint-order 프로퍼티에 따른 재정렬의 영향을 받습니다. 시각적 페인트가 없는 요소도 렌더링 트리에 있을 수 있다는 점에 유의하십시오.
현재 문서의 렌더링 트리에 직접 표현되는 요소입니다. use 요소 섀도 트리에 있는 요소의 렌더링된 인스턴스를 포함합니다. 재사용되는 그래픽의 소스 정의로서 렌더링에 영향을 주지만 그 자체가 직접 렌더링되지 않는 요소는 포함하지 않습니다. 렌더링된 요소와 렌더링되지 않은 요소를 참조하십시오.
현재 문서의 렌더링 트리에 직접 표현되지 않는 요소입니다. 그럼에도 재사용되는 그래픽 또는 그래픽 효과로서 렌더링 트리에 영향을 줄 수 있습니다. 렌더링된 요소와 렌더링되지 않은 요소를 참조하십시오.
렌더링 트리에 포함되지만 문서 모델에 직접 대응하는 단일 요소가 없는 그래픽 구성 요소입니다. 섀도 DOM 요소를 통해 표현될 수 있으며 (‘use’ 요소로 재사용되는 그래픽처럼), 또는 그래픽 효과의 일부로 생성된 이미지 조각으로 표현될 수 있습니다(패턴이나 마스크처럼).
컨텍스트 또는 display 스타일 값과 관계없이 직접 렌더링되지 않는 모든 요소 유형입니다. 여기에는 다음 요소가 포함됩니다: ‘clipPath’, ‘defs’, ‘desc’, ‘linearGradient’, ‘marker’, ‘mask’, ‘metadata’, ‘pattern’, ‘radialGradient’, ‘script’, ‘style’ 및 ‘title’; 또한 use 요소 섀도 트리의 인스턴스 루트가 아닌 ‘symbol’ 요소도 포함됩니다.
그래픽, 컨테이너, 텍스트, 오디오 또는 애니메이션으로 렌더링 트리에 직접 표현될 수 있는 모든 요소 유형입니다. 여기에는 다음 요소가 포함됩니다: ‘a’, ‘circle’, ‘ellipse’, ‘foreignObject’, ‘g’, ‘image’, ‘line’, ‘path’, ‘polygon’, ‘polyline’, ‘rect’, ‘svg’, ‘switch’, ‘text’, ‘textPath’, ‘tspan’ 및 ‘use’; 또한 use 요소 섀도 트리의 인스턴스 루트인 ‘symbol’ 요소도 포함됩니다.
렌더링 가능한 요소는 특정 문서나 특정 시점에서 렌더링될 수도 있고 렌더링되지 않을 수도 있습니다.
어느 시점에서든 모든 SVG 요소 (또는 use 요소 섀도 트리의 요소 인스턴스)는 렌더링되거나 렌더링되지 않습니다. 요소가 현재 렌더링되는지 여부는 시각적 표시뿐만 아니라 상호작용성 및 기하 계산에도 영향을 줍니다.
요소는 다음 다섯 가지 상황에서 렌더링되지 않습니다:
none인 요소
렌더링되지 않은 요소는:
렌더링되지 않은 요소는 문서 접근성 트리에 표현되지 않습니다. 그럼에도 문서 모델의 일부로 남아 있으며, 스타일 상속 및 캐스케이드에 참여합니다.
SVG는 일반적으로 렌더링되는 요소의 표시 여부를 전환하기 위해 두 프로퍼티를 사용합니다: display 및 visibility. 정적 문서에서는 비슷한 시각적 효과를 가지지만, 개념적으로는 서로 다릅니다.
display 및 visibility의 정의는 CSS 2.1 명세를 참조하십시오. [CSS2]
display를 none으로 설정하면 요소가 렌더링되지 않습니다. 일반적으로 렌더링되는 그래픽 요소, 텍스트 콘텐츠 요소, 및 컨테이너 요소에 적용할 때 display를 none으로 설정하면 요소(및 모든 자손)가 렌더링 트리의 일부가 되지 않습니다. display는 상속되는 프로퍼티가 아니라는 점에 유의하십시오.
none 이외의 display 값을 가진 요소는 정상적으로 렌더링됩니다.
display 프로퍼티는 렌더링 가능한 요소에만 적용됩니다.
절대 직접 렌더링되지 않는
요소 또는 조건부 처리에 따라 렌더링되지 않는 요소에
display: none을 설정해도
아무런 효과가 없습니다.
display 프로퍼티는 주어진 요소의 직접 처리에 영향을 주지만, 다른 요소가 이를 참조하는 것을 막지는 않습니다. 예를 들어 ‘path’ 요소에 display: none을 설정하면 해당 요소가 캔버스에 직접 렌더링되는 것은 막지만, ‘path’ 요소는 여전히 ‘textPath’ 요소에서 참조할 수 있으며 그 기하는 경로상 텍스트 처리에 사용됩니다.
그래픽 요소 또는 ‘use’ 요소에 적용할 때, visibility를 hidden 또는 collapse로 설정하면 요소가 페인팅되지 않습니다. 그러나 여전히 렌더링 트리의 일부입니다. 포인터 이벤트에 반응할 수 있으며 (pointer-events 값에 따라), 포커스를 받을 수도 있고(‘tabindex’ 값에 따라), 경계 상자 계산 및 클리핑 경로에 기여하며, 텍스트 레이아웃에도 영향을 줍니다.
visibility 프로퍼티는 그래픽 요소, 텍스트 콘텐츠 요소 및 텍스트 콘텐츠 요소의 자식인 ‘a’ 요소의 렌더링에만 직접 영향을 줍니다. 그러나 visibility는 상속되는 프로퍼티이므로, ‘use’ 요소 또는 컨테이너 요소 자체에는 영향을 주지 않더라도, 상속된 값은 자손 요소에 영향을 줄 수 있습니다.
문서의 한 부분 (또는 다른 문서)에 정의된 그래픽 콘텐츠를 다른 요소를 렌더링하는 데 사용할 수 있습니다. 렌더링 관점에서 재사용되는 그래픽에는 두 유형이 있습니다:
섀도 DOM 요소는 일반 요소와 같은 방식으로 렌더링되며, 호스트 요소(예: ‘use’ 요소)가 컨테이너이고 섀도 콘텐츠가 그 자손인 것처럼 처리됩니다. 섀도 DOM 요소의 스타일 및 기하 프로퍼티는 참조된 문서 하위 트리의 소스 요소에 있는 것과 독립적으로 해석됩니다. display 프로퍼티는 ‘symbol’ 요소에 적용되는 특별 규칙을 제외하면 섀도 요소에 일반적인 효과를 가집니다.
블렌딩을 위해 ‘use’ 요소는 비격리 그룹을 형성합니다.
반대로 그래픽 효과 요소는 자체 포함 SVG 조각을 생성하며, 이는 스태킹 컨텍스트 및 격리 그룹으로 독립적으로 렌더링됩니다. 이 조각의 캔버스는 배율 조정됩니다 그래픽 효과 요소의 자식 콘텐츠는 이 캔버스에 렌더링되고 합성됩니다. 평탄화된 캔버스 전체는 다른 페인트 레이어와 합성 및 블렌딩할 때 벡터 이미지로 취급됩니다
그래픽 효과 요소의 모든 자식 콘텐츠에 있는
display 프로퍼티는
none으로 설정되면 일반적인 효과를 가지며,
해당 하위 트리를 렌더링에 사용되지 않도록 제외합니다.
그러나 그래픽 효과 요소 또는 조상의
display: none 값에 의해
그래픽 효과 자체가 변경되지는 않습니다.
SVG는 렌더링에 "페인터 모델"을 사용합니다. 페인트는 연속적인 작업을 통해 출력 장치에 적용되며 각 작업은 출력 장치의 특정 영역에 페인트하여 이전에 적용된 페인트를 가릴 수 있습니다. 각 객체 또는 그룹이 페인팅된 후에는 다음 페인팅 작업을 위한 배경의 일부가 됩니다. SVG 2는 각 페인팅 작업이 배경과 상호작용하는 방식을 제어하는 고급 블렌딩 모드 및 합성 작업을 지원합니다. 이러한 페인팅 작업을 규정하는 규칙은 합성 및 블렌딩 명세에 설명되어 있습니다.
SVG의 요소는 SVG 뷰포트의 x축과 y축에 배치됩니다. 요소가 겹치면 페인팅되는 순서에 따라 어느 요소가 앞에 나타나는지가 결정됩니다. 이러한 앞뒤 순서를 z축이라고 합니다.
기본적으로 요소는 문서 순서대로 페인팅됩니다. 마크업에서 나중에 나타나는 요소는 앞서 나타나는 요소 위에 페인팅됩니다. 요소는 스태킹 컨텍스트로 그룹화되며, 이는 요소 집합을 모아 하나의 단위로 페인팅합니다.
스태킹 컨텍스트는 요소가 서로의 위에 페인팅되는 순서와 포인터 이벤트의 대상을 결정할 때 어느 요소가 가장 위에 있는지를 결정합니다. DOM 트리에서 요소의 위치나 크기 또는 방향에는 영향을 주지 않으며, 페인팅되는 순서에만 영향을 줍니다.
각 요소는 하나의 스태킹 컨텍스트에 속합니다. 주어진 스태킹 컨텍스트의 요소는 문서 순서에 따라 쌓여야 합니다.
스태킹 컨텍스트는 추가 스태킹 컨텍스트를 포함할 수 있습니다. 스태킹 컨텍스트는 부모 스태킹 컨텍스트의 관점에서는 원자적입니다. 부모가 페인트 순서를 결정할 때 자식 스태킹 컨텍스트는 분할할 수 없는 하나의 항목으로 취급됩니다. 외부 요소가 그 내부 요소 사이에 페인팅될 수 없습니다.
‘foreignObject’ 요소를 제외하면, SVG 요소가 생성한 스태킹 컨텍스트의 뒤에서 앞으로 쌓이는 순서는 다음과 같습니다:
‘foreignObject’ 요소는 CSS 용어로 "고정 위치 포함 블록"을 생성하므로, ‘foreignObject’ 요소가 생성하는 스태킹 컨텍스트의 스태킹 순서에 대한 규범적 규칙은 CSS 2.1 부록 E의 규칙입니다.
다음 조건 중 하나라도 충족되면 SVG 요소에 그 자손을 위한 새로운 스태킹 컨텍스트를 설정해야 합니다. 프로퍼티 기반 조건에서는 해당 프로퍼티가 요소에 적용되며 주어진 계산값을 가져야 합니다.
| 조건 | 값 조건 | 참고 |
|---|---|---|
| 문서 요소 | 항상 | 독립형 SVG 문서에서와 같이 ‘svg’ 요소인 경우에만 |
| 최외곽 svg 요소 | 항상 | SVG 문서 조각을 시작하는 ‘svg’ 요소, 즉 부모 요소가 SVG 네임스페이스에 속하지 않는 요소 |
| ‘foreignObject’ | 항상 | |
| ‘image’ | 항상 | |
| ‘marker’ | 항상 | |
| ‘mask’ | 항상 | mask 프로퍼티가 아니라 mask 요소 |
| ‘pattern’ | 항상 | |
| ‘symbol’ | 항상 | |
| ‘use’ | 항상 | |
| overflow가 있는 내부 ‘svg’ | visible 이외의 계산값 | 중첩된 ‘svg’ 요소에만 적용되며, 최외곽 svg 요소에는 적용되지 않습니다. 사용자 에이전트 스타일시트가 중첩된 ‘svg’ 요소에 overflow: hidden을 설정한다는 점에 유의하십시오. |
| clip 프로퍼티 | auto 이외의 계산값 | 요소에 명시적 클리핑이 적용됩니다. SVG에서 clip은 새 뷰포트를 설정하는 요소, ‘pattern’ 요소 및 ‘mask’ 요소에만 적용됩니다. |
| clip-path 프로퍼티 | none 이외의 계산값 | 요소에 명시적 클리핑이 적용됩니다 |
| opacity 프로퍼티 | 1 이외의 계산값 | |
| mask 프로퍼티 | none 이외의 계산값 | mask 요소가 아니라 mask 프로퍼티 |
| filter 프로퍼티 | none 이외의 계산값 | |
| 다른 명세에 정의된 프로퍼티 | 해당 명세에 정의된 대로 | 해당 프로퍼티가 SVG에서 스태킹 컨텍스트를 설정하도록 정의된 경우 |
개별 그래픽 요소는 비격리 그룹인 것처럼 취급되며, 그래픽 요소를 구성하는 구성 요소(채우기, 스트로크 등)는 ( 도형과 텍스트 페인팅 참조) 해당 그룹의 구성원입니다. 그룹이 렌더링되는 방식을 참조하십시오.
‘g’ 요소와 같은 그룹화 요소(컨테이너 요소
참조)는 합성 그룹을 생성합니다.
마찬가지로 ‘use’
요소는 자신의 섀도 콘텐츠를 위한 합성 그룹을 생성합니다.
합성 및 블렌딩
명세는 합성 그룹을 렌더링하는 방법을 규범적으로
설명합니다.
SVG에서는 그룹에 효과를 적용할 수 있습니다. 예를 들어 불투명도, 필터
또는 마스킹이 있습니다. 이러한 효과는 그룹의 렌더링 결과에
그룹의 모든 변환이 적용되기 직전에 적용되며, 이러한 변환은
그룹이 그룹 배경과
블렌딩되고 합성되기 직전에 적용됩니다.
이러한 효과 중 하나라도 그룹에 적용하면
해당 그룹은 격리됩니다.
따라서 합성
그룹의 렌더링은 다음 단계를 따릅니다:
그룹이 격리된 경우:
opacity의 정의는 CSS Color Module Level 3을 참조하십시오. [css-color-3]
opacity 프로퍼티는 주어진 그래픽 요소 또는 컨테이너 요소가 캔버스에 페인팅될 때 얼마나 불투명한지를 지정합니다. 컨테이너 요소에 적용되면 이를 그룹 불투명도라고 하며, 개별 렌더링 요소에 적용되면 객체 불투명도라고 합니다. 그러나 이 두 작업의 원리는 동일합니다.
SVG에는 불투명도와 관련된 몇 가지 다른 프로퍼티가 있습니다:
이 네 가지 불투명도 프로퍼티는 중간 렌더링 작업에 관여합니다. 그러나 객체 및 그룹 불투명도는 후처리 작업으로 생각할 수 있습니다. 개념적으로 opacity가 적용되는 객체 또는 그룹은 RGBA 오프스크린 이미지에 렌더링됩니다. 그런 다음 오프스크린 이미지 전체가 지정된 opacity 값을 오프스크린 이미지 전체에 균일하게 사용하여 캔버스에 블렌딩됩니다. 따라서 opacity가 있으면 그룹은 격리됩니다.
opacity 프로퍼티는 다음 SVG 요소에 적용됩니다: ‘svg’, ‘g’, ‘symbol’, ‘marker’, ‘a’, ‘switch’, ‘use’ 및 그래픽 요소.
다음 예제에서는 객체와 그룹에 opacity 프로퍼티를 다양하게 사용하는 방법을 보여 줍니다.
<svg xmlns="http://www.w3.org/2000/svg"
width="600" height="175" viewBox="0 0 1200 350">
<!-- 배경 파란색 사각형 -->
<rect x="100" y="100" width="1000" height="150" fill="blue"/>
<!-- 불투명에서 거의 투명으로 변하는 빨간색 원 -->
<circle cx="200" cy="100" r="50" fill="red" opacity="1"/>
<circle cx="400" cy="100" r="50" fill="red" opacity=".8"/>
<circle cx="600" cy="100" r="50" fill="red" opacity=".6"/>
<circle cx="800" cy="100" r="50" fill="red" opacity=".4"/>
<circle cx="1000" cy="100" r="50" fill="red" opacity=".2"/>
<!-- 불투명 그룹, 불투명 원 -->
<g opacity="1">
<circle cx="182.5" cy="250" r="50" fill="red" opacity="1"/>
<circle cx="217.5" cy="250" r="50" fill="green" opacity="1"/>
</g>
<!-- 그룹 불투명도: .5, 불투명 원 -->
<g opacity=".5">
<circle cx="382.5" cy="250" r="50" fill="red" opacity="1"/>
<circle cx="417.5" cy="250" r="50" fill="green" opacity="1"/>
</g>
<!-- 불투명 그룹, 빨간색 위의 반투명 녹색 -->
<g opacity="1">
<circle cx="582.5" cy="250" r="50" fill="red" opacity=".5"/>
<circle cx="617.5" cy="250" r="50" fill="green" opacity=".5"/>
</g>
<!-- 불투명 그룹, 녹색 위의 반투명 빨간색 -->
<g opacity="1">
<circle cx="817.5" cy="250" r="50" fill="green" opacity=".5"/>
<circle cx="782.5" cy="250" r="50" fill="red" opacity=".5"/>
</g>
<!-- 그룹 불투명도 .5, 빨간색 위의 반투명 녹색 -->
<g opacity=".5">
<circle cx="982.5" cy="250" r="50" fill="red" opacity=".5"/>
<circle cx="1017.5" cy="250" r="50" fill="green" opacity=".5"/>
</g>
</svg>
빨간색과 녹색 원으로 이루어진 각 그룹은 먼저 오프스크린 이미지에 렌더링된 후, 주어진 opacity 값으로 전체가 배경 파란색 사각형과 블렌딩됩니다.
예제에서 위쪽 행의 원들은 1.0에서 0.2까지 서로 다른 불투명도를 가집니다. 아래쪽 행은 다섯 개의 ‘g’ 요소를 보여 주며, 각 요소에는 다음과 같이 겹치는 빨간색과 녹색 원이 포함됩니다:
SVG는 캔버스에 렌더링할 수 있는 세 가지 기본 그래픽 요소 유형을 지원합니다:
도형과 텍스트는 채우기(즉, 도형 내부에 페인트 적용) 및 스트로크(즉, 도형의 윤곽선을 따라 페인트 적용)를 할 수 있습니다.
특정 유형의 도형에서는 마커 심볼(그 자체가 도형, 텍스트 및 이미지의 어떤 조합으로도 구성될 수 있음)을 도형 경계의 위치에 그릴 수 있습니다. 각 마커 심볼은 해당 마커 심볼을 사용하는 도형 객체 바로 뒤에 그래픽 콘텐츠가 SVG 문서 트리에 확장된 것처럼 페인팅됩니다. 마커 심볼의 그래픽 콘텐츠는 그래픽 요소와 같은 방법으로 렌더링됩니다. 마커 심볼은 텍스트에는 적용되지 않습니다.
채우기, 스트로크 및 마커가 페인팅되는 순서는 paint-order 프로퍼티에 의해 결정됩니다. 기본값은 채우기를 먼저 페인팅하고, 다음으로 스트로크, 그다음 마커 심볼을 페인팅하는 것입니다. 마커 심볼은 도형의 윤곽선을 따라 도형의 시작부터 끝까지 순서대로 렌더링됩니다.
채우기와 스트로크 작업은 완전히 독립적입니다. 예를 들어 각 채우기 또는 스트로크 작업에는 자체 불투명도 설정이 있습니다.
SVG는 채우기와 스트로크 작업에서 사용할 수 있는 다양한 내장 페인트 유형을 지원합니다. 이에 대해서는 페인트 서버에서 설명합니다.
래스터 이미지가 렌더링될 때 원본 샘플은 표준 알고리즘을 사용해 "리샘플링"되어 출력 장치에서 필요한 위치의 샘플을 생성합니다. 리샘플링 요구 사항은 적합성 요구 사항에서 설명합니다.
HTML에서와 마찬가지로 [HTML, 10.4.2], 동일한 절대 URL과 동일한 이미지 데이터를 가진 모든 애니메이션 이미지는 하나의 그룹으로 동일한 타임라인에 동기화되어 렌더링될 것으로 예상되며, 타임라인은 해당 그룹에 가장 오래전에 추가된 시점에 시작합니다.
사용자 에이전트가 애니메이션 이미지를 보여 주는 img 요소의 애니메이션을 다시 시작할 때, 해당 img 요소의 노드 문서에서 동일한 절대 URL과 동일한 이미지 데이터를 가진 모든 애니메이션 이미지는 처음부터 애니메이션을 다시 시작할 것으로 예상됩니다.
SVG에서는 모든 페인팅 작업에 필터를 적용할 수 있습니다. ( 필터 효과 참조.)
이 경우 결과는 페인트 작업이 투명한 검은색으로 초기화된 중간 캔버스에 적용된 다음, 필터 효과에 제시된 규칙에 따라 크기가 결정되고 필터 효과에 정의된 프로세스로 필터링된 것과 같아야 합니다.
SVG는 다음 클리핑/마스킹 기능을 지원합니다:
클리핑과 마스킹은 모두 CSS Masking 모듈에 지정되어 있습니다 [css-masking-1].
SVG 문서 조각은 반투명할 수 있습니다.
합성 및 블렌딩 명세에 따라, ‘svg’ 요소는 항상 격리된 그룹을 생성합니다. SVG 문서가 최상위 문서인 경우, 즉 다른 문서에 삽입되지 않은 경우, 루트 ‘svg’ 요소는 페이지 그룹으로 간주되며 불투명도 100%의 흰색 배경과 합성됩니다. 그 밖의 모든 경우 SVG 문서 또는 문서 조각은 불투명도를 유지한 채 부모 문서에 합성됩니다.
overflow의 정의는 Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) 명세 [CSS2]를 참조하십시오.
| 요소 | 초기값 | UA 스타일시트 | auto | visible | hidden | scroll |
|---|---|---|---|---|---|---|
| 문서 루트 svg | visible | n/a | visible | scroll | visible | hidden | scroll |
| 기타 svg | visible | hidden | visible | scroll | visible | hidden | scroll |
| text | visible | hidden | visible | visible | hidden | hidden |
| pattern | visible | hidden | visible | visible | hidden | hidden |
| marker | visible | hidden | visible | visible | hidden | hidden |
| symbol | visible | hidden | visible | visible | hidden | hidden |
| image | visible | hidden | visible | visible | hidden | hidden |
| foreignObject | visible | hidden | visible | scroll | visible | hidden | scroll |
overflow 프로퍼티는 CSS 2.1에 정의된 것과 동일한 매개변수 값과 동일한 의미를 가집니다 ([CSS2], 11.1.1절); 그러나 다음 추가 사항이 적용됩니다:
속성 또는 프로퍼티의 초기값은 해당 속성 또는 프로퍼티가 지정되지 않았거나 유효하지 않은 값을 가진 경우 사용되는 값입니다. 이 값은 렌더링, 애니메이션 값 계산, 그리고 DOM 인터페이스를 통해 속성 또는 프로퍼티에 접근할 때 사용됩니다.
이 명세에서 속성은 다음과 같은 속성 정의 표를 사용하여 정의됩니다:
| 이름 | 값 | 초기값 | 애니메이션 가능 |
|---|---|---|---|
| exampleattr | <length> | none | none | 예 |
값 열에는 속성의 구문에 대한 설명이 있습니다. 속성 구문을 설명하는 방법에는 여섯 가지가 있습니다:
| SVG 2 요구 사항: | 프레젠테이션 속성 값의 대소문자 구분을 완화하는 것을 고려합니다. |
|---|---|
| 결의: | 프로퍼티 값을 대소문자를 구분하지 않도록 합니다. |
| 목적: | 프레젠테이션 속성 구문 파싱을 대응하는 CSS 프로퍼티의 파싱과 일치시키기 위함입니다. |
| 담당자: | Cameron (ACTION-3276) |
| 상태: | 완료 |
CSS 값 정의 구문을 사용하여 정의된 프레젠테이션 속성을 파싱할 때는 다음과 같이 수행합니다:
<number> 기호를 삽입하면 단위 없는 길이 및 각도를 프레젠테이션 속성에서는 사용할 수 있지만 대응하는 프로퍼티 값에서는 사용할 수 없습니다.
모든 프레젠테이션 속성은 대응하는 CSS 프로퍼티를 참조하여 정의되므로 CSS 값 정의 구문을 사용하여 정의된다는 점에 유의하십시오.
CSS 값 정의 구문을 사용하여 정의된 다른 모든 속성을 파싱할 때는 속성 정의 표에 제시된 문법에 따라 속성 값을 파싱합니다.
이렇게 하면 이러한 속성에서 CSS 주석과 이스케이프를 사용할 수 있다는 점에 유의하십시오. 예를 들어 '10\px/**/' 값은 ‘rect’ 요소의 ‘x’ 프레젠테이션 속성에서 '10px'로 성공적으로 파싱됩니다.
URL로 정의된 속성을 파싱할 때는 속성 값을 input으로, 문서의 URL을 base로 하여 URL 파서를 호출합니다 [URL].
초기값 열은 속성의 초기값을 제시합니다. 지정된 CSS 값 정의 구문, ABNF 또는 EBNF 문법에 따라 속성을 파싱하지 못하거나 URL 표준에 따른 파싱 또는 속성을 파싱하는 방법을 설명하는 본문에 따른 파싱이 실패를 나타내면, 해당 속성에는 주어진 초기 값이 지정된 것으로 간주합니다.
프레젠테이션 속성의 초기값은 대응하는 프로퍼티의 초기값입니다. 유효하지 않은 값을 프레젠테이션 속성에 사용하면 초기값이 지정된 것처럼 처리되므로, 이 값은 사용자 에이전트 스타일시트에서 오는 값과 같이 우선순위가 낮은 스타일시트 규칙에서 오는 값을 재정의할 수 있습니다.
예를 들어 사용자 에이전트 스타일시트가 ‘svg’ 요소에 대해 overflow 프로퍼티 값을 hidden으로 설정하더라도, overflow="invalid"과 같은 유효하지 않은 프레젠테이션 속성을 지정하면 overflow를 visible로 설정하는 규칙이 생성되어, 사용자 에이전트 스타일시트의 값을 재정의합니다.
애니메이션 가능 열은 SVG Animation 모듈에 정의된 애니메이션 요소를 사용하여 속성을 애니메이션할 수 있는지 나타냅니다.
달리 명시되지 않는 한, SVG 속성 및 SVG 요소에 영향을 주도록 정의된 프로퍼티의 숫자 값은 호스트 아키텍처가 지원하는 모든 유한 단정밀도 값을 최소한 지원해야 합니다.
가능한 최상의 정밀도를 제공하고 반올림 오류를 방지하기 위해 좌표계 변환과 같은 연산에는 더 높은 정밀도의 부동소수점 저장 및 계산을 수행하는 것이 권장됩니다.
적합한 SVG 뷰어는 적합성 기준에 설명된 대로 해당 적합성 클래스에 따라 수치 계산을 수행해야 합니다.
일부 숫자 속성 및 프로퍼티 값에는 제한된 범위가 있습니다. 다른 값은 장치의 기능에 따라 제한됩니다. 달리 지정되지 않은 경우, 사용자 에이전트는 범위를 벗어난 오류 검사를 렌더링 과정에서 가능한 한 늦게까지 미뤄야 합니다. 이는 특히 장치 제한에서 중요합니다. 복합 연산은 범위를 벗어난 중간 값을 생성하지만 최종 값은 범위 내에 있을 수 있기 때문입니다.
스크립트 실행을 지원하는 적합한 SVG 뷰어 또는 SVG 인터프리터는 이 명세 전체에서 정의된 SVG DOM 인터페이스를 이 절에 나열된 구체적인 요구 사항 및 의존성과 함께 구현해야 합니다.
| SVG 2 요구 사항: | DOM을 개선합니다. |
|---|---|
| 결의: | SVG 2를 위해 SVG DOM을 전반적으로 개선합니다. |
| 목적: | SVG DOM을 Java 지향적이지 않게 만들어 작성자가 더 쉽게 사용하도록 돕습니다. |
| 담당자: | Cameron (ACTION-3273) |
| 참고: | SVG 2 DOM 위키 페이지를 참조하십시오. |
| SVG 2 요구 사항: | SVG 경로 DOM API를 개선합니다. |
|---|---|
| 결의: | SVG 2에서 SVG 경로 DOM API를 개선합니다. |
| 목적: | SVGPathSegList 인터페이스를 정리하고 가능하면 Canvas와 API를 공유합니다. |
| 담당자: | Cameron (조치 없음) |
SVG DOM은 Web IDL 인터페이스를 기준으로 정의됩니다. 이 명세의 모든 IDL 조각은 Web IDL 명세에 설명된 적합한 IDL 조각에 필요한 방식으로 해석해야 합니다. [WebIDL]
SVG DOM은 여러 DOM 명세를 기반으로 합니다. 특히:
SVG DOM은 HTML 및 DOM 표준과 유사한 명명 규칙을 따릅니다 ([HTML], [DOM]).
모든 이름은 하나 이상의 영어 단어를 연결하여 하나의 문자열을 형성하도록 정의됩니다. 프로퍼티 또는 메서드 이름은 첫 번째 키워드를 소문자로 시작하며, 이후 각 단어는 대문자로 시작합니다. 예를 들어 파일이 생성된 날짜와 같은 문서 메타 정보를 반환하는 프로퍼티의 이름은 "fileDateCreated"일 수 있습니다.
이 명세에서 정의된 인터페이스 이름은 거의 모두 "SVG"로 시작합니다.
SVG 네임스페이스 요소의 DOM Element
객체를 나타내는
인터페이스는
SVGElementNameElement 형식을 따르며, 여기서 ElementName은
첫 글자를 대문자로 한 요소의 태그 이름입니다.
따라서 SVGRadialGradientElement는
‘radialGradient’ 요소의 인터페이스입니다.
이 대소문자 규칙의 예외는 SVGSVGElement이며, 여기에서는 태그 이름 전체가 대문자로 되어 있습니다.
SVG DOM을 지원해야 하는 모든 SVG 소프트웨어는 SVG 문서 조각을 위해 생성된 DOM 요소를 다음과 같이 확장해야 합니다:
지원되는 SVG 요소에 대응하는 모든 Element 객체(즉, 네임스페이스 URI가 "http://www.w3.org/2000/svg"이고 로컬 이름이 이 명세 또는 소프트웨어가 구현하는 다른 명세에 정의된 요소 중 하나인 요소)는 요소 정의에서 식별된 DOM 인터페이스도 구현해야 합니다.
로컬 이름이 소프트웨어가 지원하는 어떤 명세에도 정의된 요소와 일치하지 않는 SVG 네임스페이스의 요소도 SVGElement 인터페이스를 구현해야 합니다.
‘rect’ 요소에서는 SVGRectElement 인터페이스가 지정됩니다. 이는 네임스페이스 URI가 "http://www.w3.org/2000/svg"이고 로컬 이름이 "rect"인 모든 Element 객체가 SVGRectElement도 구현해야 함을 의미합니다.
많은 SVG DOM 프로퍼티(IDL 속성)는 대응하는 요소의 콘텐츠 속성 또는 프로퍼티를 반영하며, 이는 콘텐츠 속성과 IDL 속성이 동일한 기반 데이터를 나타낸다는 의미입니다. 예를 들어 SVGRectElement의 SVGAnimatedLength ry는 연결된 ‘rect’ 요소의 ry 프레젠테이션 속성을 반영합니다.
이 반영 방식은 IDL 속성의 유형에 따라 달라집니다:
상위 수준에서 보면 객체의
baseVal은 콘텐츠 속성의 값을 반영하는 데 사용됩니다.
CSS 프로퍼티를 반영하는 객체에서는 baseVal이
프레젠테이션 속성을 반영하는 데 사용됩니다.
이 관계는 실시간이며, 속성 또는 반영된 프로퍼티가 수정되면 값은 (반영된 값 동기화의 규칙에 따라) 동기화되어야 합니다.
속성이 문서 마크업에 명시적으로 지정되지 않았더라도 반영 객체는 접근할 때 속성의 초기값으로 초기화됩니다. 속성의 초기값이 (none)이면 객체는 빈 초기값 반영에 정의된 대로 초기화됩니다. 새로 생성된 이 객체는 처음 수정되기 전까지 요소에 속성을 생성하지 않습니다. 대응하는 속성에 대한 수정 사항은 즉시 객체에 반영됩니다.
lineElement.x1.baseVal에 접근하고
(lineElement가 SVGLineElement의 인스턴스이고)
‘x1’
속성이 문서에 지정되지 않은 경우,
반환되는 SVGLength 객체는
0 user units 값을 나타냅니다.
이는 속성의 초기값이 0이기 때문입니다.
반영된 콘텐츠 속성의 기본값이 변경될 때마다 반영 객체는 값이 변경된 직후 다음 단계를 실행하여 동기화되어야 합니다:
반영된 콘텐츠 속성을 선택적으로 특정 값을 사용하여 재직렬화해야 할 때는 다음 단계를 수행해야 합니다:
이는 열거 값이 어떤 방식으로든
"알 수 없음" 값으로 설정되면 콘텐츠 속성이
빈 문자열로 설정된다는 의미입니다.
그러나 이 알 수 없음 값은
SVGAnimatedEnumeration 객체에 직접 설정할 수 없으며,
마크업에서 설정된 알 수 없는 속성 값을 나타냅니다.
값은 SVGNumber, SVGLength, SVGPoint 또는 SVGTransform 객체이거나 DOMString 값이며, 이는 value의 유형에 따라 달라집니다.
null 또는 빈 초기값을 반영하는 SVG DOM 속성을 초기화할 때는 이 절에 정의된 대로 데이터 유형에 따라 프로퍼티를 초기화해야 합니다. 이는 반영된 콘텐츠 속성에 명시적 값이 없고, 속성 정의 표의 초기값이 (none)인 경우에만 발생합니다.
아래에 인터페이스가 나열되어 있지 않다면 객체 초기화는 해당 인터페이스가 포함하는 객체의 값을 사용하여 수행해야 한다는 의미입니다. 예를 들어 SVGAnimatedString은 두 개의 DOMString 멤버로 구성되고, SVGRect는 여러 double로 구성됩니다.
textElement.dx.baseVal에 접근하고
(textElement가 SVGTextElement의
인스턴스이고)
‘dx’
속성이 문서에 지정되지 않은 경우,
반환되는 SVGLengthList 객체는
비어 있습니다.
스크립트가 반영된 DOM 속성을 콘텐츠 속성에 대해 유효하지 않은 값(예: 음수가 아닌 숫자를 요구하는 속성에 음수를 지정함)으로 설정하는 경우, 이 명세에서 달리 명시하지 않는 한 설정할 때 예외를 발생시키지 않아야 하지만, 해당 문서 조각은 오류 처리에 설명된 대로 기술적으로 오류 상태가 됩니다.
정수 상수를 사용하여 열거 값을 반영하는 DOM 속성은 예외입니다. 이러한 속성에 범위를 벗어난 정수 또는 알 수 없는 속성 값을 나타내는 상수(0)를 설정하면 TypeError를 발생시킵니다. 이는 WebIDL 열거 유형의 동작과 일치합니다 [WebIDL].
SVG 언어의 요소에 직접 대응하는 모든 SVG DOM 인터페이스 (예: ‘path’ 요소의 SVGPathElement 인터페이스)는 SVGElement 인터페이스에서 파생됩니다.
CSSOM 명세는 ‘style’ 속성에 HTML 요소와 같은 방식으로 접근할 수 있도록 SVGElement에 style IDL 속성을 추가합니다.
[Exposed=Window] interface SVGElement : Element { [SameObject] readonly attribute SVGAnimatedString className; readonly attribute SVGSVGElement? ownerSVGElement; readonly attribute SVGElement? viewportElement; }; SVGElement includes GlobalEventHandlers; SVGElement includes HTMLOrSVGOrMathMLElement;
className IDL 속성은 ‘class’ 속성을 반영합니다.
이 속성은 폐기되었으며 이 명세의 향후 버전에서 제거될 수 있습니다. 작성자는 대신 Element.classList를 사용하는 것이 좋습니다.
SVGElement의 className 속성은 WebIDL의 상속 규칙에 따라 Element의 대응하는 속성을 재정의합니다.
ownerSVGElement IDL 속성은 가장 가까운 조상 ‘svg’ 요소를 나타냅니다. ownerSVGElement를 가져오면 가장 가까운 조상 ‘svg’ 요소를 반환합니다. 현재 요소가 최외곽 svg 요소이면 null을 반환합니다.
viewportElement IDL 속성은 현재 요소에 SVG 뷰포트를 제공하는 요소를 나타냅니다. viewport를 가져오면 SVG 뷰포트를 설정하는 가장 가까운 조상 요소를 반환합니다. 현재 요소가 최외곽 svg 요소이면 null을 반환합니다.
| SVG 2 요구 사항: | 마우스 이벤트가 도형의 채우기 또는 스트로크 위에 있는지 감지합니다. |
|---|---|
| 결의: | SVG 2에서는 마우스 이벤트가 요소의 스트로크 또는 채우기 위에 있는지 더 쉽게 감지할 수 있도록 합니다. |
| 목적: | 요소를 복제하지 않고도 작성자가 요소의 채우기와 스트로크에 대한 포인터 이벤트를 구분할 수 있도록 합니다 |
| 담당자: | Cameron (ACTION-3279) |
| 상태: | 완료. |
SVGGraphicsElement 인터페이스는 주된 목적이 그래픽을 그룹에 직접 렌더링하는 SVG 요소를 나타냅니다.
dictionary SVGBoundingBoxOptions {
boolean fill = true;
boolean stroke = false;
boolean markers = false;
boolean clipped = false;
};
[Exposed=Window]
interface SVGGraphicsElement : SVGElement {
[SameObject] readonly attribute SVGAnimatedTransformList transform;
SVGRect getBBox(optional SVGBoundingBoxOptions options = {});
SVGMatrix? getCTM();
SVGMatrix? getScreenCTM();
};
SVGGraphicsElement includes SVGTests;
transform IDL 속성은 transform 프로퍼티의 계산값과 대응하는 ‘transform’ 프레젠테이션 속성을 반영합니다.
getBBox 메서드는 현재 요소의 경계 상자를 계산하는 데 사용됩니다. getBBox(options) 메서드를 호출하면 현재 요소에 대해 경계 상자 알고리즘을 호출하며, options 딕셔너리 인수의 fill, stroke, markers 및 clipped 멤버를 사용하여 경계 상자에 포함할 요소 부분을 제어하고, 요소의 사용자 좌표계를 경계 상자를 반환할 좌표계로 사용합니다. 계산된 경계 상자를 정의하는 새 SVGRect 객체를 반환합니다. 요소의 기하 속성이 없거나 유효하지 않은 값(예: 음수 width 또는 height)을 가져 요소가 렌더링되지 않는 경우, x, y, width 및 height가 모두 0으로 설정된 SVGRect를 반환합니다.
getCTM 메서드는 현재 요소의 좌표계를 해당 SVG 뷰포트의 좌표계로 변환하는 행렬을 가져오는 데 사용됩니다. getCTM()을 호출하면 다음 단계를 실행합니다:
getScreenCTM 메서드는 현재 요소의 좌표계를 SVG 문서 조각의 SVG 뷰포트 좌표계로 변환하는 행렬을 가져오는 데 사용됩니다. getScreenCTM()을 호출하면 다음 단계를 실행합니다:
여기에는 다음이 포함됩니다:
이 메서드는 getClientCTM이라는 이름이 더 적절했겠지만,
역사적인 이유로 getScreenCTM이라는 이름을 유지합니다.
SVGGeometryElement 인터페이스는 등가 경로를 가진 기하로 렌더링이 정의되며 채우기와 스트로크를 적용할 수 있는 SVG 요소를 나타냅니다. 여기에는 경로와 기본 도형이 포함됩니다.
[Exposed=Window] interface SVGGeometryElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedNumber pathLength; boolean isPointInFill(optional DOMPointInit point = {}); boolean isPointInStroke(optional DOMPointInit point = {}); float getTotalLength(); SVGPoint getPointAtLength(float distance); };
isPointInFill 메서드는 호출되었을 때, 메서드에 전달된 point로 주어진 점이 요소의 좌표 공간에서 요소의 fill-rule 프로퍼티가 나타내는 와인딩 규칙에 의해 결정되는 의도된 경로 내부에 있으면 true를 반환해야 하며, 그렇지 않으면 false를 반환해야 합니다. 경로 내부의 영역을 계산할 때 열린 하위 경로는 실제 하위 경로에 영향을 주지 않고 암시적으로 닫아야 합니다. 경로 자체 위의 점은 경로 내부에 있는 것으로 간주해야 합니다. 반환값은 fill-rule을 제외한 모든 시각적 CSS 프로퍼티와 무관합니다. point의 x 또는 y 프로퍼티 중 하나가 무한대 또는 NaN이면 메서드는 false를 반환해야 합니다. 현재 요소가 렌더링되지 않은 요소이고 UA가 요소의 기하를 계산할 수 없다면 InvalidStateError를 발생시킵니다.
isPointInFill은 요소가 ‘clipPath’ 요소의 자식이더라도 요소의 fill-rule 프로퍼티가 나타내는 와인딩 규칙을 사용합니다.
isPointInFill은 SVG 컨텍스트가 허용하는 범위에서 CanvasDrawPath 믹스인의 isPointInPath 메서드와 일치합니다.
isPointInStroke 메서드는 호출되었을 때, 메서드에 전달된 point로 주어진 점이 요소의 좌표 공간에서 요소에 적용된 스트로크의 윤곽 경로 안이나 위에 있으면 true를 반환해야 하며, 그렇지 않으면 false를 반환해야 합니다. 윤곽 경로는 요소의 스트로크 프로퍼티인 stroke-width, stroke-linecap, stroke-linejoin, stroke-miterlimit, stroke-dasharray, stroke-dashoffset 및 vector-effect를 고려해야 합니다. 자세한 내용은 스트로크 형태 계산 및 벡터 효과 절을 참조하십시오. 반환값은 나열된 스트로크 프로퍼티를 제외한 모든 시각적 CSS 프로퍼티와 무관합니다. point의 x 또는 y 프로퍼티 중 하나가 무한대 또는 NaN이면 메서드는 false를 반환해야 합니다. 현재 요소가 렌더링되지 않은 요소이고 UA가 요소의 기하를 계산할 수 없다면 InvalidStateError를 발생시킵니다.
isPointInStroke는 SVG 컨텍스트가 허용하는 범위에서 CanvasDrawPath 믹스인의 isPointInStroke 메서드와 일치합니다.
pathLength IDL 속성은 ‘pathLength’ 콘텐츠 속성을 반영합니다.
getTotalLength 메서드는 경로의 길이를 계산하는 데 사용됩니다. getTotalLength()를 호출하면 사용자 단위로 된 경로 전체 길이에 대해 사용자 에이전트가 계산한 값을 반환합니다. 현재 요소가 렌더링되지 않은 요소이고 UA가 경로 전체 길이를 계산할 수 없다면 InvalidStateError를 발생시킵니다.
사용자 에이전트가 계산한 경로 길이는 ‘pathLength’ 속성을 고려하지 않습니다.
getPointAtLength 메서드는 경로를 따라 주어진 거리의 점을 반환하는 데 사용됩니다. getPointAtLength(distance)를 호출하면 다음 단계를 실행합니다:
getTotalLength와 마찬가지로 이는 ‘pathLength’ 속성을 고려하지 않습니다.
SVGNumber 인터페이스는 주로 SVGNumberList의 일부인 <number> 값을 나타내는 데 사용됩니다. 개별 SVGNumber 객체는 스크립트로 생성할 수도 있습니다.
SVGNumber 객체는 읽기 전용으로 지정할 수 있으며, 이는 아래 설명과 같이 객체를 수정하려는 시도가 예외 발생으로 이어진다는 의미입니다. animVal IDL 속성을 통해 반영되는 SVGNumber 객체는 항상 읽기 전용입니다.
SVGNumber 객체는 특정 요소와 연결될 수 있습니다. 연결된 요소는 객체가 속성을 반영하는 경우 어느 요소의 콘텐츠 속성을 업데이트할지 결정하는 데 사용됩니다. 달리 설명되지 않는 한 SVGNumber 객체는 어떤 요소와도 연결되지 않습니다.
모든 SVGNumber 객체는 두 모드 중 하나로 동작합니다. 다음 중 하나일 수 있습니다:
SVGNumber 객체는 값이라고 하는 내부 숫자 값을 유지합니다.
[Exposed=Window] interface SVGNumber { attribute float value; };
value IDL 속성은 숫자를 나타냅니다. value를 가져오면 SVGNumber의 값을 반환합니다.
value를 설정할 때 다음 단계를 실행합니다:
SVGLength 인터페이스는 <length>, <percentage> 또는 <number> 값일 수 있는 값을 나타내는 데 사용됩니다.
SVGLength 객체는 읽기 전용으로 지정할 수 있으며, 이는 아래 설명과 같이 객체를 수정하려는 시도가 예외 발생으로 이어진다는 의미입니다. animVal IDL 속성을 통해 반영되는 SVGLength 객체는 항상 읽기 전용입니다.
SVGLength 객체는 특정 요소와 연결될 수 있으며 방향성도 지정될 수 있습니다: 수평, 수직 또는 미지정입니다. 연결된 요소와 길이의 방향성은 백분율 값을 사용자 단위로 해석하는 데 사용되고, 객체가 속성을 반영하는 경우 어느 요소의 콘텐츠 속성을 업데이트할지 결정하는 데에도 사용됩니다. 달리 설명되지 않는 한 SVGLength 객체는 어떤 요소와도 연결되지 않고 방향성이 지정되지 않습니다.
모든 SVGLength 객체는 네 가지 모드 중 하나로 동작합니다. 다음 중 하나일 수 있습니다:
SVGLength 객체는 <length> 또는 <percentage> 또는 <number> 내부 값을 유지하며, 이를 값이라고 합니다.
[Exposed=Window] interface SVGLength { // 길이 단위 유형 const unsigned short SVG_LENGTHTYPE_UNKNOWN = 0; const unsigned short SVG_LENGTHTYPE_NUMBER = 1; const unsigned short SVG_LENGTHTYPE_PERCENTAGE = 2; const unsigned short SVG_LENGTHTYPE_EMS = 3; const unsigned short SVG_LENGTHTYPE_EXS = 4; const unsigned short SVG_LENGTHTYPE_PX = 5; const unsigned short SVG_LENGTHTYPE_CM = 6; const unsigned short SVG_LENGTHTYPE_MM = 7; const unsigned short SVG_LENGTHTYPE_IN = 8; const unsigned short SVG_LENGTHTYPE_PT = 9; const unsigned short SVG_LENGTHTYPE_PC = 10; readonly attribute unsigned short unitType; attribute float value; attribute float valueInSpecifiedUnits; attribute DOMString valueAsString; undefined newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits); undefined convertToSpecifiedUnits(unsigned short unitType); };
SVGLength에 정의된 숫자 길이 단위 유형 상수는 SVGLength의 값 유형을 나타내는 데 사용됩니다. 의미는 다음과 같습니다:
| 상수 | 의미 |
|---|---|
| SVG_LENGTHTYPE_NUMBER | px 단위의 값으로 해석되는 단위 없는 <number>. |
| SVG_LENGTHTYPE_PERCENTAGE | <percentage>. |
| SVG_LENGTHTYPE_EMS | em 단위를 가진 <length>. |
| SVG_LENGTHTYPE_EXS | ex 단위를 가진 <length>. |
| SVG_LENGTHTYPE_PX | px 단위를 가진 <length>. |
| SVG_LENGTHTYPE_CM | cm 단위를 가진 <length>. |
| SVG_LENGTHTYPE_MM | mm 단위를 가진 <length>. |
| SVG_LENGTHTYPE_IN | in 단위를 가진 <length>. |
| SVG_LENGTHTYPE_PT | pt 단위를 가진 <length>. |
| SVG_LENGTHTYPE_PC | pc 단위를 가진 <length>. |
| SVG_LENGTHTYPE_UNKNOWN | 그 밖의 다른 유형의 값. |
숫자 길이 단위 유형 상수를 사용하는 것은 안티패턴이며 SVGLength가 지원하는 다른 단위 또는 길이 유형을 위한 새로운 상수 값은 도입되지 않습니다. 다른 유형의 길이가 지원되고 사용되면 SVGLength는 SVG_LENGTHTYPE_UNKNOWN 단위 유형을 사용합니다. 이러한 길이 유형에서 SVGLength의 다른 프로퍼티가 어떻게 동작하는지는 아래를 참조하십시오.
unitType IDL 속성은 SVGLength의 값이 어떤 유형인지를 나타냅니다. unitType을 가져올 때 다음 단계를 실행합니다:
예를 들어 ch 단위를 가진 <length> 또는 calc()와 같은 비스칼라 값을 가진 경우 SVG_LENGTHTYPE_UNKNOWN을 반환합니다.
value IDL 속성은 사용자 단위로 된 SVGLength의 값을 나타냅니다. value를 가져올 때 다음 단계를 실행합니다:
value를 설정할 때 다음 단계를 실행합니다:
valueInSpecifiedUnits IDL 속성은 SVGLength의 값의 숫자 계수를 나타냅니다. valueInSpecifiedUnits를 가져올 때 다음 단계를 실행합니다:
따라서 valueInSpecifiedUnits는 '12%'와 12em 모두에 대해 12를 반환하지만, calc(12px + 5%)와 같은 비스칼라 값에는 0을 반환합니다.
valueInSpecifiedUnits를 설정할 때 다음 단계를 실행합니다:
valueAsString IDL 속성은 SVGLength의 값을 문자열로 나타냅니다. valueAsString을 가져올 때 다음 단계를 실행합니다:
valueAsString을 설정할 때 다음 단계를 실행합니다:
newValueSpecifiedUnits 메서드는 SVGLength의 값을 유형이 지정된 방식으로 설정하는 데 사용됩니다. newValueSpecifiedUnits(unitType, valueInSpecifiedUnits)를 호출하면 다음 단계를 실행합니다:
convertToSpecifiedUnits 메서드는 SVGLength의 값을 특정 유형으로 변환하는 데 사용됩니다. convertToSpecifiedUnits(unitType)를 호출하면 다음 단계를 실행합니다:
SVGAngle 인터페이스는 <angle> 또는 <number> 값일 수 있는 값을 나타내는 데 사용됩니다.
SVGAngle 객체는 읽기 전용으로 지정할 수 있으며, 이는 아래 설명과 같이 객체를 수정하려는 시도가 예외 발생으로 이어진다는 의미입니다. animVal 속성을 통해 반영되는 SVGAngle은 항상 읽기 전용입니다.
SVGAngle 객체는 특정 요소와 연결될 수 있습니다. 연결된 요소는 객체가 속성을 반영하는 경우 어느 요소의 콘텐츠 속성을 업데이트할지 결정하는 데 사용됩니다. 달리 설명되지 않는 한 SVGAngle 객체는 어떤 요소와도 연결되지 않습니다.
모든 SVGAngle 객체는 두 모드 중 하나로 동작합니다. 다음 중 하나일 수 있습니다:
SVGAngle 객체는 <angle> 또는 <number> 내부 값을 유지하며, 이를 값이라고 합니다.
[Exposed=Window] interface SVGAngle { // 각도 단위 유형 const unsigned short SVG_ANGLETYPE_UNKNOWN = 0; const unsigned short SVG_ANGLETYPE_UNSPECIFIED = 1; const unsigned short SVG_ANGLETYPE_DEG = 2; const unsigned short SVG_ANGLETYPE_RAD = 3; const unsigned short SVG_ANGLETYPE_GRAD = 4; readonly attribute unsigned short unitType; attribute float value; attribute float valueInSpecifiedUnits; attribute DOMString valueAsString; undefined newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits); undefined convertToSpecifiedUnits(unsigned short unitType); };
SVGAngle에 정의된 숫자 각도 단위 유형 상수는 SVGAngle의 값 유형을 나타내는 데 사용됩니다. 의미는 다음과 같습니다:
| 상수 | 의미 |
|---|---|
| SVG_ANGLETYPE_UNSPECIFIED | 도 단위의 값으로 해석되는 단위 없는 <number>. |
| SVG_ANGLETYPE_DEG | deg 단위를 가진 <angle>. |
| SVG_ANGLETYPE_RAD | rad 단위를 가진 <angle>. |
| SVG_ANGLETYPE_GRAD | grad 단위를 가진 <angle>. |
| SVG_ANGLETYPE_UNKNOWN | 그 밖의 다른 유형의 값. |
숫자 각도 단위 유형 상수를 사용하는 것은 안티패턴이며 SVGAngle이 지원하는 다른 단위 또는 각도 유형을 위한 새로운 상수 값은 도입되지 않습니다. 다른 유형의 각도가 지원되고 사용되면 SVGAngle은 SVG_ANGLETYPE_UNKNOWN 단위 유형을 사용합니다. 이러한 각도 유형에서 SVGAngle의 다른 프로퍼티가 어떻게 동작하는지는 아래를 참조하십시오.
unitType IDL 속성은 SVGAngle의 값이 어떤 유형인지를 나타냅니다. unitType을 가져올 때 다음 단계를 실행합니다:
예를 들어 turn 단위를 가진 <angle>의 경우 SVG_ANGLETYPE_UNKNOWN을 반환합니다.
value IDL 속성은 도 단위로 된 SVGAngle의 값을 나타냅니다. value를 가져올 때 다음 단계를 실행합니다:
value를 설정할 때 다음 단계를 실행합니다:
valueInSpecifiedUnits IDL 속성은 SVGAngle의 값의 숫자 계수를 나타냅니다. valueInSpecifiedUnits를 가져올 때 다음 단계를 실행합니다:
valueInSpecifiedUnits를 설정할 때 다음 단계를 실행합니다:
valueAsString IDL 속성은 SVGAngle의 값을 문자열로 나타냅니다. valueAsString을 가져올 때 다음 단계를 실행합니다:
valueAsString을 설정할 때 다음 단계를 실행합니다:
newValueSpecifiedUnits 메서드는 SVGAngle의 값을 유형이 지정된 방식으로 설정하는 데 사용됩니다. newValueSpecifiedUnits(unitType, valueInSpecifiedUnits)를 호출하면 다음 단계를 실행합니다:
convertToSpecifiedUnits 메서드는 SVGAngle의 값을 특정 유형으로 변환하는 데 사용됩니다. convertToSpecifiedUnits(unitType)를 호출하면 다음 단계를 실행합니다:
| SVG 2 요구 사항: | SVGList* 인터페이스를 다른 목록/배열과 좀 더 유사하게 만듭니다. |
|---|---|
| 결의: | svg 목록 유형에 배열 스타일 인덱싱, .length 및 .item을 추가합니다. |
| 목적: | 다른 배열 유형(예: NodeList)과 일치시키기 위함입니다. Opera 및 Firefox에는 이미 구현되어 있습니다. |
| 담당자: | Erik (ACTION-2975) |
| 상태: | 완료 |
일부 SVG 속성은 값 목록을 포함하며, 이러한 값을 나타내기 위해 여러 SVG DOM 목록 인터페이스가 있습니다. 필요한 각 요소 유형마다 하나씩 있으며 – SVGNumberList, SVGLengthList, SVGPointList, SVGTransformList 및 SVGStringList입니다. 처음 네 개는 SVGAnimatedNumberList, SVGAnimatedLengthList, SVGAnimatedPoints 및 SVGTransformList 객체의 기본 및 애니메이션 구성 요소를 나타내는 데 사용되고, 다섯 번째 SVGStringList는 문자열 목록을 받는 몇몇 애니메이션되지 않는 속성을 반영하는 데 사용됩니다.
대부분의 목록 인터페이스는 다음 형식을 사용합니다:
interface SVGNameList {
readonly attribute unsigned long length;
readonly attribute unsigned long numberOfItems;
undefined clear();
Type initialize(Type newItem);
getter Type getItem(unsigned long index);
Type insertItemBefore(Type newItem, unsigned long index);
Type replaceItem(Type newItem, unsigned long index);
Type removeItem(unsigned long index);
Type appendItem(Type newItem);
setter undefined (unsigned long index, Type newItem);
};
여기서 Name은 목록 요소의 설명적 이름 ("Number", "Length", "Point", "Transform" 또는 "String")이고, Type은 목록 요소의 IDL 유형(SVGNumber, SVGLength, SVGPoint, SVGTransform 또는 DOMString)입니다.
SVGTransformList 인터페이스는 위 형식을 사용하지만 두 개의 추가 메서드를 가집니다.
SVGTransformList를 제외한 모든 목록 인터페이스 객체는 반영된 콘텐츠 속성의 기본값을 반영합니다. SVGTransformList 객체는 프레젠테이션 속성(‘transform’, ‘gradientTransform’ 또는 ‘patternTransform’)을 반영합니다. 모든 목록 인터페이스 객체는 특정 요소와 연결됩니다. SVGLength 및 유사한 객체와 달리, "분리된" 목록 인터페이스 객체는 없습니다.
목록 인터페이스 객체는 내부 요소 목록을 유지하며, 아래 본문에서는 이를 단순히 "목록"이라고 합니다. IDL 속성과 메서드는 목록의 요소를 검사하고 조작하는 데 사용됩니다. 목록은 반영된 콘텐츠 속성의 변경 및 콘텐츠 속성의 애니메이션에 대한 응답으로도 변경될 수 있습니다 (또는 SVGTransformList 객체의 경우 transform 프로퍼티의 계산값 변경에 대한 응답으로 변경될 수 있습니다).
목록 인터페이스 객체는 읽기 전용으로 지정할 수 있으며, 이는 아래 설명과 같이 객체를 수정하려는 시도가 예외 발생으로 이어진다는 의미입니다. animVal IDL 속성을 통해 반영되는 목록 인터페이스 객체는 항상 읽기 전용입니다.
목록 인터페이스 객체는 다음 단계를 실행하여 동기화됩니다:
목록 요소 객체를 분리해야 할 때마다 목록 요소 유형에 따라 다음 단계를 실행합니다:
목록 요소 객체를 연결해야 할 때마다 목록 요소 유형에 따라 다음 단계를 실행합니다:
목록 인터페이스 객체의 지원되는 프로퍼티 인덱스는 목록 길이보다 작은 모든 음이 아닌 정수의 집합입니다.
length 및 numberOfItems IDL 속성은 목록의 길이를 나타내며, 가져올 때 단순히 목록의 길이를 반환합니다.
clear 메서드는 목록의 모든 항목을 제거하는 데 사용됩니다. clear()를 호출하면 다음 단계를 실행합니다:
initialize 메서드는 목록을 지우고 지정된 단일 값을 추가하는 데 사용됩니다. initialize(newItem)을 호출하면 다음 단계를 실행합니다:
getItem 메서드는 지정된 위치에서 목록의 항목을 가져오는 데 사용됩니다. getItem(index)을 호출하면 다음 단계를 실행합니다:
목록의 요소 유형이 SVGLength와 같은 객체 유형이면 해당 객체의 복사본이 아니라 해당 객체에 대한 참조가 반환된다는 점에 유의하십시오.
insertItemBefore 메서드는 목록의 특정 위치에 요소를 삽입하는 데 사용됩니다. insertItemBefore(newItem, index)을 호출하면 다음 단계를 실행합니다:
replaceItem 메서드는 목록의 기존 항목을 새 항목으로 바꾸는 데 사용됩니다. replaceItem(newItem, index)을 호출하면 다음 단계를 실행합니다:
removeItem 메서드는 목록에서 항목을 제거하는 데 사용됩니다. removeItem(index)을 호출하면 다음 단계를 실행합니다:
appendItem 메서드는 목록 끝에 항목을 추가하는 데 사용됩니다. appendItem(newItem)을 호출하면 다음 단계를 실행합니다:
인덱스 프로퍼티 설정자의 동작은 replaceItem 메서드와 동일합니다.
SVGNumberList 인터페이스는 요소가 SVGNumber 객체인 목록 인터페이스입니다. SVGNumberList 객체는 숫자 목록을 나타냅니다.
[Exposed=Window] interface SVGNumberList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); SVGNumber initialize(SVGNumber newItem); getter SVGNumber getItem(unsigned long index); SVGNumber insertItemBefore(SVGNumber newItem, unsigned long index); SVGNumber replaceItem(SVGNumber newItem, unsigned long index); SVGNumber removeItem(unsigned long index); SVGNumber appendItem(SVGNumber newItem); setter undefined (unsigned long index, SVGNumber newItem); };
SVGNumberList의 모든 인터페이스 멤버 동작은 위의 목록 인터페이스 절에 정의되어 있습니다.
SVGLengthList 인터페이스는 요소가 SVGLength 객체인 목록 인터페이스입니다. SVGLengthList 객체는 길이 목록을 나타냅니다.
[Exposed=Window] interface SVGLengthList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); SVGLength initialize(SVGLength newItem); getter SVGLength getItem(unsigned long index); SVGLength insertItemBefore(SVGLength newItem, unsigned long index); SVGLength replaceItem(SVGLength newItem, unsigned long index); SVGLength removeItem(unsigned long index); SVGLength appendItem(SVGLength newItem); setter undefined (unsigned long index, SVGLength newItem); };
SVGLengthList의 모든 인터페이스 멤버 동작은 위의 목록 인터페이스 절에 정의되어 있습니다.
SVGStringList 인터페이스는 요소가 DOMString 값인 목록 인터페이스입니다. SVGStringList 객체는 문자열 목록을 나타냅니다.
[Exposed=Window] interface SVGStringList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); DOMString initialize(DOMString newItem); getter DOMString getItem(unsigned long index); DOMString insertItemBefore(DOMString newItem, unsigned long index); DOMString replaceItem(DOMString newItem, unsigned long index); DOMString removeItem(unsigned long index); DOMString appendItem(DOMString newItem); setter undefined (unsigned long index, DOMString newItem); };
SVGStringList의 모든 인터페이스 멤버 동작은 위의 목록 인터페이스 절에 정의되어 있습니다.
다음 인터페이스는 애니메이션 가능한 콘텐츠 속성의
반영된 값을 나타내는 데 사용됩니다.
각각은 동일한 데이터를 나타내는 두 구성 요소 객체인
baseVal과 animVal로 구성됩니다.
baseVal(기본값) 객체는 수정할 수 있으며,
대응하는 속성 값을 업데이트합니다.
SVG 1.1에서 SVG DOM 인터페이스의 animVal 속성은
반영된 속성의 현재 애니메이션 값을 나타냈습니다. 이 SVG 버전에서는
animVal이 더 이상 현재 애니메이션 값을 나타내지 않고
대신 baseVal의 별칭입니다.
SVGAnimatedBoolean 객체는 불리언 값을 받는 애니메이션 가능 속성을 반영하는 데 사용됩니다.
[Exposed=Window] interface SVGAnimatedBoolean { attribute boolean baseVal; readonly attribute boolean animVal; };
baseVal 및 animVal IDL 속성은 모두 반영된 속성의 현재 애니메이션되지 않은 값을 나타냅니다. baseVal 또는 animVal을 가져올 때 다음 단계를 실행합니다:
baseVal을 설정할 때 값이 true이면 반영된 속성을 "true"로 설정하고, 그렇지 않으면 "false"로 설정합니다.
SVGAnimatedEnumeration 객체는 키워드 값을 받는 애니메이션 가능 속성(예: ‘textPath’의 ‘method’ 속성)을 반영하거나, 애니메이션 가능 속성이 가진 값의 유형을 반영하는 데 사용됩니다(이는 ‘marker’ 요소의 ‘orient’ 속성에 대한 orientType IDL 속성에서만 수행됩니다).
[Exposed=Window] interface SVGAnimatedEnumeration { attribute unsigned short baseVal; readonly attribute unsigned short animVal; };
키워드 값만 받는 애니메이션 가능 속성을 반영하는 SVGAnimatedEnumeration 객체에서 baseVal 및 animVal IDL 속성은 반영된 속성의 현재 애니메이션되지 않은 값을 나타냅니다. orientType의 경우 반영된 ‘orient’ 속성의 현재 애니메이션되지 않은 값의 유형을 나타냅니다. baseVal 또는 animVal을 가져올 때 다음 단계를 실행합니다:
baseVal을 설정할 때 다음 단계를 실행합니다:
SVGAnimatedInteger 객체는 정수 값을 받는 애니메이션 가능 속성(예: ‘feTurbulence’의 ‘numOctaves’)을 반영하는 데 사용됩니다. 또한 정수 뒤에 선택적인 두 번째 정수가 오는 애니메이션 가능 속성(예: ‘feConvolveMatrix’의 ‘order’)의 한 부분을 반영하는 데에도 사용됩니다.
이 SVGAnimatedInteger 인터페이스는 이 명세에서는 사용되지 않지만 Filter Effects 명세에서는 여러 곳에서 사용됩니다.
[Exposed=Window] interface SVGAnimatedInteger { attribute long baseVal; readonly attribute long animVal; };
단일 정수 값을 받는 애니메이션 가능 속성을 반영하는 SVGAnimatedInteger 객체에서 baseVal 및 animVal IDL 속성은 반영된 속성의 현재 애니메이션되지 않은 값을 나타냅니다. 정수 뒤에 선택적인 두 번째 정수가 오는 속성의 한 정수를 반영하는 객체에서는 두 정수 중 하나의 현재 애니메이션되지 않은 값을 나타냅니다. baseVal 또는 animVal을 가져올 때 다음 단계를 실행합니다:
예를 들어 ‘order’의 정의에서는 암시적인 두 번째 정수가 명시적인 첫 번째 정수와 같다고 합니다.
baseVal을 설정할 때 다음 단계를 실행합니다:
SVGAnimatedNumber 객체는 숫자 값을 받는 애니메이션 가능 속성(예: ‘path’의 ‘pathLength’)을 반영하는 데 사용됩니다. 또한 숫자 뒤에 선택적인 두 번째 숫자가 오는 애니메이션 가능 속성(예: ‘feDiffuseLighting’의 ‘kernelUnitLength’)의 한 부분을 반영하는 데에도 사용됩니다.
[Exposed=Window] interface SVGAnimatedNumber { attribute float baseVal; readonly attribute float animVal; };
단일 숫자 값을 받는 애니메이션 가능 속성을 반영하는 SVGAnimatedNumber 객체에서 baseVal 및 animVal IDL 속성은 반영된 속성의 현재 애니메이션되지 않은 값을 나타냅니다. 숫자 뒤에 선택적인 두 번째 숫자가 오는 속성의 한 숫자를 반영하는 객체에서는 두 숫자 중 하나의 현재 애니메이션되지 않은 값을 나타냅니다. baseVal 또는 animVal을 가져올 때 다음 단계를 실행합니다:
예를 들어 ‘kernelUnitLength’의 정의에서는 암시적인 두 번째 숫자가 명시적인 첫 번째 숫자와 같다고 합니다.
baseVal을 설정할 때 다음 단계를 실행합니다:
SVGAnimatedLength 객체는 (a) <length>, <percentage> 또는 <number> 값을 받는 애니메이션 가능 속성, 또는 (b) 이러한 값 중 하나를 받는 CSS 프로퍼티 및 대응하는 프레젠테이션 속성을 반영하는 데 사용됩니다.
[Exposed=Window] interface SVGAnimatedLength { [SameObject] readonly attribute SVGLength baseVal; [SameObject] readonly attribute SVGLength animVal; };
baseVal 및 animVal IDL 속성은 반영된 콘텐츠 속성의 현재 값을 나타냅니다. baseVal 또는 animVal을 가져오면 다음 조건을 만족하는 SVGLength 객체가 반환됩니다:
SVGAnimatedAngle 객체는 ‘marker’의 애니메이션되는 ‘orient’ 속성의 <angle> 값을 orientAngle IDL 속성을 통해 반영하는 데 사용됩니다.
[Exposed=Window] interface SVGAnimatedAngle { [SameObject] readonly attribute SVGAngle baseVal; [SameObject] readonly attribute SVGAngle animVal; };
baseVal 및 animVal IDL 속성은 반영된 ‘orient’ 속성의 현재 애니메이션되지 않은 <angle> 값을 나타냅니다. baseVal 또는 animVal을 가져오면 다음 조건을 만족하는 SVGAngle 객체가 반환됩니다:
SVGAnimatedString 객체는 문자열 값을 받는 애니메이션 가능 속성을 반영하는 데 사용됩니다. 선택적으로 두 번째 폐기된 속성도 추가로 반영하도록 정의할 수 있습니다.
[Exposed=Window] interface SVGAnimatedString { attribute (DOMString or TrustedScriptURL) baseVal; readonly attribute DOMString animVal; };
baseVal 및 animVal IDL 속성은 반영된 속성의 현재 애니메이션되지 않은 값을 나타냅니다. baseVal 또는 animVal을 가져올 때 다음 단계를 실행합니다:
SVGURIReference 인터페이스의 href 멤버에서는 ‘href’ 속성이 없고 폐기된 ‘xlink:href’ 속성이 있으면 그 값이 반환되고, 그 밖의 모든 경우에는 ‘href’ 속성이 반환됩니다.
baseVal을 설정할 때 다음 단계를 실행합니다:
SVG에는 아직 완전한 스크립트 처리 모델이 없습니다. Trusted Types는 속성과 텍스트 본문 수정 보호가 HTML 스크립트의 보호와 비슷하게 동작한다고 가정합니다.
SVGURIReference 인터페이스의 href 멤버에서는 ‘href’ 속성이 없고 폐기된 ‘xlink:href’ 속성이 있으면 해당 속성이 설정되고, 그 밖의 모든 경우에는 ‘href’ 속성이 설정됩니다.
SVGAnimatedRect 객체는 x, y, width 및 height로 지정되는 사각형 값을 받는 애니메이션 가능 속성을 반영하는 데 사용됩니다.
이 명세에서 SVGAnimatedRect로 반영되는 유일한 속성은 ‘viewBox’입니다.
[Exposed=Window] interface SVGAnimatedRect { [SameObject] readonly attribute SVGRect baseVal; [SameObject] readonly attribute SVGRect animVal; };
baseVal 및 animVal IDL 속성은 반영된 속성의 현재 애니메이션되지 않은 사각형 값을 나타냅니다. baseVal 또는 animVal을 가져오면 SVGRect 객체가 반환됩니다.
baseVal 또는 animVal SVGRect 객체를 생성할 때와 이후 반영된 콘텐츠 속성이 추가, 제거 또는 변경될 때마다 다음 단계를 실행합니다:
baseVal 또는 animVal SVGRect 객체의 x 좌표, y 좌표, width 또는 height 프로퍼티가 변경될 때마다, 단 콘텐츠 속성의 값을 SVGRect에 반영하는 이전 알고리즘의 일부로 변경되는 경우는 제외하고, 반영된 콘텐츠 속성을 재직렬화해야 합니다.
SVGAnimatedNumberList 객체는 <number> 값 목록을 받는 애니메이션 가능 속성을 반영하는 데 사용됩니다.
[Exposed=Window] interface SVGAnimatedNumberList { [SameObject] readonly attribute SVGNumberList baseVal; [SameObject] readonly attribute SVGNumberList animVal; };
baseVal 및 animVal IDL 속성은 반영된 속성의 현재 애니메이션되지 않은 값을 나타냅니다. baseVal 또는 animVal을 가져오면 반영된 속성의 기본값을 반영하는 SVGNumberList 객체가 반환됩니다.
SVGAnimatedLengthList 객체는 <length>, <percentage> 또는 <number> 값 목록을 받는 애니메이션 가능 속성을 반영하는 데 사용됩니다.
[Exposed=Window] interface SVGAnimatedLengthList { [SameObject] readonly attribute SVGLengthList baseVal; [SameObject] readonly attribute SVGLengthList animVal; };
baseVal 또는 animVal IDL 속성은 반영된 속성의 현재 애니메이션되지 않은 값을 나타냅니다. baseVal 또는 animVal을 가져오면 반영된 속성의 기본값을 반영하는 SVGLengthList 객체가 반환됩니다.
SVGUnitTypes 인터페이스는 ‘gradientUnits’, ‘patternContentUnits’ 및 기타 유사한 속성을 반영하는 데 사용되는 일반적으로 사용되는 상수 집합을 정의합니다.
[Exposed=Window] interface SVGUnitTypes { // 단위 유형 const unsigned short SVG_UNIT_TYPE_UNKNOWN = 0; const unsigned short SVG_UNIT_TYPE_USERSPACEONUSE = 1; const unsigned short SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2; };
SVGUnitTypes에 정의된 단위 유형 상수의 의미는 다음과 같습니다:
| 상수 | 의미 |
|---|---|
| SVG_UNIT_TYPE_USERSPACEONUSE | 'userSpaceOnUse' 속성 값에 대응합니다. |
| SVG_UNIT_TYPE_OBJECTBOUNDINGBOX | 'objectBoundingBox' 속성 값에 대응합니다. |
| SVG_UNIT_TYPE_UNKNOWN | 그 밖의 다른 유형의 값. |
SVGTests 인터페이스는 조건부 처리 속성을 반영하는 데 사용되며, 이러한 속성을 지원하는 요소의 다른 인터페이스에 믹스인됩니다.
interface mixin SVGTests {
[SameObject] readonly attribute SVGStringList requiredExtensions;
[SameObject] readonly attribute SVGStringList systemLanguage;
};
requiredExtensions IDL 속성은 ‘requiredExtensions’ 콘텐츠 속성을 반영합니다.
systemLanguage IDL 속성은 ‘systemLanguage’ 콘텐츠 속성을 반영합니다.
SVGFitToViewBox 인터페이스는 ‘viewBox’ 및 ‘preserveAspectRatio’ 속성을 반영하는 데 사용되며, 이 두 속성을 지원하는 요소의 다른 인터페이스에 믹스인됩니다.
interface mixin SVGFitToViewBox {
[SameObject] readonly attribute SVGAnimatedRect viewBox;
[SameObject] readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio;
};
viewBox IDL 속성은 ‘viewBox’ 콘텐츠 속성을 반영합니다.
preserveAspectRatio IDL 속성은 ‘preserveAspectRatio’ 콘텐츠 속성을 반영합니다.
SVGURIReference 인터페이스는 ‘href’ 속성과 폐기된 ‘xlink:href’ 속성을 반영하는 데 사용됩니다.
interface mixin SVGURIReference {
[SameObject] readonly attribute SVGAnimatedString href;
};
href IDL 속성은 ‘href’ 속성의 값을 나타내며, 이를 지원하도록 정의된 요소에서는 폐기된 ‘xlink:href’ 속성도 나타냅니다. href를 가져오면 다음 조건을 만족하는 SVGAnimatedString 객체가 반환됩니다:
SVGAnimatedString 인터페이스는 baseVal 및 animVal 멤버를 통해, 폐기된 ‘xlink:href’ 속성이 있고 ‘href’가 없는 경우에는 해당 속성을 반영하고, 그 밖의 모든 경우에는 ‘href’ 속성을 반영하도록 정의되어 있습니다. 애니메이션 요소는 attributeName='xlink:href'를 ‘href’ 속성을 대상으로 하는 별칭으로 취급합니다.
SVG 문서 조각은 임의 개수의 SVG 요소로 구성되며 ‘svg’ 요소 안에 포함됩니다.
SVG 문서 조각은 빈 조각(즉, ‘svg’ 요소 내부에 콘텐츠가 없는 경우)부터 매우 단순한 SVG 문서 조각, 즉 단일 SVG 그래픽 요소를 포함하는 경우 (예: ‘rect’)에서 복잡하고 깊게 중첩된 컨테이너 요소와 그래픽 요소의 모음까지 다양할 수 있습니다.
SVG 문서 조각은 자체 포함된 파일 또는 리소스로 독립적으로 존재할 수 있으며, 이 경우 SVG 문서 조각은 SVG 문서가 됩니다. 또는 조각으로 인라인 삽입되어 상위 HTML 또는 XML 문서 안에 포함될 수 있습니다.
다음 예는 간단한 SVG 콘텐츠가 상위 XML 문서 안에 조각으로 인라인 삽입된 모습을 보여 줍니다. XML 네임스페이스를 사용하여 ‘svg’ 및 ‘ellipse’ 요소가 SVG 네임스페이스에 속함을 나타낸다는 점에 유의하십시오.
<?xml version="1.0" standalone="yes"?>
<parent xmlns="http://example.org"
xmlns:svg="http://www.w3.org/2000/svg">
<!-- 여기에 상위 콘텐츠가 있습니다 -->
<svg:svg width="4cm" height="8cm">
<svg:ellipse cx="2cm" cy="4cm" rx="2cm" ry="1cm" />
</svg:svg>
<!-- ... -->
</parent>
이 예는 약간 더 복잡한(즉, 여러 사각형을 포함하는) 독립적인 자체 포함 SVG 문서를 보여 줍니다.
<?xml version="1.0" standalone="no"?>
<svg width="5cm" height="4cm" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<desc>서로 분리된 네 개의 사각형
</desc>
<rect x="0.5cm" y="0.5cm" width="2cm" height="1cm"/>
<rect x="0.5cm" y="2cm" width="1cm" height="1.5cm"/>
<rect x="3cm" y="0.5cm" width="1.5cm" height="2cm"/>
<rect x="3.5cm" y="3cm" width="1cm" height="0.5cm"/>
<!-- 'rect' 요소를 사용하여 뷰포트 윤곽선을 표시합니다 -->
<rect x=".01cm" y=".01cm" width="4.98cm" height="3.98cm"
fill="none" stroke="blue" stroke-width=".02cm" />
</svg>
‘svg’ 요소는 SVG 콘텐츠 중간에도 나타날 수 있습니다. 이는 SVG 문서 조각을 다른 SVG 문서 조각 안에 삽입하는 메커니즘입니다.
SVG 콘텐츠 중간에 있는 ‘svg’ 요소의 또 다른 용도는 새로운 SVG 뷰포트를 설정하는 것입니다. ( 새 SVG 뷰포트 설정을 참조하십시오.)
SVG를 XML로 파싱할 때 XML의 네임스페이스 권고안을 준수하기 위해 [xml-names], SVG 네임스페이스 선언을 제공하여 모든 SVG 요소가 SVG 네임스페이스에 속하는 것으로 식별되도록 해야 합니다.
HTML 구문을 사용하는 경우 네임스페이스는 HTML 파서에 의해 자동으로 제공됩니다.
<html> <svg viewBox="0 0 100 100"> <circle cx="50" cy="50" r="50" fill="green"> </svg> </html>
예에서 알 수 있듯이 HTML 파서를 사용할 때는 ‘xmlns’ 속성을 사용해 해당 요소가 SVG 네임스페이스에 있음을 선언할 필요가 없습니다. HTML 파서는 올바른 네임스페이스에 SVG 요소를 자동으로 생성합니다.
이 절에서는 문서의 동작이 DOM 관점에서 어떻게 정의되는지 설명하고 HTML 파서가 어떻게 SVG 조각을 생성할 수 있는지도 설명해야 합니다.
SVG 2 네임스페이스는 http://www.w3.org/2000/svg이며,
이는 이전 버전의 SVG와 동일합니다.
다음은 SVG를 XML로 파싱할 때 네임스페이스 선언을 제공할 수 있는 방법들입니다. 네임스페이스 접두사가 없는 ‘xmlns’ 속성을 ‘svg’ 요소에 지정할 수 있으며, 이는 SVG가 기본 네임스페이스임을 ‘xmlns’ 속성을 가진 요소의 범위 안에 있는 모든 요소에 대해 의미합니다.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"> <rect x="10" y="10" width="80" height="80" fill="green" /> </svg>
‘xmlns’ 속성에 네임스페이스 접두사가 지정된 경우
(예: xmlns:svg="http://www.w3.org/2000/svg"),
해당 네임스페이스는 기본 네임스페이스가 아니므로
요소에 명시적인 네임스페이스 접두사를 지정해야 합니다:
<svg:svg xmlns:svg="http://www.w3.org/2000/svg" viewBox="0 0 100 100"> <svg:rect x="10" y="10" width="80" height="80" fill="green" /> </svg:svg>
네임스페이스 접두사는 조상 요소에 지정할 수 있습니다( 위 예에 나와 있습니다). 자세한 내용은 XML의 네임스페이스 권고안 [xml-names]을 참조하십시오.
| SVG 2 요구 사항: | ‘svg’ 요소의 변환을 지원합니다. |
|---|---|
| 결의: | SVG 2에서는 ‘svg’에 ‘transform’을 허용합니다. |
| 목적: | 작성자의 기대에 맞게 중첩된 ‘svg’ 요소에 변환을 허용하기 위함입니다. |
| 담당자: | Dirk (조치 없음) |
| 상태: | 완료 |
x 및 y 속성은 삽입된 ‘svg’ 요소가 배치되는 직사각형 영역의 왼쪽 위 모서리를 지정합니다. 가장 바깥쪽 svg 요소에서는 이러한 속성이 아무 효과도 갖지 않습니다.
가장 바깥쪽 svg 요소의 경우 width 및 height 속성은 SVG 문서 조각의 고유 크기를 지정합니다. 삽입된 ‘svg’ 요소의 경우 이 속성들은 ‘svg’ 요소가 배치되는 직사각형 영역의 크기를 지정합니다. 어느 경우든 auto의 계산된 스타일은 100%와 동등하게 취급됩니다.
SVG 문서가 다른 문서의 구성 요소로 참조될 가능성이 있다면 작성자는 종종 참조되는 문서의 가장 바깥쪽 svg 요소에 ‘viewBox’ 속성을 포함하려 할 것입니다. 이 속성은 SVG 문서가 임의의 SVG 뷰포트에 맞게 크기 조정되도록 설계하는 편리한 방법을 제공합니다.
‘svg’ 요소는 이벤트 핸들러 콘텐츠 속성으로 Window의 여러 이벤트 핸들러를 Window 객체에서 노출합니다. 또한 해당 이벤트 핸들러 IDL 속성도 미러링합니다.
onblur, ‘onerror’, onfocus, ‘onload’, 및 ‘onscroll’ Window의 이벤트 핸들러는 Window 객체에서 ‘svg’ 요소에 노출되며, 일반적으로 이벤트 핸들러로 SVG 요소가 지원하는 같은 이름의 핸들러를 대체합니다.
‘g’ 요소는 컨테이너 요소로, 관련된 그래픽 요소를 함께 그룹화합니다.
요소 그룹뿐만 아니라 개별 객체에도 ‘id’ 속성을 사용하여 이름을 지정할 수 있습니다. 이름이 지정된 그룹은 애니메이션 및 재사용 가능한 객체와 같은 여러 용도에 필요합니다.
예:
<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg"
version="1.1" width="5cm" height="5cm">
<desc>각각 두 개의 사각형으로 구성된 두 그룹</desc>
<g id="group1" fill="red">
<rect x="1cm" y="1cm" width="1cm" height="1cm"/>
<rect x="3cm" y="1cm" width="1cm" height="1cm"/>
</g>
<g id="group2" fill="blue">
<rect x="1cm" y="3cm" width="1cm" height="1cm"/>
<rect x="3cm" y="3cm" width="1cm" height="1cm"/>
</g>
<!-- 'rect' 요소를 사용하여 뷰포트 윤곽선을 표시합니다 -->
<rect x=".01cm" y=".01cm" width="4.98cm" height="4.98cm"
fill="none" stroke="blue" stroke-width=".02cm"/>
</svg>
‘g’ 요소는 다른 ‘g’ 요소를 임의의 깊이까지 중첩하여 포함할 수 있습니다.
SVG에서는 나중에 재사용할 그래픽 객체를 정의할 수 있습니다. 이를 위해 SVG에서는 URL 참조 구문 [rfc3987]을 광범위하게 사용합니다. 예를 들어 직사각형을 선형 그라디언트로 채우려면 ‘linearGradient’ 요소를 다음에서 참조할 수 있는 ‘id’ 프로퍼티와 함께 정의할 수 있습니다. 직사각형의 fill 프로퍼티 값에서 다음과 같이 참조합니다:
<linearGradient id="MyGradient">...</linearGradient>
<rect style="fill:url(#MyGradient)"/>
그라디언트와 같은 일부 유형의 요소는 그 자체로 그래픽 결과를 생성하지 않습니다. 따라서 편리한 위치 어디에든 배치할 수 있습니다. 그러나 때로는 그래픽 객체를 정의하면서 직접 렌더링되지 않도록 해야 할 수 있습니다. 즉, 다른 곳에서 참조되기 위해서만 존재합니다. 이를 위해, 정의된 콘텐츠를 편리하게 그룹화할 수 있도록 SVG는 ‘defs’ 요소를 제공합니다.
가능하면 참조되는 요소는 문서 순서상 이를 사용하는 요소보다 먼저 정의하는 것이 권장됩니다. 모든 참조되는 요소를 파일 상단 근처의 하나의 ‘defs’ 요소 내부에 모으면 마크업을 더 쉽게 읽고 이해할 수 있습니다.
‘defs’ 요소는 참조되는 요소를 위한 컨테이너 요소입니다. 이해하기 쉽고 접근성을 높이기 위해 가능하면 참조되는 요소를 ‘defs’ 안에 정의하는 것이 권장됩니다.
‘defs’의 콘텐츠 모델은 ‘g’ 요소와 동일합니다. 따라서 ‘g’의 자식이 될 수 있는 모든 요소는 ‘defs’의 자식도 될 수 있으며 그 반대도 마찬가지입니다.
‘defs’의 자손인 요소는 직접 렌더링되지 않습니다. ‘defs’ 요소의 display 값은 사용자 에이전트 스타일시트에 의해 항상 none으로 설정되어야 하며, 이 선언은 다른 모든 CSS 규칙이나 프레젠테이션 속성보다 높은 중요도를 가져야 합니다. 그러나 ‘defs’의 자손은 항상 소스 트리에 존재하므로 언제든 다른 요소에서 참조할 수 있습니다. 따라서 display 프로퍼티의 ‘defs’ 요소에 대한 값은 해당 요소들이 다른 요소에서 참조되는 것을 막지 않습니다.
‘symbol’ 요소는 그래픽 템플릿을 정의하는 데 사용되며 ‘use’ 요소에 의해 인스턴스화될 수 있지만 직접 렌더링되지는 않습니다.
‘symbol’은 중첩 좌표계를 설정합니다 자신이 포함하는 그래픽에 대해. 심볼이 인스턴스화되어 ‘use’ 요소의 참조되는 요소가 되면, 따라서 중첩된 ‘svg’ 요소와 매우 유사하게 렌더링됩니다.
x, y, width, 및 height 기하 프로퍼티는 ‘svg’ 요소에서와 동일한 효과를 가지며, 이는 ‘symbol’이 ‘use’ 요소에 의해 인스턴스화될 때 적용됩니다. 특히 width 및 height가 auto로 계산되고 (인스턴스화하는 ‘use’ 요소의 값에 의해 재정의되지 않은 경우) 100% 값으로 취급됩니다.
SVG 2에서 새로 추가되었습니다. 심볼에 기하 프로퍼티를 지정할 수 있도록 하면 더 일관된 렌더링 모델을 제공하며, 작성자가 각 심볼의 기본 크기를 설정할 수 있습니다. (이 크기는 여전히 ‘use’ 요소의 속성에 의해 재정의될 수 있습니다.)
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| refX | <length> | left | center | right | (없음) | 예 |
| refY | <length> | top | center | bottom | (없음) | 예 |
SVG 2에서 새로 추가되었습니다. 지도에서 흔히 하듯 심볼을 특정 지점에 더 쉽게 정렬할 수 있도록 추가되었습니다. ‘marker’의 대응 속성과 유사합니다.
symbol 요소에 refX/refY를 추가합니다. 다음에서 결의되었습니다: Leipzig F2F. 상태: 완료.
marker/symbol의 refX/refY에 top/center/bottom, left/center/right 키워드를 추가합니다. 다음에서 결의되었습니다: London F2F. 값은 다음에서 착안했습니다: 'background-position'. 상태: 완료.
‘refX’ 및 ‘refY’ 속성은 심볼의 참조점을 정의하며, 이 참조점은 정확히 심볼의 x,y 배치 좌표에 놓입니다. 이는 x 및 y 프로퍼티와 ‘symbol’ 및 그 호스트 ‘use’ 요소에 적용된 모든 변환의 누적 효과로 정의됩니다.
키워드 값은 ‘refX’ 및 ‘refY’ 속성의 의미와 동일하며 ‘marker’ 요소에서 해당 방향의 0%, 50% 또는 100%로 해석됩니다.
다른 배치 속성과 달리 ‘refX’ 및 ‘refY’은 다음 좌표계에서 해석됩니다. ‘viewBox’ 및 ‘preserveAspectRatio’ 속성을 적용한 후의 심볼 콘텐츠 좌표계입니다. 하나 또는 두 속성 모두 지정되지 않은 경우 해당 차원에서는 조정이 이루어지지 않으며, 심볼의 직사각형 뷰포트 영역의 위쪽 또는 왼쪽 면이 (‘viewBox’ 좌표와 관계없이) x,y 지점에 배치됩니다.
이전 버전과의 호환성을 위해 ‘refX’ 및 ‘refY’이 ‘symbol’에 지정되지 않은 경우의 동작은 값 0으로 지정한 경우와 다르며, 따라서 다음 동작과도 다릅니다. ‘marker’에 대응 속성이 지정되지 않은 경우입니다.
‘symbol’ 요소를 같은 문서에서 여러 번 사용되는 그래픽에 사용하면 구조와 의미론이 추가됩니다. ‘symbol’ 요소와 밀접하게 관련된 것은 ‘marker’ 및 ‘pattern’ 요소이며, 이 세 요소 모두 그래픽 콘텐츠의 컨테이너를 정의하고 SVG의 다양한 위치와 배율에서 반복적으로 렌더링될 수 있습니다. 그러나 pattern 및 marker의 재사용된 그래픽은 다른 요소에 그래픽 효과를 제공하는 반면, ‘symbol’의 콘텐츠는 use 요소 섀도 트리 안에 완전히 상호작용 가능한 콘텐츠로 삽입됩니다.
사용자 에이전트 스타일시트는 ‘symbol’ 요소의 overflow 프로퍼티를 hidden으로 설정하며, 이로 인해 직사각형 클리핑 경로가 심볼의 SVG 뷰포트 경계에 생성됩니다. 다음 overflow 프로퍼티가 재정의되지 않는 한, 심볼 내부에서 심볼의 SVG 뷰포트 밖으로 나가는 모든 그래픽은 잘립니다.
‘symbol’ 요소는 절대로 직접 렌더링되어서는 안 되며, 유일한 용도는 ‘use’ 요소를 사용해 참조할 수 있는 대상으로 사용하는 것입니다. 사용자 에이전트는 ‘symbol’ 요소의 display 프로퍼티를 none으로 설정해야 하며, 이는 사용자 에이전트 스타일시트의 일부로, 이 선언은 다른 모든 CSS 규칙이나 프레젠테이션 속성보다 높은 중요도를 가져야 합니다.
‘symbol’에서 생성된 인스턴스가 ‘use’ 요소의 직접적인 참조되는 요소인 경우 display 프로퍼티의 계산값은 항상 inline이어야 합니다. 즉, 호스트 ‘use’ 요소가 렌더링될 때마다 렌더링되어야 합니다. 사용자 에이전트 스타일시트는 다시 이 선언이 다른 모든 CSS 규칙이나 프레젠테이션 속성보다 높은 중요도를 갖도록 정의합니다. ‘symbol’ 중 다른 모든 요소는 복제되어 use 요소 섀도 트리 안에서 요소 인스턴스를 생성하는 경우 심볼 정의처럼 동작하며 렌더링되어서는 안 됩니다.
| SVG 2 요구 사항: | ‘use’가 조각을 생략하여 외부 문서의 루트 요소를 참조할 수 있도록 합니다. |
|---|---|
| 결의: | SVG 2에서는 use와 같이 적절한 경우 조각을 생략하면 루트 요소를 참조하는 것을 의미하도록 특정 요소에 대한 참조 요구 사항을 완화합니다. |
| 목적: | 작성자가 참조되는 문서의 루트 요소에 ID를 추가하도록 수정해야 하는 요구를 피하기 위함입니다. |
| 담당자: | Cameron (ACTION-3417) |
| 상태: | 완료 |
‘use’ 요소는 다른 요소를 참조하며, 그 복사본이 문서의 ‘use’ 대신 렌더링됩니다. 참조되는 요소는 컨테이너 요소일 수 있으며, 이 경우 해당 요소를 루트로 하는 완전한 SVG 문서 하위 트리의 복사본이 사용됩니다.
복제된 콘텐츠는 ‘use’ 요소에서 스타일을 상속하며 사용자 이벤트의 대상이 될 수 있습니다. 그러나 이러한 복제된 요소 인스턴스는 참조되는 소스와 계속 연결된 상태로 남아 원본의 DOM 변경을 반영합니다. 또한 참조되는 요소의 범위에 적용되는 모든 스타일 규칙은 복제된 섀도 트리의 범위에도 적용됩니다.
x, y, width 및 height 기하 프로퍼티는 참조되는 요소의 위치를 지정합니다. width 및 height 속성은 참조되는 요소가 뷰포트를 정의하는 경우에만 효과가 있습니다(즉, ‘svg’ 또는 ‘symbol’인 경우). 이 경우 auto 이외의 값은 ‘use’ 요소에서 해당 요소의 대응하는 기하 프로퍼티 값을 재정의합니다.
width 또는 height의 음수 값은 유효하지 않으며 무시되어야 합니다. width 또는 height가 0이고, 해당 프로퍼티가 참조되는 요소에 영향을 미치는 경우 해당 요소의 렌더링은 비활성화됩니다.
x 및 y 프로퍼티는 요소의 사용자 좌표계에 영향을 줍니다. 구현 세부 사항은 레이아웃 절을 참조하십시오.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| href | URL [URL] | (없음) | 예 |
렌더링을 위해 복제할 SVG 문서 내의 요소/조각에 대한 URL 참조입니다.
‘use’ 요소는 조각이 없는 ‘href’ 값을 지정하여 전체 SVG 문서를 참조할 수 있습니다. 이러한 참조는 참조되는 문서의 루트 요소를 가리키는 것으로 간주됩니다.
URL 참조 속성 및 폐기된 XLink 속성에 정의된 공통 처리를 참조하십시오.SVG 2에서 새로 추가되었습니다. 조각이 없는 ‘href’는 루트 요소에 ID가 있는지 확인할 필요 없이 전체 SVG 문서를 참조할 수 있도록 합니다.
사용자 에이전트는 보안 이유로 외부 리소스 문서를 제한할 수 있습니다. 특히 이 명세는 ‘use’에서 교차 출처 및 data URL 리소스 요청을 허용하지 않습니다.
‘href’ 속성이 설정되면 (또는 ‘href’ 속성이 없는 경우 ‘xlink:href’ 속성이 설정되면), 사용자 에이전트는 URL을 처리해야 합니다. URL 처리 결과로 얻은 대상 요소는 ‘use’의 참조되는 요소입니다.
URL을 확인한 결과 얻은 참조되는 요소가 SVG 요소가 아니면, 참조는 유효하지 않으며 ‘use’ 요소는 오류 상태입니다.
참조되는 요소가 ‘use’ 요소의 (섀도를 포함한) 조상이라면, 이는 유효하지 않은 순환 참조이며 ‘use’ 요소는 오류 상태입니다.
그렇지 않으면 사용자 에이전트는 다음 절인 use 요소 섀도 트리에 설명된 대로, ‘use’ 요소의 콘텐츠로 렌더링할 섀도 트리 형태의 재사용된 그래픽을 생성해야 합니다.
확인되지 않은 또는 유효하지 않은 URL 참조를 가진 ‘use’는 렌더링되지 않습니다. 경계 상자 계산의 목적에서는 빈 컨테이너 요소와 동등합니다.
‘use’ 요소가 생성한 재사용된 그래픽은 섀도 트리를 기준으로 정의됩니다. 따라서 상호작용성과 스타일 상속 측면에서 SVG의 다른 유형의 재사용된 그래픽, 예를 들어 ‘pattern’ 및 ‘marker’ 콘텐츠와는 상당히 다릅니다.
섀도 트리의 요소는 ‘use’ 요소가 컨테이너이고 자신들이 그 자식인 것처럼 렌더링됩니다. 그러나 SVG 문서 객체 모델(DOM)은 ‘use’ 요소와 그 속성만 포함합니다. SVG DOM은 요소 인스턴스를 ‘use’ 요소의 자식으로 포함하지 않습니다.
스크립팅과 문서 객체 모델을 지원하는 사용자 에이전트는 이 절과 dom 명세 [dom] 또는 그 향후 대체 명세를 준수하여 use 요소 섀도 트리를 구현해야 합니다. 반대로 동적 대화형 처리 모드를 지원하지 않는 사용자 에이전트는 섀도 DOM의 모든 세부 사항을 구현할 필요가 없을 수 있습니다. 그러나 모든 사용자 에이전트는 재사용된 그래픽의 레이아웃 및 스타일 상속과 해당되는 경우 선언적 애니메이션이 섀도 DOM이 구현된 것과 동일한 방식으로 렌더링되도록 해야 합니다.
‘use’ 요소와 그 섀도 트리를 설명할 때는 다음 정의가 적용됩니다:
다음 예와 다이어그램은 ‘use’ 요소가 그룹을 참조할 때 이 정의들이 서로 어떻게 관련되는지 보여 줍니다:
<svg>
<defs>
<g id="icon">
<circle/>
<rect/>
</g>
</defs>
<use href="#icon"/>
</svg>
‘use’ 요소를 포함하는 문서 트리와 그 use 요소 섀도 트리 사이의 관계입니다. 파란색 점선 화살표는 섀도 트리의 각 요소 인스턴스가 참조되는 문서 하위 트리의 요소를 복제한 것임을 보여 줍니다. ‘use’ 요소는 섀도 호스트이고, 인스턴스 루트는 섀도 루트의 직접 자식입니다.
사용자 에이전트가 ‘use’ 요소를 성공적으로 확인하여 참조되는 요소를 식별하면, 사용자 에이전트는 ‘use’ 요소 자체를 호스트로 하는 use 요소 섀도 트리를 생성해야 합니다. 섀도 트리는 ‘use’ 요소가 절대 렌더링되지 않는 요소의 자손이어서, 조건부 처리 때문에, 또는 해당 요소나 조상 요소에 display 프로퍼티가 none으로 설정되어 렌더링되지 않더라도 생성되어야 합니다.
섀도 트리의 각 노드는 참조되는 문서 하위 트리의 대응하는 노드에 대한 인스턴스입니다. 모든 섀도 노드는 인스턴스 루트의 자손이며, 인스턴스 루트는 참조되는 요소의 인스턴스이고, 그 자체로 섀도 루트 노드의 직접 자식입니다.
섀도 트리는 열려 있어(스크립트로 검사 가능) 읽을 수 있지만, 읽기 전용입니다.
섀도 트리의 요소, 속성 및 기타 노드를 직접 수정하려는 모든 시도는
NoModificationAllowedError를 발생시켜야 합니다.
use 요소 섀도 트리 내의 ‘script’ 요소는 비활성 상태입니다(실행되지 않습니다).
이전 버전의 SVG에서는 섀도 트리의 콘텐츠를 SVG 그래픽 요소로 제한했습니다. 이 명세에서는 유효한 모든 SVG 문서 하위 트리를 복제할 수 있습니다. 그러나 그래픽이 아닌 콘텐츠를 복제해도 일반적으로 시각적 효과는 없습니다.
참조되는 요소가 외부 파일에 있으면, 속성과 스타일 프로퍼티의 모든 URL 참조는 값을 요소 인스턴스로 복사하기 전에 절대 URL 생성에 설명된 대로 절대 URL로 만들어야 합니다. 섀도 트리 자체는 이를 포함하는 문서와 동일한 문서 기본 URL을 사용합니다.
사용자 에이전트는 참조되는 문서 하위 트리의 모든 변경 사항이 섀도 트리에 반영되도록 해야 합니다. 여기에는 요소, 속성, 텍스트 및 기타 노드의 변경 사항이 포함됩니다. 또한 참조되는 그래픽에 적용되는 스타일시트의 변경 사항은 섀도 트리 범위의 스타일시트 변경 사항에도 반영되어야 하며, 이는 스타일 상속 절에서 더 자세히 설명합니다.
‘use’ 요소 또는 참조되는 요소가 변경되어 ‘use’ 요소의 URL 참조가 다시 확인되지 않은 상태가 되면, 해당 use 요소의 전체 섀도 트리는 폐기됩니다.
‘use’가 또 다른 ‘use’ 요소이거나 그 콘텐츠에 ‘use’ 요소가 포함된 다른 요소를 참조하면, 위에서 설명한 섀도 DOM 복제 방식은 재귀적으로 적용됩니다. 그러나 직접적으로든 간접적으로든 어떤 요소를 참조하여 순환 의존성을 만드는 참조 집합은 유효하지 않은 순환 참조입니다. 섀도 트리가 순환 참조를 생성하게 되는 ‘use’ 요소 또는 요소 인스턴스는 오류 상태이며 사용자 에이전트가 렌더링해서는 안 됩니다.
‘use’ 요소의 x, y, width 및 height 프로퍼티 값은 재사용된 그래픽의 위치를 지정하고, 참조되는 요소가 중첩 뷰포트를 정의하는 경우 뷰포트 크기를 설정하는 데 사용됩니다. 이러한 프로퍼티가 ‘use’ 요소에 미치는 효과는 그래픽 요소에 미치는 효과나 CSS 상자 레이아웃에서의 효과와 크게 다릅니다.
x 및 y 프로퍼티는 추가 변환을 정의하며 (translate(x,y), 여기서 x 및 y는 대응하는 프로퍼티의 계산값을 나타냄), 이는 ‘use’ 요소에 다른 프로퍼티로 지정된 모든 변환 이후에 적용됩니다 (즉, 변환 목록의 오른쪽에 추가됩니다).
역사적인 이유로 추가 변환은 섀도 트리의 재사용된 콘텐츠에만 적용되는 것이 아니라 ‘use’ 요소 자체에 적용됩니다. 이는 ‘use’ 요소에 적용되고 userSpaceOnUse 단위로 계산되는 모든 마스크, 클리핑 경로 또는 필터에 사용되는 좌표계에 영향을 줍니다.
변환되지 않은 좌표 공간에서 userSpaceOnUse 그래픽 효과를 적용하면서, x 및 y를 사용해 그래픽의 위치도 지정하려면, 작성자는 ‘g’ 안에 ‘use’ 요소를 중첩하고 그래픽 효과를 ‘g’ 요소에 적용할 수 있습니다.
‘use’ 요소의 width 및 height 프로퍼티는 인스턴스 루트 요소에서 해당 프로퍼티의 사용값을 결정할 때 참조되는 ‘svg’ 또는 ‘symbol’ 요소의 대응하는 프로퍼티 값을 재정의합니다. 그러나 ‘use’ 요소에서 프로퍼티의 계산값이 auto이면, 해당 프로퍼티는 요소 인스턴스에 대해 일반적인 방식으로 계산됩니다.
따라서 이러한 프로퍼티는 자체 좌표계를 정의하는 그래픽을 재사용할 때마다 크기 조정하는 데 사용할 수 있습니다. auto가 초기값이므로, ‘use’ 요소에 치수가 명시적으로 설정되지 않은 경우 ‘svg’ 또는 ‘symbol’에 설정된 값이 기본값으로 사용됩니다.
‘use’ 요소의 width 및 height 프로퍼티는 참조되는 요소가 새 뷰포트를 설정하지 않는 경우 아무런 효과가 없습니다. 특히 ‘use’ 요소 자체는 새 뷰포트를 설정하지 않으므로, 재사용된 그래픽에서 백분율을 해석하는 방식에 영향을 주지 않습니다.
그 밖의 모든 면에서 use 요소 섀도 트리 내 요소의 렌더링과 레이아웃은 ‘use’ 요소가 섀도 콘텐츠를 위한 컨테이너인 것처럼 이루어집니다. 특히 섀도 트리 내 요소가 새 뷰포트를 설정하지 않는 한, ‘use’ 요소가 정의된 좌표계에서 (누적된 모든 변환을 포함하여) 그려져야 합니다. 이는 백분율 길이의 해석뿐 아니라 userSpaceOnUse 단위를 가진 그래픽 효과에도 영향을 줍니다.
use 요소 섀도 트리는 다른 섀도 트리와 마찬가지로 CSS Scoping 모듈 [css-scoping-1]에 정의된 스타일 캡슐화를 나타냅니다. 이는 섀도 트리의 요소가 그 호스트 ‘use’ 요소에서 스타일을 상속하지만, 외부 문서에 정의된 스타일 규칙은 섀도 트리의 요소와 일치하지 않는다는 의미입니다. 대신 섀도 트리는 자체 스타일시트 목록을 유지하며, 그 CSS 규칙이 섀도 트리의 요소와 일치하는지 평가됩니다.
프레젠테이션 속성과 ‘style’ 속성은 참조되는 그래픽의 요소에서 다른 속성과 같은 방식으로 요소 인스턴스에 복제됩니다.
참조되는 요소가
‘use’ 요소와 같은 문서에 있으면,
동일한 문서 스타일시트가
원래 문서와 섀도 트리 문서 조각 모두에 적용됩니다.
주 문서의 스타일시트 변경 사항은
섀도 트리에도 영향을 줍니다.
문서와 섀도 루트 문서 조각의
styleSheets 프로퍼티를 통해 접근한
StyleSheetList 객체는 동일해야 합니다.
‘style’ 요소가
참조되는 문서 하위 트리의 일부로 복제되면,
요소
인스턴스의 styleSheet 프로퍼티는
참조되는 문서 하위 트리의 소스 요소와 동일한 객체를 가리킵니다.
참조되는 요소가 외부 문서에 있으면, 해당 문서를 처리할 때 생성된 스타일시트 객체가 섀도 트리에 적용되며 읽기 전용입니다. 스타일시트의 모든 URL 참조는, 조각만 있는 참조를 포함하여, 참조되는 요소를 포함하는 문서의 URL을 기준으로 절대 URL로 만들어야 합니다. 사용자 에이전트는 동일한 외부 문서를 참조하는 모든 섀도 트리에 같은 스타일시트 객체를 재사용할 수 있습니다.
섀도 트리 범위에 지정된 스타일 규칙은 일반적으로 주 문서의 어떤 요소에도 영향을 줄 수 없습니다. 마찬가지로 주 문서의 스타일 규칙은 상속값을 변경하는 방식으로만 섀도 트리 요소에 영향을 줄 수 있습니다. 그러나 CSS Scoping은 섀도 트리 내부에서 호스트 요소를 스타일링하거나, 호스트의 컨텍스트 변경에 따라 섀도 트리 내부의 스타일을 조정하기 위한 특수 선택자를 정의합니다 [css-scoping-1].
섀도 트리 범위 내의 CSS 미디어 쿼리는 대응하는 "라이트" 문서와 동일한 장치 기능 및 치수를 사용하여 평가됩니다. (즉, 중첩된 모든 섀도 트리를 재귀적으로 빠져나온 뒤 해당 섀도 트리의 호스트 ‘use’ 요소를 포함하는 문서입니다.)
대부분의 경우
섀도 트리의 요소 인스턴스는
참조되는 문서
하위 트리의 소스 요소와 동일한 스타일 규칙에 일치합니다.
그러나 CSS 규칙이 복합
선택자를 사용하여
조상 또는 형제를 기준으로 요소를 일치시키고,
그 조상이나 형제가 섀도 트리의 일부로 복제되지 않았다면,
해당 규칙은 더 이상 요소 인스턴스와 일치하지 않습니다.
마찬가지로
nth-of-type 및 nth-child와 같은 자식 인덱스 의사 클래스는
한 요소에는 적용되지만 다른 요소에는 적용되지 않을 수 있습니다.
이는
이전 SVG 버전에서 스타일 복제가 정의된 방식과 달라진 점입니다.
다음 예는 일관된 스타일 일치 규칙과 변경된 스타일 일치 규칙을 모두 보여 줍니다. 왼쪽의 원은 오른쪽 원을 그리는 데 재사용됩니다. 원래 원에는 여러 방식으로 스타일이 설정되어 있습니다:
special인 요소의 자손으로 원을 일치시키는 복합 CSS 선택자를 사용하여 설정됩니다.
SVG 1.1 스타일 복제 모델에서는 지정된 스타일 값이 원래 요소에서 요소 인스턴스로 복제됩니다. 재사용된 원은 원래 원과 동일한 스타일을 가지지만, fill 값은 ‘g’(파란색)이 아니라 ‘use’ (주황색)에서 상속됩니다.
SVG 2에서 요구하는 섀도 DOM 모델에서는 재사용된 원의 스타일이 다음과 같이 계산됩니다:
special인 요소의 자손이 아닌 원의 요소 인스턴스와는
일치하지 않습니다. 대신 원의 stroke 색상은 호스트
‘use’ 요소
(보라색)에서 상속됩니다.
따라서 재사용된 원은 원래 원과 채우기 색상(다른 요소에서 상속되기 때문)과 스트로크 색상(복합 선택자가 더 이상 일치하지 않기 때문) 모두에서 다릅니다.
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="200" height="100" viewBox="0 0 200 100">
<title>스타일 상속과 use 요소</title>
<desc>
두 개의 원 중 하나는 다른 하나를 다시 스타일링한 복제본입니다.
이 파일은 다음과 같은 경우 중 하나를 보여 줍니다.
SVG 2의 섀도 DOM 스타일 일치 규칙은
SVG 1.1 스타일 복제 규칙과 다른 효과를 가집니다.
왼쪽의 원래 원은
파란색 채우기와
녹색 스트로크를 가져야 합니다.
적합한 SVG 1.1 사용자 에이전트에서는
오른쪽의 재사용된 원이
주황색 채우기와 녹색 스트로크를 가져야 합니다.
적합한 SVG 2 사용자 에이전트에서는
재사용된 원이 주황색 채우기와 보라색 스트로크를 가져야 합니다.
모든 경우에
스트로크는 부분적으로 투명하고
너비가 20단위여야 하며,
전체 원 지름은 100단위입니다.
</desc>
<style type="text/css">
circle { stroke-opacity: 0.7; }
.special circle { stroke: green; }
use { stroke: purple;
fill: orange; }
</style>
<g class="special" style="fill: blue">
<circle id="c" cy="50" cx="50" r="40"
stroke-width="20" />
</g>
<use xlink:href="#c" x="100" />
</svg>
예 Use-changed-styles
이전 버전의 SVG에서는
동적 의사 클래스
(예: :hover)가
요소 인스턴스에 어떻게 적용되어야 하는지 명확하지 않았습니다.
섀도 트리 모델에서는 이러한 모든 의사 클래스가
사용자가 어느 요소와 상호작용하는지에 따라
요소 인스턴스 또는 참조되는 문서 하위 트리의 소스 요소에
독립적으로 일치해야 합니다.
‘use’ 요소에 'visibility:hidden'을 지정해도 참조되는 콘텐츠가 렌더링되지 않는다고 보장할 수는 없습니다. display 또는 opacity 프로퍼티와 달리, visibility 프로퍼티는 컨테이너 요소에 직접 적용되지 않으므로 ‘use’ 요소에도 직접 적용되지 않습니다. visibility는 일반적으로 상속되므로, use 요소를 숨기면 자식 콘텐츠도 숨겨지는 경우가 많지만 반드시 그런 것은 아닙니다. 섀도 트리의 어떤 그래픽 요소에 'visibility:visible'이 지정되어 있다면, ‘use’ 요소에 'visibility:hidden'이 지정되어 있더라도 해당 요소는 표시됩니다.
다음 예에서 주요 스타일 규칙은 다음과 같습니다:
.dark {
visibility: hidden;
}
.eyes {
visibility: visible;
}
svg:hover .dark, svg:focus .dark {
visibility: visible;
}
"dark" 클래스는 ‘use’ 요소를 포함하는 그룹에 설정되어 있으므로, 재사용된 그래픽의 모든 부분이 숨김 가시성 설정을 상속하지만, 클래스가 "eyes"인 하위 트리에서는 visible로 다시 설정됩니다. 그래픽에 마우스를 올리거나 포커스하면 숨김 효과가 제거됩니다.
예 Use-visibility-hidden, 기본 스타일
예 Use-visibility-hidden, 대화형 스타일
이 예는 또한 ‘use’ 요소에 지정된 다른 스타일 프로퍼티 (fill 및 stroke)의 상속과, 심볼 내부의 어떤 요소가 명시적인 값을 지정하면 이러한 값 역시 사용되지 않는 방식(예: 분홍색 코와 귀 및 흰색 꼬리)을 보여 줍니다.
Web Animations API [web-animations-1] 및 SVG Animations 명세 [svg-animation]는 DOM 프로퍼티를 직접 조작하지 않고 대상 요소의 속성과 스타일을 애니메이션하는 비CSS 방식을 정의합니다 (자세한 내용은 애니메이션 부록 참조). 이러한 기능을 구현하는 사용자 에이전트는 참조되는 문서 하위 트리의 요소에 적용되는 모든 애니메이션이 이 절에 설명된 대로 use 요소 섀도 트리의 해당 요소 인스턴스에도 적용되도록 해야 합니다.
참조되는 그래픽의 요소 속성을 직접 조작하여 생성된 스크립트 애니메이션 (‘style’ 속성 또는 그 IDL 프로퍼티 포함)은 다른 DOM 조작과 같은 방식으로 섀도 트리의 요소 인스턴스에 전파됩니다.
CSS를 사용하여 적용된 애니메이션 효과는 스타일 범위 지정 및 상속 절에 지정된 절차에 따라 다른 스타일시트 규칙과 함께 복제됩니다.
use 요소 섀도 트리 내의 모든 애니메이션은 참조되는 요소가 같은 문서에 있든 외부 문서에 있든 상관없이 호스트 ‘use’ 요소와 동일한 문서 타임라인에서 동작합니다.
Web Animations API 메서드 [web-animations-1]를 사용하여 적용된 애니메이션 효과에서, 애니메이션 대상이 섀도 트리의 요소 인스턴스에 대응하는 참조되는 문서 하위 트리의 요소라면, 사용자 에이전트는 소스가 해당 Animation 객체이고 대상이 요소 인스턴스인 ShadowAnimation을 생성해야 합니다. 서로 다른 트리에 해당 요소의 인스턴스가 여러 개 있으면, 각각에 하나씩 여러 개의 섀도 애니메이션이 존재합니다.
사용자 에이전트는 섀도 트리가 생성되는 시점에 적용 중인 모든 Web Animations API 애니메이션 (대기 중 및 고정된 애니메이션 포함)에 대해 이러한 ShadowAnimation을 생성해야 하며, 섀도 트리가 존재하는 동안 적용되는 새로운 애니메이션에 대해서도 생성해야 합니다. 사용자 에이전트는 CSS 애니메이션 또는 애니메이션 요소에 대해 ShadowAnimation 객체를 생성해서는 안 됩니다 (이들은 별도로 복제되기 때문입니다).
인터페이스 정의의 일부로, ShadowAnimation은 읽기 전용이며, 그 sourceAnimation의 모든 변경 사항을 반영해야 합니다.
use 요소 섀도 트리 내의
읽기 전용 요소 인스턴스(또는
의사 요소)를 대상으로 새 애니메이션을 직접 적용하려는 모든 시도는
NoModificationAllowedError를 발생시켜야 합니다.
참조되는 문서 하위 트리의 요소를 대상으로 하는 각 애니메이션 요소 [svg-animation]에 대해, 사용자 에이전트는 동등한 애니메이션 요소가 use 요소 섀도 트리에서 적용되도록 해야 합니다. 애니메이션 요소 자체가 참조되는 문서 하위 트리의 일부이면, 애니메이션 요소에 대한 요소 인스턴스를 생성함으로써 자연스럽게 그렇게 됩니다. 그렇지 않으면 사용자 에이전트는 섀도 트리의 노드인 것과 동일한 효과를 갖는 애니메이션 요소의 요소 인스턴스를 생성해야 합니다. 이렇게 생성된 애니메이션 요소의 실질적인 문서 순서는 참조되는 문서 하위 트리에서 소스 요소의 문서 순서와 같아야 합니다.
각 애니메이션 요소 또는 인스턴스는 대상 지정이 암시적(부모 요소)이든 명시적(요소 ‘id’에 대한 URL 교차 참조)이든 상관없이, 동일한 노드 트리(섀도 또는 라이트)의 대상 요소에만 영향을 주어야 합니다. 이렇게 하여 애니메이션 요소와 대상 요소 사이의 일대일 관계가 유지됩니다.
‘id’ 속성은 다른 모든 속성과 마찬가지로 소스 요소에서 요소 인스턴스로 복제됩니다. 이는 ‘id’가 고유해야 한다는 요구 사항과 충돌하지 않습니다. 복제본과 원본은 서로 다른 노드 트리에 있기 때문입니다.
문서 또는 섀도 트리의 모든 애니메이션 요소 중 ‘id’ 속성으로 식별되는 다른 요소의 이벤트에 응답하여 시작 또는 종료하도록 시간 지정된 요소는, 해당 ‘id’를 가진 요소의 인스턴스가 같은 이벤트를 수신할 때에도 시작하거나 종료해야 합니다. 이는 참조되는 요소의 이벤트 리스너가 해당 요소의 인스턴스에서 발생하는 이벤트도 수신하는 방식과 일치하며, use 요소 섀도 트리의 이벤트 처리 절에 설명되어 있습니다. 이 동작은 이벤트만으로 정의되고 ‘id’로 정의되지 않은 애니메이션 시작 또는 종료 시간에는 적용되지 않습니다 (따라서 대상 요소의 이벤트를 암시적으로 수신합니다). 이 경우 각 애니메이션 요소는 자체 대상에 의해서만 트리거됩니다.
섀도 트리 내에서 애니메이션 요소의 인스턴스가 생성되는 시점에, 참조되는 문서 하위 트리의 소스 요소와 연결된 활성 애니메이션(고정된 애니메이션 포함)이 있고, 해당 애니메이션을 시작한 타이밍 이벤트가 인스턴스가 존재했다면 그 인스턴스도 시작했을 것이라면, 요소 인스턴스의 애니메이션도 시작되어야 하며, 시작 시간은 소스 요소의 타이밍과 일치하도록 문서 타임라인에서 뒤로 조정되어야 합니다.
많은 경우 이 절의 요구 사항은 요소 인스턴스와 그 소스 요소가 동기식으로 애니메이션된다는 의미입니다. 애니메이션이 순전히 시간 기반이거나, ‘id’로 참조되는 요소에 대한 사용자 상호작용에 응답하여 시작하고 종료되는 경우가 이에 해당합니다. 그러나 애니메이션이 대상 요소에서 (암시적으로) 발생한 사용자 상호작용 이벤트에 의해 트리거되면, 상호작용 이벤트를 수신한 요소 또는 요소 인스턴스만 애니메이션을 표시합니다.
이는 이전 버전의 SVG에서 변경된 것으로, 이전에는 사용자 상호작용 여부와 관계없이 소스 요소의 모든 애니메이션이 미러링되도록 요구했지만, 요소 인스턴스와의 사용자 상호작용에 어떻게 응답해야 하는지에 대한 명확한 지침을 제공하지 않았습니다. 이 변경으로 애니메이션 요소를 사용해 선언된 대화형 애니메이션이 대화형 CSS 스타일 및 CSS 애니메이션과 같은 방식으로 동작합니다.
어떤 인스턴스나 원래 요소가 이벤트를 수신할 때 모든 인스턴스에 적용되는 애니메이션을 만들려면, 요소 ‘id’를 명시적으로 지정합니다:
<set href="#target" begin="mouseover" ... />
<!-- 마우스를 올린 요소에만 영향을 줍니다 -->
<set href="#target" begin="target.mouseover" ... />
<!-- id가 'target'인 요소의 모든 인스턴스에 영향을 줍니다.
모든 라이트 및 섀도 노드 트리에서,
그중 하나에 마우스를 올리면 적용됩니다 -->
use 요소 섀도 트리의 요소는 DOM 이벤트를 수신할 수도 있고 이벤트의 대상이 될 수도 있습니다. 이벤트 재대상 지정은 캡슐화를 제공하여, 이벤트가 섀도 트리 밖으로 버블링되어 라이트 트리로 들어갈 때 섀도 DOM 구조의 세부 사항을 숨깁니다.
이벤트 재대상 지정은 SVG 2에서 새로 추가되었습니다. 이는 Shadow DOM 명세, 기존 구현, 그리고 주 DOM의 요소만 고려하는 작성자의 기대와 일관성을 제공합니다.
참조되는 그래픽의 요소에
정의된 모든 이벤트 리스너는
use 요소 섀도 트리의 해당 요소 각 인스턴스에서도 같은 캡처 단계의 동일한 이벤트를 수신해야 합니다.
여기에는 이벤트 속성을 사용하여 할당된 이벤트 리스너
(다른 모든 DOM 속성과 마찬가지로 복제됨)와
addEventListener
메서드를 사용하여 할당된 이벤트 리스너가 모두 포함됩니다.
사용자 에이전트는
각 요소 인스턴스의 이벤트 리스너 목록이
참조되는 문서
하위 트리의 소스 요소와 일치하도록 동기화되어야 합니다.
읽기 전용 요소 인스턴스에는
use 요소 섀도 트리에서 이벤트 리스너를 직접 할당할 수 없습니다.
이러한 요소에 이벤트 리스너를 추가하려는 모든 시도는
NoModificationAllowedError를 발생시켜야 합니다.
use 요소 섀도 트리의 이벤트는 섀도 트리의 이벤트 경로 및 이벤트 재대상 지정 알고리즘 [DOM]에 따라 디스패치되고 버블링됩니다.
일반적으로 use 요소 섀도 트리의 이벤트 경로는 이벤트 대상 요소의 조상부터 섀도 루트까지, 그다음 호스트 ‘use’ 요소와 문서 창까지 이어지는 그 이벤트 경로로 구성됩니다. 이는 캡처 단계에서 이벤트가 창에서 일반 문서 트리를 거쳐 ‘use’ 요소로 전파된 다음 섀도 루트 객체로 전달되고 섀도 트리를 따라 아래로 (또는 여러 섀도 트리를 재귀적으로 거쳐) 이벤트 대상 요소까지 전달된다는 의미입니다. 버블링 단계에서는 이벤트가 반대 방향으로 이동하여, 섀도 트리 요소에서 섀도 루트로, 그다음 ‘use’ 요소와 그 조상으로 전달됩니다.
이벤트 재대상 지정 알고리즘은
‘use’ 요소
또는 그 조상의 이벤트 리스너 관점에서는,
섀도
트리의 요소 인스턴스를 대상으로 한 모든 이벤트가
대신 ‘use’ 요소 자체를 대상으로
하도록 보장합니다.
이벤트에 target과
relatedTarget이 모두 있고,
두 프로퍼티가 모두 동일한 ‘use’
요소를 가리키도록 재대상 지정된다면,
이벤트는 섀도 트리 밖으로 전혀 전파되지 않습니다.
예를 들어
포커스가 섀도 트리 내부의 한 요소에서 다른 요소로 이동하는 경우가 이에 해당합니다.
특정 다른 이벤트 유형도
자신이 생성된 섀도 트리 밖으로 전파되지 않도록 제한됩니다.
반대로 이벤트가 섀도 트리를 통해 전파되는 동안
이벤트를 처리하는 이벤트 리스너는
(리스너가 참조되는 문서
하위 트리의
소스 요소에 추가되었기 때문에)
target이
섀도
트리의 읽기 전용 요소 인스턴스를 가리키는 이벤트를 수신합니다.
SVG에는 ‘switch’ 요소와 함께 ‘requiredExtensions’ 및 ‘systemLanguage’ 속성이 있으며, 이를 통해 주어진 사용자 에이전트의 기능이나 사용자의 언어에 따라 대체 표시를 지정할 수 있습니다.
‘requiredExtensions’ 및 ‘systemLanguage’ 속성은 테스트로 작동하며 true 또는 false로 평가됩니다. ‘switch’는 이 모든 속성 테스트가 true인 자식 중 첫 번째를 렌더링합니다. 주어진 속성이 지정되지 않은 경우에는 true 값으로 간주합니다.
조건부 처리 때문에 요소가 제외되면,
display 프로퍼티의 사용값이 none인 것처럼 처리됩니다.
display 프로퍼티와 마찬가지로 조건부
처리
속성은 요소의 직접 렌더링에만 영향을 주며
다른 요소가 해당 요소를 성공적으로 참조하는 것을
막지 않습니다(예: ‘use’를 통한 참조).
따라서:
이전 버전의 SVG에는 세 번째 조건부 처리 속성인
requiredFeatures가 포함되어 있었습니다.
이는 작성자가 SVG 명세의 일부만 구현한 사용자 에이전트를 위해
대체 동작을 제공할 수 있도록 하기 위한 것이었습니다.
하지만 이 속성의 불충분한 명세와 구현 때문에
기능 지원 여부를 테스트하는 수단으로 신뢰할 수 없었습니다.
‘switch’ 요소는 직접 자식 요소의 ‘requiredExtensions’ 및 ‘systemLanguage’ 속성을 순서대로 평가한 다음, 이 속성들이 true로 평가되는 첫 번째 자식을 처리하고 렌더링합니다. 나머지는 모두 건너뛰므로 렌더링되지 않습니다. 자식 요소가 ‘g’와 같은 컨테이너 요소이면 전체 하위 트리가 처리/렌더링되거나 건너뛰어져/렌더링되지 않습니다.
SVG에서 ‘systemLanguage’ 속성을 평가할 때, ‘switch’ 요소의 자손 요소 평가 순서는 SMIL 명세 [SMIL]에 정의된 'allowReorder' 속성의 값이 항상 'yes'인 것처럼 처리해야 합니다.
display 및 visibility 프로퍼티의 값은 ‘switch’ 요소 처리에 아무런 영향을 주지 않는다는 점에 유의하십시오. 특히 ‘switch’ 요소의 자식에 display를 none으로 설정해도 ‘switch’ 요소 처리와 관련된 true/false 테스트에는 아무런 영향을 주지 않습니다.
‘switch’ 요소는 ‘script’ 및 ‘style’ 요소의 처리에 영향을 주지 않습니다.
자세한 내용과 예는 외부 객체 유형 삽입을 참조하십시오.
‘requiredExtensions’ 속성은 필수 언어 확장 목록을 정의합니다. 언어 확장은 이 명세에 정의된 기능 집합을 넘어서는 사용자 에이전트의 기능입니다. 각 확장은 URL 참조로 식별됩니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| requiredExtensions | 공백으로 구분된 토큰 집합 [HTML] | (없음) | 아니요 |
값은 필수 확장을 식별하는 URL 참조 목록이며, 각각의 값은 공백으로 구분됩니다. 이름이 지정된 모든 확장을 사용자 에이전트가 지원하는지 결정합니다. 주어진 모든 확장을 지원하면 속성은 true로 평가되며, 그렇지 않으면 현재 요소와 그 자식은 건너뛰므로 렌더링되지 않습니다.
주어진 URL 참조 자체에 공백이 포함되어 있다면 해당 공백은 이스케이프해야 합니다.
속성이 존재하지 않으면 암시적으로 "true"로 평가됩니다. ‘requiredExtensions’ 속성에 null 문자열 또는 빈 문자열 값을 지정하면 해당 속성은 "false"로 평가됩니다.
‘requiredExtensions’는 종종 ‘switch’ 요소와 함께 사용됩니다. ‘requiredExtensions’를 다른 상황에서 사용하면, 주어진 요소를 렌더링할지 여부를 결정하는 단순한 스위치를 나타냅니다.
확장의 URL 이름에는 "http://example.org/SVGExtensionXYZ/1.0"과 같은 버전 정보를 포함하는 것이 좋으며, 이를 통해 스크립트 작성자는 주어진 확장의 서로 다른 버전을 구분할 수 있습니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| systemLanguage | 쉼표로 구분된 토큰 집합 [HTML] | (없음) | 아니요 |
값은 쉼표로 구분된 토큰 집합이며, 각 토큰은 BCP 47 [BCP47]에 정의된 Language-Tag 값이어야 합니다.
값 V를 사용하여 ‘systemLanguage’ 속성을 평가하려면:
tags를 V를 쉼표로 구분된 토큰 집합 [HTML]으로 파싱한 결과로 둡니다.
tags에서 빈 문자열인 모든 토큰을 제거합니다.
tags가 비어 있으면 false를 반환합니다.
user languages를 사용자가 선호하는 언어의 순서 있는 목록으로 둡니다.
tags의 각 tag에 대해, user languages의 각 user-lang에 대해:
tag가 user-lang과 ASCII 대소문자를 구분하지 않고 일치하면 true를 반환합니다.
user-lang이 tag의 ASCII 대소문자를 구분하지 않는 접두사이고, tag에서 그 접두사 바로 다음 코드 포인트가 U+002D HYPHEN-MINUS (-)이면 true를 반환합니다.
false를 반환합니다.
속성이 존재하지 않으면 암시적으로 "true"로 평가됩니다.
이러한 접두사 일치 규칙을 사용한다고 해서 언어 태그가 특정 태그의 언어를 사용자가 이해하면 그 태그가 접두사인 태그를 가진 모든 언어도 항상 이해할 수 있도록 언어에 할당된다는 의미는 아닙니다.
접두사 규칙은 단지 이러한 경우에 접두사 태그를 사용할 수 있도록 합니다.
구현 참고: 언어 선호도 선택 기능을 사용자에게 제공할 때 구현자는 사용자가 위에서 설명한 언어 일치 방식의 세부 사항에 익숙하지 않다는 점을 고려하고 적절한 안내를 제공하는 것이 좋습니다. 예를 들어 사용자는 "en-gb"를 선택하면 영국 영어를 사용할 수 없을 때 모든 종류의 영어 문서를 제공받을 것이라고 생각할 수 있습니다. 사용자 선호도를 설정하는 사용자 인터페이스에서는 최적의 일치 동작을 얻기 위해 "en"을 추가하도록 안내하는 것이 좋습니다.
여러 언어권의 사용자를 대상으로 하는 콘텐츠에는 여러 언어를 나열할 수 있습니다. 예를 들어 원래 마오리어 버전과 영어 버전이 동시에 제시되는 콘텐츠라면 다음과 같이 지정할 수 있습니다:
<text systemLanguage="mi, en"><!-- 콘텐츠가 여기에 들어갑니다 --></text>
그러나 ‘systemLanguage’ 테스트 속성이 지정된 객체 안에 여러 언어가 존재한다고 해서, 반드시 여러 언어권의 사용자를 대상으로 한다는 의미는 아닙니다. 예를 들어 "라틴어 첫 수업"과 같은 초급 언어 입문서는 분명 영어를 읽을 수 있는 사용자를 대상으로 합니다. 이 경우 ‘systemLanguage’ 테스트 속성에는 "en"만 포함하는 것이 좋습니다.
‘switch’ 요소는 각 자식의 ‘systemLanguage’ 속성을 순서대로 평가하고 처음 일치하는 자식만 렌더링합니다. ‘systemLanguage’가 없는 마지막 자식은 포괄적인 대체 항목으로 작동하여 사용자의 언어 선호도와 관계없이 항상 콘텐츠가 표시되도록 합니다.
<switch> <text systemLanguage="fr" x="10" y="30">Bonjour</text> <text systemLanguage="ja" x="10" y="30">こんにちは</text> <text x="10" y="30">Hello</text> </switch>
언어 선호도가 "fr"인 사용자는 "Bonjour"를 봅니다. "ja"인 사용자는 "こんにちは"를 봅니다. 그 밖의 사용자는 포괄적인 대체 항목인 "Hello"를 봅니다.
접두사 일치 규칙을 통해 작성자는 점진적으로 더 구체적인 언어 변형을 제공할 수 있습니다. ‘switch’ 요소는 처음 일치하는 자식을 렌더링하므로 더 구체적인 태그를 먼저 배치하는 것이 좋습니다.
<switch> <text systemLanguage="zh-Hans" x="10" y="30">简体中文</text> <text systemLanguage="zh-Hant" x="10" y="30">繁體中文</text> <text systemLanguage="zh" x="10" y="30">中文</text> </switch>
언어 선호도가 "zh-Hans-CN"인 사용자는 첫 번째 자식과 일치합니다. 이는 "zh-Hans"가 "zh-Hans-CN"의 ASCII 대소문자를 구분하지 않는 접두사이고 그 뒤에 "-"가 오기 때문입니다. "zh-TW" 사용자는 "zh-Hans" 또는 "zh-Hant"와 일치하지 않지만 대체 항목 "zh"와 일치합니다.
작성 참고: 여러 대체 언어 객체가 ‘switch’ 안에 포함되어 있는데 그중 어느 것도 일치하지 않으면 콘텐츠가 전혀 표시되지 않는 상황이 발생할 수 있음을 작성자는 인지해야 합니다. 따라서 이러한 ‘switch’의 마지막에는 모든 경우에 적절한 "포괄적인 대체" 선택 항목을 포함하는 것이 권장됩니다.
‘systemLanguage’는 종종 ‘switch’ 요소와 함께 사용됩니다. ‘systemLanguage’를 다른 상황에서 사용하면 주어진 요소를 렌더링할지 여부를 결정하는 단순한 스위치를 나타냅니다.
‘lang’ 속성을 기반으로 하는 다국어 설명 텍스트 선택은 ‘desc’ 및 ‘title’ 요소의 국제화를 허용하기 위해 추가되었습니다.
SVG 2에서 새로 추가되었습니다. 'lang' 추가는 Rigi Kaltbad 대면 회의에서 결의되었습니다. 'desc' 및 'title' 요소의 수를 제한하던 텍스트를 제거했습니다. 상태: 완료.
SVG 문서의 모든 컨테이너 요소 또는 그래픽 요소는 텍스트를 콘텐츠로 가지는 ‘desc’ 및/또는 ‘title’ 요소를 자식으로 0개 이상 가질 수 있습니다. ‘desc’ 및 ‘title’ 요소는 그래픽의 일부로 시각적으로 렌더링되지 않습니다. ‘title’ 및 ‘desc’ 요소의 display 값은 사용자 에이전트 스타일시트에 의해 항상 none으로 설정되어야 하며, 이 선언은 다른 모든 CSS 규칙 또는 프레젠테이션 속성보다 높은 중요도를 가져야 합니다.
여러 형제 ‘desc’
또는 ‘title’ 요소는
서로 다른 언어를 가져야 하며,
이는 설명 요소 또는 조상의 ‘lang’
속성(또는 xml:lang
속성)을 사용하여 정의됩니다.
사용자 에이전트는 각 유형에서 사용자가 설정한 언어 선호도와 가장 잘
일치하는 언어의 요소를 선택해야 합니다.
빈 문자열 언어 태그를 가진 설명 요소
(언어가 없음을 나타냄, 예를 들어 이모지 기호로 구성된 텍스트 대체)는
모든 사용자에게 가장 낮은 우선순위로 일치하며, 사용자가 지정한 모든 언어 선호도보다 낮게 평가됩니다.
동일하게 유효한 일치 항목이 여러 개 존재하면 첫 번째 일치 항목을 사용하는 것이 좋습니다.
'title' 또는 'desc'에 일치 항목이 없으면 해당 유형의 첫 번째 요소를 선택해야 합니다.
다음 예는 HTML 문서에 인라인으로 포함된
재사용 별 아이콘의 대체 언어 제목을 보여 줍니다.
이 예에서는 HTML 문서 전체의 언어가
en(국가 코드가 지정되지 않은 영어)으로 올바르게 선언되었다고 가정합니다.
<svg>
<use href="#star">
<title>Favourite</title>
<title lang="en-us">Favorite</title>
<title lang="nl">Favoriet</title>
<title lang="">★</title>
</use>
</svg>
첫 번째 title 요소는 문서의 언어(en)를 상속하며,
나머지는 각 요소에 대해 언어가 명시적으로 선언되어 있습니다.
사용자가 선호하는 언어(제공된 언어 중)가 미국 영어이면 아이콘 제목은
미국식 철자인 "Favorite"입니다.
사용자가 선호하는 언어가 네덜란드어이면 아이콘 제목은 "Favoriet"입니다.
사용자의 선호 목록에서 일반 영어가 네덜란드어보다 높은 순위이면 제목은
영국식 철자인 "Favourite"입니다.
사용자가 네덜란드어나 영어를 모두 이해하지 못하면 제목은 별표
문자가 됩니다. 이는 이상적이지는 않지만(대부분의 스크린 리더는 이를 "검은색
별"의 지역화된 표현으로 읽음), 텍스트 대체가 전혀 없는 것보다는 낫습니다.
아직 다국어 설명 텍스트를 구현하지 않은
SVG 1.1 지원 사용자 에이전트는 일반적으로
사용자의 선호도와 관계없이 각 유형의 첫 번째 요소를 선택한다는 점을 작성자는 인지해야 합니다.
SVG 1.1 사용자 에이전트는 부모의 첫 번째
자식이 아닌 title 요소나
이전 형제가 다른 설명 요소가 아닌 desc 요소를 인식하지 못할 수도 있습니다.
지역화된 정보를 제공하기 위해 둘 이상의 ‘title’ 또는 ‘desc’ 요소를 사용하는 기능은 알려진 구현이 없어 위험한 상태입니다.
사용자 에이전트는 선택된 'title' 및 'desc' 요소의 텍스트 콘텐츠를 부모 요소의 이름과 설명을 계산하는 과정의 일부로 플랫폼 접근성 API에 제공해야 하며, 이는 SVG 접근성 API 매핑 [SVG-AAM] 명세에 정의되어 있습니다.
렌더링된 요소의 직접 자식으로 'title' 또는 'desc' 요소가 포함되어 있다는 것은 해당 렌더링된 요소가 그래픽에서 의미상 중요함을 나타냅니다. 작성자는 텍스트 콘텐츠가 없거나 공백만 있는 텍스트 콘텐츠를 가진 빈 'title' 또는 'desc' 요소를 포함해서는 안 되며, SVG 생성기는 반드시 포함하지 않아야 합니다. 그렇게 하면 이름 없는 객체가 보조 기술 사용자에게 제시되기 때문입니다.
개별 그래픽 요소 자체에 의미가 없다면, 의미 있는 객체를 설명하는 가장 가까운 컨테이너 요소에 대신 대체 텍스트를 제공하는 것이 좋습니다. 작성자는 그룹화(‘g’) 요소를 사용하여 그리기 요소를 의미 있는 객체로 구조화하고, 해당 그룹에 ‘title’로 이름을 지정하는 것이 좋습니다. 반대로 컨테이너 객체가 단순히 스타일 또는 레이아웃을 적용하기 위해 사용되고, 객체를 정의하거나 의미 있는 그룹화 구조를 제공하지 않는다면, 대체 텍스트가 필요하지 않습니다.
부모가 렌더링되지 않는 설명 텍스트 요소는 작성자 또는 작성 도구가 참조 정보로 사용할 수 있습니다. 이러한 데이터는 일반적으로 보조 기술을 통해 그래픽을 보는 최종 사용자가 이용할 수 없다는 점에 작성자는 유의해야 합니다. 그럼에도 렌더링되지 않는 요소는 렌더링된 요소의 접근 가능한 이름이나 설명의 일부로 참조될 수 있으며(SVG-AAM에 정의됨), 재귀 계산에서는 참조된 요소의 설명 자식 요소를 사용합니다.
설명 및 제목 요소는 네임스페이스를 나타내는 표준 XML 메커니즘을 사용하여 다른 네임스페이스의 마크업된 텍스트를 포함할 수 있습니다. 그러나 작성자는 이러한 마크업이 대체 텍스트에 의미를 제공한다고 의존해서는 안 됩니다. 현재 보조 기술에 노출하도록 요구되는 것은 일반 텍스트 콘텐츠뿐입니다.
HTML 파서는 ‘title’ 및 ‘desc’ 내부의 모든 마크업을 HTML 조각의 마크업과 동일한 방식으로 처리합니다. 대부분의 요소는 HTML 네임스페이스에 할당됩니다.
사용자 에이전트는 ‘title’ 내의 마크업을 사용하여 제목의 시각적 표시 방식(예: 툴팁)에 영향을 줄 수 있지만, 그렇게 해야 할 의무는 없습니다.
‘title’ 자식 요소는 해당 요소에 대한 짧은 텍스트 대체를 나타냅니다.
링크에서는 대상 리소스의 제목이나 설명일 수 있고, 이미지나 그리기 객체에서는 그래픽에 대한 짧은 설명일 수 있으며, 대화형 콘텐츠에서는 요소 사용을 위한 레이블이나 지침일 수 있습니다.
그리기 요소에 이미 보이는 레이블이 있는 경우(예: ‘text’ 요소 사용) 작성자는 ‘title’ 요소에 중복 정보를 제공하지 않는 것이 좋습니다. 대신 보이는 레이블을 ‘aria-labelledby’ 속성을 사용하여 그리기 요소와 연결하는 것이 좋습니다.
대화형 사용자 에이전트는 ‘title’ 요소의 일반 텍스트 콘텐츠를 사용자 상호작용에 응답하여 플랫폼 관례에 맞는 방식으로 제공하는 것이 좋습니다. 기존 사용자 에이전트는 일반적으로 부모 요소 위에 마우스를 올렸을 때 ‘title’ 요소를 툴팁으로 렌더링합니다.
작성자는 독립형 SVG 문서의 루트 svg 요소에 ‘title’ 자식 요소를 제공하는 것이 좋습니다. 사용자는 종종 맥락 없이 문서를 보기 때문에 작성자는 맥락이 풍부한 제목을 제공하는 것이 좋습니다. 따라서 맥락적 배경을 거의 제공하지 않는 "소개"와 같은 제목 대신 "중세 양봉 소개"와 같은 제목을 제공하는 것이 좋습니다. 접근성 때문에 사용자 에이전트는 루트 svg 요소의 ‘title’ 자식 요소 콘텐츠를 항상 사용자에게 제공하는 것이 좋습니다. 그러나 이는 일반적으로 중첩 SVG 및 그래픽 요소에 사용되는 툴팁이 아니라 브라우저 탭에 표시하는 등 다른 방식으로 수행됩니다.
‘desc’ 요소는 설명과 같은 더 상세한 텍스트 정보를 요소에 대해 나타냅니다. 이는 일반적으로 그래픽의 시각적 외관에 대한 설명이나 복잡한 위젯의 기능을 설명하기 위한 도움말 같은 더 자세한 정보를 제공하기 위해 보조 기술에 노출됩니다. 일반적으로 다른 사용자에게는 제공되지 않으므로 필수 지침에 사용해서는 안 됩니다.
작성자는 그래픽의 일부에 보이는 텍스트를 포함한 상세 정보를 ‘aria-describedby’ 속성을 사용하여 연결할 수 있습니다. (설명되는 요소 또는 부모 컨테이너에 지정) 그 값은 설명을 포함하는 하나 이상의 SVG 또는 HTML 요소에 대한 ID 참조입니다. ‘aria-describedby’ 속성은 설명을 제공할 때 자식 ‘desc’보다 우선합니다. 요소에 보이는 설명과 보충 정보를 제공하는 자식 ‘desc’ 요소가 모두 있다면, 두 설명을 함께 연결하기 위해 작성자는 요소 자체의 ‘id’를 자신의 ‘aria-describedby’ 목록에 명시적으로 포함하는 것이 좋습니다.
SVG 콘텐츠와 함께 포함되는 메타데이터는 ‘metadata’ 요소 내부에 지정하는 것이 좋습니다. ‘metadata’의 콘텐츠는 다른 XML 네임스페이스의 요소인 것이 좋으며, 이러한 네임스페이스의 요소는 XML의 네임스페이스 권고안 [xml-names]을 준수하는 방식으로 표현하는 것이 좋습니다.
SVG 2에서는 메타데이터 요소를 특정 방식으로 구조화하라는 권고를 제거합니다.
메타데이터 콘텐츠는 직접 렌더링되지 않습니다. ‘metadata’ 요소의 display 값은 사용자 에이전트 스타일시트에 의해 항상 none으로 설정되어야 하며, 이 선언은 다른 모든 CSS 규칙 또는 프레젠테이션 속성보다 높은 중요도를 가져야 합니다.
다음은 SVG 문서에 메타데이터를 포함하는 방법의 예입니다. 이 예에서는 Dublin Core 버전 1.1 스키마를 사용합니다. (RDF를 기반으로 하지 않는 것을 포함한 다른 XML 호환 메타데이터 언어도 사용할 수 있습니다.)
<?xml version="1.0" standalone="yes"?>
<svg width="4in" height="3in"
xmlns = 'http://www.w3.org/2000/svg'>
<desc xmlns:myfoo="http://example.org/myfoo">
<myfoo:title>이것은 재무 보고서입니다</myfoo:title>
<myfoo:descr>전역 설명은
<myfoo:emph>myfoo</myfoo:emph> 네임스페이스의 마크업을 사용합니다.</myfoo:descr>
<myfoo:scene><myfoo:what>widget $growth</myfoo:what>
<myfoo:contains>$three $graph-bar</myfoo:contains>
<myfoo:when>1998 $through 2000</myfoo:when> </myfoo:scene>
</desc>
<metadata>
<rdf:RDF
xmlns:rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs = "http://www.w3.org/2000/01/rdf-schema#"
xmlns:dc = "http://purl.org/dc/elements/1.1/" >
<rdf:Description about="http://example.org/myfoo"
dc:title="MyFoo Financial Report"
dc:description="$three $bar $thousands $dollars $from 1998 $through 2000"
dc:publisher="Example Organization"
dc:date="2000-04-11"
dc:format="image/svg+xml"
dc:language="en" >
<dc:creator>
<rdf:Bag>
<rdf:li>Irving Bird</rdf:li>
<rdf:li>Mary Lambert</rdf:li>
</rdf:Bag>
</dc:creator>
</rdf:Description>
</rdf:RDF>
</metadata>
</svg>
HTML을 지원하는 사용자 에이전트는 SVG 문서에서 다음 HTML 요소(HTML 네임스페이스)를 지원해야 합니다:
base
요소는 예를 들어 페인트 서버 참조 또는 ‘use’
요소 참조를 포함하여
문서의 모든 URL 값에 영향을 준다는 점에 유의하십시오.
그러나 특정 대상 요소를 식별하기 위해
URL 참조를 처리할 때
사용자 에이전트는 생성된 절대 URL을 항상 현재 문서 기본 URL과 비교하여
동일 문서 URL 참조인지 판단해야 합니다.
이렇게 하면 문서 기본 URL이 변경되더라도
동일 문서의 요소에 대한 대상 조각 전용 참조는 계속 유효합니다.
SVG는 SVG 콘텐츠 내 어디에서든 외부 네임스페이스의 요소를 포함할 수 있도록 허용합니다. 일반적으로 SVG 사용자 에이전트는 알 수 없는 외부 네임스페이스 요소를 DOM에 포함해야 하지만, 렌더링에서는 무시하고 제외합니다.
주목할 만한 예외는 삽입된 콘텐츠 장의 외부 객체 유형 삽입에서 설명합니다.
또한 SVG는 모든 SVG 요소에 외부 네임스페이스의 속성을 포함할 수 있도록 허용합니다. SVG 사용자 에이전트는 알 수 없는 속성을 DOM에 포함해야 하지만, 그 밖에는 알 수 없는 속성을 무시하는 것이 좋습니다.
알 수 없는 네임스페이스 요소와 속성은 HTML 파서에서 네임스페이스가 있는 것으로 파싱되지 않는다는 점을 작성자는 인지해야 합니다. 대신 네임스페이스 접두사가 태그 또는 속성 이름에 포함되고, 요소는 부모 요소 네임스페이스에, 속성은 기본 네임스페이스에 배치됩니다.
XML 및 HTML 문서 모두에서 일관되게 파싱되는 방식으로 사용자 지정 속성을 추가하려면, 작성자는 ‘data-*’ 속성을 사용할 수 있습니다. 이 속성이 인코딩하는 정보가 문서의 다른 요소와 연결되지 않는다면 SVG ‘metadata’ 요소에 추가할 수 있습니다.
SVG가 외부 네임스페이스를 포함할 수 있는 기능은 다음 목적으로 사용할 수 있습니다:
예를 들어 비즈니스 그래픽 작성 애플리케이션은 SVG 문서 안에 일부 비공개 데이터를 포함하여 다시 읽어 들일 때 차트(이 경우 원형 차트)를 올바르게 재구성하려 할 수 있습니다:
<?xml version="1.0" standalone="yes"?>
<svg width="4in" height="3in"
xmlns = 'http://www.w3.org/2000/svg'>
<defs>
<myapp:piechart xmlns:myapp="http://example.org/myapp"
title="지역별 판매">
<myapp:pieslice label="북부 지역" value="1.23"/>
<myapp:pieslice label="동부 지역" value="2.53"/>
<myapp:pieslice label="남부 지역" value="3.89"/>
<myapp:pieslice label="서부 지역" value="2.04"/>
<!-- 다른 비공개 데이터가 여기에 들어갑니다 -->
</myapp:piechart>
</defs>
<desc>이 차트에는 다른 네임스페이스의 비공개 데이터가 포함되어 있습니다
</desc>
<!-- 여기에 원형 차트를 그리는 실제 SVG 그래픽 요소가
들어갑니다 -->
</svg>
‘id’ 속성은 모든 SVG 요소에서 사용할 수 있습니다:
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| id | (아래 참조) | (없음) | 아니요 |
요소의 ID [DOM]를 반영해야 합니다. ‘id’ 속성은 노드 트리 내에서 고유해야 하며, 빈 문자열이어서는 안 되고, 공백 문자를 포함해서도 안 됩니다.
XML 문서에서 ‘id’ 속성이 유효하려면 관련 XML 버전의 명세에 정의된 추가 요구 사항이 적용됩니다. 독립형 SVG 문서는 XML 1.0 구문 [xml]을 사용하며, 유효한 ‘id’ 값이 XML 이름 토큰이라고 지정합니다. 유효한 XML 1.0 이름에는 지정된 문자(문자, 숫자 및 일부 구두점 기호)만 포함되며, 숫자, 마침표(.) 문자 또는 하이픈-마이너스(-) 문자로 시작하지 않습니다.
사용자 에이전트는 XML 유효성과 관계없이 SVG 파일의 ‘id’ 값을 처리하는 것이 좋습니다.
작성자는 URL 대상 조각으로 사용될 때 SVG 뷰 명세 또는 기본 미디어 조각으로 파싱될 수 있는 ‘id’ 값을 사용하지 않는 것이 좋습니다.
네임스페이스가 없는 ‘lang’ 속성은 요소의 콘텐츠와 텍스트를 포함하는 요소의 모든 속성에 대한 기본 언어를 지정합니다.
XML 네임스페이스의 ‘lang’ 속성은 XML [xml]에 정의되어 있습니다.
이러한 속성이 요소에서 생략되면 해당 요소의 언어는 부모 요소가 있는 경우 부모 요소의 언어와 같습니다.
XML 네임스페이스의 ‘lang’ 속성은 XML 문서의 SVG 요소에 사용할 수 있습니다. 네임스페이스가 없는 ‘lang’ 속성과 XML 네임스페이스의 ‘lang’ 속성이 같은 요소에 모두 지정되면 ASCII 대소문자를 구분하지 않고 비교했을 때 정확히 같은 값을 가져야 합니다.
네임스페이스가 없는 ‘lang’ 속성과 XML 네임스페이스의 ‘lang’ 속성이 요소에 모두 설정되면 사용자 에이전트는 XML 네임스페이스의 ‘lang’ 속성을 사용해야 하며, 요소의 언어를 결정할 때 네임스페이스가 없는 ‘lang’ 속성은 무시해야 합니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| lang | Language-Tag [ABNF] | (없음) | 아니요 |
‘lang’ 속성은 요소의 콘텐츠와 텍스트를 포함하는 모든 속성에 대한 기본 언어를 지정합니다. 그 값은 유효한 BCP 47 언어 태그이거나 빈 문자열이어야 합니다. 속성을 빈 문자열로 설정하면 기본 언어를 알 수 없음을 나타냅니다. [BCP47].
| SVG 2 요구 사항: | 텍스트 레이아웃에 영향을 주기 위한 ‘xml:space’ 사용을 폐기하고 대신 ‘white-space’ 프로퍼티를 사용합니다. |
|---|---|
| 결의: | SVG 2에서 xml:space를 제거하고 관련 테스트를 SVG 1.1 테스트 모음에서 제거합니다. |
| 목적: | CSS와 일치시키기 위함입니다. |
| 담당자: | Chris (ACTION-3004, 완료; 및 ACTION-3005, 완료) |
| 상태 | 완료. |
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| xml:space | (아래 참조) | default | 아니요 |
문자 데이터에서 공백을 보존할지 지정하는 폐기된 XML 속성입니다. 가능한 값은 공백 없이 문자열 'default' 및 'preserve'뿐입니다. 확장 가능한 마크업 언어(XML) 1.0 권고안 [xml] 및 SVG의 공백 처리 설명을 참조하십시오.
새 콘텐츠에서는 대신 white-space 프로퍼티를 사용하는 것이 좋습니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| tabindex | 유효한 정수 [HTML] | (없음) | 아니요 |
이 콘텐츠 속성을 통해 작성자는 요소에 포커스를 둘 수 있는지, 순차 포커스 탐색으로 접근할 수 있어야 하는지, 그리고 순차 포커스 탐색에서 요소의 상대적인 순서를 제어할 수 있습니다.
"tab index"라는 이름은 포커스 가능한 요소 사이를 탐색할 때 일반적으로 "tab" 키를 사용하는 데서 유래합니다. "tabbing"이라는 용어는 순차 포커스 탐색을 사용하여 접근할 수 있는 포커스 가능한 요소를 앞으로 이동하는 것을 의미합니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| autofocus | 불리언 속성 [HTML] | (없음) | 아니요 |
이 콘텐츠 속성을 통해 작성자는 포커스 가능한 요소가 문서에 연결된 후 포커스를 받도록 요청할 수 있습니다. 자세한 내용은 HTML 명세의 autofocus를 참조하십시오.
요소가 이미 포커스 가능하지 않으면 이 속성은 아무런 효과가 없습니다.
모든 SVG 요소는 사용자 지정 데이터 속성을 지원하며, 이는 네임스페이스가 없고 이름이 문자열 "data-"로 시작하는 속성입니다. HTML 명세의 사용자 지정 데이터 속성에 대한 요구 사항을 참조하십시오.
위의 ARIA 속성 목록은 향후 WAI-ARIA 명세에 의해 확장될 수 있다는 점에 유의하십시오.
모든 렌더링 가능한 요소에는 ARIA role 속성을 지정할 수 있으며, role 속성은 렌더링되지 않는 요소에서는 무시됩니다. 속성을 지정한 경우 그 값은 요소가 속하는 다양한 WAI-ARIA 역할을 나타내는 공백으로 구분된 토큰 집합이어야 합니다. 이러한 토큰은 역할 정의 ([wai-aria], 5.4절) 및 그래픽 역할 ([graphics-aria-1.0], 4절)에 정의된 역할 값입니다.
SVG 요소에 할당된 WAI-ARIA 역할은 role 속성을 공백으로 분할해 생성한 토큰 목록에서 발견되는 첫 번째 유효한 역할입니다. 유효한 역할은 인식되는 비추상 역할이며 해당 요소 유형에 허용되어야 합니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| role | 공백으로 구분된 토큰 집합 [HTML] | (아래 참조) | 아니요 |
‘role’ 속성은 공백으로 구분된 토큰 집합이어야 하며 그 값은 역할 정의 ([wai-aria], 5.4절)에 정의되어 있어야 합니다.
role 값은 요소의 목적을 정의하는 데 사용되는 공백으로 구분된 기계 추출 가능한 의미 정보 집합입니다.
각 SVG 요소의 ‘role’ 속성에 대한 초기값은 대응하는 SVG 요소의 기본 암시적 ARIA 의미론입니다.
유효하고 유용하려면 많은 요소 역할에는 접근 가능한 이름 또는 명시적인 상태 및 프로퍼티 값 형태의 추가 정보가 필요합니다. 접근 가능한 이름은 SVG 설명 요소 또는 ARIA 속성을 사용하여 제공할 수 있습니다. 각 역할에 대한 요구 사항은 역할이 정의된 위치, 예를 들어 WAI-ARIA ([WAI-ARIA]) 또는 WAI-ARIA Graphics Module ([graphics-aria-1.0])에 제시되어 있습니다.
WAI-ARIA 상태 및 프로퍼티 속성은 SVG 요소에 지정할 수 있습니다. 이러한 속성은 ARIA의 상태 및 프로퍼티 정의(모든 aria-* 속성) ([wai-aria], 6.6절)에 정의되어 있습니다.
이러한 속성을 지정하는 경우 해당 값은 상태 또는 프로퍼티 정의의 "Value" 필드에 있는 WAI-ARIA 값 유형이어야 하며, WAI-ARIA 값 유형을 언어에 매핑에 따라 SVG 매핑을 사용하여 적절한 SVG 값 유형으로 매핑해야 합니다 ([wai-aria], 10.2절).
이러한 속성은 애니메이션할 수 있습니다. 애니메이션을 사용하여 그래픽의 상태를 변경하거나, 올바른 대체 텍스트 설명이 달라지도록 콘텐츠를 변경하는 경우, 대응하는 ARIA 상태 또는 프로퍼티 속성도 동일한 애니메이션 방법을 사용하여 업데이트하는 것이 좋습니다.
WAI-ARIA 상태 및 프로퍼티 속성은 모든 요소에서 사용할 수 있습니다. 그러나 항상 의미가 있는 것은 아니며, 이런 경우 사용자 에이전트는 DOM에 포함하는 것 외에는 아무 처리도 하지 않을 수 있습니다. 상태 및 프로퍼티 속성은 ARIA 및 SVG 접근성 API 매핑 명세에 따라 처리됩니다. [wai-aria] [svg-aam-1.0]
다음 표는 SVG 요소에 적용되는 기본 암시적 ARIA 의미론을 정의합니다. 첫 번째 열의 셀에 있는 각 언어 기능(요소)은 같은 행의 두 번째 열 셀에 제시된 ARIA 의미론(역할, 상태 및/또는 프로퍼티)을 암시합니다. 세 번째 열은 어떤 WAI-ARIA 의미론(역할, 상태 또는 프로퍼티)을 적용할 수 있거나 적용할 수 없는지에 대한 제한을 정의합니다.
많은 그래픽 요소에서는 작성자가 의미적 중요성을 나타내는 정보를 제공한 경우에만 암시적 역할이 할당됩니다. 접근성 트리에 대한 완전한 포함 기준은 사용자 에이전트를 위해 SVG 접근성 API 매핑 명세 [svg-aam-1.0]에 정의되어 있습니다. 작성자의 경우 의미적 중요성을 나타내는 권장 방법은 요소에 접근 가능한 이름을 제공하는 것입니다. 이는 직접 자식 ‘title’ 요소나 ‘aria-label’ 또는 ‘aria-labelledby’ 속성을 통해 수행할 수 있습니다. 작성자는 SVG를 이해하는 데 필수적인 모든 콘텐츠, 특히 모든 대화형 콘텐츠에 접근 가능한 이름을 제공하기 위해 이러한 방법 중 하나를 사용하는 것이 좋습니다.
| 언어 기능 | 기본 암시적 ARIA 의미론 | 허용된 역할 |
|---|---|---|
| ‘a’ | 요소에 유효한 href 또는 xlink:href 속성이 있으면
link 역할.
링크가 아닌 a 요소의 경우 기본 의미론은
a 요소가 text의 자손이면 tspan과 같고,
그렇지 않으면 g와 같습니다.
|
제한 없음 |
| ‘circle’ | 요소가 포함 기준을 충족하면
graphics-symbol 역할,
그렇지 않으면 none
|
제한 없음 |
| ‘clipPath’ | none | 역할을 적용할 수 없음 |
| ‘defs’ | none | 역할을 적용할 수 없음 |
| ‘desc’ | none | 역할을 적용할 수 없음 |
| ‘ellipse’ | 요소가 포함 기준을 충족하면
graphics-symbol 역할,
그렇지 않으면 none
|
제한 없음 |
| ‘feBlend’ | none | 역할을 적용할 수 없음 |
| ‘feColorMatrix’ | none | 역할을 적용할 수 없음 |
| ‘feComponentTransfer’ | none | 역할을 적용할 수 없음 |
| ‘feComposite’ | none | 역할을 적용할 수 없음 |
| ‘feConvolveMatrix’ | none | 역할을 적용할 수 없음 |
| ‘feDiffuseLighting’ | none | 역할을 적용할 수 없음 |
| ‘feDisplacementMap’ | none | 역할을 적용할 수 없음 |
| ‘feDistantLight’ | none | 역할을 적용할 수 없음 |
| ‘feDropShadow’ | none | 역할을 적용할 수 없음 |
| ‘feFlood’ | none | 역할을 적용할 수 없음 |
| ‘feFuncA’ | none | 역할을 적용할 수 없음 |
| ‘feFuncB’ | none | 역할을 적용할 수 없음 |
| ‘feFuncG’ | none | 역할을 적용할 수 없음 |
| ‘feFuncR’ | none | 역할을 적용할 수 없음 |
| ‘feGaussianBlur’ | none | 역할을 적용할 수 없음 |
| ‘feImage’ | none | 역할을 적용할 수 없음 |
| ‘feMerge’ | none | 역할을 적용할 수 없음 |
| ‘feMergeNode’ | none | 역할을 적용할 수 없음 |
| ‘feMorphology’ | none | 역할을 적용할 수 없음 |
| ‘feOffset’ | none | 역할을 적용할 수 없음 |
| ‘fePointLight’ | none | 역할을 적용할 수 없음 |
| ‘feSpecularLighting’ | none | 역할을 적용할 수 없음 |
| ‘feSpotLight’ | none | 역할을 적용할 수 없음 |
| ‘feTile’ | none | 역할을 적용할 수 없음 |
| ‘feTurbulence’ | none | 역할을 적용할 수 없음 |
| ‘filter’ | none | 역할을 적용할 수 없음 |
| ‘foreignObject’ | 요소가 포함 기준을 충족하면
group 역할,
그렇지 않으면 none
|
제한 없음 |
| ‘g’ | 요소가 포함 기준을 충족하면
group 역할,
그렇지 않으면 none
|
제한 없음 |
| ‘image’ | img 역할 |
제한 없음 |
| ‘line’ | 요소가 포함 기준을 충족하면
graphics-symbol 역할,
그렇지 않으면 none
|
제한 없음 |
| ‘linearGradient’ | none | 역할을 적용할 수 없음 |
| ‘marker’ | none | 역할을 적용할 수 없음 |
| ‘mask’ | none | 역할을 적용할 수 없음 |
| ‘metadata’ | none | 역할을 적용할 수 없음 |
| ‘mpath’ | none | 역할을 적용할 수 없음 |
| ‘path’ | 요소가 포함 기준을 충족하면
graphics-symbol 역할,
그렇지 않으면 none
|
제한 없음 |
| ‘pattern’ | none | 역할을 적용할 수 없음 |
| ‘polygon’ | 요소가 포함 기준을 충족하면
graphics-symbol 역할,
그렇지 않으면 none
|
제한 없음 |
| ‘polyline’ | 요소가 포함 기준을 충족하면
graphics-symbol 역할,
그렇지 않으면 none
|
제한 없음 |
| ‘radialGradient’ | none | 역할을 적용할 수 없음 |
| ‘rect’ | 요소가 포함 기준을 충족하면
graphics-symbol 역할,
그렇지 않으면 none
|
제한 없음 |
| ‘script’ | none | 역할을 적용할 수 없음 |
| ‘stop’ | none | 역할을 적용할 수 없음 |
| ‘style’ | none | 역할을 적용할 수 없음 |
| ‘svg’ | graphics-document 역할 |
제한 없음 |
| ‘switch’ | none | 역할을 적용할 수 없음 |
| ‘symbol’ | 요소가 포함 기준을 충족하는
렌더링된 요소 인스턴스이면
graphics-object 역할,
그렇지 않으면 none
|
제한 없음 |
| ‘text’ | SVG 접근성 API
매핑 명세에 정의된
플랫폼별 역할 매핑을 가진 group 역할 |
제한 없음 |
| ‘textPath’ | 요소가 포함 기준을 충족하면
group 역할,
그렇지 않으면 none
|
제한 없음 |
| ‘title’ | none | 역할을 적용할 수 없음 |
| ‘tspan’ | 요소가 포함 기준을 충족하면
group 역할,
그렇지 않으면 none
|
제한 없음 |
| ‘use’ | 요소가 포함 기준을 충족하면
graphics-object 역할,
그렇지 않으면 none
|
제한 없음 |
| ‘view’ | none | 역할을 적용할 수 없음 |
DOM Core 명세는 Document 인터페이스를 정의하며, 이 명세는 이를 확장합니다.
SVG 문서가 참조를 통해 삽입되는 경우, 예를 들어 HTML 문서에 ‘object’ 요소가 있고 그 ‘data’ 속성이 SVG 문서(즉, MIME 유형이 "image/svg+xml"이고 따라서 루트 요소가 ‘svg’ 요소인 문서)를 참조하는 경우, 서로 다른 두 DOM 계층이 존재합니다. 첫 번째 DOM 계층은 참조하는 문서(예: XHTML 문서)를 위한 것입니다. 두 번째 DOM 계층은 참조되는 SVG 문서를 위한 것입니다.
partial interface Document { readonly attribute SVGSVGElement? rootElement; };
rootElement IDL 속성은 루트 ‘svg’ 요소를 나타냅니다. rootElement를 가져올 때 문서의 루트 요소가 ‘svg’ 요소이면 이를 반환하고, 그렇지 않으면 null을 반환합니다.
이 속성은 폐기되었으며 향후 SVG 명세에서 제거될 수 있습니다. 작성자는 대신 Document의 documentElement 속성을 사용하는 것이 권장됩니다.
HTML을 구현하는 SVG 구현은 document 인터페이스에 대한 HTML 확장을 지원해야 합니다. 그 밖의 SVG 구현은 다음 IDL 조각을 지원해야 합니다.
// 특정 구현에서만 구현해야 합니다 partial interface Document { readonly attribute DOMString title; readonly attribute DOMString referrer; readonly attribute DOMString domain; readonly attribute Element? activeElement; };
title, referrer, domain 및 activeElement IDL 속성은 HTML에 정의된 해당 IDL 속성과 동일하게 동작해야 합니다.
SVGSVGElement 객체는 DOM의 ‘svg’ 요소를 나타냅니다. SVGSVGElement 인터페이스에는 데이터 유형 객체 팩토리 메서드와 같은 여러 유틸리티 메서드도 포함되어 있습니다.
SVGSVGElement 객체는 내부 SVGPoint 객체를 유지하며, 이를 현재 변환 지점 객체라고 합니다. 이 객체는 currentTranslate IDL 속성에서 반환됩니다.
[Exposed=Window] interface SVGSVGElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; attribute float currentScale; [SameObject] readonly attribute SVGPoint currentTranslate; NodeList getIntersectionList(SVGRect rect, SVGElement? referenceElement); NodeList getEnclosureList(SVGRect rect, SVGElement? referenceElement); boolean checkIntersection(SVGElement element, SVGRect rect); boolean checkEnclosure(SVGElement element, SVGRect rect); undefined deselectAll(); [NewObject] SVGNumber createSVGNumber(); [NewObject] SVGLength createSVGLength(); [NewObject] SVGAngle createSVGAngle(); [NewObject] SVGPoint createSVGPoint(); [NewObject] SVGMatrix createSVGMatrix(); [NewObject] SVGRect createSVGRect(); [NewObject] SVGTransform createSVGTransform(); [NewObject] SVGTransform createSVGTransformFromMatrix(optional DOMMatrix2DInit matrix = {}); Element? getElementById(DOMString elementId); // 호출해도 아무 효과가 없는 폐기된 메서드이며, // 호환성을 위해 유지됩니다. unsigned long suspendRedraw(unsigned long maxWaitMilliseconds); undefined unsuspendRedraw(unsigned long suspendHandleID); undefined unsuspendRedrawAll(); undefined forceRedraw(); }; SVGSVGElement includes SVGFitToViewBox; SVGSVGElement includes WindowEventHandlers;
x, y, width 및 height IDL 속성은 각각 x, y, width 및 height 프로퍼티와 이에 대응하는 프레젠테이션 속성의 계산값을 반영합니다.
currentScale 및 currentTranslate IDL 속성은 SVG에 적용되는 추가 변환을 나타냅니다. 이 속성들은 SVG 문서 조각의 가장 바깥쪽 svg 요소에만 영향을 줍니다.
문서의 확대 및 패닝
변환은 다음 형식의 2x3 행렬입니다.
[currentScale 0 0 currentScale currentTranslate.x currentTranslate.y].
‘transform’ 프로퍼티의 값은
currentScale 또는
currentTranslate에 영향을 주지 않습니다.
이전 버전의 SVG에서는 사용자 에이전트가 기본적으로
그래픽의 배율(확대/축소)과 이동(패닝)을 사용자가 설정할 수 있는 컨트롤을 구현하도록 권고했습니다.
이러한 사용자 동작에 의한 변환은
currentScale 및 currentTranslate 값에 반영되었습니다.
이러한 사용자 컨트롤은 제대로 구현되지 않았으며 더 이상 권고되지 않습니다.
그러나 사용자 에이전트가 이러한 값을 업데이트할 수 있다는 점을 작성자는 인지해야 합니다.
가장 바깥쪽 SVG 요소의 폐기된 속성 zoomAndPan="disable"은
사용자 동작에 기반하여 사용자 에이전트가 값을 조작하는 것을 비활성화하는 것이 좋지만,
일부 사용자 에이전트에서는 원하지 않는 부작용이 발생할 수 있습니다.
currentScale 및 currentTranslate와 문서 루트를 변환하는 다른 방법(transform 및 SVG view)의 상호작용은 제대로 정의되어 있지 않습니다. 자세한 내용은 GitHub 이슈를 참조하십시오.
currentScale을 가져올 때 다음 단계를 실행합니다:
currentScale을 설정할 때 다음 단계를 실행합니다:
currentTranslate를 가져올 때 SVGSVGElement 객체의 현재 변환 지점 객체를 반환합니다. 이 객체는 ‘svg’ 요소의 현재 이동을 나타냅니다. 현재 변환 지점 객체는 해당 ‘svg’ 요소가 가장 바깥쪽 svg 요소가 아닐 때 읽기 전용이어야 하며, 그렇지 않으면 쓰기 가능해야 합니다.
현재 변환 지점 객체를 수정하면 문서의 확대 및 패닝 변환에 어떤 영향을 주는지에 대해서는 SVGPoint에 할당하는 규칙을 참조하십시오.
사용자 상호작용에 응답하여 문서의 확대 및 패닝 변환이 변경되거나 가장 바깥쪽 svg 요소가 변경될 때마다 다음 단계를 실행합니다:
가장 바깥쪽 svg 요소가 변경될 때 이러한 단계를 실행하면 문서 요소가 다른 ‘svg’ 요소로 교체되는 경우 그 요소의 currentTranslate가 문서의 확대 및 패닝 변환의 이동 구성 요소를 반영하도록 즉시 업데이트됩니다.
‘svg’ 요소가 더 이상 가장 바깥쪽 svg 요소가 아니게 될 때마다 그 요소의 현재 변환 지점 객체의 x 및 y 구성 요소를 0으로 설정해야 합니다.
suspendRedraw, unsuspendRedraw, unsuspendRedrawAll 및 forceRedraw 메서드는 모두 폐기되었으며 아무 효과도 없도록 정의되어 있습니다. suspendRedraw 메서드가 호출되면 1을 반환해야 합니다.
getIntersectionList, getEnclosureList, checkIntersection 및 checkEnclosure 메서드는 그래픽 요소에 기하 연산을 수행하여 그래픽 콘텐츠가 주어진 사각형 안에 부분적으로 또는 완전히 포함되는 요소를 찾거나 그러한지 확인하는 데 사용됩니다.
주어진 요소 element의 교차하거나 포함된 자손을 찾으려면, 주어진 사각형 rectangle과 rectangle을 해석할 좌표 공간의 요소로 ancestor를 사용하여 다음 단계를 실행합니다:
이는 use 요소 섀도 트리의 요소를 살펴보더라도 요소 인스턴스나 참조되는 문서 하위 트리의 소스 요소를 result 목록에 넣지 않고, ‘use’ 요소 자체만 반환한다는 의미입니다.
주어진 요소 element 안에서 컨테이너가 아닌 그래픽 요소를 찾으려면 다음 단계를 실행합니다:
getIntersectionList(rect, referenceElement) 또는 getEnclosureList(rect, referenceElement)가 호출되면 다음 단계를 실행합니다:
checkIntersection(element, rect) 또는 checkEnclosure(element, rect)가 호출되면 다음 단계를 실행합니다:
deselectAll 메서드는 문서에서 모든 선택을 제거하는 데 사용됩니다. deselectAll()이 호출되면 문서의 모든 범위가 선택에서 제거되고 선택의 방향이 forwards로 설정됩니다. [DOM][EDITING] 이 메서드는 Selection API의 기능과 중복되므로 폐기되었습니다.
이는 이 ‘svg’ 요소가 속한 문서에서
document.getSelection().removeAllRanges()를 호출하는 것과 동일합니다.
createSVGNumber, createSVGLength, createSVGAngle, createSVGPoint, createSVGMatrix, createSVGRect 및 createSVGTransform 메서드는 모두 특정 유형의 새 데이터 유형 객체를 생성하는 데 사용되는 팩토리 함수입니다. 이 메서드 중 하나가 호출되면 다음 표에 따라 새 객체가 반환됩니다:
| 메서드 | 객체 및 세부 정보 |
|---|---|
| createSVGNumber | 값이 0인 새 분리된 SVGNumber 객체. |
| createSVGLength | 값이 단위 없는 <number> 0인 새 분리된 SVGLength 객체. |
| createSVGAngle | 값이 단위 없는 <number> 0인 새 분리된 SVGAngle 객체. |
| createSVGPoint | 모든 좌표가 0인 새 분리된 SVGPoint 객체. |
| createSVGMatrix | 항등 행렬을 나타내는 새 분리된 SVGMatrix 객체. |
| createSVGRect | x, y, width 및 height가 모두 0인 새 SVGRect 객체. |
| createSVGTransform | 값이 matrix(1, 0, 0, 1, 0, 0)인 새 분리된 SVGTransform 객체. |
createSVGPoint, createSVGMatrix 및 createSVGRect 메서드는 모두 폐기되었으며 레거시 콘텐츠와의 호환성을 위해서만 유지됩니다. 작성자는 대신 SVGPoint, SVGMatrix 및 SVGRect 생성자를 사용하는 것이 권장됩니다.
createSVGTransformFromMatrix 메서드는 행렬 객체에서 새 SVGTransform 객체를 생성하는 데 사용됩니다. 그 동작은 SVGTransformList의 createSVGTransformFromMatrix 메서드와 동일합니다.
getElementById 메서드는 ‘svg’ 요소의 자손 중에서 ID가 elementId인 첫 번째 요소를 트리 순서로 반환해야 하며, 그러한 요소가 없으면 null을 반환해야 합니다.
SVGGElement 객체는 DOM의 ‘g’ 요소를 나타냅니다.
[Exposed=Window] interface SVGGElement : SVGGraphicsElement { };
SVGDefsElement 객체는 DOM의 ‘defs’ 요소를 나타냅니다.
[Exposed=Window] interface SVGDefsElement : SVGGraphicsElement { };
SVGDescElement 객체는 DOM의 ‘desc’ 요소를 나타냅니다.
[Exposed=Window] interface SVGDescElement : SVGElement { };
SVGMetadataElement 객체는 DOM의 ‘metadata’ 요소를 나타냅니다.
[Exposed=Window] interface SVGMetadataElement : SVGElement { };
SVGTitleElement 객체는 DOM의 ‘title’ 요소를 나타냅니다.
[Exposed=Window] interface SVGTitleElement : SVGElement { };
SVGSymbolElement 객체는 DOM의 ‘symbol’ 요소를 나타냅니다.
[Exposed=Window] interface SVGSymbolElement : SVGGraphicsElement { }; SVGSymbolElement includes SVGFitToViewBox;
SVG 2에서 새로 추가되었습니다. 이제 SVGSymbolElement 인터페이스는 SVGGraphicsElement를 상속하므로, 섀도 DOM에서 인스턴스화된 symbol을 그래픽 요소로 쿼리할 수 있습니다.
SVGUseElement 객체는 DOM의 ‘use’ 요소를 나타냅니다.
[Exposed=Window] interface SVGUseElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; }; SVGUseElement includes SVGURIReference;
x, y, width 및 height IDL 속성은 각각 x, y, width 및 height 프로퍼티와 이에 대응하는 프레젠테이션 속성의 계산값을 반영합니다.
각 use 요소 섀도 트리의 루트 객체는 SVGUseElementShadowRoot 인터페이스를 구현합니다. 이 인터페이스는 현재 ShadowRoot 인터페이스 및 DocumentOrShadowRoot 믹스인에 정의된 프로퍼티와 메서드에 대한 확장을 정의하지 않습니다. 그러나 이 노드를 루트로 하는 트리는 작성자 스크립트의 관점에서 완전히 읽기 전용입니다.
[Exposed=Window] interface SVGUseElementShadowRoot : ShadowRoot { };
ShadowAnimation 인터페이스는 생성의 기반이 된 sourceAnimation 객체의 모든 변경 사항을 미러링하는 읽기 전용 Animation 객체를 정의합니다. 이는 use 요소 섀도 트리에서 작성자가 시작한 애니메이션 객체를 미러링하는 데 사용됩니다.
[Exposed=Window] interface ShadowAnimation : Animation { constructor(Animation source, (Element or CSSPseudoElement) newTarget); [SameObject] readonly attribute Animation sourceAnimation; };
sourceAnimation IDL 프로퍼티는 생성자에 전달된 Animation 객체를 가리킵니다.
생성자는 새 ShadowAnimation 객체를 생성하며,
이는 sourceAnimation의
모든 프로퍼티를 반영합니다. 다만 그
effect는
sourceAnimation의
keyframe effect를 소스로 사용하여 새
KeyframeEffectReadOnly를
생성한 다음 그
target을
newTarget 매개변수와 일치하도록 수정하여 생성합니다.
ShadowAnimation은 읽기 전용입니다.
상속된 IDL 프로퍼티를 설정하거나
상태를 변경하는 Animation 메서드를
호출하려는 모든 시도는
NoModificationAllowedError를 발생시켜야 합니다.
그러나 사용자 에이전트는
sourceAnimation의 프로퍼티 또는 상태에 대한
모든 변경 사항이 ShadowAnimation의 변경 사항에
반영되도록 해야 합니다.
SVGSwitchElement 객체는 DOM의 ‘switch’ 요소를 나타냅니다.
[Exposed=Window] interface SVGSwitchElement : SVGGraphicsElement { };
이 인터페이스는 다른 DOM 기반 언어에 참조를 통해 삽입된 SVG 문서에 접근할 수 있도록 합니다. 이 인터페이스는 이러한 SVG 문서 참조를 허용하는 DOM 객체에서 구현될 것으로 예상됩니다.
이 인터페이스는 폐기되었으며 향후 버전의
SVG 명세에서 제거될 수 있습니다.
‘iframe’ 또는
‘object’ 요소 내부의 SVG 문서에 접근하려면
작성자는 각각 HTMLIFrameElement
또는 HTMLObjectElement
인터페이스의 contentDocument
속성을 사용하는 것이 권장됩니다.
HTMLIFrameElement, HTMLEmbedElement 및 HTMLObjectElement 인터페이스는 모두 자체 getSVGDocument 메서드를 정의하며, 이는 GetSVGDocument와 같은 방식으로 SVG 문서에 접근할 수 있도록 합니다. 따라서 이 세 인터페이스는 GetSVGDocument를 구현할 필요가 없습니다. 그래도 작성자는 대신 contentDocument를 사용하는 것이 강력히 권장됩니다.
interface mixin GetSVGDocument {
Document getSVGDocument();
};
getSVGDocument 메서드는 참조되는 SVG 문서를 반환하는 데 사용됩니다. getSVGDocument()가 호출되면 GetSVGDocument 인터페이스를 구현하는 삽입 요소가 참조하는 Document 객체를 반환해야 하며, 문서가 없으면 null을 반환합니다.
이 메서드는 참조되는 문서가 실제로 SVG 문서인지 확인하지 않는다는 점에 유의하십시오. 대신 모든 문서를 반환합니다.
SVG 문서의 요소는 CSS를 사용하여 스타일을 지정할 수 있습니다. 대부분의 시각적 특성과 요소 기하의 일부 측면은 CSS 프로퍼티를 사용하여 제어합니다. 예를 들어 fill 프로퍼티는 도형의 내부를 채우는 데 사용되는 페인트를 제어하고, width 및 height 프로퍼티는 ‘rect’ 요소의 크기를 제어하는 데 사용됩니다.
SVG 사용자 에이전트는 이 장에서 설명하는 모든 CSS 스타일링 메커니즘을 지원해야 합니다.
SVG 1.1에서는 ‘style’ 요소 및 ‘style’을 사용한 인라인 스타일시트 지원이 필수가 아니었습니다. SVG 2에서는 이를 지원해야 합니다.
| SVG 2 요구 사항: | HTML5 ‘style’ 요소의 속성을 SVG의 ‘style’ 요소에 추가합니다. |
|---|---|
| 결의: | SVG 2의 ‘style’ 요소를 HTML5의 ‘style’ 요소와 일치시킵니다. |
| 목적: | HTML과 SVG 콘텐츠의 ‘style’ 요소가 서로 다르게 동작하여 작성자를 당황하게 하지 않기 위함입니다. |
| 담당자: | Cameron (ACTION-3277) |
‘style’ 요소를 사용하면 스타일시트를 SVG 콘텐츠 안에 직접 삽입할 수 있습니다. SVG의 ‘style’ 요소는 HTML의 대응하는 요소와 동일한 속성을 가집니다.
속성 정의:
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| type | (아래 참조) | (없음) | 아니요 |
이 속성은 요소 콘텐츠의 스타일시트 언어를 미디어 유형으로 지정합니다. [rfc2046]. 속성이 지정되지 않으면 스타일시트 언어는 CSS로 간주됩니다. 이 속성은 폐기되었으며 사용해서는 안 됩니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| media | (아래 참조) | (없음) | 아니요 |
이 속성은 스타일시트를 적용하기 위해 일치해야 하는 미디어 쿼리를 지정합니다. 그 값은 media_query_list로 파싱됩니다. 지정되지 않으면 스타일시트는 조건 없이 적용됩니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| title | (아래 참조) | (없음) | 아니요 |
이 속성은 스타일시트의 제목을 지정하며, 대체 스타일시트를 노출하고 선택할 때 사용됩니다. 속성은 어떤 값이든 사용할 수 있습니다.
‘style’ 및 그 속성의 의미론과 처리는 HTML ‘style’ 요소에 정의된 것과 동일해야 합니다.
스타일시트의 텍스트 콘텐츠는 직접 렌더링되지 않습니다. ‘style’ 요소의 display 값은 사용자 에이전트 스타일시트에 의해 항상 none으로 설정되어야 하며, 이 선언은 다른 모든 CSS 규칙 또는 프레젠테이션 속성보다 높은 중요도를 가져야 합니다.
SVG 문서의 HTML ‘link’ 요소(즉, 로컬 이름이 "link"인 HTML 네임스페이스의 요소)는 ‘rel’ 속성이 'stylesheet'로 설정된 경우 HTML 명세에 정의된 대로 처리되어 외부 스타일시트를 로드하고 문서에 적용해야 합니다. 인라인 SVG 조각 밖의 HTML 문서에 있는 이러한 요소도 SVG 콘텐츠에 적용되어야 합니다.
요소가 HTML 네임스페이스에 있어야 하므로 HTML ‘link’ 요소를 text/html 문서의 인라인 SVG 조각 일부로 파싱할 수 없습니다. 그러나 XML 구문을 사용하여 SVG 문서를 파싱할 때는 XML 네임스페이스 선언을 사용하여 요소를 HTML 네임스페이스에 둘 수 있습니다.
HTML ‘link’ 요소를 사용하지 않고 외부 스타일시트를 참조하는 다른 방법은 인라인 스타일시트에서 @import 규칙을 사용하는 것입니다. 예:
<svg xmlns="http://www.w3.org/2000/svg">
<style>
@import url(mystyles.css);
</style>
<rect .../>
</svg>
이는 다음과 유사하게 동작합니다:
<svg xmlns="http://www.w3.org/2000/svg"> <link xmlns="http://www.w3.org/1999/xhtml" rel="stylesheet" href="mystyles.css" type="text/css"/> <rect .../> </svg>
또는 XML 문서에서는 <?xml-stylesheet?> 처리 명령을 사용하여 외부 CSS 스타일시트를 포함할 수 있습니다 [xml-stylesheet].
SVG ‘style’ 또는 HTML ‘style’ 요소를 HTML 문서에서 사용하는 경우 해당 스타일시트는 문서의 모든 HTML 및 인라인 SVG 콘텐츠에 적용되어야 합니다. 마찬가지로 SVG 문서에서 사용되는 모든 HTML ‘style’ 요소도 해당 스타일시트를 문서에 적용해야 합니다.
HTML과 마찬가지로 SVG는 모든 요소에서 ‘class’ 및 ‘style’ 속성을 지원하여 요소별 스타일링을 지원합니다.
속성 정의:
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| class | 공백으로 구분된 토큰 집합 [HTML] | (없음) | 예 |
‘class’ 속성은 요소에 하나 이상의 클래스 이름을 할당하며, 이후 스타일링 언어에서 대상을 지정하는 데 사용할 수 있습니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| style | (아래 참조) | (없음) | 아니요 |
‘style’ 속성은 요소의 CSS 선언을 제공하는 데 사용됩니다. 이 속성은 declaration-list로 파싱됩니다.
‘class’ 속성이 SVG DOM(SVGElement의 className IDL 속성)에 반영되는 방식을 제외하면, ‘class’ 및 ‘style’ 속성의 의미론과 동작은 HTML의 대응하는 속성과 동일해야 합니다.
다음 예에서는 ‘text’ 요소를 ‘class’ 속성과 함께 사용하여 문서 메시지를 마크업합니다. 메시지는 영어와 프랑스어 버전으로 모두 나타납니다.
<!-- 영어 메시지 --> <text class="info" lang="en">변수가 두 번 선언되었습니다</text> <text class="warning" lang="en">선언되지 않은 변수</text> <text class="error" lang="en">변수 이름의 구문이 잘못되었습니다</text> <!-- 프랑스어 메시지 --> <text class="info" lang="fr">변수가 두 번 선언되었습니다</text> <text class="warning" lang="fr">정의되지 않은 변수</text> <text class="error" lang="fr">변수 구문 오류</text>
다음 CSS 스타일 규칙은 시각적 사용자 에이전트에 정보 메시지는 녹색, 경고 메시지는 노란색, 오류 메시지는 빨간색으로 표시하도록 지시합니다:
text.info { fill: green; }
text.warning { fill: yellow; }
text.error { fill: red; }
이 예는 ‘style’ 속성을 사용하여 이전 예와 유사하게 ‘text’ 요소의 스타일을 지정하는 방법을 보여 줍니다:
<text style="fill: green;" lang="en">변수가 두 번 선언되었습니다</text> <text style="fill: yellow;" lang="en">선언되지 않은 변수</text> <text style="fill: red;" lang="en">변수 이름의 구문이 잘못되었습니다</text>
일부 스타일링 프로퍼티는 스타일시트와 ‘style’ 속성뿐만 아니라 프레젠테이션 속성으로도 지정할 수 있습니다. 이들은 이름이 주어진 CSS 프로퍼티와 일치하거나 유사하고 값이 해당 프로퍼티의 값으로 파싱되는 속성입니다. 프레젠테이션 속성은 캐스케이드의 작성자 수준에 기여하며, 그 뒤에 다른 모든 작성자 수준 스타일시트가 오고, 명시도는 0입니다.
프레젠테이션 속성은 선언이 아니라 CSS 값으로 파싱되므로, 프레젠테이션 속성 안에 !important 선언이 있으면 유효하지 않은 값이 됩니다. 프레젠테이션 속성을 파싱하는 방법에 대한 자세한 내용은 속성 구문을 참조하십시오.
SVG 렌더링에 영향을 줄 수 있는 모든 스타일 프로퍼티에 대응하는 프레젠테이션 속성이 있는 것은 아닙니다. 다른 속성(우연히 스타일 프로퍼티와 이름이 같은 속성)은 프레젠테이션 속성으로 파싱해서는 안 되며 CSS 캐스케이딩과 상속에 영향을 주어서도 안 됩니다. 또한 SVG 네임스페이스의 요소만 프레젠테이션 속성을 지원합니다. 대부분의 SVG 프레젠테이션 속성은 기존 속성과 이름 충돌이 없는 경우 SVG 네임스페이스의 모든 요소에 지정할 수 있습니다. 그러나 기하 프로퍼티는 지정된 요소에만 동등한 프레젠테이션 속성을 가집니다. 다른 요소의 같은 이름 속성은 CSS 캐스케이딩과 상속에 영향을 주어서는 안 됩니다.
transform 프레젠테이션 속성 표에 명시된 경우를 제외하면, 프레젠테이션 속성 이름은 프로퍼티 이름과 동일하며 소문자로 작성됩니다.
‘cx’, ‘cy’, ‘r’, ‘x’, ‘y’, ‘width’ 및 ‘height’ 속성이 항상 프레젠테이션 속성인 것은 아니라는 점에 유의하십시오. 예를 들어 ‘text’ 및 ‘tspan’의 ‘x’ 속성은 x 프로퍼티의 프레젠테이션 속성이 아니며, ‘radialGradient’의 ‘r’ 속성은 r 프로퍼티의 프레젠테이션 속성이 아닙니다.
향후 SVG 콘텐츠에 적용되는 새로운 프로퍼티에는 프레젠테이션 속성이 추가되지 않습니다. 따라서 작성자는 SVG 콘텐츠의 스타일을 지정할 때 프레젠테이션 속성보다 인라인 ‘style’ 프로퍼티 또는 스타일시트를 통한 스타일링 프로퍼티를 사용하는 것이 권장됩니다.
프레젠테이션 속성의 애니메이션은 대응하는 프로퍼티를 애니메이션하는 것과 동등합니다.
다음 프로퍼티는 모든 SVG 사용자 에이전트에서 지원해야 합니다:
다음 사용자 에이전트 스타일시트는 모든 SVG 사용자 에이전트에서 적용되어야 합니다.
@namespace url(http://www.w3.org/2000/svg);
@namespace xml url(http://www.w3.org/XML/1998/namespace);
svg:not(:root), image, marker, pattern, symbol { overflow: hidden; }
*:not(svg),
*:not(foreignObject) > svg {
transform-origin: 0 0;
}
*[xml|space=preserve] {
white-space-collapse: preserve-spaces;
}
:link, :visited {
cursor: pointer;
}
또한
모든 대화형 사용자 에이전트는
:focus 의사 클래스
(일반적으로 outline 프로퍼티 사용)와
::selection 의사 요소에
구별되는 스타일을 적용해야 합니다
(선택된 글리프를 반전 색상으로 다시 그리는 것과 같은
적절한 강조 표시 기법 사용).
CSS Transforms는 transform-origin의 초기값을 50% 50%로 정의합니다. SVG의 요소는 기본적으로 원점 (0, 0)을 중심으로 변환해야 하므로 transform-origin은 모든 SVG 요소에 대해 재정의되어 기본값 0 0으로 설정됩니다 (루트 ‘svg’ 요소 및 ‘svg’ 요소 중 ‘foreignObject’ 요소 또는 SVG가 아닌 네임스페이스의 요소의 자식인 요소는 제외하며, 이 요소들은 중심을 기준으로 변환해야 합니다). [css-transforms-1]
OpenType 명세는 [OPENTYPE]를 처리할 때 추가 사용자 에이전트 스타일시트를 적용하도록 요구합니다. 내용은 다음과 같습니다:
@namespace svg url(http://www.w3.org/2000/svg);
svg|text, svg|foreignObject {
display: none !important;
}
:root {
fill: context-fill;
fill-opacity: context-fill-opacity;
stroke: context-stroke;
stroke-opacity: context-stroke-opacity;
stroke-width: context-value;
stroke-dasharray: context-value;
stroke-dashoffset: context-value;
}
context-fill 및 context-stroke 키워드는 이 명세에 정의된 것과 같으며, 글꼴 글리프의 컨텍스트 요소는 대응하는 텍스트 콘텐츠 요소입니다. 그 밖의 키워드는 OpenType 명세에 정의되어 있으며, 텍스트 콘텐츠 요소의 스타일 값이 좌표계 변경에 적절히 맞게 조정되어 글꼴 글리프로 전파되도록 보장합니다 [OPENTYPE].
위에서 설명한 기능 외에도 다음 CSS 기능은 SVG 사용자 에이전트에서도 지원해야 합니다:
SVGStyleElement 객체는 DOM의 ‘style’ 요소를 나타냅니다.
[Exposed=Window] interface SVGStyleElement : SVGElement { [Reflect] attribute DOMString type; [Reflect] attribute DOMString media; [Reflect] attribute DOMString title; attribute boolean disabled; }; SVGStyleElement includes LinkStyle;
SVG의 스타일링 프로퍼티 외에도 SVG는 기하 프로퍼티도 정의합니다. 기하 프로퍼티는 그래픽 요소인 ‘circle’, ‘ellipse’, ‘rect’, ‘image’, ‘foreignObject’ 및 ‘svg’ 요소의 위치와 크기를 설명합니다.
cx, cy, x 및 y 프로퍼티는 음수 값을 허용합니다. r, rx, ry, width 및 height 프로퍼티는 허용하지 않습니다. 음수 <length-percentage>는 유효하지 않습니다. 이러한 프로퍼티 중 하나에 유효하지 않은 음수 값이 지정되면, 프레젠테이션 속성을 통해서든 CSS 선언을 통해서든, 프로퍼티의 초기값이 지정된 것처럼 처리해야 합니다. 즉, rx, ry, width 및 height에는 auto, r에는 0입니다. 따라서 음수 값은 요소를 오류 상태로 만들지 않으며, @@ 알 수 없는 용어 "사용값"은 프로퍼티의 일반적인 값 결정 규칙에 따라 결정됩니다. 다음 표는 이 처리를 요약합니다.
| 프로퍼티 | 값 | 초기값 | 음수 허용 여부 | 음수의 계산값 | 음수 값의 사용값 |
|---|---|---|---|---|---|
| cx, cy | <length-percentage> | 0 | 예 | 지정된 값(그대로 유지) | 음수 값(도형을 이동시킴) |
| r | <length-percentage> | 0 | 아니요 | 0 | 0; r = 0인 ‘circle’ 은 렌더링되지 않음 |
| rx, ry | <length-percentage> | auto | auto | 아니요 | auto | auto로 결정됨: 다른 반지름의 사용값과 같거나, 다른 반지름도 auto 또는 음수이면 0. 결정된 반지름이 0인 ‘ellipse’는 렌더링되지 않습니다. |
| width, height | <length-percentage> | auto | auto | 아니요 | auto | 크기 조정 표에 따라 auto로 결정됨: 가장 바깥쪽 ‘svg’에는 100%, ‘image’에는 고유 크기, 그 밖의 모든 요소에는 0. |
| 이름: | cx |
|---|---|
| 값: | <length-percentage> |
| 초기값: | 0 |
| 적용 대상: | ‘circle’ 및 ‘ellipse’ 요소 |
| 상속: | 아니요 |
| 백분율: | 현재 SVG 뷰포트의 너비를 기준으로 함( 단위 참조) |
| 미디어: | 시각 |
| 계산값: | 절대 길이 또는 백분율 |
| 애니메이션 유형: | 계산값에 따라 |
cx 프로퍼티는 요소 위치의 수평 중심 좌표를 설명합니다.
cx에는 음수 값이 허용됩니다. 음수 값은 도형의 중심을 이동시키며 r, rx 및 ry와 달리 렌더링을 비활성화하지 않습니다(음수 값 처리 참조).
| 이름: | cy |
|---|---|
| 값: | <length-percentage> |
| 초기값: | 0 |
| 적용 대상: | ‘circle’ 및 ‘ellipse’ 요소 |
| 상속: | 아니요 |
| 백분율: | 현재 SVG 뷰포트의 높이를 기준으로 함( 단위 참조) |
| 미디어: | 시각 |
| 계산값: | 절대 길이 또는 백분율 |
| 애니메이션 유형: | 계산값에 따라 |
cy 프로퍼티는 요소 위치의 수직 중심 좌표를 설명합니다.
cy에는 음수 값이 허용됩니다. 음수 값은 도형의 중심을 이동시키며 렌더링을 비활성화하지 않습니다( 음수 값 처리 참조).
| 이름: | r |
|---|---|
| 값: | <length-percentage> |
| 초기값: | 0 |
| 적용 대상: | ‘circle’ 요소 |
| 상속: | 아니요 |
| 백분율: | 현재 SVG 뷰포트의 정규화된 대각선을 기준으로 함( 단위 참조) |
| 미디어: | 시각 |
| 계산값: | 절대 길이 또는 백분율 |
| 애니메이션 유형: | 계산값에 따라 |
r 프로퍼티는 ‘circle’ 요소의 반지름을 설명합니다.
r의 음수 값은 유효하지 않으며, 0이 지정된 것처럼 처리됩니다( 음수 값 처리 참조). 따라서 ‘circle’은 렌더링되지 않습니다.
| 이름: | rx |
|---|---|
| 값: | <length-percentage> | auto |
| 초기값: | auto |
| 적용 대상: | ‘ellipse’, ‘rect’ 요소 |
| 상속: | 아니요 |
| 백분율: | 현재 SVG 뷰포트의 너비를 기준으로 함( 단위 참조) |
| 미디어: | 시각 |
| 계산값: | 절대 길이 또는 백분율 |
| 애니메이션 유형: | 계산값에 따라 |
rx 프로퍼티는 ‘ellipse’ 요소의 수평 반지름 및 ‘rect’ 요소의 곡선 반지름을 설명합니다. ‘rx’의 계산값이 auto이면 사용 반지름은 ry에 사용된 절대 길이와 같아 원호를 생성합니다. ‘rx’와 ‘ry’ 모두의 계산값이 auto이면 사용값은 0입니다.
값이 어떻게 계산되든 ‘rect’의 ‘rx’ 사용값은 같은 도형의 width 사용값의 50%를 절대 초과하지 않습니다.
‘ellipse’에서 auto 동작은 SVG 2에서 새로 추가되었으며, rx가 지정되지 않았을 때 ‘rect’ 요소의 동작과 일치합니다.
rx의 음수 값은 유효하지 않으며, auto가 지정된 것처럼 처리됩니다( 음수 값 처리 참조). 따라서 auto와 같이 결정됩니다. 즉, ry의 사용값이 되거나, ry도 auto 또는 음수이면 0이 됩니다.
| 이름: | ry |
|---|---|
| 값: | <length-percentage> | auto |
| 초기값: | auto |
| 적용 대상: | ‘ellipse’, ‘rect’ |
| 상속: | 아니요 |
| 백분율: | 현재 SVG 뷰포트의 높이를 기준으로 함( 단위 참조) |
| 미디어: | 시각 |
| 계산값: | 절대 길이 또는 백분율 |
| 애니메이션 가능 유형: | 계산값에 따라 |
ry 프로퍼티는 ‘ellipse’ 요소의 수직 반지름 및 ‘rect’ 요소의 수직 곡선 반지름을 설명합니다. ‘ry’의 계산값이 auto이면 사용 반지름은 rx에 사용된 절대 길이와 같아 원호를 생성합니다. ‘rx’와 ‘ry’ 모두의 계산값이 auto이면 사용값은 0입니다.
값이 어떻게 계산되든 ‘rect’의 ‘ry’ 사용값은 같은 도형의 height 사용값의 50%를 절대 초과하지 않습니다.
‘ellipse’에서 auto 동작은 SVG 2에서 새로 추가되었으며, ry가 지정되지 않았을 때 ‘rect’ 요소의 동작과 일치합니다.
ry의 음수 값은 유효하지 않으며, auto가 지정된 것처럼 처리됩니다( 음수 값 처리 참조). 따라서 auto와 같이 결정됩니다. 즉, rx의 사용값이 되거나, rx도 auto 또는 음수이면 0이 됩니다.
| 이름: | x |
|---|---|
| 값: | <length-percentage> |
| 초기값: | 0 |
| 적용 대상: | ‘svg’, ‘rect’, ‘image’, ‘foreignObject’ 요소 |
| 상속: | 아니요 |
| 백분율: | 현재 SVG 뷰포트의 너비를 기준으로 함( 단위 참조) |
| 미디어: | 시각 |
| 계산값: | 절대 길이 또는 백분율 |
| 애니메이션 유형: | 계산값에 따라 |
x 프로퍼티는 요소 위치의 수평 좌표를 설명합니다.
| 이름: | y |
|---|---|
| 값: | <length-percentage> |
| 초기값: | 0 |
| 적용 대상: | ‘svg’, ‘rect’, ‘image’, ‘foreignObject’ 요소 |
| 상속: | 아니요 |
| 백분율: | 현재 SVG 뷰포트의 높이를 기준으로 함( 단위 참조) |
| 미디어: | 시각 |
| 계산값: | 절대 길이 또는 백분율 |
| 애니메이션 유형: | 계산값에 따라 |
y 프로퍼티는 요소 위치의 수직 좌표를 설명합니다.
width 및 height의 정의는 CSS 2.1 명세를 참조하십시오.
CSS width 및 height 프로퍼티는 일부 SVG 요소의 크기를 지정하는 데 사용됩니다. 구체적으로 ‘rect’, ‘image’, ‘foreignObject’, 그리고 가장 바깥쪽 ‘svg’ 요소의 크기를 지정합니다. 이 모든 요소에는 ‘width’ 및 ‘height’ 프레젠테이션 속성이 있습니다. 이 프로퍼티는 HTML 네임스페이스에서 삽입된 요소의 레이아웃에도 사용됩니다.
중첩된 ‘svg’ 요소, ‘use’ 요소 및 ‘symbol’ 요소와 같은 다른 SVG 요소에도 ‘width’ 및 ‘height’ 속성이 있지만 CSS 프로퍼티로는 허용하지 않습니다. 이러한 요소에서는 width와 height를 XML 속성으로 지정해야 하며, 같은 이름의 CSS 프로퍼티는 무시됩니다.
width의 사용값은 max-width 및 min-width 프로퍼티의 값에 의해 제한될 수 있습니다. height의 사용값은 max-height 및 min-height 프로퍼티의 값에 의해 제한될 수 있습니다.
다음 표는 요소에 따라 width 및 height의 auto 값이 어떻게 처리되는지 요약합니다:
| 요소 | 값 | 처리 방식 |
|---|---|---|
| ‘svg’ | auto | 100% |
| ‘image’ | auto | CSS 기본 크기 조정 알고리즘에 따라 참조된 이미지의 고유 크기와 종횡비에서 계산됩니다. |
| 그 밖의 모든 요소 | auto | 0 |
SVG 2에서 새로 추가되었습니다. 이제 SVG에 삽입된 이미지는 고유 크기에 맞게 자동으로 크기를 지정하거나, 고유 종횡비에 따라 고정된 높이 또는 너비로 조정할 수 있습니다. 이는 HTML에 삽입된 이미지의 동작과 일치합니다.
이는 예를 들어 ‘foreignObject’ 객체 요소에서 auto를 사용하더라도 콘텐츠에 맞게 축소되지 않는다는 의미입니다.
모든 SVG 콘텐츠는 SVG 뷰포트 내부에 그려집니다. 모든 SVG 뷰포트는 크기 (너비, 높이)와 원점으로 특징지어지는 그리기 영역을 정의하며, 이는 추상적인 사용자 단위로 측정됩니다.
SVG 뷰포트라는 용어는 CSS에서 사용되는 "뷰포트" 용어와 다르다는 점에 유의하십시오.
초기 뷰포트는 최상위 SVG 뷰포트로, 포함 환경에서 사용하는 좌표계 (예: 웹 브라우저의 CSS 픽셀)와 사용자 단위 사이의 매핑을 설정합니다. 초기 뷰포트를 설정하는 방법은 다음에서 더 자세히 설명합니다: 초기 뷰포트.
SVG 뷰포트는 요소에 의해서만 설정됩니다. 어떤 요소가 뷰포트를 생성하는지에 대한 정보는 새로운 SVG 뷰포트 설정을 참조하십시오.
각 SVG 뷰포트는 뷰포트 좌표 계와 사용자 좌표 계를 생성하며, 처음에는 서로 동일합니다. 뷰포트 요소에 ‘viewBox’를 제공하면 사용자 좌표계가 뷰포트 좌표계에 대해 ‘viewBox’ 속성에서 설명하는 대로 변환됩니다. 뷰포트의 자식 요소는 예를 들어 transform 프로퍼티를 지정하여 사용자 좌표계를 추가로 수정할 수 있습니다.
SVG 뷰포트는 중첩될 수 있습니다. 백분율 단위는 가장 가까운 조상 뷰포트 정의 요소의 사용자 좌표계를 기준으로 결정되며, 이는 단위 절에 정의되어 있습니다. 따라서 중첩된 SVG 뷰포트는 백분율 단위의 의미를 다시 정의하고 특정 직사각형 영역에 대해 그래픽을 "맞추기" 위한 새로운 참조 직사각형을 제공할 기회를 줍니다. 가장 먼 조상 SVG 뷰포트는 SVG 컨텍스트를 벗어나지 않고 도달할 수 있는 최상위 루트 SVG 뷰포트입니다. 조상 SVG 뷰포트는 DOM 트리 순서에 의존하지 않을 수도 있습니다. 예를 들어 ‘linearGradient’, ‘radialGradient’, ‘pattern’, ‘mask’, ‘clipPath’, ‘symbol’ 또는 ‘use’ 요소가 그렇습니다.
SVG 컨텍스트는 조각 내의 모든 요소가 SVGElement를 프로토타입으로 갖는 문서 조각입니다.
SVG 뷰포트의 너비, 높이 및 원점은 SVG 뷰포트를 생성하는 SVG 문서 조각과 그 조각의 부모(실제 또는 암시적) 사이의 협상 과정에 의해 설정됩니다. 이 협상 과정에 대한 설명은 새로운 SVG 뷰포트 설정을 참조하십시오.
기본적으로 중첩된 SVG 뷰포트의 뷰포트 좌표 계는 SVG 뷰포트 요소의 원점만큼 이동한 부모 요소의 로컬 좌표계와 동일합니다. 그러나 SVG 뷰포트 요소의 transform 프로퍼티는 부모 요소의 사용자 좌표계에 대해 뷰포트 좌표계를 수정합니다.
추상적으로 모든 SVG 뷰포트는 캔버스에 삽입되며, 이는 관련된 모든 차원에서 무한히 큰 그리기 영역입니다.
이 과정은 viewBox 속성의 min-x, min-y, width 및 height 값, viewBox 속성이 정의된 요소의 위치와 크기, 그리고 해당 요소의 preserveAspectRatio 속성 값을 요소에 포함된 콘텐츠에 적용되는 이동과 배율로 변환합니다.
요소에 포함된 콘텐츠에 적용되는 변환은 translate(translate-x, translate-y) scale(scale-x, scale-y)입니다.
다음 조건이 충족되지 않는 한 초기 뷰포트의 너비는 가장 바깥쪽 svg 요소의 width 프레젠테이션 속성 값이어야 합니다:
이러한 조건에서는 뷰포트의 너비를 배치 프로퍼티를 통해 설정해야 합니다.
마찬가지로 참조 요소 또는 가장 바깥쪽 svg 요소에 뷰포트의 높이를 설정하기에 충분한 배치 프로퍼티가 지정되어 있으면 이러한 배치 프로퍼티가 뷰포트의 높이를 설정해야 하며, 그렇지 않으면 초기 뷰포트의 높이는 가장 바깥쪽 svg 요소의 height 프레젠테이션 속성 값이어야 합니다.
가장 바깥쪽 svg 요소의 width 또는 height 프레젠테이션 속성이 사용자 단위로 되어 있다면(즉, 단위 식별자가 제공되지 않은 경우), 그 값은 동일한 수의 "px" 단위와 동등한 것으로 간주됩니다(단위 참조).
다음 예에서는 SVG 그래픽이 CSS 레이아웃 규칙을 사용하여 형식이 지정된 부모 XML 문서 내부에 인라인으로 삽입됩니다. 가장 바깥쪽 svg 요소에 CSS 배치 프로퍼티가 제공되지 않았으므로, width="100px" 및 height="200px" 속성이 초기 뷰포트의 크기를 결정합니다:
<?xml version="1.0" standalone="yes"?>
<parent xmlns="http://some.url">
<!-- SVG 그래픽 -->
<svg xmlns='http://www.w3.org/2000/svg'
width="100px" height="200px">
<path d="M100,100 Q200,400,300,100"/>
<!-- 나머지 SVG 그래픽은 여기에 들어갑니다 -->
</svg>
</parent>
가장 바깥쪽 svg 요소의 경우 SVG 사용자 에이전트는 초기 뷰포트 좌표 계와 초기 사용자 좌표계를 두 좌표계가 동일하도록 결정해야 합니다. 두 좌표계의 원점은 SVG 뷰포트의 원점에 있어야 하며, 초기 좌표계의 한 단위는 SVG 뷰포트에서 하나의 CSS 2.1 px ([CSS2], 4.3.2절)와 같아야 합니다. 독립형 SVG 문서 및 부모 문서 내부에 (참조 또는 인라인으로) 삽입되고 부모의 레이아웃이 CSS [CSS2]에 의해 결정되는 SVG 문서 조각에서는 초기 뷰포트 좌표계(따라서 초기 사용자 좌표 계)의 원점이 뷰포트의 왼쪽 위에 있어야 하고, 양의 x축은 오른쪽을 향하고, 양의 y축은 아래쪽을 향해야 하며, 텍스트는 "직립" 방향으로 렌더링되어야 합니다. 이는 로마자 문자와 아시아 문자의 전각 표의문자에 대해 대응하는 글리프의 위쪽 가장자리가 위를 향하고 오른쪽 가장자리가 오른쪽을 향하도록 글리프의 방향이 정해짐을 의미합니다.
SVG 구현이 CSS 2.1 호환 px 단위를 사용하여 문서 스타일링을 지원하는 사용자 에이전트의 일부라면 SVG 사용자 에이전트는 실제 세계 단위에서 px 단위 크기의 초기값을 다른 스타일링 작업에 사용되는 값과 일치하도록 설정하는 것이 좋습니다. 그렇지 않고 사용자 에이전트가 환경으로부터 px 단위의 크기를 결정할 수 있다면 해당 값을 사용하는 것이 좋습니다. 그렇지 않으면 하나의 px 단위에 적절한 크기를 선택하는 것이 좋습니다. 모든 경우에 px의 크기는 CSS 2.1에 설명된 규칙 ([CSS2], 4.3.2절)을 준수해야 합니다.
아래의 예 InitialCoords는 초기 좌표계의 원점이 왼쪽 위에 있고 x축은 오른쪽을, y축은 아래쪽을 향한다는 것을 보여 줍니다. 초기 사용자 좌표계에서는 한 사용자 단위가 부모(암시적 또는 명시적) 사용자 에이전트의 "픽셀"과 같습니다.
<?xml version="1.0" standalone="no"?>
<svg width="300px" height="100px" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<desc>예 InitialCoords - SVG의 초기 좌표계</desc>
<g fill="none" stroke="black" stroke-width="3" >
<line x1="0" y1="1.5" x2="300" y2="1.5" />
<line x1="1.5" y1="0" x2="1.5" y2="100" />
</g>
<g fill="red" stroke="none" >
<rect x="0" y="0" width="3" height="3" />
<rect x="297" y="0" width="3" height="3" />
<rect x="0" y="97" width="3" height="3" />
</g>
<g font-size="14" font-family="Verdana" >
<text x="10" y="20">(0,0)</text>
<text x="240" y="20">(300,0)</text>
<text x="10" y="90">(0,100)</text>
</g>
</svg>
예 InitialCoords
사용자 에이전트는 [css-transforms-1]에 정의된 transform 프로퍼티 및 프레젠테이션 속성을 지원해야 합니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| viewBox | [<min-x>,? <min-y>,? <width>,? <height>] | 지정되지 않은 것과 같음. | 예 |
<min-x>, <min-y>, <width>, <height> = <number>
‘svg’
요소의 변환은 ‘viewBox’ 속성
때문에 다소 특별합니다.
이 변환은 ‘svg’에 해당 변환이 설정된
부모 요소가 있는 것처럼 적용하는 것이 좋습니다.
결의: transform 프로퍼티는
개념적으로 'svg' 요소의 바깥쪽에 적용되며
프레젠테이션 속성과 스타일 프로퍼티 사이에는 차이가 없습니다(시각적 결과 측면에서).
‘viewBox’ 속성은 ‘preserveAspectRatio’ 속성과 함께 SVG 뷰포트를 특정 컨테이너 요소에 맞게 늘릴 수 있는 기능을 제공합니다.
‘viewBox’ 속성의 값은 공백 및/또는 쉼표로 구분된 네 개의 숫자 <min-x>, <min-y>, <width> 및 <height>의 목록이며, 사용자 공간에서 주어진 요소에 의해 설정된 SVG 뷰포트의 경계에 매핑되어야 하는 직사각형을 지정합니다. 이때 ‘preserveAspectRatio’ 속성을 고려합니다. ‘viewBox’ 속성이 있으면 SVG 뷰포트의 동등한 변환 계산에 설명된 대로 뷰포트 좌표계에 변환이 적용됩니다.
<width> 또는 <height>의 음수 값은 오류입니다. ‘viewBox’ 속성은 유효하지 않으며 지정되지 않은 것처럼 처리해야 하므로, viewBox 변환은 적용되지 않습니다. <width> 또는 <height>의 값이 0이면 다른 크기가 0인 뷰포트의 처리와 일관되게 요소의 렌더링이 비활성화됩니다.
예 ViewBox는 가장 바깥쪽 svg 요소에서 ‘viewBox’ 속성을 사용하여 SVG 콘텐츠가 SVG 뷰포트의 경계에 맞도록 늘어나야 함을 지정하는 방법을 보여 줍니다.
<?xml version="1.0" standalone="no"?>
<svg width="300px" height="200px"
viewBox="0 0 1500 1000" preserveAspectRatio="none"
xmlns="http://www.w3.org/2000/svg">
<desc>예 ViewBox - viewBox
속성을 사용하여 초기 사용자 좌표계를 자동으로 생성하고
SVG 뷰포트의 크기에 관계없이 그래픽이
SVG 뷰포트에 맞게 크기 조정되도록 합니다.</desc>
<!-- 이 직사각형은 사용자 좌표계에서 (0,0)에서 (1500,1000)까지 이어집니다.
위의 viewBox 속성 때문에
직사각형은 결국 SVG 콘텐츠에
예약된 전체 영역을 채우게 됩니다. -->
<rect x="0" y="0" width="1500" height="1000"
fill="yellow" stroke="blue" stroke-width="12" />
<!-- 크고 빨간 삼각형 -->
<path fill="red" d="M 750,100 L 250,900 L 1250,900 z"/>
<!-- SVG 뷰포트 대부분에 걸쳐 표시되는 텍스트 문자열 -->
<text x="100" y="600" font-size="200" font-family="Verdana" >
맞게 늘리기
</text>
</svg>
| 다음에 렌더링됨 SVG 뷰포트 width=300px, height=200px |
다음에 렌더링됨 SVG 뷰포트 width=150px, height=200px |
|
|---|---|---|
|
![]() |
‘viewBox’ 속성의 효과는 사용자 에이전트가 사용자 좌표계의 지정된 직사각형을 지정된 영역 (흔히 SVG 뷰포트)의 경계에 매핑하기 위한 적절한 변환 행렬을 자동으로 제공하는 것입니다. 왼쪽 예와 같이 SVG 뷰포트의 크기가 300 x 200픽셀인 효과를 얻으려면 사용자 에이전트가 X와 Y를 모두 0.2배 하는 변환을 자동으로 삽입해야 합니다. 이 효과는 300px x 200px 크기의 SVG 뷰포트와 문서에 다음과 같은 보충 변환이 있는 것과 같습니다:
<?xml version="1.0" standalone="no"?>
<svg width="300px" height="200px"
xmlns="http://www.w3.org/2000/svg">
<g transform="scale(0.2)">
<!-- 문서의 나머지 부분은 여기에 들어갑니다 -->
</g>
</svg>
오른쪽 예와 같은 효과를 얻으려면 SVG 뷰포트 크기가 150 x 200픽셀일 때 사용자 에이전트가 X를 0.1배, Y를 0.2배 하는 변환을 자동으로 삽입해야 합니다. 이 효과는 150px x 200px 크기의 SVG 뷰포트와 문서에 다음과 같은 보충 변환이 있는 것과 같습니다:
<?xml version="1.0" standalone="no"?>
<svg width="150px" height="200px"
xmlns="http://www.w3.org/2000/svg">
<g transform="scale(0.1 0.2)">
<!-- 문서의 나머지 부분은 여기에 들어갑니다 -->
</g>
</svg>
일부 경우에는 사용자 에이전트가 scale 변환뿐 아니라 translate 변환도 제공해야 한다는 점에 유의하십시오. 예를 들어 가장 바깥쪽 svg 요소에서 ‘viewBox’ 속성이 <min-x> 또는 <min-y>에 0이 아닌 값을 지정하면 translate 변환이 필요합니다.
transform(또는 ‘patternTransform’)과 ‘viewBox’가 모두 요소에 적용되면 두 개의 새로운 좌표 계가 설정됩니다. transform은 요소의 첫 번째 새 좌표계를 설정합니다. ‘viewBox’는 요소의 모든 자손을 위한 두 번째 좌표계를 설정합니다. 첫 번째 좌표계에는 두 번째 좌표계가 후위 곱셈됩니다.
transform 프로퍼티와 달리 ‘viewBox’ 때문에 생성되는 자동 변환은 ‘x’, ‘y’, ‘width’ 및 ‘height’ 속성 (또는 ‘marker’ 요소의 경우 ‘markerWidth’ 및 ‘markerHeight’ 속성)에 영향을 주지 않습니다. 따라서 위의 예에서 width 및 height 프레젠테이션 속성과 ‘viewBox’ 속성을 가진 ‘svg’ 요소의 width 및 height는 ‘viewBox’ 변환이 적용되기 전에 존재하는 좌표계의 값을 나타냅니다. 반면 transform 프로퍼티와 마찬가지로 그 밖의 모든 속성과 자손 요소를 위한 새 좌표계를 설정합니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| preserveAspectRatio | <align> <meetOrSlice>? | xMidYMid meet | 예 |
<align> =
none
| xMinYMin | xMidYMin | xMaxYMin
| xMinYMid | xMidYMid | xMaxYMid
| xMinYMax | xMidYMax | xMaxYMax
<meetOrSlice> = meet | slice
균일한 크기 조정을 강제할지 여부를 나타냅니다. 새 SVG 뷰포트를 설정하는 모든 요소(SVG 뷰포트를 설정하는 요소 참조)와 ‘image’, ‘marker’, ‘pattern’ 및 ‘view’ 요소에 적용됩니다.
일반적으로 ‘viewBox’ 속성을 사용할 때처럼, 그래픽을 비균일하게 늘려 전체 SVG 뷰포트를 차지하도록 하는 것이 바람직한 경우가 있습니다. 다른 경우에는 그래픽의 종횡비를 보존하기 위해 균일한 크기 조정을 사용하는 것이 바람직합니다.
새 SVG 뷰포트를 설정하는 요소(SVG 뷰포트를 설정하는 요소 참조)와 ‘marker’, ‘pattern’ 및 ‘view’ 요소의 경우, ‘preserveAspectRatio’은 같은 요소에 ‘viewBox’ 값이 제공된 경우에만 적용됩니다. 이러한 요소에 ‘viewBox’ 속성이 제공되지 않으면 ‘preserveAspectRatio’은 무시됩니다.
‘image’ 요소의 경우 ‘preserveAspectRatio’은 참조된 이미지를 참조 직사각형에 대해 어떻게 맞출지, 그리고 참조된 이미지의 종횡비를 현재 사용자 좌표계에 대해 보존할지를 나타냅니다.
<align> 매개변수는 균일한 크기 조정을 강제할지 여부와, 강제한다면 ‘viewBox’의 종횡비가 SVG 뷰포트의 종횡비와 일치하지 않을 때 사용할 정렬 방법을 나타냅니다. <align> 매개변수는 다음 문자열 중 하나여야 합니다:
<meetOrSlice> 매개변수는 선택 사항이며, 제공되는 경우 <align> 값과 하나 이상의 공백으로 구분한 다음 다음 문자열 중 하나여야 합니다:
meet (기본값) - 그래픽을 다음 조건을 만족하도록 크기 조정합니다:
이 경우 그래픽의 종횡비가 SVG 뷰포트와 일치하지 않으면 SVG 뷰포트의 일부가 ‘viewBox’의 경계를 넘어 확장됩니다(즉, ‘viewBox’가 그려지는 영역은 SVG 뷰포트보다 작아집니다).
slice - 그래픽을 다음 조건을 만족하도록 크기 조정합니다:
이 경우 ‘viewBox’의 종횡비가 SVG 뷰포트와 일치하지 않으면 ‘viewBox’의 일부가 SVG 뷰포트의 경계를 넘어 확장됩니다(즉, ‘viewBox’가 그려지는 영역은 SVG 뷰포트보다 큽니다).
예 PreserveAspectRatio는 ‘preserveAspectRatio’의 다양한 옵션을 보여 줍니다. 이 예는 가장 바깥쪽 svg 요소 안에 ‘svg’ 하위 요소를 삽입하여 여러 개의 새 SVG 뷰포트를 생성합니다(새로운 SVG 뷰포트 설정 참조).
<svg width="450px" height="300px" xmlns="http://www.w3.org/2000/svg">
<desc>예 PreserveAspectRatio - preserveAspectRatio 속성을 보여 줍니다</desc>
<style type="text/css">
text { font-size: 9; }
rect { fill: none; stroke: blue; }
</style>
<defs>
<g id="smile">
<rect x='.5' y='.5' width='29' height='39' style="fill:black;stroke:red"/>
<circle cx='15' cy='20' r='10' fill='yellow'/>
<circle cx='12' cy='17' r='1.5' fill='black'/>
<circle cx='17' cy='17' r='1.5' fill='black'/>
<path d='M 10 24 A 8 8 0 0 0 20 24' stroke='black' stroke-width='2'/>
</g>
</defs>
<rect x="1" y="1" width="448" height="298"/>
<text x="10" y="30">맞출 SVG</text>
<g transform="translate(20,40)"><use href="#smile" /></g>
<text x="10" y="110">뷰포트 1</text>
<g transform="translate(10,120)"><rect x='.5' y='.5' width='49' height='29'/></g>
<text x="10" y="180">뷰포트 2</text>
<g transform="translate(20,190)"><rect x='.5' y='.5' width='29' height='59'/></g>
<g id="meet-group-1" transform="translate(100, 60)">
<text x="0" y="-30">--------------- meet ---------------</text>
<g>
<text y="-10">xMin*</text>
<rect x='.5' y='.5' width='49' height='29'/>
<svg preserveAspectRatio="xMinYMin meet" viewBox="0 0 30 40" width="50" height="30">
<use href="#smile" />
</svg>
</g>
<g transform="translate(70,0)">
<text y="-10">xMid*</text>
<rect x='.5' y='.5' width='49' height='29'/>
<svg preserveAspectRatio="xMidYMid meet" viewBox="0 0 30 40" width="50" height="30">
<use href="#smile" />
</svg>
</g>
<g transform="translate(0,70)">
<text y="-10">xMax*</text>
<rect x='.5' y='.5' width='49' height='29'/>
<svg preserveAspectRatio="xMaxYMax meet" viewBox="0 0 30 40" width="50" height="30">
<use href="#smile" />
</svg>
</g>
</g>
<g id="meet-group-2" transform="translate(250, 60)">
<text x="0" y="-30">---------- meet ----------</text>
<g>
<text y="-10">*YMin</text>
<rect x='.5' y='.5' width='29' height='59'/>
<svg preserveAspectRatio="xMinYMin meet" viewBox="0 0 30 40" width="30" height="60">
<use href="#smile" />
</svg>
</g>
<g transform="translate(50, 0)">
<text y="-10">*YMid</text>
<rect x='.5' y='.5' width='29' height='59'/>
<svg preserveAspectRatio="xMidYMid meet" viewBox="0 0 30 40" width="30" height="60">
<use href="#smile" />
</svg>
</g>
<g transform="translate(100, 0)">
<text y="-10">*YMax</text>
<rect x='.5' y='.5' width='29' height='59'/>
<svg preserveAspectRatio="xMaxYMax meet" viewBox="0 0 30 40" width="30" height="60">
<use href="#smile" />
</svg>
</g>
</g>
<g id="slice-group-1" transform="translate(100, 220)">
<text x="0" y="-30">---------- slice ----------</text>
<g>
<text y="-10">xMin*</text>
<rect x='.5' y='.5' width='29' height='59'/>
<svg preserveAspectRatio="xMinYMin slice" viewBox="0 0 30 40" width="30" height="60">
<use href="#smile" />
</svg>
</g>
<g transform="translate(50,0)">
<text y="-10">xMid*</text>
<rect x='.5' y='.5' width='29' height='59'/>
<svg preserveAspectRatio="xMidYMid slice" viewBox="0 0 30 40" width="30" height="60">
<use href="#smile" />
</svg>
</g>
<g transform="translate(100,0)">
<text y="-10">xMax*</text>
<rect x='.5' y='.5' width='29' height='59'/>
<svg preserveAspectRatio="xMaxYMax slice" viewBox="0 0 30 40" width="30" height="60">
<use href="#smile" />
</svg>
</g>
</g>
<g id="slice-group-2" transform="translate(250, 220)">
<text x="0" y="-30">--------------- slice ---------------</text>
<g>
<text y="-10">*YMin</text>
<rect x='.5' y='.5' width='49' height='29'/>
<svg preserveAspectRatio="xMinYMin slice" viewBox="0 0 30 40"
width="50" height="30">
<use href="#smile" />
</svg>
</g>
<g transform="translate(70,0)">
<text y="-10">*YMid</text>
<rect x='.5' y='.5' width='49' height='29'/>
<svg preserveAspectRatio="xMidYMid slice" viewBox="0 0 30 40" width="50" height="30">
<use href="#smile" />
</svg>
</g>
<g transform="translate(140,0)">
<text y="-10">*YMax</text>
<rect x='.5' y='.5' width='49' height='29'/>
<svg preserveAspectRatio="xMaxYMax slice" viewBox="0 0 30 40" width="50" height="30">
<use href="#smile" />
</svg>
</g>
</g>
</svg>
예 PreserveAspectRatio
SVG 콘텐츠 내부에 ‘svg’ 요소를 포함하면 포함된 모든 그래픽이 그려지는 새 SVG 뷰포트가 생성됩니다. 이는 암시적으로 새 뷰포트 좌표계와 새 사용자 좌표계를 모두 설정합니다. 또한 새 SVG 뷰포트가 설정되었기 때문에 그 안에서 백분율 단위에는 새로운 의미가 생깁니다 (단위 참조).
새 SVG 뷰포트의 경계는 새 SVG 뷰포트를 설정하는 요소(예: ‘svg’ 요소)의 ‘x’, ‘y’, ‘width’ 및 ‘height’ 속성으로 정의됩니다. 새 뷰포트 좌표계와 새 사용자 좌표계는 모두 (‘x’, ‘y’)에 원점을 가지며, 여기서 ‘x’와 ‘y’는 SVG 뷰포트를 설정하는 요소의 대응하는 속성 값을 나타냅니다. 새 뷰포트 좌표계와 새 사용자 좌표계의 방향은 SVG 뷰포트를 설정하는 요소의 현재 사용자 좌표계 방향과 일치합니다. 새 뷰포트 좌표계와 새 사용자 좌표계의 한 단위는 SVG 뷰포트를 설정하는 요소의 현재 사용자 좌표계에서 한 단위와 같은 크기입니다.
다음은 예입니다:
<?xml version="1.0" standalone="no"?>
<svg width="4in" height="3in"
xmlns="http://www.w3.org/2000/svg">
<desc>이 SVG 그림은 다른 그림을 삽입하여
새 SVG 뷰포트를 설정합니다.
</desc>
<!-- 다음 문은 새 SVG 뷰포트를 설정하고
SVG 그림 B를 해당 SVG 뷰포트에 렌더링합니다 -->
<svg x="25%" y="25%" width="50%" height="50%">
<!-- 그림 B는 여기에 들어갑니다 -->
</svg>
</svg>
새 SVG 뷰포트 생성의 자세한 예는 예 PreserveAspectRatio를 참조하십시오.
다음 요소들은 새 SVG 뷰포트를 설정합니다:
역사적인 이유로 ‘pattern’ 및 ‘marker’ 요소는 ‘viewBox’ 속성을 허용함에도 불구하고 새 뷰포트를 생성하지 않습니다. ‘clipPath’ 또는 ‘mask’ 요소도 마찬가지입니다. 이러한 요소의 콘텐츠 내부에서 사용되는 백분율 길이는 그래픽 효과 영역의 크기에 비례하지 않습니다.
‘foreignObject’ 요소는 자식 콘텐츠를 위한 새 CSS 포함 블록을 설정합니다. 이는 새 뷰포트와 비슷한 일부 효과를 가지며, 자식 콘텐츠의 레이아웃 범위를 재설정합니다. 그러나 ‘foreignObject’의 자손인 SVG 요소를 렌더링하려면 새 ‘svg’ 요소가 SVG 문서 조각과 SVG 뷰포트를 설정해야 합니다.
‘image’는 참조되는 문서를 위한 새 문서 뷰포트를 생성합니다. 참조되는 문서가 SVG 파일이면 당연히 자체 SVG 뷰포트를 설정합니다.
새 SVG 뷰포트가 추가로 새 클리핑 경로를 설정할지 여부는 새 SVG 뷰포트를 설정하는 요소의 overflow 프로퍼티 값에 의해 결정됩니다.
SVG는 속성, 프레젠테이션 속성 및 CSS 프로퍼티에 대해 CSS Values and Units Module [css-values]의 공통 값 및 단위에 대한 설명과 정의를 따릅니다. 각 속성과 프로퍼티는 사용되는 구성 요소 값 유형을 지정해야 합니다. CSS WG 또는 SVG WG에서 발행하는 후속 또는 확장 명세는 기본 데이터 유형을 확장하거나 새 데이터 유형을 추가할 수 있습니다.
SVG 뷰포트의 크기에 상대적이라고 정의된 <percentage> 값의 경우:
sqrt((width)**2 + (height)**2)/sqrt(2)로 계산해야 합니다.
아래의 예 Units는 다양한 유형의 단위에 대한 처리 규칙 중 일부를 보여 줍니다.
<?xml version="1.0" standalone="no"?>
<svg width="400px" height="200px" viewBox="0 0 4000 2000"
xmlns="http://www.w3.org/2000/svg">
<title>예 Units</title>
<desc>다양한 단위 옵션을 보여 줍니다</desc>
<!-- 그림의 테두리를 표시합니다 -->
<rect x="5" y="5" width="3990" height="1990"
fill="none" stroke="blue" stroke-width="10"/>
<g fill="blue" stroke="red" font-family="Verdana" font-size="150">
<!-- 절대 단위 지정자 -->
<g transform="translate(400,0)">
<text x="-50" y="300" fill="black" stroke="none">절대 단위:</text>
<rect x="0" y="400" width="4in" height="2in" stroke-width=".4in"/>
<rect x="0" y="750" width="384" height="192" stroke-width="38.4"/>
<g transform="scale(2)">
<rect x="0" y="600" width="4in" height="2in" stroke-width=".4in"/>
</g>
</g>
<!-- 상대 단위 지정자 -->
<g transform="translate(1600,0)">
<text x="-50" y="300" fill="black" stroke="none">상대 단위:</text>
<rect x="0" y="400" width="2.5em" height="1.25em" stroke-width=".25em"/>
<rect x="0" y="750" width="375" height="187.5" stroke-width="37.5"/>
<g transform="scale(2)">
<rect x="0" y="600" width="2.5em" height="1.25em" stroke-width=".25em"/>
</g>
</g>
<!-- 백분율 -->
<g transform="translate(2800,0)">
<text x="-50" y="300" fill="black" stroke="none">백분율:</text>
<rect x="0" y="400" width="10%" height="10%" stroke-width="1%"/>
<rect x="0" y="750" width="400" height="200" stroke-width="31.62"/>
<g transform="scale(2)">
<rect x="0" y="600" width="10%" height="10%" stroke-width="1%"/>
</g>
</g>
</g>
</svg>
예 Units
왼쪽의 세 직사각형은 절대 단위 식별자 중 하나인 "in" 단위(인치)의 사용을 보여 줍니다. CSS는 1 인치를 96픽셀과 같다고 정의합니다. 따라서 인치로 지정된 가장 위의 직사각형은 사용자 단위로 지정되어 가장 위 직사각형의 각 대응하는 인치마다 96개의 사용자 단위를 갖는 가운데 직사각형과 정확히 같은 크기입니다. 그룹의 아래쪽 직사각형은 인치로 지정된 값이 크기 조정될 때 일어나는 일을 보여 줍니다.
가운데의 세 직사각형은 상대 단위 식별자 중 하나인 "em" 단위의 사용을 보여 줍니다. 가장 바깥쪽 ‘g’ 요소에서 font-size 프로퍼티가 150으로 설정되어 있으므로 각 "em" 단위는 150 사용자 단위와 같습니다. "em" 단위로 지정된 가장 위의 직사각형은 사용자 단위로 지정되어 가장 위 직사각형의 각 대응하는 "em" 단위마다 150개의 사용자 단위를 갖는 가운데 직사각형과 정확히 같은 크기입니다. 그룹의 아래쪽 직사각형은 "em" 단위로 지정된 값이 크기 조정될 때 일어나는 일을 보여 줍니다.
오른쪽의 세 직사각형은
백분율의 사용을 보여 줍니다. SVG 뷰포트 요소의 사용자 좌표계에서
SVG 뷰포트의 너비와 높이(이 경우
가장 바깥쪽 svg 요소)는 각각 4000과
2000이라는 점에 유의하십시오. 이는 ‘viewBox’ 속성을 처리하면
변환된 사용자 좌표계가 생성되기 때문입니다. 백분율 단위로
지정된 가장 위의 직사각형은 동등한
사용자 단위로 지정된 가운데 직사각형과 정확히 같은
크기입니다. 특히 가운데 직사각형의
stroke-width 프로퍼티가
sqrt((actual-width)**2 +
(actual-height)**2) / sqrt(2)의 1%로 설정되어 있다는 점에 유의하십시오. 이 경우
.01*sqrt(4000*4000+2000*2000)/sqrt(2), 즉 31.62입니다.
그룹의 아래쪽 직사각형은 백분율 단위로
지정된 값이 크기 조정될 때 일어나는 일을 보여 줍니다.
요소의 경계 상자(또는 "bbox")는 해당 요소의 사용자 좌표계 축에 맞춰 정렬되며 요소와 그 자손을 완전히 둘러싸는 가장 꼭 맞는 직사각형입니다.
요소에 대해 세 종류의 경계 상자를 계산할 수 있습니다:
요소의 opacity, visibility, fill, fill-opacity, fill-rule, stroke-dasharray 및 stroke-dashoffset 프로퍼티 값은 요소의 경계 상자에 아무런 영향을 주지 않는다는 점에 유의하십시오.
곡선 도형의 경우 경계 상자는 끝점만이 아니라 가장자리를 따라 있는 도형의 모든 부분을 둘러싸야 합니다. 결과 곡선의 선 위에 놓인 것으로 정의되지 않은 곡선의 제어점(예: 3차 베지어 명령의 두 번째 좌표 쌍)은 경계 상자의 크기에 기여해서는 안 됩니다(다만 이러한 점이 도형 자체의 내부 또는 곡선 위나 곡선 가까이에 있으면 경계 상자 영역 안에 놓일 수 있습니다). 예를 들어 곡선 가장자리의 둘러싸이지 않는 쪽에서 곡선 가장자리보다 더 멀리 떨어진 곡선 제어점은 경계 상자에서 제외해야 합니다.
경로 'M20,50 L35,100 H120 V50 Q70,10 20,50'가 연한 파란색으로 표시됩니다. 왼쪽에는 경로의 올바른 객체 경계 상자가 표시됩니다. 곡선의 가장 위쪽 제어점은 포함하지 않지만 제어점의 볼록 껍질 밖에 놓인 부분까지 포함하여 파란색 도형 전체를 포함한다는 점에 유의하십시오.
요소가 'display: none'이거나, ‘defs’ 요소 내부에 있거나, ‘symbol’ 요소처럼 일반적으로 렌더링되지 않거나, 현재 문서 트리에 존재하지 않아서 렌더링 트리에 없더라도 여전히 경계 상자를 가집니다. 요소에서 getBBox를 호출하면 요소가 렌더링된 경우와 같은 직사각형을 반환합니다. 그러나 렌더링 트리에 없는 요소는 어떤 조상 요소의 경계 상자에도 기여하지 않습니다.
다음 예에서는 여러 요소를 정의합니다. ID가 있는 각 요소에 대해 예상되는 객체 경계 상자가 아래에 표시되어 있습니다.
<svg xmlns="http://www.w3.org/2000/svg">
<title>경계 상자 계산</title>
<desc>컨텍스트에 따라 서로 다른 경계 상자 결과를 갖는 요소의 예.</desc>
<defs id="defs-1">
<rect id="rect-1" x="20" y="20" width="40" height="40" fill="blue" />
</defs>
<g id="group-1">
<use id="use-1" href="#rect-1" x="10" y="10" />
<g id="group-2" display="none">
<rect id="rect-2" x="10" y="10" width="100" height="100" fill="red" />
</g>
</g>
</svg>
| 요소 ID | 경계 상자 결과 |
|---|---|
"defs-1" |
{0, 0, 0, 0} |
"rect-1" |
{20, 20, 40, 40} |
"group-1" |
{30, 30, 40, 40} |
"use-1" |
{30, 30, 40, 40} |
"group-2" |
{10, 10, 100, 100} |
"rect-2" |
{10, 10, 100, 100} |
텍스트 콘텐츠 요소의 경우 경계 상자 계산의 목적상 각 글리프를 별도의 그래픽 요소로 취급해야 합니다. 계산에서는 모든 글리프가 전체 글리프 셀을 차지한다고 가정해야 합니다. 전체 글리프 셀은 수평 텍스트에서 너비가 수평 진행량과 같고 높이가 EM 상자와 같아야 합니다. 옆으로 조판되는 수직 텍스트에서는 전체 글리프 셀의 너비가 EM 상자와 같고 높이가 수평 진행량과 같아야 합니다. 그 밖의 수직 텍스트에서는 전체 글리프 셀의 너비가 EM 상자와 같고 높이는 수직 진행량과 같아야 하며, 글꼴에 수직 진행량이 정의되지 않았다면 EM 상자의 높이와 같아야 합니다. 예를 들어 수평 텍스트의 경우 계산에서는 각 글리프가 글꼴의 전체 어센트와 디센트 값까지 수직으로 확장된다고 가정해야 합니다.
선언적 또는 스크립트 애니메이션은 요소의 도형, 크기 및 위치를 변경할 수 있으므로 경계 상자는 변경 가능합니다. 따라서 요소의 경계 상자는 스크립트 호출을 통해서든 선언적 또는 링크 구문의 일부로든 경계 상자가 요청되는 시점의 스냅샷에서 요소의 현재 값을 반영해야 합니다.
너비가 0이거나 높이가 0이거나 둘 다 0인 요소(예: 수직선 또는 수평선, 또는 width 또는 height가 0인 ‘rect’ 요소)도 양수인 차원에는 양수 값을 갖는 경계 상자를 가지며, 양수인 차원이 지정되지 않았다면 너비와 높이가 모두 '0'인 경계 상자를 가집니다. 마찬가지로 너비와 높이가 0인 ‘path’ 요소의 하위 경로 세그먼트도 경계 상자를 위해 해당 요소의 기하에 포함해야 합니다.
위치가 지정되지 않은 요소(예: d 프로퍼티 값이 none인 ‘path’ 요소)는 경계 상자 계산을 위해 점 (0,0)에 배치됩니다.
DOM 객체가 SVGGraphicsElement에서 파생되지 않는 요소 (예: 그라디언트 요소)는 경계 상자를 갖지 않으므로 경계 상자를 요청하는 인터페이스도 없다는 점에 유의하십시오.
렌더링 트리에서 해결되지 않은 리소스를 참조하는 요소도
경계 상자를 가져야 하며,
이는 속성에 지정된 위치와 크기 또는 값이 제공되지 않은 경우
해당 속성의 초기값에 의해 정의됩니다.
예를 들어 <use href="#bad" x="10" y="10"/> 요소는
x와 y가 10이고 너비와 높이가 0인 경계 상자를 가집니다.
다음 알고리즘은 주어진 요소의 경계 상자를 계산하는 방법을 정의합니다. 알고리즘의 입력은 다음과 같습니다:
경계 상자를 계산하는 알고리즘은 element의 유형에 따라 다음과 같습니다:
fill, fill-opacity 및 fill-rule 프로퍼티 값은 fill-shape에 영향을 주지 않습니다.
stroke-opacity, stroke-dasharray 및 stroke-dashoffset 프로퍼티 값은 스트로크 도형 계산에 영향을 주지 않습니다.
값이 (0, 0, 0, 0)인 box와 빈 도형의 합집합은 box입니다.
요소의 객체 경계 상자, 스트로크 경계 상자 또는 장식된 경계 상자는 위의 경계 상자 계산 알고리즘을 다음 인수로 호출한 결과입니다: element는 요소 자체이고; space는 요소의 사용자 좌표계이고; fill은 true이고; stroke는 스트로크 경계 상자 또는 장식된 경계 상자를 계산하는 경우 true이고, 그렇지 않으면 false이고; markers는 장식된 경계 상자를 계산하는 경우 true이고, 그렇지 않으면 false이며; clipped는 false입니다.
다음 요소들은 지정된 속성을 'objectBoundingBox'로 설정하여 좌표 값과 길이를 객체 경계 상자의 비율(일부 경우에는 백분율)로 표현할 수 있는 옵션을 제공합니다:
| 요소 | 속성 | 효과 |
|---|---|---|
| ‘linearGradient’ | ‘gradientUnits’ | 그라디언트 벡터를 지정하는 속성(‘x1’, ‘y1’, ‘x2’, ‘y2’)이 그라디언트가 적용되는 요소의 경계 상자에 대한 비율 또는 백분율을 나타냄을 의미합니다. |
| ‘radialGradient’ | ‘gradientUnits’ | 중심 (‘cx’, ‘cy’), 반지름 (‘r’) 및 초점 (‘fx’, ‘fy’)을 지정하는 속성이 그라디언트가 적용되는 요소의 경계 상자에 대한 비율 또는 백분율을 나타냄을 의미합니다. |
| ‘pattern’ | ‘patternUnits’ | 패턴을 타일링하는 방법을 정의하는 속성 (‘x’, ‘y’, ‘width’, ‘height’)이 패턴이 적용되는 요소의 경계 상자를 사용하여 설정됨을 의미합니다. |
| ‘pattern’ | ‘patternContentUnits’ | 패턴 콘텐츠의 사용자 좌표계가 패턴이 적용되는 요소의 경계 상자를 사용하여 설정됨을 의미합니다. |
| ‘clipPath’ | ‘clipPathUnits’ | ‘clipPath’ 요소 콘텐츠의 사용자 좌표계가 클리핑 경로가 적용되는 요소의 경계 상자를 사용하여 설정됨을 의미합니다. |
| ‘mask’ | ‘maskUnits’ | 마스킹 영역을 정의하는 속성 (‘x’, ‘y’, ‘width’, ‘height’)이 마스크가 적용되는 요소의 경계 상자를 사용하여 설정됨을 의미합니다. |
| ‘mask’ | ‘maskContentUnits’ | ‘mask’ 요소 콘텐츠의 사용자 좌표계가 마스크가 적용되는 요소의 경계 상자를 사용하여 설정됨을 의미합니다. |
| ‘filter’ | ‘filterUnits’ | 필터 효과 영역을 정의하는 속성 (‘x’, ‘y’, ‘width’, ‘height’)이 필터가 적용되는 요소의 경계 상자에 대한 비율 또는 백분율을 나타냄을 의미합니다. |
| ‘filter’ | ‘primitiveUnits’ | 필터 프리미티브 내부의 다양한 길이 값이 필터가 적용되는 요소의 경계 상자에 대한 비율 또는 백분율을 나타냄을 의미합니다. |
다음 논의에서 적용 대상 요소라는 용어는 주어진 효과가 적용되는 요소를 의미합니다. 그라디언트와 패턴의 경우 적용 대상 요소는 주어진 그라디언트 또는 패턴을 참조하는 fill 또는 stroke 프로퍼티를 가진 그래픽 요소입니다. (텍스트 요소에 관한 특별 규칙은 객체 경계 상자 단위와 텍스트 요소에 대한 논의를 참조하십시오.) 클리핑 경로, 마스크 및 필터의 경우 적용 대상 요소는 컨테이너 요소 또는 그래픽 요소일 수 있습니다.
objectBoundingBox 키워드를 사용하면 새 사용자 좌표계를 생성하기 위해 중첩된 변환 행렬 목록에 보충 변환 행렬이 삽입된 것과 같은 효과가 생깁니다.
먼저 (minx,miny) 및 (maxx,maxy) 좌표는 적용 대상 요소의 객체 경계 상자 범위에 의해 결정됩니다.
그런 다음 새 사용자 좌표계의 좌표 (0,0)은 적용 대상 요소의 사용자 좌표계에서 꼭 맞는 경계 상자의 (minx,miny) 모서리에 매핑되고, 새 사용자 좌표계의 좌표 (1,1)은 적용 대상 요소의 꼭 맞는 경계 상자의 (maxx,maxy) 모서리에 매핑됩니다. 대부분의 상황에서 다음 변환 행렬이 올바른 효과를 생성합니다:
[ (maxx-minx) 0 0 (maxy-miny) minx miny ]
그라디언트 벡터, 패턴 타일, 필터 영역 또는 마스킹 영역을 정의하는 속성에서 백분율을 사용하는 경우 백분율은 대응하는 소수 값과 동일한 값을 나타냅니다 (예: 50%는 0.5와 같음). ‘pattern’, ‘clipPath’, ‘mask’ 또는 ‘filter’ 요소의 콘텐츠 내에서 백분율을 사용하는 경우 이러한 값은 단위에 정의된 백분율 처리 규칙에 따라 처리됩니다.
객체 경계 상자 단위의 비율 또는 백분율로 표현되는 값에는 어떤 숫자 값도 지정할 수 있습니다. 특히 0보다 작거나 1보다 큰 비율과 0%보다 작거나 100%보다 큰 백분율을 지정할 수 있습니다.
objectBoundingBox 키워드는 수평선 또는 수직선처럼 적용 대상 요소의 기하에 너비나 높이가 없는 경우에는 사용하지 않는 것이 좋습니다. 스트로크 너비가 0이 아니어서 실제로 볼 때 선에 두께가 있더라도 경계 상자 계산에서는 스트로크 너비가 무시되기 때문입니다. 적용 대상 요소의 기하에 너비나 높이가 없고 objectBoundingBox가 지정되면 주어진 효과(예: 그라디언트 또는 필터)는 무시됩니다.
CSS로 형식이 지정된 호스트 문서에 SVG를 포함할 수 있도록 구체적 객체 크기를 계산해야 합니다. 구체적 객체 크기는 CSS Images 3 [css-images-3]에 정의된 기본 크기 조정 알고리즘을 다음 입력과 함께 사용하여 계산해야 합니다:
지정된 크기는 ‘svg’ 요소의 width 및 height 크기 조정 프로퍼티의 사용값에서 결정해야 합니다.
고유 크기도 width 및 height 크기 조정 프로퍼티에서 결정해야 합니다. width 또는 height 중 하나라도 지정되지 않은 경우 사용값은 초기값 'auto'입니다. 'auto' 및 백분율 길이는 고유 너비 또는 고유 높이를 결정하는 데 사용해서는 안 됩니다.
비트맵 이미지 형식에서는 고유 크기가 이미지 파일에 고정되어 있고, 이미지를 크기 조정하기 위해 필요에 따라 지정된 크기가 호스트 문서에서 정의됩니다. 본질적으로 크기 조정 가능한 SVG는 고유 너비와 고유 높이를 지정된 크기의 너비와 높이가 되도록 조정합니다. 따라서 길이로 지정된 경우 ‘svg’ 요소의 width 및 height 크기 조정 프로퍼티는 SVG 이미지의 고유 크기와 SVG 이미지를 호스트 문서에 배치할 때 사용되는 지정된 크기를 제어합니다.
고유 종횡비는 다음 알고리즘을 사용하여 계산해야 합니다. 알고리즘이 null을 반환하면 고유 종횡비가 없습니다.
이 절에 정의된 동작은 CSS에 특화되어 있지만 다른 호스트 컨텍스트에 맞게 조정할 수 있습니다. 모든 호스트 컨텍스트에서 사용할 수 있는 경우 고유 종횡비를 SVG 뷰포트 크기를 정할 때 반드시 준수해야 합니다.
예:
<svg xmlns="http://www.w3.org/2000/svg"
width="10cm" height="5cm">
...
</svg>
이 예에서 SVG 뷰포트의 고유 종횡비는 2:1입니다. 고유 너비는 10cm이고 고유 높이는 5cm입니다.
<svg xmlns="http://www.w3.org/2000/svg"
width="100%" height="50%" viewBox="0 0 200 200">
...
</svg>
이 예에서 가장 바깥쪽 SVG 뷰포트의 고유 종횡비는 1:1입니다. 이 경우 종횡비 계산을 통해 한 방향으로만 제약된 포함 블록 내부의 객체에 삽입할 수 있습니다.
<svg xmlns="http://www.w3.org/2000/svg"
width="10cm" viewBox="0 0 200 200">
...
</svg>
이 경우 고유 종횡비는 1:1입니다.
<svg xmlns="http://www.w3.org/2000/svg"
width="75%" height="10cm" viewBox="0 0 200 200">
...
</svg>
이 예에서 고유 종횡비는 1:1입니다.
새로운 auto 값에 대한 예제를 더 추가할까요? 예를 들어 David Vest가 제공한 예제 일부처럼 말입니다.
| SVG 2 요구 사항: | SVG 2에는 SVG 1.2 Tiny를 기반으로 하는 제한된 변환이 포함됩니다. |
|---|---|
| 결의: | 벡터 효과 확장 제안을 SVG 2 명세에 추가합니다. |
| 목적: | 비확대/축소 기능(객체의 확대/축소되지 않는 부분 및 전체 객체의 확대/축소되지 않는 부분을 포함하기 위함 |
| 담당자: | Satoru Takagi (ACTION-3619) |
때로는 어떤 변환이 적용되더라도 객체의 윤곽선이 원래 너비를 유지하거나 객체의 위치가 고정되도록 하는 것이 유용합니다. 예를 들어 도로를 나타내는 너비 2px의 선이 있는 지도에서는 사용자가 지도를 확대하더라도 도로 너비를 2px로 유지하거나, 패닝이 가능한 그래픽 차트의 소개 설명을 고정하는 것이 유용합니다.
특수 좌표 변환 및 그래픽 그리기와 관련된 이러한 효과를 제공하기 위해 SVG Tiny 1.2에서는 vector-effect 프로퍼티를 도입했습니다. SVG Tiny 1.2에서는 비확대/축소 스트로크 동작만 도입했지만, 이 버전에서는 여러 추가 효과를 도입합니다. 또한 이러한 효과는 조합하여 지정할 수 있으므로 더 다양한 효과를 나타냅니다. 그리고 SVG 언어의 향후 버전에서는 이 프로퍼티를 통해 더욱 강력한 벡터 효과를 허용할 것입니다.
vector-effect에서 non-scaling-stroke 및 none 이외의 값은 구현 부족으로 인해 SVG 2에서 삭제될 위험이 있습니다. 현재 명세된 방식으로 이를 구현하는 실용성에 관한 구현자의 피드백을 구현 기간 동안 요청합니다.
| 이름: | vector-effect |
|---|---|
| 값: | none | non-scaling-stroke | non-scaling-size | non-rotation | fixed-position |
| 초기값: | none |
| 적용 대상: | 그래픽 요소 및 ‘use’ |
| 상속: | 아니요 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 대로 |
| 애니메이션 유형: | 불연속 |
이 값들은 열거할 수 있습니다. 따라서 이러한 특성을 동시에 갖는 효과를 지정할 수 있습니다.
vector-effect의 호스트 좌표 공간은 가장 먼 조상 SVG 뷰포트의 뷰포트 좌표계입니다.
참고: 향후 SVG 버전에서는 장치 좌표계를 지정하는 방법을 허용할 수 있습니다.
이 절에서는 명확한 의미를 갖는 non-scaling-stroke를 제외하고 벡터 효과의 동작을 명확히 하기 위해 값 조합과 관련된 변환 수식 목록을 보여 줍니다.
vector-effect 프로퍼티는 3D 렌더링 컨텍스트에서 수행되는 변환에는 영향을 주지 않습니다.
사용자 좌표계에서 뷰포트 좌표계로의 일반적인 좌표 변환 수식은 다음과 같습니다.
<circle vector-effect="veValue" transform="translate(xo yo)" cx="xf" cy="yf" r=".."/>
위와 같이 vector-effect가 요소에 추가되면 사용자 좌표에서 장치 좌표로의 변환 수식은 다음과 같이 변경됩니다. 여기서 xf 및 yf는 해당 요소와 그 자손의 사용자 좌표입니다. 그리고 xo 및 yo는 해당 요소가 가진 transform 속성의 행렬 요소 e 및 f입니다. 또한 |det(CTM)|는 CTM 행렬식의 절댓값입니다. 이 값이 0이 되고 non-scaling-size가 지정되면 vector-effect는 유효하지 않게 되어, 즉 none이 됩니다.
| veValue | 수식 |
|---|---|
| non-scaling-size |
|
| non-rotation |
|
| non-scaling-size non-rotation |
|
| fixed-position |
|
| fixed-position non-scaling-size |
|
| fixed-position non-rotation |
|
| fixed-position non-scaling-size non-rotation |
|
아래는 벡터 효과가 없는 중첩 뷰포트 좌표계의 일반적인 좌표 변환 수식입니다. xviewport(UA) 및 yviewport(UA)는 사용자 에이전트가 직접 제어하는 좌표입니다. CTMthis는 대상 그래픽의 사용자 좌표계에서 그것이 속한 뷰포트 좌표계로의 변환 행렬에 대한 CTM입니다. CTMparent는 앞서 언급한 뷰포트 좌표계에서 그 부모의 뷰포트 좌표계로의 변환 행렬에 대한 CTM입니다. 그리고 CTMroot는 가장 루트에 있는 뷰포트 좌표계(UA)에 대한 CTM입니다.
앞 절의 일곱 수식을 중첩 뷰포트 좌표계에 적용할 때, 해당 수식의 적용 방식은 vector-effect의 추가 값으로 viewport 또는 screen이 지정되었는지에 따라 다음과 같이 달라집니다.
viewport 값이 지정되면 사용자 에이전트는 앞 절의 일곱 수식 중 하나와 다음 수식을 결합하여 좌표를 계산합니다.
screen 값이 지정되면 사용자 에이전트는 앞 절의 일곱 수식 중 하나와 다음 수식을 결합하여 좌표를 계산합니다.
아래는 non-scaling-stroke vector-effect의 예입니다.
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg"
width="6cm" height="4cm" viewBox="0 0 600 400"
viewport-fill="rgb(255,150,200)">
<desc>non-scaling stroke 예제</desc>
<rect x="1" y="1" width="598" height="398" fill="none" stroke="black"/>
<g transform="scale(9,1)">
<line stroke="black" stroke-width="5" x1="10" y1="50" x2="10" y2="350"/>
<line vector-effect="non-scaling-stroke" stroke="black" stroke-width="5"
x1="32" y1="50" x2="32" y2="350"/>
<line vector-effect="none" stroke="black" stroke-width="5"
x1="55" y1="50" x2="55" y2="350"/>
</g>
</svg>
아래는 none vector-effect(벡터 효과 없음)의 예입니다.
| CTM 변경 전 | CTM 변경 후 |
소스 코드
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-50,-50,500,500" height="500" width="500">
<rect x="-50" y="-50" width="500" height="500" stroke="orange" stroke-width="3" fill="none"/>
<!-- 중첩 사용자 좌표계는 이 transform 속성에 의해 변환됩니다 -->
<g transform="matrix(2.1169438081370817,0.3576047954311102,-0.3576047954311102,1.4700998667618626,0,0)
translate(-50,-50)">
<svg viewBox="-50,-50,500,500" height="500" width="500">
<!-- 이 svg의 기본 사용자 좌표계 위의 모눈종이 -->
<g stroke="green" stroke-width="1" fill="none">
<circle cx="0" cy="0" r="10"/>
<circle cx="150" cy="150" r="7"/>
<path fill="green" stroke="none" d="M0,-3 L30,-3 25,-10 50,0 25,10 30,3 0,3z"/>
<line x1="-100" y1="-100" x2="600" y2="-100" stroke-dasharray="5,5"/>
<line x1="-100" y1="000" x2="600" y2="000"/>
<line x1="-100" y1="100" x2="600" y2="100" stroke-dasharray="5,5"/>
<line x1="-100" y1="200" x2="600" y2="200" stroke-dasharray="5,5"/>
<line x1="-100" y1="300" x2="600" y2="300" stroke-dasharray="5,5"/>
<line x1="-100" y1="400" x2="600" y2="400" stroke-dasharray="5,5"/>
<line x1="-100" y1="500" x2="600" y2="500" stroke-dasharray="5,5"/>
<line y1="-100" x1="-100" y2="600" x2="-100" stroke-dasharray="5,5"/>
<line y1="-100" x1="000" y2="600" x2="000"/>
<line y1="-100" x1="100" y2="600" x2="100" stroke-dasharray="5,5"/>
<line y1="-100" x1="200" y2="600" x2="200" stroke-dasharray="5,5"/>
<line y1="-100" x1="300" y2="600" x2="300" stroke-dasharray="5,5"/>
<line y1="-100" x1="400" y2="600" x2="400" stroke-dasharray="5,5"/>
<line y1="-100" x1="500" y2="600" x2="500" stroke-dasharray="5,5"/>
</g>
<!-- 벡터 효과를 가진 도형 -->
<!-- 이 도형의 중첩 사용자 좌표계 원점에 있는
굵은 빨간색 오른쪽 화살표와 작은 직사각형 -->
<path id="ve" vector-effect="none"
stroke="red" stroke-width="3" fill="none"
transform="matrix(1,0,0,1,150,150)"
d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/>
</svg>
</g>
</svg>
아래는 non-scaling-size의 예입니다.
| CTM 변경 전 | CTM 변경 후 |
<path id="ve" vector-effect="non-scaling-size"
stroke="red" stroke-width="3" fill="none"
transform="matrix(1,0,0,1,150,150)"
d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/>
아래는 non-rotation의 예입니다.
| CTM 변경 전 | CTM 변경 후 |
<path id="ve" vector-effect="non-rotation"
stroke="red" stroke-width="3" fill="none"
transform="matrix(1,0,0,1,150,150)"
d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/>
아래는 non-scaling-size non-rotation의 예입니다.
| CTM 변경 전 | CTM 변경 후 |
<path id="ve" vector-effect="non-scaling-size non-rotation"
stroke="red" stroke-width="3" fill="none"
transform="matrix(1,0,0,1,150,150)"
d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/>
아래는 fixed-position의 예입니다.
| CTM 변경 전 | CTM 변경 후 |
<path id="ve" vector-effect="fixed-position"
stroke="red" stroke-width="3" fill="none"
transform="matrix(1,0,0,1,150,150)"
d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/>
아래는 non-scaling-size fixed-position의 예입니다.
| CTM 변경 전 | CTM 변경 후 |
<path id="ve" vector-effect="non-scaling-size fixed-position"
stroke="red" stroke-width="3" fill="none"
transform="matrix(1,0,0,1,150,150)"
d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/>
아래는 non-rotation fixed-position의 예입니다.
| CTM 변경 전 | CTM 변경 후 |
<path id="ve" vector-effect="non-rotation fixed-position"
stroke="red" stroke-width="3" fill="none"
transform="matrix(1,0,0,1,150,150)"
d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/>
아래는 non-scaling-size non-rotation fixed-position의 예입니다.
| CTM 변경 전 | CTM 변경 후 |
<path id="ve" vector-effect="non-scaling-size non-rotation fixed-position"
stroke="red" stroke-width="3" fill="none"
transform="matrix(1,0,0,1,150,150)"
d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/>
SVGTransform 인터페이스는 transform 프로퍼티와 그 프레젠테이션 속성 ‘transform’, ‘gradientTransform’ 및 ‘patternTransform’에 나타나는 <transform-function> 값을 나타내는 데 사용됩니다. SVGTransform은 단일 scale(…) 또는 matrix(…) 값처럼 변환 목록의 단일 구성 요소를 나타냅니다.
SVGTransform 객체는 읽기 전용으로 지정될 수 있으며, 이는 아래 설명한 대로 객체를 수정하려고 하면 예외가 발생함을 의미합니다.
SVGTransform 객체는 특정 요소와 연결될 수 있습니다. 객체가 해당 속성을 반영하는 경우 연결된 요소는 어떤 요소의 ‘transform’ 프레젠테이션 속성을 업데이트할지 결정하는 데 사용됩니다. 달리 설명되지 않는 한 SVGTransform 객체는 어떤 요소와도 연결되지 않습니다.
모든 SVGTransform 객체는 두 모드 중 하나로 동작합니다. 다음 중 하나일 수 있습니다:
SVGTransform 객체는 내부 <transform-function> 값을 유지하며, 이를 해당 객체의 값이라고 합니다. 또한 SVGMatrix 객체를 유지하며, 이를 해당 객체의 행렬 객체라고 하며, 이는 matrix IDL 속성에서 반환되는 객체입니다. SVGTransform 객체의 행렬 객체는 항상 해당 객체의 값과 동기화된 상태로 유지됩니다.
[Exposed=Window] interface SVGTransform { // 변환 유형 const unsigned short SVG_TRANSFORM_UNKNOWN = 0; const unsigned short SVG_TRANSFORM_MATRIX = 1; const unsigned short SVG_TRANSFORM_TRANSLATE = 2; const unsigned short SVG_TRANSFORM_SCALE = 3; const unsigned short SVG_TRANSFORM_ROTATE = 4; const unsigned short SVG_TRANSFORM_SKEWX = 5; const unsigned short SVG_TRANSFORM_SKEWY = 6; readonly attribute unsigned short type; [SameObject] readonly attribute SVGMatrix matrix; readonly attribute float angle; undefined setMatrix(optional DOMMatrix2DInit matrix = {}); undefined setTranslate(float tx, float ty); undefined setScale(float sx, float sy); undefined setRotate(float angle, float cx, float cy); undefined setSkewX(float angle); undefined setSkewY(float angle); };
SVGTransform에 정의된 숫자 변환 유형 상수는 SVGTransform의 값 유형을 나타내는 데 사용됩니다. 그 의미는 다음과 같습니다:
| 상수 | 의미 |
|---|---|
| SVG_TRANSFORM_MATRIX | matrix(…) 값. |
| SVG_TRANSFORM_TRANSLATE | translate(…) 값. |
| SVG_TRANSFORM_SCALE | scale(…) 값. |
| SVG_TRANSFORM_ROTATE | rotate(…) 값. |
| SVG_TRANSFORM_SKEWX | skewX(…) 값. |
| SVG_TRANSFORM_SKEWY | skewY(…) 값. |
| SVG_TRANSFORM_UNKNOWN | 그 밖의 유형의 값. |
숫자 변환 유형 상수를 사용하는 것은 안티패턴이며 SVGTransform이 지원하는 어떤 변환 유형에도 새로운 상수 값은 도입되지 않습니다. 다른 유형의 변환이 지원되고 사용되면 SVGTransform은 SVG_TRANSFORM_UNKNOWN 유형을 사용합니다. 이러한 유형의 변환에서 SVGTransform의 다른 프로퍼티가 어떻게 동작하는지에 대한 자세한 내용은 아래를 참조하십시오.
type IDL 속성은 SVGTransform의 값인 변환 항목의 유형을 나타냅니다. type을 가져올 때 다음 단계를 실행합니다:
예를 들어 scaleX(…) 또는 translate3d(…) 변환의 경우 SVG_TRANSFORM_UNKNOWN이 반환됩니다.
matrix IDL 속성은 변환을 4x4 동차 행렬로 나타내며, 가져올 때 SVGTransform의 행렬 객체를 반환합니다. 행렬 객체가 처음 생성될 때 그 값은 SVGTransform의 변환 함수 값과 일치하도록 설정되고 SVGTransform을 반영하도록 설정됩니다.
서로 다른 변환 함수 유형이 특정 행렬 값에 어떻게 대응하는지에 대한 설명은 CSS Transforms 명세를 참조하십시오.
angle IDL 속성은 rotate(…), skewX(…) 또는 skewY(…) 변환 함수의 각도 매개변수를 나타냅니다. 가져올 때 다음 단계를 실행합니다:
setMatrix 메서드는 SVGTransform을 주어진 행렬 값으로 설정하는 데 사용됩니다. setMatrix(matrix)가 호출되면 다음 단계를 실행합니다:
DOMMatrixReadOnly.fromMatrix(matrix)의
결과로 둡니다.
해당 메서드가 오류를 발생시키면 그 오류를 다시 발생시키고 이 단계를 중단합니다.
setTranslate, setScale, setRotate, setSkewX 및 setSkewY 메서드는 SVGTransform을 새로운 변환 함수 값으로 설정하는 데 사용됩니다. 이러한 메서드 중 하나가 호출되면 다음 단계를 실행합니다:
이 명세는 SVGMatrix 객체가 변환 값을 취하는 프레젠테이션 속성을 반영하는 데 사용될 수 있도록 Geometry Interfaces 명세에 설명된 것 이상의 추가 동작 요구 사항을 부과합니다.
모든 SVGMatrix 객체는 두 모드 중 하나로 동작합니다. 다음 중 하나일 수 있습니다:
SVGMatrix는 읽기 전용으로 지정될 수 있으며, 이는 객체를 수정하려고 하면 예외가 발생함을 의미합니다. 읽기 전용 SVGMatrix의 IDL 속성 중 하나에 할당하거나 가변 변환 메서드 중 하나를 호출할 때 내부 값을 업데이트하는 대신 NoModificationAllowedError 예외가 발생합니다.
svgwg#706 (2019-10 WG 결의)에 따라 SVG 2는 SVG 1.1 방식으로 되돌아간다는 점에 유의하십시오. 별도의 읽기 전용 변형 인터페이스는 없습니다. SVGMatrix는 내부 플래그를 통해 읽기 전용으로 지정될 수 있으며, 쓰기 시 동일한 인터페이스에서 NoModificationAllowedError가 발생합니다.
쓰기 가능한 SVGMatrix의 IDL 속성 중 하나에 할당하거나 가변 변환 메서드 중 하나를 호출할 때 내부 행렬 값을 업데이트한 후 다음 단계를 실행합니다:
SVGTransformList 인터페이스는 요소가 SVGTransform 객체인 목록 인터페이스입니다. SVGTransformList는 transform 프로퍼티가 취할 수 있는 값, 즉 <transform-list> 또는 키워드 none을 나타냅니다.
[Exposed=Window] interface SVGTransformList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); SVGTransform initialize(SVGTransform newItem); getter SVGTransform getItem(unsigned long index); SVGTransform insertItemBefore(SVGTransform newItem, unsigned long index); SVGTransform replaceItem(SVGTransform newItem, unsigned long index); SVGTransform removeItem(unsigned long index); SVGTransform appendItem(SVGTransform newItem); setter undefined (unsigned long index, SVGTransform newItem); // 다른 목록 인터페이스에는 공통적이지 않은 추가 메서드. SVGTransform createSVGTransformFromMatrix(optional DOMMatrix2DInit matrix = {}); SVGTransform? consolidate(); };
createSVGTransformFromMatrix 메서드는 행렬 객체에서 새 SVGTransform 객체를 생성하는 데 사용됩니다. createSVGTransformFromMatrix(matrix) 메서드가 호출되면 다음 단계를 실행합니다:
consolidate 메서드는 변환 목록을 하나의 변환 함수를 사용하는 동등한 변환으로 변환하는 데 사용됩니다. consolidate() 메서드가 호출되면 다음 단계를 실행합니다:
SVGLengthList의 다른 모든 인터페이스 멤버 동작은 목록 인터페이스에 정의되어 있습니다.
SVGAnimatedTransformList 객체는 transform 프로퍼티와 그에 대응하는 프레젠테이션 속성 (요소에 따라 ‘transform’, ‘gradientTransform’ 또는 ‘patternTransform’)을 반영하는 데 사용됩니다.
[Exposed=Window] interface SVGAnimatedTransformList { [SameObject] readonly attribute SVGTransformList baseVal; [SameObject] readonly attribute SVGTransformList animVal; };
baseVal 및 animVal IDL 속성은 반영된 프레젠테이션 속성의 값을 나타냅니다. baseVal 또는 animVal을 가져오면 주어진 프레젠테이션 속성을 반영하는 SVGTransformList 객체가 반환됩니다.
SVGPreserveAspectRatio 인터페이스는 ‘preserveAspectRatio’ 속성의 값을 나타내는 데 사용됩니다.
SVGPreserveAspectRatio 객체는 읽기 전용으로 지정될 수 있으며, 이는 아래 설명한 대로 객체를 수정하려고 하면 예외가 발생함을 의미합니다.
모든 SVGPreserveAspectRatio 객체는 SVGAnimatedPreserveAspectRatio의 baseVal 또는 animVal 멤버에 있는 메서드를 통해 노출되는 반영된 ‘preserveAspectRatio’ 속성의 기본값을 반영합니다.
[Exposed=Window] interface SVGPreserveAspectRatio { // 정렬 유형 const unsigned short SVG_PRESERVEASPECTRATIO_UNKNOWN = 0; const unsigned short SVG_PRESERVEASPECTRATIO_NONE = 1; const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMIN = 2; const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3; const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4; const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMID = 5; const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMID = 6; const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMID = 7; const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMAX = 8; const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9; const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10; // Meet-or-slice 유형 const unsigned short SVG_MEETORSLICE_UNKNOWN = 0; const unsigned short SVG_MEETORSLICE_MEET = 1; const unsigned short SVG_MEETORSLICE_SLICE = 2; attribute unsigned short align; attribute unsigned short meetOrSlice; };
SVGPreserveAspectRatio에 정의된 숫자 정렬 유형 상수는 ‘preserveAspectRatio’이 취할 수 있는 정렬 키워드 값을 나타내는 데 사용됩니다. 그 의미는 다음과 같습니다:
| 상수 | 의미 |
|---|---|
| SVG_PRESERVEASPECTRATIO_NONE | none 키워드. |
| SVG_PRESERVEASPECTRATIO_XMINYMIN | xMinYMin 키워드. |
| SVG_PRESERVEASPECTRATIO_XMIDYMIN | xMidYMin 키워드. |
| SVG_PRESERVEASPECTRATIO_XMAXYMIN | xMaxYMin 키워드. |
| SVG_PRESERVEASPECTRATIO_XMINYMID | xMinYMid 키워드. |
| SVG_PRESERVEASPECTRATIO_XMIDYMID | xMidYMid 키워드. |
| SVG_PRESERVEASPECTRATIO_XMAXYMID | xMaxYMid 키워드. |
| SVG_PRESERVEASPECTRATIO_XMINYMAX | xMinYMax 키워드. |
| SVG_PRESERVEASPECTRATIO_XMIDYMAX | xMidYMax 키워드. |
| SVG_PRESERVEASPECTRATIO_XMAXYMAX | xMaxYMax 키워드. |
| SVG_PRESERVEASPECTRATIO_UNKNOWN | 그 밖의 유형의 값. |
마찬가지로 SVGPreserveAspectRatio에 정의된 숫자 meet-or-slice 유형 상수는 ‘preserveAspectRatio’이 취할 수 있는 meet-or-slice 키워드 값을 나타내는 데 사용됩니다. 그 의미는 다음과 같습니다:
| 상수 | 의미 |
|---|---|
| SVG_MEETORSLICE_MEET | meet 키워드. |
| SVG_MEETORSLICE_SLICE | slice 키워드. |
| SVG_MEETORSLICE_UNKNOWN | 그 밖의 유형의 값. |
align IDL 속성은 ‘preserveAspectRatio’ 값의 정렬 키워드 부분을 나타냅니다. 가져올 때 다음 단계를 실행합니다:
align을 설정할 때 다음 단계를 실행합니다:
meetOrSlice IDL 속성은 ‘preserveAspectRatio’ 값의 정렬 키워드 부분을 나타냅니다. 가져올 때 다음 단계를 실행합니다:
meetOrSlice를 설정할 때 다음 단계를 실행합니다:
SVGAnimatedPreserveAspectRatio 객체는 ‘preserveAspectRatio’ 속성을 반영하는 데 사용됩니다.
[Exposed=Window] interface SVGAnimatedPreserveAspectRatio { [SameObject] readonly attribute SVGPreserveAspectRatio baseVal; [SameObject] readonly attribute SVGPreserveAspectRatio animVal; };
baseVal 및 animVal IDL 속성은 반영된 ‘preserveAspectRatio’ 속성의 현재 애니메이션되지 않은 값을 나타냅니다. baseVal 또는 animVal을 가져오면 반영하는 IDL 속성을 가진 객체를 얻은 SVG 요소의 ‘preserveAspectRatio’ 속성의 기본값을 반영하는 SVGPreserveAspectRatio 객체가 반환됩니다.
경로는 채우거나 스트로크할 수 있는 도형의 윤곽선을 나타냅니다. 경로는 클리핑 경로로 사용하거나, 애니메이션을 설명하거나 텍스트를 배치하는 데 사용할 수도 있습니다. 하나의 경로를 이러한 기능 중 둘 이상에 동시에 사용할 수 있습니다. ( 채우기, 스트로크 및 페인트 서버, 클리핑 및 마스킹, 애니메이션('animateMotion'), 및 경로 위의 텍스트를 참조하십시오.)
경로는 현재점이라는 개념을 사용하여 설명합니다. 종이에 그리는 것에 비유하면 현재점은 펜의 위치라고 생각할 수 있습니다. 펜의 위치는 변경할 수 있으며, 펜을 직선 또는 곡선을 따라 움직여 도형의 윤곽선(열리거나 닫힌)을 그릴 수 있습니다.
경로는 객체 윤곽선의 기하를 나타내며, moveto(새 현재점 설정), lineto(직선 그리기), curveto(3차 베지어를 사용하여 곡선 그리기), arc(타원 또는 원호) 및 closepath(마지막 moveto에 연결하여 현재 도형 닫기) 명령으로 정의됩니다. 복합 경로(즉, 여러 하위 경로가 있는 경로)를 사용하여 객체에 "도넛 구멍"과 같은 효과를 만들 수 있습니다.
이 장에서는 SVG 경로의 구문, 동작 및 DOM 인터페이스를 설명합니다. SVG 경로에 대한 다양한 구현 참고 사항은 ‘path’ 요소 구현 참고 사항에서 확인할 수 있습니다.
경로는 SVG에서 ‘path’ 요소를 사용하여 정의합니다.
기본 도형은 모두 해당 도형의 동등한 경로가 무엇인지, 즉 경로로 표현했을 때의 도형이 무엇인지에 따라 설명됩니다. ( ‘path’ 요소의 동등한 경로는 단순히 경로 자체입니다.)
‘path’ 요소의 도형 윤곽선은 d 프로퍼티를 사용하여 지정합니다. 아래의 경로 데이터를 참조하십시오.
경로는 d 프로퍼티가 경로 데이터를 지정하는 ‘path’ 요소를 포함하여 정의합니다. 경로 데이터에는 moveto, lineto, curveto(3차 및 2차 베지어 모두), arc 및 closepath 명령이 포함됩니다.
예 triangle01은 삼각형 모양의 경로를 지정합니다. ( M은 moveto를 나타내고, L은 lineto를 나타내며, z는 closepath를 나타냅니다.)
<?xml version="1.0" standalone="no"?>
<svg width="4cm" height="4cm" viewBox="0 0 400 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<title>예 triangle01- 'path'의 간단한 예</title>
<desc>삼각형을 그리는 경로</desc>
<rect x="1" y="1" width="398" height="398"
fill="none" stroke="blue" />
<path d="M 100 100 L 300 100 L 200 300 z"
fill="red" stroke="blue" stroke-width="3" />
</svg>
예 triangle01
경로 데이터에는 줄바꿈 문자가 포함될 수 있으므로 가독성을 높이기 위해 여러 줄로 나눌 수 있습니다. 마크업의 속성 내부에 있는 줄바꿈은 파싱할 때 공백 문자로 정규화됩니다.
경로 데이터 구문은 많은 SVG 파일에서 경로 데이터가 대부분을 차지하기 때문에 파일 크기를 최소화하고 효율적으로 다운로드할 수 있도록 간결하게 설계되었습니다. SVG가 경로 데이터 크기를 최소화하려는 방법 중 일부는 다음과 같습니다:
M 100 100 L 200 200M100 100L200 200M 100 200 L 200 100 L -100 -200M 100 200 L 200 100 -100 -200경로 데이터 구문은 접두 표기법입니다(즉, 명령 뒤에 매개변수가 옴). 허용되는 유일한 소수점은 Unicode U+002E FULL STOP (".") 문자(Unicode에서는 PERIOD, dot 및 decimal point라고도 함)이며 그 밖의 구분 문자는 허용되지 않습니다 [UNICODE]. (예를 들어 다음은 경로 데이터 스트림에서 유효하지 않은 숫자 값입니다: "13,000.56". 대신 "13000.56"을 사용하십시오.)
명령의 상대 버전에서는 모든 좌표 값이 명령 시작 시점의 현재점을 기준으로 합니다.
아래 표에서는 주어진 경로 명령의 구문을 설명하기 위해 다음 표기법을 사용합니다:
경로 명령 설명에서 cpx 및 cpy는 현재점의 좌표를 나타냅니다.
| 이름: | d |
|---|---|
| 값: | none | <string> |
| 초기값: | none |
| 적용 대상: | ‘path’ |
| 상속: | 아니요 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 대로 |
| 애니메이션 유형: | 본문 참조 |
d 프로퍼티는 ‘path’ 요소의 도형을 지정하는 데 사용됩니다.
none 값은 요소에 경로 데이터가 없음을 나타냅니다. ‘path’ 요소의 경우 이는 요소가 렌더링되지 않으며 조상 컨테이너 요소의 경계 상자에도 기여하지 않음을 의미합니다.
경로는 여러 세그먼트로 구성되며, 명시적이든 암시적이든 moveto 또는 closepath 이외의 모든 명령은 하나의 경로 세그먼트를 정의합니다.
경로 데이터 내에 지정된 모든 좌표와 길이는 현재 사용자 좌표계의 사용자 단위로 처리해야 합니다.
<string> 값은 경로 데이터 문자열을 사용하여 도형을 지정합니다. <string> 값의 콘텐츠는 아래 정의된 svg-path EBNF 문법과 일치해야 하며, 문자열 내 오류는 경로 데이터 오류 처리 절의 규칙에 따라 처리됩니다. 경로 데이터 문자열에 유효한 명령이 하나도 없으면 동작은 none 값과 같습니다.
애니메이션의 경우 두 d 프로퍼티 값은 경로 데이터 문자열이 동일한 구조(즉, 정확히 같은 수와 유형의 경로 데이터 명령이 같은 순서로 존재함)를 가질 때만 부드럽게 보간할 수 있습니다. 애니메이션이 지정되었는데 경로 데이터 명령 목록의 구조가 같지 않으면 값은 보간할 때 불연속 애니메이션 유형을 사용해야 합니다.
from/by 애니메이션 또는 가산 애니메이션에서 지정된 애니메이션 값이 호환되지 않으면(즉, 경로 데이터 명령 목록의 구조가 같지 않으면) 애니메이션은 효과 값을 생성해서는 안 됩니다. 요소는 애니메이션이 지속되는 동안과 애니메이션이 끝난 후 기본값을 사용하여 렌더링해야 합니다. 특히 ‘fill’='freeze'가 지정된 경우 고정된 값은 기본값이어야 합니다.
by 애니메이션은 정의상 가산형이므로, 기본값의 경로 데이터 명령 목록이 by 값과 호환되지 않으면 가산 합성은 정의되지 않습니다. 다음을 참조하십시오: SMIL Animation: from, to, by 및 가산 동작.
경로 데이터 명령 목록의 구조가 같으면 각 경로 데이터 명령의 각 매개변수를 보간할 때 각각 실수로 처리해야 합니다. 플래그와 불리언은 0과 1 사이의 분수로 보간해야 하며, 0이 아닌 값은 모두 1/true 값으로 간주합니다.
"d는 경로 데이터 문자열을 값으로 갖는 프레젠테이션 속성이 됩니다(이름 변경 없음)"라는 결의가 London 편집자 회의에서 내려졌습니다.
다음 절에서는 경로 데이터 문자열에서 사용할 수 있는 명령을 나열합니다. 직선 세그먼트를 그리는 명령에는 lineto 명령 (L, l, H, h, V 및 v) 및 close path 명령 (Z 및 z)이 있습니다. 다음 세 그룹의 명령은 곡선을 그립니다:
"moveto" 명령(M 또는 m)은 새 초기점과 새 현재점을 설정해야 합니다. 이는 "펜"을 들어서 새 위치로 이동한 것과 같은 효과를 냅니다. 경로 데이터 세그먼트(있는 경우)는 "moveto" 명령으로 시작해야 합니다. 이후의 "moveto" 명령(즉, "moveto"가 첫 번째 명령이 아닌 경우)은 새 하위 경로의 시작을 나타냅니다:
| 명령 | 이름 | 매개변수 | 설명 |
|---|---|---|---|
| M (절대) m (상대) |
moveto | (x y)+ | 주어진 (x,y) 좌표에서 새 하위 경로를 시작합니다. M(대문자)은 절대 좌표가 이어짐을 나타내며, m(소문자)은 상대 좌표가 이어짐을 나타냅니다. moveto 뒤에 여러 좌표 쌍이 오면 이후의 쌍은 암시적 lineto 명령으로 처리됩니다. 따라서 암시적 lineto 명령은 moveto가 상대이면 상대가 되고, moveto가 절대이면 절대가 됩니다. 상대 moveto (m)가 경로의 첫 번째 요소로 나타나면 절대 좌표 쌍으로 처리됩니다. 이 경우 이후 좌표 쌍은 초기 moveto가 절대 moveto로 해석되더라도 상대 좌표로 처리됩니다. |
상대 m 명령을 사용하면 이동하는 위치는 (cpx + x, cpy + y)입니다.
"closepath"(Z 또는 z)는 현재 하위 경로를 그 초기점에 다시 연결하여 끝냅니다. 현재점에서 현재 하위 경로의 초기점까지 직선이 자동으로 그려집니다. 이 경로 세그먼트의 길이는 0일 수 있습니다.
"closepath" 바로 뒤에 "moveto"가 오면 "moveto"가 다음 하위 경로의 시작점을 식별합니다. "closepath" 바로 뒤에 그 밖의 명령이 오면 다음 하위 경로는 현재 하위 경로와 같은 초기점에서 시작합니다.
하위 경로가 "closepath"로 끝나면 ‘stroke-linejoin’ 및 ‘stroke-linecap’의 구현 방식에서 "lineto" 명령을 통해 하위 경로를 "수동으로" 닫을 때의 동작과 다릅니다. "closepath"를 사용하면 하위 경로의 마지막 세그먼트 끝이 현재 ‘stroke-linejoin’ 값을 사용하여 하위 경로의 첫 세그먼트 시작과 "연결"됩니다. 대신 "lineto" 명령을 통해 하위 경로를 "수동으로" 닫으면 첫 세그먼트의 시작과 마지막 세그먼트의 끝은 연결되지 않고 각각 현재 ‘stroke-linecap’ 값을 사용하여 캡 처리됩니다. 명령이 끝나면 새 현재점은 현재 하위 경로의 초기점으로 설정됩니다.
| 명령 | 이름 | 매개변수 | 설명 |
|---|---|---|---|
| Z 또는 z |
closepath | (없음) | 현재 하위 경로를 현재 하위 경로의 초기점에 다시 연결하여 닫습니다(위 본문 참조). Z 및 z 명령은 매개변수를 받지 않으므로 동일한 효과를 갖습니다. |
닫힌 하위 경로는 "closepath" 명령으로 닫아야 하며, 이는 첫 번째와 마지막 경로 세그먼트를 "연결"합니다. 그 밖의 모든 경로는 열린 하위 경로입니다.
닫힌 하위 경로는 동작 면에서 마지막 좌표가 하위 경로의 초기점인 열린 하위 경로와 다릅니다. 마지막 경로 세그먼트의 최종 좌표가 하위 경로의 초기점이더라도 열린 하위 경로의 첫 번째와 마지막 경로 세그먼트는 연결되지 않습니다. 그 결과 첫 번째와 마지막 경로 세그먼트는 현재 stroke-linecap 값을 사용하여 캡 처리되고, 현재 stroke-linejoin 값을 사용하여 연결되지 않습니다.
"closepath" 바로 뒤에 "moveto"가 오면 "moveto"가 다음 하위 경로의 시작점을 식별합니다. "closepath" 바로 뒤에 다른 명령이 오면 다음 하위 경로는 현재 하위 경로와 같은 초기 점에서 시작해야 합니다.
여러 "lineto" 명령은 현재점에서 새 점까지 직선을 그립니다:
| 명령 | 이름 | 매개변수 | 설명 |
|---|---|---|---|
| L (절대) l (상대) |
lineto | (x y)+ | 현재점에서 새 현재점이 되는 주어진 (x,y) 좌표까지 선을 그립니다. L(대문자)은 절대 좌표가 이어짐을 나타내고, l(소문자)은 상대 좌표가 이어짐을 나타냅니다. 여러 좌표 쌍을 지정하여 폴리라인을 그릴 수 있습니다. 명령이 끝나면 새 현재점은 제공된 마지막 좌표 집합으로 설정됩니다. |
| H (절대) h (상대) |
수평 lineto | x+ | 현재점에서 수평선을 그립니다. H(대문자)은 절대 좌표가 이어짐을 나타내고, h (소문자)는 상대 좌표가 이어짐을 나타냅니다. 여러 x 값을 제공할 수 있습니다(일반적으로 그렇게 하는 것은 의미가 없지만). H 또는 h 명령은 y 좌표에 0을 지정한 L 또는 l 명령과 동등합니다. 명령이 끝나면 새 현재점은 마지막 좌표 값에서 가져옵니다. |
| V (절대) v (상대) |
수직 lineto | y+ | 현재점에서 수직선을 그립니다. V(대문자)은 절대 좌표가 이어짐을 나타내고, v (소문자)는 상대 좌표가 이어짐을 나타냅니다. 여러 y 값을 제공할 수 있습니다(일반적으로 그렇게 하는 것은 의미가 없지만). V 또는 v 명령은 x 좌표에 0을 지정한 L 또는 l 명령과 동등합니다. 명령이 끝나면 새 현재점은 마지막 좌표 값에서 가져옵니다. |
상대 l 명령을 사용하면 선의 끝점은 (cpx + x, cpy + y)입니다.
상대 h 명령을 사용하면 선의 끝점은 (cpx + x, cpy)입니다. 이는 양의 x 값을 가진 h 명령이 양의 x축 방향으로 수평선을 그린다는 의미입니다.
상대 v 명령을 사용하면 선의 끝점은 (cpx, cpy + y)입니다.
3차 베지어 명령은 다음과 같습니다:
| 명령 | 이름 | 매개변수 | 설명 |
|---|---|---|---|
| C (절대) c (상대) |
curveto | (x1 y1 x2 y2 x y)+ | 현재점에서 (x,y)까지 3차 베지어 곡선을 그리며, (x1,y1)을 곡선 시작 부분의 제어점으로, (x2,y2)를 곡선 끝 부분의 제어점으로 사용합니다. C(대문자)는 절대 좌표가 이어짐을 나타내고, c(소문자)는 상대 좌표가 이어짐을 나타냅니다. 여러 좌표 집합을 지정하여 폴리베지어를 그릴 수 있습니다. 명령이 끝나면 새 현재점은 폴리베지어에서 사용된 마지막 (x,y) 좌표 쌍이 됩니다. |
| S (절대) s (상대) |
축약/부드러운 curveto | (x2 y2 x y)+ | 현재점에서 (x,y)까지 3차 베지어 곡선을 그립니다. 첫 번째 제어점은 현재점을 기준으로 이전 명령의 두 번째 제어점을 반사한 점으로 간주됩니다. ( 이전 명령이 없거나 이전 명령이 C, c, S 또는 s가 아니면 첫 번째 제어점이 현재점과 일치한다고 간주합니다.) (x2,y2)는 두 번째 제어 점(즉, 곡선 끝 부분의 제어점)입니다. S(대문자)는 절대 좌표가 이어짐을 나타내고, s(소문자)는 상대 좌표가 이어짐을 나타냅니다. 여러 좌표 집합을 지정하여 폴리베지어를 그릴 수 있습니다. 명령이 끝나면 새 현재점은 폴리베지어에서 사용된 마지막 (x,y) 좌표 쌍이 됩니다. |
상대 c 또는 s 명령을 사용하면 각 상대 좌표 쌍은 m 명령과 같은 방식으로 계산됩니다. 예를 들어 두 명령 모두에서 곡선의 마지막 제어점은 (cpx + x, cpy + y)입니다.
예 cubic01은 경로 내에서 3차 베지어 명령을 간단히 사용하는 몇 가지 예를 보여 줍니다. 이 예에서는 내부 CSS 스타일시트를 사용하여 스타일링 프로퍼티를 할당합니다. "S" 명령의 제어점은 이전 "C" 명령의 제어점을 "S" 명령의 시작점을 기준으로 반사한 점으로 자동 계산된다는 점에 유의하십시오.
<?xml version="1.0" standalone="no"?>
<svg width="5cm" height="4cm" viewBox="0 0 500 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<title>예 cubic01- 경로 데이터의 3차 베지어 명령</title>
<desc>"C"와 "S" 명령을 모두 사용하는
경로 데이터의 간단한 예와,
제어점 및 끝점을 보여 주는 주석을
나타내는 그림</desc>
<style type="text/css"><![CDATA[
.Border { fill:none; stroke:blue; stroke-width:1 }
.Connect { fill:none; stroke:#888888; stroke-width:2 }
.SamplePath { fill:none; stroke:red; stroke-width:5 }
.EndPoint { fill:none; stroke:#888888; stroke-width:2 }
.CtlPoint { fill:#888888; stroke:none }
.AutoCtlPoint { fill:none; stroke:blue; stroke-width:4 }
.Label { font-size:22; font-family:Verdana }
]]></style>
<rect class="Border" x="1" y="1" width="498" height="398" />
<polyline class="Connect" points="100,200 100,100" />
<polyline class="Connect" points="250,100 250,200" />
<polyline class="Connect" points="250,200 250,300" />
<polyline class="Connect" points="400,300 400,200" />
<path class="SamplePath" d="M100,200 C100,100 250,100 250,200
S400,300 400,200" />
<circle class="EndPoint" cx="100" cy="200" r="10" />
<circle class="EndPoint" cx="250" cy="200" r="10" />
<circle class="EndPoint" cx="400" cy="200" r="10" />
<circle class="CtlPoint" cx="100" cy="100" r="10" />
<circle class="CtlPoint" cx="250" cy="100" r="10" />
<circle class="CtlPoint" cx="400" cy="300" r="10" />
<circle class="AutoCtlPoint" cx="250" cy="300" r="9" />
<text class="Label" x="25" y="70">M100,200 C100,100 250,100 250,200</text>
<text class="Label" x="325" y="350"
style="text-anchor:middle">S400,300 400,200</text>
</svg>
예 cubic01
다음 그림은 3차 베지어 곡선이 제어점 위치에 따라 모양이 어떻게 변하는지를 몇 가지 보여 줍니다. 처음 다섯 예는 하나의 3차 베지어 경로 세그먼트를 보여 줍니다. 오른쪽 아래 예는 "C" 명령 뒤에 "S" 명령이 오는 경우를 보여 줍니다.

2차 베지어 명령은 다음과 같습니다:
| 명령 | 이름 | 매개변수 | 설명 |
|---|---|---|---|
| Q (절대) q (상대) |
2차 베지어 curveto | (x1 y1 x y)+ | 현재점에서 (x,y)까지 2차 베지어 곡선을 그리며 (x1,y1)을 제어점으로 사용합니다. Q(대문자)는 절대 좌표가 이어짐을 나타내고, q(소문자)는 상대 좌표가 이어짐을 나타냅니다. 여러 좌표 집합을 지정하여 폴리베지어를 그릴 수 있습니다. 명령이 끝나면 새 현재점은 폴리베지어에서 사용된 마지막 (x,y) 좌표 쌍이 됩니다. |
| T (절대) t (상대) |
축약/부드러운 2차 베지어 curveto | (x y)+ | 현재점에서 (x,y)까지 2차 베지어 곡선을 그립니다. 제어점은 현재점을 기준으로 이전 명령의 제어점을 반사한 점으로 간주됩니다. ( 이전 명령이 없거나 이전 명령이 Q, q, T 또는 t가 아니면 제어점이 현재 점과 일치한다고 간주합니다.) T(대문자)는 절대 좌표가 이어짐을 나타내고, t (소문자)는 상대 좌표가 이어짐을 나타냅니다. 명령이 끝나면 새 현재점은 폴리베지어에서 사용된 마지막 (x,y) 좌표 쌍이 됩니다. |
상대 q 또는 t 명령을 사용하면 각 상대 좌표 쌍은 m 명령과 같은 방식으로 계산됩니다. 예를 들어 두 명령 모두에서 곡선의 마지막 제어점은 (cpx + x, cpy + y)입니다.
예 quad01은 경로 내에서 2차 베지어 명령을 간단히 사용하는 몇 가지 예를 보여 줍니다. "T" 명령의 제어점은 이전 "Q" 명령의 제어점을 "T" 명령의 시작점을 기준으로 반사한 점으로 자동 계산된다는 점에 유의하십시오.
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="6cm" viewBox="0 0 1200 600"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<title>예 quad01 - 경로 데이터의 2차 베지어 명령</title>
<desc>"Q"와 "T" 명령을 보여 주는 그림과,
제어점
및 끝점을 보여 주는 주석</desc>
<rect x="1" y="1" width="1198" height="598"
fill="none" stroke="blue" stroke-width="1" />
<path d="M200,300 Q400,50 600,300 T1000,300"
fill="none" stroke="red" stroke-width="5" />
<!-- 끝점 -->
<g fill="black" >
<circle cx="200" cy="300" r="10"/>
<circle cx="600" cy="300" r="10"/>
<circle cx="1000" cy="300" r="10"/>
</g>
<!-- 제어점 및 끝점에서 제어점까지의 선 -->
<g fill="#888888" >
<circle cx="400" cy="50" r="10"/>
<circle cx="800" cy="550" r="10"/>
</g>
<path d="M200,300 L400,50 L600,300
L800,550 L1000,300"
fill="none" stroke="#888888" stroke-width="2" />
</svg>
예 quad01
| SVG 2 요구 사항: | SVG 경로 구문에서 호를 더 간단하게 그릴 수 있도록 합니다. |
|---|---|
| 결의: | 경로의 호를 더 쉽게 만듭니다. |
| 목적: | 작성자가 호를 포함하는 경로 데이터를 직접 더 쉽게 작성할 수 있도록 하기 위함입니다. |
| 담당자: | Cameron (ACTION-3151) |
타원 호 명령은 다음과 같습니다:
| 명령 | 이름 | 매개변수 | 설명 |
|---|---|---|---|
| A (절대) a (상대) |
타원 호 | (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+ | 현재점에서 (x, y)까지 타원 호를 그립니다. 타원의 크기와 방향은 두 반지름 (rx, ry)과 x-axis-rotation으로 정의되며, 이는 현재 좌표계에 대해 타원 전체가 몇 도 회전하는지를 나타냅니다. 타원의 중심(cx, cy)은 다른 매개변수가 부과하는 제약 조건을 만족하도록 자동으로 계산됩니다. large-arc-flag 및 sweep-flag는 자동 계산에 기여하며 호를 그리는 방식을 결정하는 데 도움을 줍니다. |
상대 a 명령을 사용하면 호의 끝점은 (cpx + x, cpy + y)입니다.
예 arcs01은 경로 내에서 호 명령을 간단히 사용하는 몇 가지 예를 보여 줍니다.
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="5.25cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<title>예 arcs01 - 경로 데이터의 호 명령</title>
<desc>두 개의 원형 차트 조각이 있는 원형 차트와
호 모양 돌출부가 있는 선을 보여 주는 그림</desc>
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="1" />
<path d="M300,200 h-150 a150,150 0 1,0 150,-150 z"
fill="red" stroke="blue" stroke-width="5" />
<path d="M275,175 v-150 a150,150 0 0,0 -150,150 z"
fill="yellow" stroke="blue" stroke-width="5" />
<path d="M600,350 l 50,-25
a25,25 -30 0,1 50,-25 l 50,-25
a25,50 -30 0,1 50,-25 l 50,-25
a25,75 -30 0,1 50,-25 l 50,-25
a25,100 -30 0,1 50,-25 l 50,-25"
fill="none" stroke="red" stroke-width="5" />
</svg>
예 arcs01
타원 호 명령은 다음 제약 조건을 충족해야 하는 타원의 일부를 그립니다:
대부분의 상황에서는 실제로 이러한 제약 조건을 만족하는 서로 다른 네 개의 호 (서로 다른 두 타원, 각각 서로 다른 두 호 스윕)가 있습니다. large-arc-flag 및 sweep-flag는 다음과 같이 네 호 중 어느 것을 그릴지 나타냅니다:
다음은 large-arc-flag 및 sweep-flag의 네 조합과 이러한 플래그 값에 따라 그려지는 서로 다른 네 호를 보여 줍니다. 각 경우에는 다음 경로 데이터 명령을 사용했습니다:
<path d="M 125,75 a100,50 0 ?,? 100,50"
style="fill:none; stroke:red; stroke-width:6"/>
여기서 "?,?"는 네 가지 가능한 경우를 생성하기 위해 "0,0" "0,1" "1,0" 및 "1,1"로 대체됩니다.
경로 데이터의 타원 호 명령에 대한 자세한 구현 참고 사항은 범위를 벗어난 타원 호 매개변수 절을 참조하십시오.
SVG 호 표기법을 중심점과 호 스윕을 사용하는 형식으로 변환해야 하는 소프트웨어와 관련된 수식은 구현 참고 사항 부록에 있습니다.
SVG 경로 데이터는 다음 EBNF 문법과 일치합니다.
svg_path::= wsp* (moveto (wsp* drawto_command)*)? wsp*
drawto_command::=
moveto
| closepath
| lineto
| horizontal_lineto
| vertical_lineto
| curveto
| smooth_curveto
| quadratic_bezier_curveto
| smooth_quadratic_bezier_curveto
| elliptical_arc
moveto::=
( "M" | "m" ) wsp* coordinate_pair_sequence
closepath::=
("Z" | "z")
lineto::=
("L"|"l") wsp* coordinate_pair_sequence
horizontal_lineto::=
("H"|"h") wsp* coordinate_sequence
vertical_lineto::=
("V"|"v") wsp* coordinate_sequence
curveto::=
("C"|"c") wsp* curveto_coordinate_sequence
curveto_coordinate_sequence::=
coordinate_pair_triplet
| (coordinate_pair_triplet comma_wsp? curveto_coordinate_sequence)
smooth_curveto::=
("S"|"s") wsp* smooth_curveto_coordinate_sequence
smooth_curveto_coordinate_sequence::=
coordinate_pair_double
| (coordinate_pair_double comma_wsp? smooth_curveto_coordinate_sequence)
quadratic_bezier_curveto::=
("Q"|"q") wsp* quadratic_bezier_curveto_coordinate_sequence
quadratic_bezier_curveto_coordinate_sequence::=
coordinate_pair_double
| (coordinate_pair_double comma_wsp? quadratic_bezier_curveto_coordinate_sequence)
smooth_quadratic_bezier_curveto::=
("T"|"t") wsp* coordinate_pair_sequence
elliptical_arc::=
( "A" | "a" ) wsp* elliptical_arc_argument_sequence
elliptical_arc_argument_sequence::=
elliptical_arc_argument
| (elliptical_arc_argument comma_wsp? elliptical_arc_argument_sequence)
elliptical_arc_argument::=
number comma_wsp? number comma_wsp? number comma_wsp
flag comma_wsp? flag comma_wsp? coordinate_pair
coordinate_pair_double::=
coordinate_pair comma_wsp? coordinate_pair
coordinate_pair_triplet::=
coordinate_pair comma_wsp? coordinate_pair comma_wsp? coordinate_pair
coordinate_pair_sequence::=
coordinate_pair | (coordinate_pair comma_wsp? coordinate_pair_sequence)
coordinate_sequence::=
coordinate | (coordinate comma_wsp? coordinate_sequence)
coordinate_pair::= coordinate comma_wsp? coordinate
coordinate::= sign? number
sign::= "+"|"-"
exponent::= ("e" | "E") sign? digit+
fractional-constant::= (digit* "." digit+) | digit+
number::= fractional-constant exponent?
flag::= ("0" | "1")
comma_wsp::= (wsp+ ","? wsp*) | ("," wsp*)
wsp::= (#x9 | #x20 | #xA | #xC | #xD)
digit::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
EBNF 처리는 주어진 EBNF 생성식에서 가능한 한 많은 부분을 소비해야 하며, 더 이상 해당 생성식을 만족하지 않는 문자를 만나는 지점에서 중지해야 합니다. 따라서 문자열 "M 100-200"에서 첫 번째 "moveto" 좌표는 문자 "100"을 소비하고 마이너스 기호를 만나면 중지합니다. "coordinate" 생성식에서는 숫자 뒤에 마이너스 기호가 올 수 없기 때문입니다. 그 결과 첫 번째 좌표는 "100"이 되고 두 번째 좌표는 "-200"이 됩니다.
마찬가지로 문자열 "M 0.6.5"의 경우 "moveto"의 첫 번째 좌표는 문자 "0.6"을 소비하고 두 번째 소수점을 만나면 중지합니다. "coordinate" 생성식은 소수점을 하나만 허용하기 때문입니다. 그 결과 첫 번째 좌표는 "0.6"이 되고 두 번째 좌표는 ".5"가 됩니다.
이전 명세의
문법은 숫자에 소수 자릿수가 없는 후행 소수점
(예: 23.)을 허용했습니다. SVG 2는 숫자 파싱을
CSS [css-syntax-3]와 조화시켜
숫자에 대한 완화된 문법을 허용하지 않습니다. 그러나 사용자 에이전트는 파싱이 모호하지 않다면
후행 소수점이 있는 숫자를 계속
허용할 수 있습니다.
작성자와 저작 도구는 허용되지 않는 숫자 형식을 사용해서는 안 됩니다.
EBNF는 d 프로퍼티의 경로 데이터 문자열이 비어 있는 것을 허용합니다. 빈 경로 데이터 문자열은 경로 렌더링을 비활성화합니다. d 프로퍼티의 값이 none인 경우에도 렌더링이 비활성화됩니다.
문법과 일치하지 않는 경로 데이터를 만나면 경로 데이터에 오류가 있는 것입니다 (오류 처리 참조).
마커의 방향 및 선 캡의 도형과 같은 일부 기능은 경로를 따른 주어진 거리에서의 경로 방향 또는 개별 세그먼트의 시작이나 끝에서의 방향을 기준으로 정의됩니다.
경로를 따른 지정된 거리에서의 경로 방향은 다음과 같이 정의됩니다:
경로 세그먼트의 시작 지점에서의 방향은 다음과 같이 정의됩니다:
경로 세그먼트 끝 지점에서의 방향은 다음과 같이 정의됩니다:
적합한 SVG 사용자 에이전트는 경로 데이터를 사용하는 기능을 다음 세부 사항에 따라 구현해야 합니다:
모든 타원 호 매개변수에는 임의의 숫자 값이 허용되지만 (불리언 플래그 제외), 사용자 에이전트는 곡선을 렌더링하거나 그 기하를 계산할 때 유효하지 않은 값에 대해 다음과 같이 조정해야 합니다:
세그먼트의 끝점(x, y)이 현재점과 동일하면 (예: 이전 세그먼트의 끝점), 이는 타원 호 세그먼트 전체를 생략하는 것과 같습니다.
rx 또는 ry 중 하나가 0이면 이 호는 끝점을 연결하는 직선 세그먼트 ("lineto")로 처리됩니다.
rx 또는 ry 중 하나에 음수 부호가 있으면 해당 부호를 제거하고 대신 절댓값을 사용합니다.
rx, ry 및 x-axis-rotation이 해가 없도록 하는 값이면 (기본적으로 타원이 현재점에서 새 끝점까지 도달할 만큼 충분히 크지 않음) 정확히 하나의 해가 존재할 때까지 타원을 균일하게 확대합니다(타원이 딱 충분히 커질 때까지).
이 확대 연산의 수학적 수식은 부록의 범위를 벗어난 반지름 보정 절을 참조하십시오.
범위를 벗어난 값을 이렇게 관대하면서도 일관되게 처리하면 다음이 보장됩니다:
S/s 및 T/t 명령은 주어진 3차 베지어 세그먼트의 첫 번째 제어점을 현재점을 기준으로 이전 경로 세그먼트의 마지막 제어점을 반사하여 계산함을 나타냅니다. 정확한 계산식은 다음과 같습니다.
현재점이 (curx, cury)이고 이전 경로 세그먼트의 마지막 제어점이 (oldx2, oldy2)이면 반사된 점(즉, 현재 경로 세그먼트의 첫 번째 제어점인 (newx1, newy1))은 다음과 같습니다:
(newx1, newy1) = (curx - (oldx2 - curx), cury - (oldy2 - cury))
= (2*curx - oldx2, 2*cury - oldy2)
길이가 0인 경로 세그먼트는 유효하지 않은 것이 아니며 다음과 같은 경우 렌더링에 영향을 줍니다:
경로 위의 텍스트, 모션 애니메이션 및 여러 스트로크 연산을 포함한 다양한 연산에서는 사용자 에이전트가 ‘path’와 같은 그래픽 요소의 기하를 따라 거리를 계산해야 합니다.
경로를 따른 거리를 계산하기 위한 정확한 수학식이 존재하지만 그 수식은 매우 복잡하며 상당한 계산이 필요합니다. 저작 제품과 사용자 에이전트는 가능한 한 정밀한 결과를 생성하는 알고리즘을 사용하는 것이 권장됩니다. 그러나 구현 차이를 수용하고 거리 계산 결과가 작성자의 의도에 근접하도록 하기 위해 ‘pathLength’ 속성을 사용하여 작성자가 계산한 경로의 전체 길이를 제공할 수 있으며, 사용자 에이전트는 ‘pathLength’과 사용자 에이전트가 자체 계산한 전체 경로 길이 값의 비율로 경로를 따른 거리 계산을 조정할 수 있습니다.
‘path’ 요소 내부의 "moveto" 연산은 길이가 0인 것으로 정의됩니다. 여러 "lineto", "curveto" 및 "arcto" 명령만 경로 길이 계산에 기여합니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| pathLength | <number> | (없음) | 예 |
작성자가 계산한 경로의 전체 길이이며 사용자 단위로 나타냅니다. 이 값은 사용자 에이전트 자체의 경로를 따른 거리 계산을 작성자의 계산과 보정하는 데 사용됩니다. 사용자 에이전트는 모든 경로를 따른 거리 계산을 ‘pathLength’과 사용자 에이전트 자체가 계산한 전체 경로 길이 값의 비율로 조정합니다. ‘pathLength’는 경로 위의 텍스트, 모션 애니메이션 및 여러 스트로크 연산의 계산에 영향을 줄 수 있습니다.
0 값은 유효하며 무한대의 배율 계수로 처리해야 합니다. 무한대로 확대/축소된 0 값은 0으로 유지되어야 하며, 0보다 큰 모든 비백분율 값은 +Infinity가 되어야 합니다.
음수 값은 오류입니다(오류 처리 참조).
‘pathLength’는 백분율 경로를 따른 거리 계산에 영향을 주지 않습니다.
| 이름: | path-length |
|---|---|
| 값: | none | <length> [0,∞] |
| 초기값: | none |
| 적용 대상: | ‘path’, ‘circle’, ‘ellipse’, ‘line’, ‘polygon’, ‘polyline’, ‘rect’ |
| 상속: | 아니요 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 키워드 none 또는 절대 길이 |
| 애니메이션 유형: | 계산값에 따라 |
path-length 프로퍼티는 작성자가 계산한 경로의 전체 길이를 제공합니다. 이 값은 사용자 에이전트 자체의 경로를 따른 거리 계산을 작성자의 계산과 보정하는 데 사용됩니다.
none 값은 작성자가 지정한 경로 길이가 없으며 사용자 에이전트 자체가 계산한 경로 길이를 사용함을 나타냅니다.
<length> 값은 0 이상이어야 합니다. 0 값은 유효하며 무한대의 배율 계수로 처리해야 합니다. 무한대로 확대/축소된 0 값은 0으로 유지되어야 하며, 0보다 큰 값은 +Infinity가 되어야 합니다.
SVG ‘pathLength’
속성은
path-length CSS 프로퍼티에
프레젠테이션 속성으로 매핑됩니다.
속성의 단위 없는 숫자 값은 px 단위의
<length> 값으로 해석됩니다.
‘pathLength’
속성 값이 없고
path-length 프로퍼티가
none으로 계산되면 작성자 배율 조정은 적용되지 않습니다.
path-length 프로퍼티는 다음에 영향을 줍니다:
path-length는 백분율 경로를 따른 거리 계산에 영향을 주지 않습니다.
CSS Working Group은 path-length를 CSS 프로퍼티로 추가하고 ‘pathLength’가 이에 매핑되도록 결의했습니다 (2020년 1월 22일 회의록).
SVGPathElement 객체는 DOM의 ‘path’ 요소를 나타냅니다.
[Exposed=Window] interface SVGPathElement : SVGGeometryElement { };
SVG에는 다음과 같은 기본 도형 요소 집합이 포함됩니다:
수학적으로 이러한 도형 요소는 동일한 도형을 구성하는 ‘path’ 요소와 동등합니다. 기본 도형은 스트로크하거나 채우거나 클리핑 경로로 사용할 수 있습니다. ‘path’ 요소에 사용할 수 있는 모든 프로퍼티는 기본 도형에도 적용됩니다.
각 도형의 동등한 경로와 스트로크를 계산하는 알고리즘은 아래의 도형 절에서 정의됩니다.
아래의 ‘rect’, ‘circle’ 및 ‘ellipse’의 동등한 경로는 각각 길이가 0인 선을 그리는 closepath로 끝나는데, 바로 앞의 명령이 이미 초기점에서 끝나기 때문입니다. 길이가 0인 선은 도형이 채워지거나 스트로크되는 방식을 바꾸지 않습니다. 이는 정점 마커가 배치되는 위치에 영향을 줄 수 있지만, 이러한 요소의 마커는 각 도형에 나열된 명령 수가 아니라 정점 마커의 규칙에 따라 배치됩니다.
‘rect’ 요소는 현재 사용자 좌표 계의 축에 정렬된 직사각형을 정의합니다. rx 및 ry 기하 프로퍼티에 0이 아닌 값을 설정하여 둥근 직사각형을 만들 수 있습니다.
x 및 y 좌표는 현재 사용자 좌표계에서 직사각형의 왼쪽 및 위쪽 가장자리를 나타냅니다.
width 및 height 프로퍼티는 직사각형의 전체 너비와 높이를 정의합니다. 어느 프로퍼티든 음수 값은 유효하지 않으며 반드시 무시해야 합니다. 어느 차원이든 계산값이 0이면 요소의 렌더링이 비활성화됩니다.
둥근 직사각형의 경우
rx 및 ry 프로퍼티의 계산값은
직사각형 모서리를 둥글게 만드는 데 사용되는 타원 호의 x축 및 y축 반지름을 정의합니다.
호는 항상 수평축과 수직축 모두를 따라 대칭입니다. 모서리의 둥글기가 균일하지 않은 직사각형을 만들려면
‘path’로 도형을 명시적으로 정의하십시오.
어느 프로퍼티든 음수 값은 유효하지 않으며 반드시 무시해야 합니다.
어느 차원이든 계산값이 0이거나,
두 차원 모두의 계산값이 auto이면
모서리가 둥글지 않은 직사각형이 됩니다.
x축 및 y축 둥근 모서리 반지름의 사용값은
다른 차원에서 암시적으로 결정될 수 있으며(auto 값 사용),
직사각형의 직선 세그먼트 길이가 절대로 음수가 되지 않도록
클램핑의 적용도 받습니다.
rx 및 ry의 사용값은
계산값에서 다음 단계를 순서대로 수행하여 결정합니다:
auto이면
(auto는 두 프로퍼티 모두의 초기값이므로, 작성자가 둘 다
지정하지 않았거나 작성자가 제공한 모든 값이 유효하지 않은 경우에도 이 상태가 됨),
rx 및 ry의 사용값은 모두 0입니다. (그러면 모서리가 각집니다.)
auto이면,
백분율을 직사각형의 사용 width에 대해 결정하여 rx의 동등한 절대 길이를 계산하고,
ry의 절대값도 동일하게 합니다.
auto이면,
백분율을 직사각형의 사용 height에 대해 결정하여 ry의 동등한 절대 길이를 계산하고,
rx의 절대값도 동일하게 합니다.
수학적으로 ‘rect’ 요소는 다음과 같이 동등한 ‘path’ 요소에 매핑되며, 먼저 x, y, width, height, rx 및 rx의 절대 사용값을 사용자 좌표계의 사용자 단위로 생성하고, 위에서 지정한 규칙 및 단위에 따라 각 동등한 기하 프로퍼티에 적용합니다:
경로 분해는 다음 원격 회의에서 결의되었습니다: 2013년 6월 3일.
예 rect01은 각진 모서리를 가진 직사각형을 보여 줍니다. ‘rect’ 요소는 노란색으로 채워지고 남색으로 스트로크됩니다.
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>예 rect01 - 각진 모서리를 가진 직사각형</desc>
<!-- 'rect' 요소를 사용하여 뷰포트 윤곽선을 표시합니다 -->
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="2"/>
<rect x="400" y="100" width="400" height="200"
fill="yellow" stroke="navy" stroke-width="10" />
</svg>
예 rect01
예 rect02는 두 개의 둥근 직사각형을 보여 줍니다. rx는 직사각형의 모서리를 둥글게 만드는 방법을 지정합니다. ry 속성에 값이 지정되지 않았으므로 사용값은 rx 속성에서 파생됩니다.
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>예 rect02 - 둥근 직사각형</desc>
<!-- 'rect' 요소를 사용하여 뷰포트 윤곽선을 표시합니다 -->
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="2"/>
<rect x="100" y="100" width="400" height="200" rx="50"
fill="green" />
<g transform="translate(700 210) rotate(-30)">
<rect x="0" y="0" width="400" height="200" rx="50"
fill="none" stroke="purple" stroke-width="30" />
</g>
</svg>
예 rect02
‘circle’ 요소는 중심점과 반지름을 기반으로 원을 정의합니다.
r 속성은 원의 반지름을 정의합니다. 음수 값은 유효하지 않으며 반드시 무시해야 합니다. 계산값이 0이면 요소의 렌더링이 비활성화됩니다.
수학적으로 ‘circle’ 요소는 네 개의 타원 호 세그먼트로 구성된 동등한 ‘path’ 요소에 매핑됩니다. 각 세그먼트는 원의 4분의 1을 차지합니다. 경로는 반지름의 "3시" 지점에서 시작하여 시계 방향으로 진행합니다(변환 적용 전). 호 명령의 rx 및 ry 매개변수는 로컬 사용자 단위로 변환한 후 r 프로퍼티의 사용값과 모두 같으며, x-axis-rotation 및 large-arc-flag는 0으로 설정하고, sweep-flag는 1로 설정합니다. 좌표는 다음과 같이 계산하며, 여기서 cx, cy 및 r은 동등한 프로퍼티의 사용값을 사용자 단위로 변환한 것입니다:
경로 분해는 다음 원격 회의에서 결의되었습니다: 2013년 6월 3일.
예 circle01은 빨간색으로 채워지고 파란색으로 스트로크된 ‘circle’ 요소로 구성됩니다.
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>예 circle01 - 빨간색으로 채우고 파란색으로 스트로크한 원</desc>
<!-- 'rect' 요소를 사용하여 뷰포트 윤곽선을 표시합니다 -->
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="2"/>
<circle cx="600" cy="200" r="100"
fill="red" stroke="blue" stroke-width="10" />
</svg>
예 circle01
‘ellipse’ 요소는 중심점과 두 반지름을 기반으로 현재 사용자 좌표 계의 축에 정렬된 타원을 정의합니다.
rx 및 ry 프로퍼티는 타원의 x축 및 y축 반지름을
정의합니다.
어느 프로퍼티든 음수 값은 유효하지 않으며 반드시 무시해야 합니다.
어느 차원이든 계산값이 0이거나,
두 차원 모두의 계산값이 auto이면
요소의 렌더링이 비활성화됩니다.
rx 또는 ry 중 하나의 auto 값은
위에서 직사각형에 대해 제시한 규칙에 따라 사용값으로 변환됩니다
(단, width 또는 height를 기준으로 하는 클램핑은 없음).
실질적으로 auto 값은
한 차원으로만 표현된 값에 의해 반지름이 정의되는 원형 도형을 만들며,
다음 중 하나를 기준으로 반지름이 정의된 원을 만들 수 있습니다:
SVG 2에서 새로 추가되었습니다.
rx 및 ry의 auto 값은 타원과 직사각형 모두에서 이러한 프로퍼티를
일관되게 파싱할 수 있도록 추가되었습니다.
이전에는 rx 또는 ry 중 하나라도 지정되지 않으면
타원이 렌더링되지 않았습니다.
수학적으로 ‘ellipse’ 요소는 네 개의 타원 호 세그먼트로 구성된 동등한 ‘path’ 요소에 매핑됩니다. 각 세그먼트는 타원의 4분의 1을 차지합니다. 경로는 반지름의 "3시" 지점에서 시작하여 시계 방향으로 진행합니다(변환 적용 전). 호 명령의 rx 및 ry 매개변수는 로컬 사용자 단위로 변환한 후 동등한 프로퍼티의 사용값이며, x-axis-rotation 및 large-arc-flag는 0으로 설정하고, sweep-flag는 1로 설정합니다. 좌표는 다음과 같이 계산하며, 여기서 cx, cy, rx 및 ry는 동등한 프로퍼티의 사용값을 사용자 단위로 변환한 것입니다:
경로 분해는 다음 원격 회의에서 결의되었습니다: 2013년 6월 3일.
아래의 예 ellipse01은 ‘svg’ 요소의 ‘viewBox’ 속성과 ‘g’ 및 ‘ellipse’ 요소의 transform 프로퍼티가 설정한 사용자 좌표계에서 두 타원의 좌표를 지정합니다. 두 타원 모두 cx 및 cy 속성(타원의 중심)에 기본값 0을 사용합니다. 두 번째 타원은 회전되어 있습니다.
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>예 ellipse01 - 타원의 예</desc>
<!-- 'rect' 요소를 사용하여 뷰포트 윤곽선을 표시합니다 -->
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="2" />
<g transform="translate(300 200)">
<ellipse rx="250" ry="100"
fill="red" />
</g>
<ellipse transform="translate(900 200) rotate(-30)"
rx="250" ry="100"
fill="none" stroke="blue" stroke-width="20" />
</svg>
예 ellipse01
‘line’ 요소는 한 점에서 시작하여 다른 점에서 끝나는 선분을 정의합니다.
속성 정의:
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| x1, y1 | <length-percentage> | <number> | 0 | 예 |
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| x2, y2 | <length-percentage> | <number> | 0 | 예 |
향후 명세에서는 ‘x1’, ‘y1’, ‘x2’ 및 ‘y2’ 속성을 기하 프로퍼티로 변환할 수 있습니다. 현재는 요소 속성을 통해서만 지정할 수 있으며 CSS로는 지정할 수 없습니다.
수학적으로 ‘line’ 요소는 다음과 같이 동등한 ‘path’ 요소에 매핑할 수 있으며, 먼저 단위에 따라 좌표를 사용자 좌표계 사용자 단위로 변환하여 x1, y1, x2 및 y2 값을 생성합니다:
‘line’ 요소는 하나의 선이므로 기하학적으로 1차원이며 내부가 없습니다. 따라서 ‘line’ 요소는 절대로 채워지지 않습니다(fill 프로퍼티 참조).
아래의 예 line01은 ‘svg’ 요소의 ‘viewBox’ 속성이 설정한 사용자 좌표계에서 다섯 선의 좌표를 지정합니다. 선의 두께는 서로 다릅니다.
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>예 line01 - 사용자 좌표로 표현된 선</desc>
<!-- 'rect' 요소를 사용하여 뷰포트 윤곽선을 표시합니다 -->
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="2" />
<g stroke="green" >
<line x1="100" y1="300" x2="300" y2="100"
stroke-width="5" />
<line x1="300" y1="300" x2="500" y2="100"
stroke-width="10" />
<line x1="500" y1="300" x2="700" y2="100"
stroke-width="15" />
<line x1="700" y1="300" x2="900" y2="100"
stroke-width="20" />
<line x1="900" y1="300" x2="1100" y2="100"
stroke-width="25" />
</g>
</svg>
예 line01
‘polyline’ 요소는 서로 연결된 직선 세그먼트 집합을 정의합니다. 일반적으로 ‘polyline’ 요소는 열린 도형을 정의합니다.
속성 정의:
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| points | <points> | (없음) | 예 |
여기서:
폴리라인을 구성하는 점입니다. 모든 좌표 값은 사용자 좌표계에 있습니다.
홀수 개의 좌표가 제공되면 요소는 오류 상태가 되며, 잘못 지정된 ‘path’ 요소에서 발생하는 것과 동일한 사용자 에이전트 동작을 합니다. 이러한 오류의 경우 사용자 에이전트는 마지막 홀수 번째 좌표를 버리고 그 밖의 도형은 렌더링합니다.
초기값 (없음)은 polyline 요소가 유효하지만 렌더링되지 않음을 나타냅니다.
향후 명세에서는 ‘points’ 속성을 기하 프로퍼티로 변환할 수 있습니다. 현재는 요소 속성을 통해서만 지정할 수 있으며 CSS로는 지정할 수 없습니다.
수학적으로 ‘polyline’ 요소는 다음과 같이 동등한 ‘path’ 요소에 매핑할 수 있습니다:
아래의 예 polyline01은 ‘svg’ 요소의 ‘viewBox’ 속성이 설정한 사용자 좌표계에서 폴리라인을 지정합니다.
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>예 polyline01 - 점점 더 커지는 막대</desc>
<!-- 'rect' 요소를 사용하여 뷰포트 윤곽선을 표시합니다 -->
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="2" />
<polyline fill="none" stroke="blue" stroke-width="10"
points="50,375
150,375 150,325 250,325 250,375
350,375 350,250 450,250 450,375
550,375 550,175 650,175 650,375
750,375 750,100 850,100 850,375
950,375 950,25 1050,25 1050,375
1150,375" />
</svg>
예 polyline01
‘polygon’ 요소는 서로 연결된 직선 세그먼트 집합으로 구성된 닫힌 도형을 정의합니다.
속성 정의:
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| points | <points> | (없음) | 예 |
다각형을 구성하는 점입니다. 모든 좌표 값은 사용자 좌표계에 있습니다.
홀수 개의 좌표가 제공되면 요소는 오류 상태가 되며, 잘못 지정된 ‘path’ 요소에서 발생하는 것과 동일한 사용자 에이전트 동작을 합니다.
초기값 (없음)은 polygon 요소가 유효하지만 렌더링되지 않음을 나타냅니다.
향후 명세에서는 ‘points’ 속성을 기하 프로퍼티로 변환할 수 있습니다. 현재는 요소 속성을 통해서만 지정할 수 있으며 CSS로는 지정할 수 없습니다.
수학적으로 ‘polygon’ 요소는 다음과 같이 동등한 ‘path’ 요소에 매핑할 수 있습니다:
아래의 예 polygon01은 ‘svg’ 요소의 ‘viewBox’ 속성이 설정한 사용자 좌표계에서 두 다각형(별과 육각형)을 지정합니다.
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>예 polygon01 - 별과 육각형</desc>
<!-- 'rect' 요소를 사용하여 뷰포트 윤곽선을 표시합니다 -->
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="2" />
<polygon fill="red" stroke="blue" stroke-width="10"
points="350,75 379,161 469,161 397,215
423,301 350,250 277,301 303,215
231,161 321,161" />
<polygon fill="lime" stroke="blue" stroke-width="10"
points="850,75 958,137.5 958,262.5
850,325 742,262.6 742,137.5" />
</svg>
예 polygon01
SVGRectElement 객체는 DOM의 ‘rect’ 요소를 나타냅니다.
[Exposed=Window] interface SVGRectElement : SVGGeometryElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; [SameObject] readonly attribute SVGAnimatedLength rx; [SameObject] readonly attribute SVGAnimatedLength ry; };
x, y, width, height, rx 및 ry IDL 속성은 각각 x, y, width, height, rx 및 ry 프로퍼티와 이에 대응하는 프레젠테이션 속성의 계산값을 반영합니다.
SVGCircleElement 객체는 DOM의 ‘circle’ 요소를 나타냅니다.
[Exposed=Window] interface SVGCircleElement : SVGGeometryElement { [SameObject] readonly attribute SVGAnimatedLength cx; [SameObject] readonly attribute SVGAnimatedLength cy; [SameObject] readonly attribute SVGAnimatedLength r; };
cx, cy 및 r IDL 속성은 cx, cy 및 r 프로퍼티와 이에 대응하는 프레젠테이션 속성의 계산값을 각각 반영합니다.
SVGEllipseElement 객체는 DOM의 ‘ellipse’ 요소를 나타냅니다.
[Exposed=Window] interface SVGEllipseElement : SVGGeometryElement { [SameObject] readonly attribute SVGAnimatedLength cx; [SameObject] readonly attribute SVGAnimatedLength cy; [SameObject] readonly attribute SVGAnimatedLength rx; [SameObject] readonly attribute SVGAnimatedLength ry; };
cx, cy, rx 및 ry IDL 속성은 cx, cy, rx 및 ry 프로퍼티와 이에 대응하는 프레젠테이션 속성의 계산값을 각각 반영합니다.
[Exposed=Window] interface SVGLineElement : SVGGeometryElement { [SameObject] readonly attribute SVGAnimatedLength x1; [SameObject] readonly attribute SVGAnimatedLength y1; [SameObject] readonly attribute SVGAnimatedLength x2; [SameObject] readonly attribute SVGAnimatedLength y2; };
x1, y1, x2 및 y2 IDL 속성은 각각 ‘x1’, ‘y1’, ‘x2’ 및 ‘y2’ 콘텐츠 속성을 반영합니다
SVGAnimatedPoints 인터페이스는 ‘polygon’ 또는 ‘polyline’ 요소의 ‘points’ 속성을 반영하는 데 사용됩니다. 이는 SVGPolygonElement 및 SVGPolylineElement 인터페이스에 믹스인됩니다.
interface mixin SVGAnimatedPoints {
[SameObject] readonly attribute SVGPointList points;
[SameObject] readonly attribute SVGPointList animatedPoints;
};
points IDL 속성은 반영된 속성의 현재 애니메이션되지 않은 값을 나타냅니다. points를 가져오면 반영된 속성의 기본 값을 반영하는 SVGPointList 객체가 반환됩니다.
animatedPoints IDL 속성은 반영된 속성의 현재 애니메이션되지 않은 값을 나타냅니다. animatedPoints를 가져오면 반영된 속성의 애니메이션 값을 반영하는 SVGPointList 객체가 반환됩니다.
points 및 animatedPoints에서 반환되는 객체는 현재 속성에 영향을 주는 애니메이션이 없더라도 서로 달라야 합니다.
SVGPointList 인터페이스는 요소가 SVGPoint 객체인 목록 인터페이스입니다. SVGPointList 객체는 점 목록을 나타냅니다.
[Exposed=Window] interface SVGPointList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); SVGPoint initialize(SVGPoint newItem); getter SVGPoint getItem(unsigned long index); SVGPoint insertItemBefore(SVGPoint newItem, unsigned long index); SVGPoint replaceItem(SVGPoint newItem, unsigned long index); SVGPoint removeItem(unsigned long index); SVGPoint appendItem(SVGPoint newItem); setter undefined (unsigned long index, SVGPoint newItem); };
SVGPointList의 모든 인터페이스 멤버 동작은 목록 인터페이스에 정의되어 있습니다.
이 명세는 ‘points’ 속성을 반영하는 데 사용할 수 있도록 Geometry Interfaces 명세에 설명된 것 이상의 추가 동작 요구 사항을 SVGPoint 객체에 부과합니다.
모든 SVGPoint 객체는 네 가지 모드 중 하나로 동작합니다. 다음 중 하나일 수 있습니다:
SVGPoint 객체는 특정 요소와 연결될 수 있습니다. 연결된 요소는 객체가 속성을 반영하는 경우 어떤 요소의 콘텐츠 속성을 업데이트할지 결정하는 데 사용됩니다. 달리 설명되지 않는 한 SVGPoint 객체는 어떤 요소와도 연결되지 않습니다.
SVGPoint 객체는 읽기 전용으로 지정될 수 있으며, 이는 객체를 수정하려고 하면 예외가 발생함을 의미합니다. 읽기 전용 SVGPoint의 x, y, w 또는 z IDL 속성에 할당할 때 내부 좌표 값을 업데이트하는 대신 NoModificationAllowedError를 반드시 발생시켜야 합니다.
svgwg#706 (2019-10 WG 결의)에 따라 SVG 2는 SVG 1.1 방식으로 되돌아간다는 점에 유의하십시오. 별도의 읽기 전용 변형 인터페이스는 없습니다. SVGPoint는 내부 플래그를 통해 읽기 전용으로 지정할 수 있으며, 쓰기 시 동일한 인터페이스에서 NoModificationAllowedError가 발생합니다.
쓰기 가능한 SVGPoint의 x, y, w 또는 z IDL 속성에 할당할 때 내부 좌표 값을 업데이트한 후 다음 단계를 실행합니다:
SVGPolylineElement 객체는 DOM의 ‘polyline’ 요소를 나타냅니다.
[Exposed=Window] interface SVGPolylineElement : SVGGeometryElement { }; SVGPolylineElement includes SVGAnimatedPoints;
SVGPolygonElement 객체는 DOM의 ‘polygon’ 요소를 나타냅니다.
[Exposed=Window] interface SVGPolygonElement : SVGGeometryElement { }; SVGPolygonElement includes SVGAnimatedPoints;
SVG 문서 조각의 일부로 렌더링할 텍스트는 ‘text’ 요소를 사용하여 지정합니다. ‘text’ 요소 내부의 텍스트는 다음과 같이 렌더링할 수 있습니다:
텍스트 레이아웃 절에서는 텍스트 레이아웃을 소개합니다. 이어지는 절에서는 콘텐츠 영역과 콘텐츠 영역 안에서 텍스트를 배치하는 알고리즘을 다룹니다. 그 다음에는 사전 서식 지정된, 자동 줄바꿈된 및 경로 위의 텍스트에 해당하는 특수 레이아웃 규칙을 개별 절에서 다룹니다.
SVG 1.1의 텍스트 레이아웃 규칙은 대부분 SVG 1.1 명세 안에서 정의됩니다. 이 규칙은 대체로 CSS에 있는 규칙을 반영합니다. SVG 2에서는 CSS에 대한 의존성이 더 명시적입니다. 실제로 결과 레이아웃은 동일합니다. CSS 명세에 직접 의존하도록 변경하면 SVG 명세가 단순해지는 동시에 렌더링 에이전트가 HTML과 SVG의 텍스트 모두를 렌더링하는 데 동일한 코드를 사용할 수 있음이 더 분명해집니다. 특히 SVG 2의 자동 줄바꿈 텍스트는 CSS 텍스트 레이아웃을 기반으로 합니다.
SVG의 ‘text’ 요소는 다른 그래픽 요소처럼 렌더링됩니다. 따라서 좌표계 변환, 페인팅, 클리핑 및 마스킹 기능은 ‘text’ 요소에도 도형, 예를 들면 경로 및 직사각형에 적용되는 것과 같은 방식으로 적용됩니다.
SVG 텍스트는 다음과 같은 고급 타이포그래피 기능을 지원합니다:
SVG 텍스트는 다음과 같은 국제 텍스트 처리 요구 사항을 지원합니다:
다국어 SVG 콘텐츠는 사용자의 선호 언어를 기준으로 서로 다른 텍스트 문자열을 대체하여 구현할 수 있습니다.
그릴 문자는 ‘text’ 요소 내부의 문자 데이터 ([xml], 2.4절)로 표현됩니다. 그 결과:
접근성을 위해 문서에 포함된 텍스트에는 그 기능을 나타내는 적절한 시맨틱 마크업을 사용하는 것이 권장됩니다. 예를 들어, 다이어그램 일부에 표시되는 레이블을 제공하는 text 요소는 관련 그룹 또는 경로 요소의 ‘aria-labelledby’ 속성에서 참조되는 ‘id’를 가져야 합니다. 자세한 내용은 SVG 접근성 지침을 참조하십시오.
본질적으로 Unicode 코드 포인트입니다. 문자는 제어 명령(탭, 캐리지 리턴 또는 줄바꿈 등), 렌더링 가능한 기호(문자, 숫자, 문장 부호 또는 기타 기호), 또는 수정자(결합 악센트 등)일 수 있습니다.
서로 다른 방식은 SVG 1.1과 하위 호환됩니다. SVG DOM 텍스트 메서드에 UTF-16 코드 단위를 사용하는 것은 DOM 2 명세의 DOMString 정의에 따라 필요합니다.
SVG 워킹 그룹은 텍스트 배치 속성을 매핑할 때 Unicode 코드 포인트를 Unicode Standard Annex #29에서 정의된 그래핌 클러스터로 대체할 가능성에 대한 구현자 피드백에 관심이 있습니다. CSS 타이포그래피 문자를 사용하는 것은 적절하지 않다는 점에 유의하십시오. 무엇이 문자를 구성하는지는 문맥(줄바꿈, 단어 나눔 등)에 따라 달라질 수 있기 때문입니다.
향후 CSS 생성 콘텐츠 텍스트에 대한 지원이 도입되면 주소 지정 가능한 문자 배열에 포함됩니다.
여러 CSS 3 텍스트 레이아웃 명세가 이 용어를 사용하지만, 현재 어느 명세도 공식적인 정의를 확립하지 않았습니다. 따라서 링크는 CSS 2.1을 가리키며, CSS WG에 이슈가 제출되었습니다.
시작및
끝측면을 정의합니다(예를 들어 text-anchor 프로퍼티가 적용되는 방식과 관련됨). 이는 direction 프로퍼티에 의해 결정됩니다. (참고: 텍스트 줄에서 문자의 순서는 주로 인라인 기준 방향이 아니라 Unicode 양방향 알고리즘에 의해 제어됩니다.)
글꼴은 시각적 매체에 문자를 표시하기 위해 해당 글리프를 사용하는 데 필요한 기타 정보 (총칭하여 글꼴 테이블)와 글리프 모음으로 구성됩니다. 글리프 모음과 글꼴 테이블의 조합을 글꼴 데이터라고 합니다.
글꼴은 포매터(텍스트 셰이퍼)가 글리프 시퀀스를 재정렬, 결합 및 배치하여 하나 이상의 복합 글리프를 구성하는 데 사용할 수 있는 대체 및 배치 테이블을 제공할 수 있습니다. 결합은 합자처럼 단순할 수도 있고, 일반적으로 일부 재정렬과 함께 여러 자음 및 모음 글리프를 결합하는 인도계 음절처럼 복잡할 수도 있습니다. 테이블은 언어에 따라 달라질 수 있어 언어에 적합한 글자 형태를 사용할 수 있습니다.
단순 또는 복합 글리프가 조판 목적상 나눌 수 없는 단위를 나타내는 경우 이를 타이포그래피 문자라고 합니다.
합자는 고급 텍스트 레이아웃의 중요한 기능입니다. 일부 합자는 선택적이며 다른 합자(예: 아랍어)는 필수입니다. 합자 형성에는 다음 명시적 규칙이 적용됩니다:
문자가 서로 다른 DOM 텍스트 노드에 있을 때는 합자 형성을 활성화하지 않는 것이 좋습니다. 따라서 마크업으로 분리된 문자는 합자를 사용하지 않는 것이 좋습니다.
문자가 서로 다른 텍스트 청크에 있을 때는 합자 형성을 활성화하지 않는 것이 좋습니다.
두 문자 사이의 간격이 기본 간격과 같지 않을 때는 선택적 합자를 사용하지 않는 것이 좋습니다 (예: letter-spacing이 기본값이 아닌 값을 갖거나, text-align 값이 justify이고 text-justify 값이 distribute인 경우). (다음을 참조하십시오: CSS Text Module Level 3, ([css-text-3]).
‘dx’, ‘textLength’, 및 ‘spacing’ (‘textPath’에서)과 같이 타이포그래피 문자를 재배치할 수 있는 SVG 속성은 선택적 합자를 끊지 않습니다. 선택적 합자를 원하지 않는 경우 font-variant-ligatures 프로퍼티를 사용하여 끌 수 있습니다.
OpenType 글꼴의 경우 선택적 합자에는 liga, clig, dlig, hlig 및 cala 기능에 의해 활성화되는 합자가 포함되며, 필수 합자는 rlig 기능에 있습니다.
| SVG 2 요구 사항: | Web Open Font Format (WOFF)에 대한 명시적 지원을 포함합니다. |
|---|---|
| 결의: | SVG 2에서 WOFF 지원을 의무화합니다. |
| 목적: | 국제화 및 고급 타이포그래피를 위해 전체 OpenType 기능에 접근할 수 있도록 하기 위함입니다. |
| 담당자: | Chris (조치 없음) |
| 상태: | 완료 |
올바른 텍스트 렌더링은 저작 시 사용한 것과 동일한 글꼴을 사용하는 데 의존할 수 있습니다. 이러한 이유로 SVG는 글꼴 리소스 절에서 정의한 다운로드 가능한 글꼴에 대한 지원을 요구합니다. CSS Fonts Module을 참조하십시오. 특히 Web Open Font Format [WOFF] 지원이 필요합니다.
SVG 2에서 새로 추가된 WOFF를 통해 작성자는 콘텐츠를 올바르게 렌더링하는 데 필요한 글꼴을 제공할 수 있습니다. 여기에는 복잡한 문자 체계, 선택적 합자, 스워시, 올드스타일 숫자 등을 지원하기 위한 적절한 OpenType 테이블이 글꼴에 포함되도록 하는 것이 포함됩니다. WOFF는 또한 글꼴을 압축하고, 서브셋화하고, 라이선스 정보를 포함할 수 있도록 합니다.
글리프 선택과 배치는 일반적으로 CSS 규칙에 따라 처리됩니다. 그러나 일부 경우 SVG에서 텍스트의 최종 레이아웃에는 개별 글리프의 기하 프로퍼티에 대한 지식이 필요합니다.
기하학적 글꼴 특성은 EM 박스를 기반으로 하는 좌표계로 표현됩니다. (EM은 글꼴 내 글리프 높이의 상대적 척도입니다.) 높이 1 EM, 너비 1 EM인 박스를 디자인 공간이라고 합니다. 이 공간에는 EM을 여러 em당 단위로 세분하여 기하 좌표가 부여됩니다.
em당 단위는 글꼴 특성입니다. 일반적인 em당 단위 값은 1000 또는 2048입니다.
EM 박스의 좌표 공간을 디자인 공간 좌표계라고 합니다. 확장 가능한 글꼴의 경우 글리프를 그리는 데 사용되는 곡선과 선은 이 좌표계를 사용하여 표현됩니다.
대부분의 경우 이 좌표계의 (0,0) 점은 EM 박스의 왼쪽 가장자리에 있지만 왼쪽 아래 모서리에는 있지 않습니다. 로마자 대문자 밑부분의 Y 좌표는 일반적으로 0입니다. 로마자 소문자의 디센더는 음수 좌표값을 갖습니다.
Em 박스(파란색 사각형) 안의 'M'입니다. 'M'은 기준선(파란색 선) 위에 놓입니다. 좌표계의 원점은 작은 검은색 원으로 표시됩니다.
SVG는 글꼴 테이블이 최소 세 가지 글꼴 특성, 즉 어센트, 디센트 및 기준선 테이블 집합을 제공한다고 가정합니다. 어센트는 글꼴의 (0,0) 점에서 EM 박스 상단까지의 거리이며, 디센트는 글꼴의 (0.0) 점에서 EM 박스 하단까지의 거리입니다. 기준선 테이블은 아래에서 설명합니다.
OpenType 글꼴([OPENTYPE])에서 가로 쓰기 모드의 경우 어센트와 디센트는 OS/2 테이블의 sTypoAscender 및 sTypoDescender 항목으로 제공됩니다. 세로 쓰기 모드의 경우 디센트(이 경우 (0,0) 점에서 글리프의 왼쪽 가장자리까지의 거리)는 보통 0입니다. (0,0) 점이 왼쪽 가장자리에 있기 때문입니다. 세로 쓰기 모드의 어센트는 1 em이거나 세로 쓰기 모드용 OpenType Base 테이블의 ideographic top baseline 값으로 지정됩니다.
글리프는 각 글리프의 정렬점이라고 하는 특정 점을 기준으로 배치됩니다. 가로 쓰기 모드에서는 글리프의 정렬점이 수직으로 정렬되고, 세로 쓰기 모드에서는 수평으로 정렬됩니다. 정렬점의 위치는 문자 체계에 따라 달라집니다. 예를 들어 서양 글리프는 대문자 아래쪽에, 북인도 글리프는 글리프 상단 부근의 가로 획 위쪽에 정렬되며, 극동 글리프는 글리프의 아래쪽 또는 중앙에 정렬됩니다.
하나의 문자 체계와 하나의 font-size를 사용하는 텍스트 줄 내에서 정렬점의 시퀀스는 인라인 기준 방향을 따라 기준선이라는 기하학적 선을 정의합니다. 서양 및 대부분의 다른 알파벳 및 음절 글리프는 "alphabetic" 기준선에 정렬되고, 북인도 글리프는 "hanging" 기준선에 정렬되며 극동 글리프는 "ideographic" 기준선에 정렬됩니다.
세 가지 서로 다른 문자 체계의 기준선 예(빨간색 선)입니다. 왼쪽에서 오른쪽 순서로: alphabetic, hanging, ideographic. ideographic 문자 체계의 EM 박스는 파란색으로 표시됩니다.
글리프가 기준선을 따라 순서대로 배치될 때 글리프의 정렬점은 일반적으로 현재 텍스트 위치에 배치됩니다(vertical-align 같은 일부 프로퍼티는 배치를 변경할 수 있습니다). 각 글리프가 배치된 후 현재 텍스트 위치는 글리프의 advance 값(일반적으로 가로 텍스트에서는 너비, 세로 텍스트에서는 높이)만큼 전진하며, 커닝이나 기타 간격 조정뿐 아니라 사전 서식 지정된 또는 자동 줄바꿈된 텍스트의 새 줄에 대한 보정도 적용됩니다. 초기 및 최종 현재 텍스트 위치는 정렬에 사용됩니다(예: text-anchor 값이 'middle' 또는 'end'인 경우). 해당 글리프의 advance는 경로를 따라 텍스트를 배치할 때 필요합니다.
글꼴 메트릭의 예입니다. 파란색 상자는 세 글리프의 기하학적 박스를 보여 줍니다. 레이블이 있는 작은 원은 글리프 배치 전 현재 텍스트 위치를 보여 줍니다. 작은 사각형은 마지막 글리프를 배치한 후의 최종 현재 텍스트 위치를 보여 줍니다. 커닝으로 인해 'a' 글리프 박스의 왼쪽이 'V' 글리프 박스의 오른쪽과 정렬되지 않는다는 점에 유의하십시오.
글리프가 현재 글리프 방향에 해당하는 명시적 advance 값을 제공하지 않는 경우 적절한 근삿값을 사용하는 것이 좋습니다. 세로 텍스트의 경우 권장되는 근삿값은 em 크기입니다.
초기 현재 텍스트 위치는 사전 서식 지정된 텍스트의 경우 ‘text’ 요소 또는 처음 렌더링되는 ‘tspan’ 요소의 ‘x’ 및 ‘y’ 속성에 의해 설정되며, inline-size 프로퍼티로 콘텐츠 영역이 결정되는 자동 줄바꿈 텍스트의 경우에도 같습니다. 그 밖의 자동 줄바꿈 텍스트에서는 CSS 줄바꿈 알고리즘을 적용한 후 처음 렌더링된 글리프의 위치에 의해 초기 현재 텍스트 위치가 결정됩니다.
‘x’ (‘y’) 속성이 초기 현재 텍스트 위치를 설정하지 않으면 해당 X (Y) 좌표는 현재 사용자 좌표계에서 0입니다.
기준선 테이블은 디자인 공간 좌표계에서 하나 이상의 기준선 위치를 지정합니다. 기준선 테이블의 기능은 동일한 텍스트 줄에 서로 다른 문자 체계가 혼합될 때 서로에 대한 정렬을 용이하게 하는 것입니다. 원하는 상대적 정렬은 줄(또는 블록)에서 어떤 문자 체계가 지배적인지에 따라 달라질 수 있으므로 문자 체계마다 서로 다른 기준선 테이블이 있을 수 있습니다. 또한 가로 및 세로 쓰기 모드에는 서로 다른 정렬 위치가 필요합니다. 따라서 글꼴에는 기준선 테이블 집합이 있을 수 있습니다: 일반적으로 가로 쓰기 모드용 하나 이상과 세로 쓰기 모드용 0개 이상입니다.
일부 글꼴에는 기준선 테이블 값이 없을 수 있습니다. 주어진 글꼴이 기준선 테이블을 제공하지 않을 때 기준선 테이블을 근사하기 위한 휴리스틱은 CSS Inline Layout Module Level 3 [css-inline-3]에서 제안됩니다.
텍스트 실행 중간에 다른 글꼴(또는 글꼴 크기 변경)이 지정되면 지배 기준선이 새 글꼴(새 크기)의 글리프를 이전 글꼴의 글리프와 정렬하는 데 사용할 기준선을 결정합니다. dominant-baseline 프로퍼티를 사용하여 지배 기준선을 설정합니다.
부모에 대한 객체의 정렬은 정렬 기준선에 의해 결정됩니다. 일반적으로 지배 기준선과 동일하지만 축약 vertical-align 프로퍼티(권장) 또는 본딧말 alignment-baseline을 사용하여 다른 기준선을 선택할 수 있습니다.
지배 기준선은 위 첨자 또는 아래 첨자에 필요한 경우 축약 vertical-align 프로퍼티(권장) 또는 본딧말 baseline-shift 프로퍼티를 사용하여 일시적으로 이동할 수 있습니다. 이동은 중첩될 수 있으며 각 이동은 이전 이동에 더해집니다.
'vertical-align' 프로퍼티 사용 예입니다. 왼쪽: 'vertical-align:mathematical' ('alignment-baseline:mathematical')이 '[z]'를 포함하는 ‘tspan’에 적용됩니다. 연한 파란색 선은 수학 기준선의 위치를 보여 줍니다. 오른쪽: '2'를 포함하는 ‘tspan’에 'vertical-align:super' ('baseline-shift:super')가 적용됩니다. 연한 파란색 선은 기준선 이동을 나타냅니다.
SVG는 또한 글꼴 데이터 내 각 글리프마다 두 개의 너비 값, 두 개의 정렬 기준선 및 두 개의 정렬점이 있으며, 하나는 가로 쓰기 모드용이고 다른 하나는 세로 쓰기 모드용이라고 가정합니다. (너비로 지정되지만, 세로 쓰기 모드에서는 이 너비가 세로 방향으로 사용됩니다.) 정렬점의 인라인 기준 방향 위치는 글리프의 시작 가장자리에 있습니다.
기준선에 대한 추가 정보는 CSS Inline Layout Module Level 3 명세에서 확인할 수 있습니다. [css-inline-3] (또한 다음도 참조하십시오: CSS Writing Modes Level 3 명세. [css-writing-modes-3])
| SVG 2 요구 사항: | 서로 다른 기준선에 정렬되는 텍스트를 지원합니다. |
|---|---|
| 결의: | SVG 2는 기존 또는 개선된 CSS 프로퍼티를 사용하여 글리프를 서로 다른 기준선에 정렬하는 기능을 지원합니다. |
| 목적: | 가로 텍스트의 글리프가 스타일 효과를 위해 서로 다른 수직 정렬을 갖도록 하기 위함입니다. |
| 담당자: | Chris (조치 없음) |
| 상태: | 완료 |
한 줄의 텍스트는 라인 박스 안에 배치됩니다. 여러 줄 텍스트는 이러한 박스를 쌓아 생성합니다. 라인 박스의 높이는 line-height 프로퍼티의 효과를 적용한 후 텍스트 줄에 있는 모든 글리프의 최대 어센트와 최대 디센트를 찾아 결정합니다. 라인 박스의 너비는 일반적으로 포함하는 텍스트 블록의 너비입니다. SVG에서 포함하는 텍스트 블록이 고정된 기하를 갖지 않는 경우(사전 서식 지정된 텍스트처럼) 라인 박스는 박스 내부의 글리프 박스를 밀착하여 감쌉니다.
라인 박스 높이를 결정하는 예입니다. 먼저 각 글리프 박스(작은 연한 파란색 박스)는 line-height 프로퍼티에 따라 위아래로 수직 확장됩니다. 이 경우 line-height 프로퍼티는 125%입니다. 큰 글리프의 font-size는 96px이므로 추가 높이는 24px(96px의 25%)입니다. 추가 높이는 위아래로 균등하게 나뉘어 빨간색 박스가 됩니다. (명확성을 위해 동일한 인라인 요소의 모든 글리프를 함께 그룹화했습니다). 최종 라인 박스(큰 연한 파란색 박스)는 기준선 위아래의 빨간색 박스 최대 범위를 사용하여 결정됩니다.
다양한 국제 문자 체계를 지원하기 위해 라인 박스는 가로 또는 세로 방향으로 배치될 수 있습니다. 세로 라인 박스 내의 텍스트는 위에서 아래로 흐릅니다. 가로 라인 박스 내의 텍스트는 왼쪽에서 오른쪽으로 (예: 현대 라틴 문자), 오른쪽에서 왼쪽으로(예: 히브리어 또는 아랍어), 또는 왼쪽에서 오른쪽과 오른쪽에서 왼쪽이 혼합되어 (양방향 텍스트) 흐를 수 있습니다.
양방향 텍스트의 처리 모델은 다음과 같습니다:
커닝 또는 합자 처리는 글꼴에 따라 달라질 수 있지만, 권장 모델에서는 문자 또는 글리프가 재정렬된 후 문자 또는 글리프 조합 사이에서 커닝 및 합자 처리가 이루어집니다.
라인 박스의 방향과 이들이 쌓이는 방향(블록 흐름 방향)은 writing-mode 프로퍼티에 의해 결정됩니다. 가로 텍스트 (writing-mode 값 horizontal-tb)에서는 라인 박스가 위에서 아래로 쌓입니다. 세로 텍스트에서는 라인 박스가 오른쪽에서 왼쪽으로(writing-mode 값 vertical-rl) 또는 왼쪽에서 오른쪽으로 (writing-mode 값 vertical-lr) 쌓입니다.
‘text’ 요소는 텍스트로 구성된 그래픽 요소를 정의합니다. ‘text’ 또는 다른 ‘tspan’ 요소 내부의 ‘tspan’ 요소를 사용하면 스타일을 전환하거나 부모 요소를 기준으로 ‘tspan’ 요소 내부에서 렌더링되는 텍스트 위치를 조정할 수 있습니다.
‘text’ 및 ‘tspan’ 요소 내의 문자 데이터와 관련 속성 및 프로퍼티, 그리고 글꼴 자체의 문자-글리프 매핑 테이블이 렌더링할 글리프를 정의합니다. ‘text’ 및 ‘tspan’ 요소의 속성과 프로퍼티는 쓰기 방향, 글꼴 명세 및 문자를 정확히 어떻게 렌더링할지 설명하는 페인팅 속성과 같은 사항을 나타냅니다. 이 장의 후속 절에서는 관련 텍스트 전용 속성 및 프로퍼티를 설명합니다.
‘text’ 및 ‘tspan’ 요소는 다른 그래픽 요소와 동일한 렌더링 방법을 사용하므로 경로 및 직사각형 같은 도형에 적용되는 것과 동일한 페인팅 기능이 ‘text’ 및 ‘tspan’ 요소에도 적용되지만, 마커는 제외됩니다. 또한 좌표계 변환, 클리핑 및 마스킹은 ‘text’ 요소 전체에 적용할 수 있습니다.
CSS 용어로 ‘text’ 요소는 블록 요소처럼 동작합니다. 텍스트 콘텐츠 요소의 자손인 ‘tspan’, ‘textPath’ 및 ‘a’ 요소는 인라인 요소처럼 동작합니다.
그라디언트, 패턴, 클리핑 경로, 마스크 또는 필터를 텍스트에 적용할 수 있습니다. 이러한 기능 중 하나가 텍스트에 적용되고 키워드 'objectBoundingBox'가 사용되어( 객체 경계 상자 단위 참조) "객체 경계 상자"를 기준으로 그래픽 효과를 지정하는 경우, 객체 경계 상자 단위는 모든 경우에 전체 ‘text’ 요소를 기준으로 계산되며, 같은 ‘text’ 요소 내부의 서로 다른 ‘tspan’ 또는 ‘textPath’ 요소에 서로 다른 효과가 적용되는 경우에도 마찬가지입니다.
‘text’ 요소는 양방향 재정렬 후 첫 번째 글리프를 초기 현재 텍스트 위치에 렌더링합니다( text-anchor 프로퍼티 또는 text-align 프로퍼티 값으로 인해 조정될 수 있음). 사전 서식 지정된 텍스트와 inline-size 프로퍼티가 콘텐츠 영역을 결정하는 자동 줄바꿈 텍스트의 경우, 초기 현재 텍스트 위치는 처음 렌더링되는 문자를 포함하는 ‘text’ 또는 ‘tspan’ 요소의 ‘x’ 및 ‘y’ 값으로 결정됩니다. 도형 안의 자동 줄바꿈 텍스트 또는 경로 위의 텍스트는 각각 자동 줄바꿈 텍스트 또는 경로 위의 텍스트 절을 참조하여 초기 현재 텍스트 위치를 결정하십시오. 주어진 문자에 해당하는 글리프가 렌더링된 후 현재 텍스트 위치는 다음 문자를 위해 업데이트됩니다. 가장 단순한 경우 새 현재 텍스트 위치는 이전 현재 텍스트 위치에 글리프의 advance 값 (가로 또는 세로)을 더한 것입니다. 글리프 배치 및 글리프 advance에 대한 설명은 텍스트 레이아웃을 참조하십시오.
텍스트 문자열 안녕하세요, 저기요!
는
Verdana 글꼴 패밀리를 사용하여 캔버스에 렌더링되며 글리프는
파란색으로 채워집니다.
<?xml version="1.0" standalone="no"?>
<svg width="10cm" height="3cm" viewBox="0 0 1000 300"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<text x="250" y="180"
font-family="Verdana" font-size="64" fill="blue" >
안녕하세요, 저기요!
</text>
</svg>
‘tspan’을 사용하여
아닌
이라는 단어의 스타일을 변경합니다.
<?xml version="1.0" standalone="no"?>
<svg width="10cm" height="3cm" viewBox="0 0 1000 300"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<g font-family="Verdana" font-size="64" >
<text x="160" y="180" fill="blue" >
당신은
<tspan font-weight="bold" fill="red" >아닌</tspan>
바나나입니다.
</text>
</g>
</svg>
두 ‘tspan’ 요소는 ‘x’ 및 ‘y’ 속성을 사용하여 가로 및 세로 방향으로 재배치됩니다. 모든 텍스트가 하나의 ‘text’ 요소 안에 있으므로 사용자는 텍스트 선택 및 클립보드 연산을 지원하는 사용자 에이전트에서 모든 텍스트를 선택하여 시스템 클립보드에 복사할 수 있습니다.
<?xml version="1.0" standalone="no"?>
<svg width="10cm" height="3cm" viewBox="0 0 1000 300"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<g font-family="Verdana" font-size="64" >
<text x="100" y="180" fill="blue" >
하지만 당신은
<tspan dx="2em" dy="-50" font-weight="bold" fill="red" >
입니다
</tspan>
<tspan dy="100">
복숭아!
</tspan>
</text>
</g>
</svg>
| SVG 2 요구 사항: | ‘tspan’에 변환을 허용합니다. |
|---|---|
| 결의: | SVG 2는 ‘tspan’에 변환을 허용합니다. |
| 목적: | 이미 변환을 허용하는 ‘a’ 같은 다른 요소와 일치시키기 위함입니다. |
| 담당자: | Cameron (조치 없음) |
| 상태: | 완료 |
이 결정은 번복되었습니다. 다음을 참조하십시오: GitHub 이슈 210. CSS/HTML은 인라인 요소에 변환을 허용하지 않으며 어떤 렌더러도 인라인인 ‘a’ 요소에 변환을 지원하지 않습니다(SVG와 HTML 모두에서).
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| x, y | [ [ <length-percentage> | <number> ]+ ]# | (없음) | 예 |
하나의 <length>가 제공되면 그 값은 이 요소 또는 그 자손 중 첫 번째 문자에 해당하는 글리프를 렌더링하기 위한 현재 텍스트 위치의 새로운 절대 X (Y) 좌표를 나타냅니다.
쉼표 또는 공백으로 구분된 n개의 <length> 목록이 제공되면 그 값은 이 요소 또는 그 자손 내부의 처음 n개 주소 지정 가능한 문자 각각에 대응하는 글리프를 렌더링하기 위한 현재 텍스트 위치의 새로운 절대 X (Y) 좌표를 나타냅니다.
문자보다 더 많은 <length>가 제공되면 추가 <length>는 글리프 배치에 영향을 주지 않습니다.
<length>보다 문자가 더 많거나 속성이 지정되지 않은 경우 각 추가 문자에 대해:
SVG 2에서 ‘text’ 및 ‘tspan’의 ‘x’ 및 ‘y’ 속성은 프레젠테이션 속성이 아니며 CSS를 통해 설정할 수 없습니다. 이는 향후 SVG 버전에서 변경될 수 있습니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| dx, dy | [ [ <length-percentage> | <number> ]+ ]# | (없음) | 예 |
하나의 <length>가 제공되면 이 값은 이 요소 또는 그 자손 내부의 첫 번째 문자에 해당하는 글리프를 렌더링하기 위한 현재 텍스트 위치의 새로운 상대 X (Y) 좌표를 나타냅니다. 첫 번째 문자의 글리프가 렌더링되기 전에 현재 텍스트 위치는 현재 사용자 좌표계의 x축(y축)을 따라 <length>만큼 이동합니다.
쉼표 또는 공백으로 구분된 n개의 <length> 목록이 제공되면 값은 이 요소 또는 그 자손 내부의 처음 n개 주소 지정 가능한 문자에 대응하는 글리프를 렌더링하기 전에 현재 텍스트 위치에 대한 x축(y축)의 증분 이동을 나타냅니다. 따라서 각 문자에 해당하는 글리프가 렌더링되기 전에 현재 ‘text’ 요소에서 이전 문자의 글리프를 그린 결과인 현재 텍스트 위치가 현재 사용자 좌표계의 x축(y축)을 따라 <length>만큼 이동합니다.
문자보다 더 많은 <length>가 제공되면 추가 <length>는 글리프 배치에 영향을 주지 않습니다.
<length>보다 문자가 더 많거나 속성이 지정되지 않은 경우 각 추가 문자에 대해:
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| rotate | [ <number>+ ]# | (없음) | 예(비가산). |
이 요소 내부의 각 문자에 해당하는 모든 글리프에 적용되는 현재 텍스트 위치 주변의 도 단위 추가 회전입니다.
쉼표 또는 공백으로 구분된 <number> 목록이 제공되면 첫 번째 <number>는 이 요소 또는 그 자손 내부의 첫 번째 문자에 해당하는 글리프의 추가 회전을 나타내고, 두 번째 <number>는 두 번째 문자에 해당하는 글리프의 추가 회전을 나타내며, 이후에도 같은 방식입니다.
문자 수보다 더 많은 <number>가 제공되면 추가 <number>는 무시됩니다.
<number>보다 더 많은 문자가 제공되면 이러한 각 추가 문자에는 마지막 숫자로 지정된 회전 값을 사용해야 합니다.
속성이 지정되지 않았고 ‘tspan’ 요소의 조상이 ‘rotate’ 속성을 통해 주어진 문자에 대한 추가 회전을 지정한 경우 (가장 가까운 조상이 우선함), 해당 추가 회전을 주어진 문자에 적용합니다. 조상의 ‘rotate’ 속성에 지정된 <number>보다 문자가 더 많으면 이러한 각 추가 문자에는 마지막 숫자로 지정된 회전 값을 사용해야 합니다.
이 추가 회전은 글리프가 렌더링될 때 현재 텍스트 위치가 수정되는 규칙에는 영향을 주지 않으며, 경로 위의 텍스트 및 text-orientation, glyph-orientation-horizontal, 또는 glyph-orientation-vertical로 인한 회전에 추가됩니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| textLength | <length-percentage> | <number> | 아래 참조 | 예 |
이 요소 내 문자 데이터에 해당하는 모든 advance 값의 총합에 대한 작성자의 계산값으로, 글리프의 advance 값(가로 또는 세로), letter-spacing 및 word-spacing 프로퍼티의 효과와 이 ‘text’ 또는 ‘tspan’ 요소나 그 자손의 ‘dx’ 및 ‘dy’ 속성으로 인한 조정을 포함합니다. 이 값은 사용자 에이전트 자체의 계산을 작성자의 계산과 보정하는 데 사용됩니다.
이 속성의 목적은 양방향 재정렬 후 시각적 렌더링 순서에서 이 요소에 대응하는 첫 번째 및 마지막 렌더링 글리프를 정확히 정렬할 수 있도록 하는 것입니다. 따라서 마지막으로 렌더링되는 문자(양방향 재정렬 후 시각적 렌더링 순서에서)에 대해서는 사용자 에이전트가 ‘textLength’ 길이에 맞추기 위해 텍스트 문자열을 확장/압축할 적절한 양을 결정할 때 정상적인 글리프 advance를 초과하는 추가 문자 간 간격을 (대부분의 경우) 무시합니다.
주어진 요소에 ‘textLength’ 속성이 지정되고 조상에도 지정되어 있으면, 이 요소 내 모든 문자 데이터의 조정은 오직 이 요소의 ‘textLength’ 값에 의해 제어되며, 이 요소 콘텐츠의 조정 비율이 동일한 조상을 공유하는 다른 콘텐츠에 사용되는 조정 비율과 달라질 수 있다는 부작용이 있을 수 있습니다. 사용자 에이전트는 해당 조상 내 다른 콘텐츠의 총 advance 값이 그 조상의 advance 값과 이 요소의 advance 값의 차이라고 가정해야 합니다.
이 속성은 텍스트를 축소하거나 확대하는 것과 같은 효과를 얻기 위해 사용하는 것을 의도하지 않습니다.
음수 값은 오류입니다 (오류 처리 참조).
‘textLength’ 속성은 inline-size 프로퍼티가 줄바꿈 영역을 정의하지 않을 때만 적용됩니다. 또한 white-space 값이 pre 또는 pre-line이어서 강제 줄바꿈이 있는 ‘text’ 또는 ‘tspan’ 요소에는 적용되지 않습니다.
‘text’ 요소 내 어디에도 속성이 지정되지 않으면 작성자의 계산값이 사용자 에이전트가 계산한 값과 정확히 일치하는 것처럼 동작하므로 advance 조정이 이루어지지 않습니다. DOM에서 속성을 반영하기 위한 초기값은 암시적 사용자 단위로 표현된 현재 사용자 에이전트 계산 길이입니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| lengthAdjust | spacing | spacingAndGlyphs | spacing | 예 |
사용자 에이전트는 텍스트 문자열의 올바른 시작 및 끝 위치를 달성해야 하지만 중간 글리프의 위치는 예측할 수 없습니다. 사용자 에이전트가 정확한 시작 및 끝 배치와 최적의 타이포그래피 간 균형을 맞추기 위해 텍스트 문자열을 늘리거나 압축하는 고급 알고리즘을 사용할 수 있기 때문입니다.
n개의 문자를 포함하는 텍스트 문자열의 경우 advance 값 조정은 보통 n−1개의 문자에만 적용되지만( ‘textLength’ 속성 설명 참조), 글리프를 늘리거나 압축하는 것은 모든 n개 문자에 적용된다는 점에 유의하십시오.
‘text’ 및 ‘tspan’ 요소의 ‘x’, ‘y’, ‘dx’, ‘dy’ 및 ‘rotate’는 개별 글리프의 정확한 배치가 필요한 고급 타이포그래피 상황에서 유용합니다. 이러한 속성은 문자 사이의 작은 배치 조정 또는 새 텍스트 줄과 같은 시각적 효과를 얻기 위해 텍스트의 한 부분을 새 위치로 이동하는 것과 같은 큰 배치 조정에 유용합니다( SVG 1.1과 호환). ‘x’, ‘y’, ‘dx’, ‘dy’ 및 ‘rotate’ 속성은 inline-size 프로퍼티가 콘텐츠 영역을 지정하는 경우의 초기 현재 텍스트 위치를 제외하고 자동 줄바꿈 텍스트에서는 무시됩니다.
2015 Sydney F2F에서 'dx', 'dy' 및 'rotate'는 자동 줄바꿈 텍스트에서 무시하기로 결정했습니다. (기술적으로 이를 적용하는 것은 어렵지 않지만 실제로 유용하다고 보지 않았습니다.)
고급 타이포그래피 제어를 위해 미세 수준의 배치 조정이 필요한 상황에서는 SVG 콘텐츠 디자이너가 문서의 모든 뷰어에서 필요한 글꼴을 사용할 수 있도록 해야 합니다(예: 필요한 글꼴 데이터를 SVG 글꼴 또는 SVG 콘텐츠와 동일한 웹 사이트에 저장되는 대체 WebFont 형식으로 패키징) 또한 보기 소프트웨어가 글꼴을 예상한 방식으로 처리하도록 해야 합니다(기능, 특성 및 글꼴 레이아웃 메커니즘은 시스템마다 크게 다름). SVG 콘텐츠에 특정 보기 소프트웨어 집합에서 처리되는 특정 글꼴에 대응하도록 의도된 ‘x’, ‘y’, ‘dx’ 또는 ‘dy’ 속성 값이 포함되어 있는데 이 요구 사항 중 하나라도 충족되지 않으면 텍스트가 낮은 품질로 표시될 수 있습니다.
다음 추가 규칙은 숫자 목록을 포함하는 ‘x’, ‘y’, ‘dx’, ‘dy’ 및 ‘rotate’ 속성에 적용됩니다:
<tspan dx="11 12 13 14 15 0 21 22 23 0 31 32 33 34 35 36">Latin and Hebrew</tspan>
예 tspan04는 ‘tspan’ 요소의 ‘rotate’ 속성을 사용하여 렌더링할 글리프를 회전합니다. 이 예는 ‘tspan’ 요소 안의 하나의 텍스트 문자열에 ‘rotate’ 속성에 지정된 값 수보다 더 많은 문자가 포함된 경우를 보여 줍니다. 이 경우 ‘tspan’의 ‘rotate’ 속성에 지정된 마지막 값은 문자열의 나머지 문자에 적용되어야 합니다.
<?xml version="1.0" standalone="no"?>
<svg width="10cm" height="3cm" viewBox="0 0 1000 300"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>
예 tspan04 - rotate 값의 수가 문자열의
문자 수보다 적습니다.
</desc>
<text font-family="Verdana" font-size="55" fill="blue" >
<tspan x="250" y="150" rotate="-30,0,30">
안녕하세요, 저기요
</tspan>
</text>
<!-- 'rect' 요소를 사용하여 뷰포트 윤곽선을 표시합니다 -->
<rect x="1" y="1" width="998" height="298"
fill="none" stroke="blue" stroke-width="2" />
</svg>
예 tspan04
예 tspan05는 ‘text’ 요소와 하나를 제외한 모든 자식 ‘tspan’ 요소에 ‘rotate’ 속성을 지정하여 렌더링할 글리프를 회전합니다. 이 예는 ‘rotate’ 속성의 전파를 보여 줍니다.
<?xml version="1.0" standalone="no"?>
<svg width="100%" height="100%" viewBox="0 0 500 120"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>
예 tspan05 - 중첩된 tspan 요소로 회전 값이 전파되는 예.
</desc>
<text id="parent" font-family="Arial, sans-serif" font-size="32" fill="red" x="40" y="40"
rotate="5,15,25,35,45,55">
아닌
<tspan id="child1" rotate="-10,-20,-30,-40" fill="orange">
모든 문자에
<tspan id="child2" rotate="70,60,50,40,30,20,10" fill="yellow">
있는
<tspan id="child3">
것은
</tspan>
</tspan>
<tspan id="child4" fill="orange" x="40" y="90">
텍스트
</tspan>
지정된
</tspan>
<tspan id="child5" rotate="-10" fill="blue">
회전이
</tspan>
있지는 않습니다
</text>
<!-- 'rect' 요소를 사용하여 뷰포트 윤곽선을 표시합니다 -->
<rect x="1" y="1" width="498" height="118" fill="none"
stroke="blue" stroke-width="2" />
</svg>
예 tspan05
‘text’ 요소 내부의 빨간색 텍스트 회전:
"child1" ‘tspan’ 요소 내부의 주황색 텍스트 회전:
"child2" ‘tspan’ 요소 내부의 노란색 텍스트 회전:
"child5" ‘tspan’ 요소 내부의 파란색 텍스트 회전:
다음 다이어그램은 ‘text’ 요소 안에 중첩된 ‘tspan’ 요소로 회전 값이 어떻게 전파되는지를 보여 줍니다:
| SVG 2 요구 사항: | SVG Tiny 1.2의 텍스트 레이아웃 개선 사항을 포함합니다. |
|---|---|
| 결의: | SVG 2에는 문자와 글리프, 텍스트 레이아웃, 텍스트 선택, 텍스트 검색에 관한 SVG Tiny 1.2의 개선된 텍스트가 포함됩니다. |
| 목적: | 텍스트 레이아웃을 더 명확하게 설명하기 위함이며 기능적 변경은 없습니다. |
| 담당자: | Chris (ACTION-3236) |
| SVG 2 요구 사항: | 도형 안의 텍스트를 지원합니다. |
|---|---|
| 결의: | SVG 2는 CSS와 호환되는 자동 텍스트 줄바꿈을 요구합니다. |
| 목적: | 플로 차트 등의 텍스트. |
| 담당자: | Tav (조치 없음) |
이 절에서는 SVG 텍스트 레이아웃을 간략히 개관합니다. 이어지는 절에서는 텍스트 레이아웃의 다양한 측면을 더 자세히 다룹니다.
SVG의 텍스트 레이아웃은 ‘text’ 요소 하위 트리와 해당 프로퍼티 값을 입력으로 받아 각 텍스트 콘텐츠 요소의 좌표계에서 렌더링할 글리프 시퀀스와 그 위치를 생성하는 다단계 과정입니다.
먼저 ‘text’ 요소와 그 자손은 CSS에 따라 콘텐츠 영역 또는 줄바꿈 영역 안에 배치됩니다. 이때 ‘text’는 블록 요소이고 ‘tspan’, ‘textPath’ 및 ‘a’ 자손은 인라인 요소인 것처럼 처리합니다. 이 레이아웃은 이 장에서 설명한 모든 문단 수준 및 글꼴 관련 CSS 프로퍼티를 고려합니다.
콘텐츠 영역은 inline-size 프로퍼티를 설정하여 명시적으로 선언할 수 있습니다. 콘텐츠 영역이 선언되지 않으면 무한한 너비와 높이를 가진 직사각형이 기본값입니다.
둘째, ‘x’, ‘y’, ‘dx’ 및 ‘dy’ 속성으로 제공된 배치를 CSS 레이아웃 과정에서 얻은 결과 글리프 위치에 적용합니다. 허용되는 변환 규칙은 콘텐츠 영역이 명시적으로 선언되었는지 여부에 따라 달라집니다. 명시적으로 선언되지 않았다면 이 규칙은 사전 서식 지정된 텍스트의 레이아웃을 정의합니다. 선언되었다면 이 규칙은 자동 줄바꿈 텍스트의 레이아웃을 정의합니다.
셋째, 필요한 경우 text-anchor 프로퍼티의 효과를 적용합니다.
마지막으로 모든 ‘textPath’ 요소의 글리프 레이아웃을 수행하여 사전 서식 지정된 텍스트를 경로 위의 텍스트로 변환합니다.
서로 다른 유형의 텍스트 레이아웃 예:
여러 줄로 사전 서식 지정된 텍스트의 예입니다.
<svg xmlns="http://www.w3.org/2000/svg"
width="300" height="100" viewBox="0 0 300 100">
<text x="20" y="45" style="font: 24px sans-serif;">
여러 줄,
<tspan x="20" y="75">사전 서식 지정 텍스트의 예.</tspan>
</text>
</svg>
‘tspan’ 요소를 사용해 여러 줄 텍스트를 만든 사전 서식 지정된 텍스트입니다.
자동 줄바꿈 텍스트의 예입니다.
<svg xmlns="http://www.w3.org/2000/svg"
width="300" height="100" viewBox="0 0 300 100">
<text x="20" y="45" style="font: 24px sans-serif; inline-size: 250px;">
자동으로 줄바꿈되는 텍스트의 예.</text>
</svg>
자동 줄바꿈 텍스트입니다. inline-size 프로퍼티는 무한한 높이의 직사각형 콘텐츠 영역을 정의합니다 (연한 파란색으로 표시).
경로 위의 텍스트 예입니다.
<svg xmlns="http://www.w3.org/2000/svg"
width="300" height="100" viewBox="0 0 300 100">
<path id="MyPath" stroke="lightblue" fill="none"
d="M 50,50 C 100,0 200,100 250,50"/>
<text style="font: 24px sans-serif;">
<textPath href="#MyPath">경로 위의 텍스트.</textPath>
</text>
</svg>
SVG 2는 콘텐츠 영역을 지정하여 직사각형이나 다른 도형 안에서 텍스트를 자동으로 줄바꿈할 수 있는 기능을 도입합니다. SVG 줄바꿈 텍스트의 설계는 CSS 텍스트 줄바꿈을 지원하는 렌더러가 SVG 텍스트 줄바꿈을 쉽게 구현할 수 있도록 SVG 텍스트 줄바꿈이 CSS의 텍스트 줄바꿈과 최대한 호환되기를 바라는 데서 비롯되었습니다(단, HTML과 호환되지 않는 SVG 렌더러가 HTML을 구현하도록 요구하지는 않음). SVG와 CSS 텍스트 줄바꿈에는 몇 가지 차이가 있습니다. 가장 중요한 차이는 SVG에는 자동으로 유한한(또는 반유한한) 콘텐츠 영역(CSS에서는 박스 모델로 제공됨)이 없으므로 콘텐츠 영역을 명시적으로 제공해야 한다는 것입니다. 또 다른 차이는 SVG에는 줄바꿈을 만드는 <p></p> 및 <br/> 요소가 없다는 것입니다. 대신 SVG는 white-space의 pre 및 pre-line 값을 사용하여 줄바꿈을 제공합니다. SVG 줄바꿈 텍스트는 콘텐츠 생성 도구가 줄바꿈 텍스트를 지원하지 않는 SVG 1.1 렌더러에 자연스러운 대체 표시를 제공할 수도 있습니다( ‘text’ 및 ‘tspan’ 요소에서 ‘x’ 및 ‘y’ 속성을 사용하며, SVG 2 렌더러는 자동 줄바꿈 텍스트에서 이를 무시함).
SVG의 텍스트 레이아웃 옵션은 대부분의 일반적인 사용 사례를 포괄하도록 설계되었습니다. 더 복잡한 레이아웃(글머리 기호 목록, 표 등)이 필요한 경우 텍스트를 ‘foreignObject’ 요소 안에 인라인으로 임베드된 XHTML 같은 다른 XML 네임스페이스 [HTML]에서 렌더링할 수 있습니다.
콘텐츠 영역은 ‘text’ 요소에서 inline-size 프로퍼티를 지정하여 정의합니다. 콘텐츠 영역이 제공되지 않으면 콘텐츠 영역은 기본적으로 무한한 너비와 높이의 직사각형입니다( 사전 서식 지정된 텍스트 절 참조).
줄바꿈 텍스트는 줄바꿈 영역 안에 배치됩니다. 줄바꿈 영역은 콘텐츠 영역과 같습니다.
줄바꿈 영역이 정의되면 텍스트는 CSS 규칙에 따라 줄바꿈 영역 안에 배치됩니다 (이 절에 제시된 특수 규칙을 준수함).
다음 결의에 따라 'extent'가 추가되었습니다: 2015년 2월 12일. 'extent'는 2013년 6월 27일 결의로 추가된 'width' 및 'height' 속성을 대체합니다. 다음 결의에 따라 'inline-size' 프레젠테이션 속성으로 대체되었습니다: Linkoping F2F, 2015년 6월 11일.
inline-size 프로퍼티를 사용하면 줄바꿈 영역을 직사각형 도형으로 설정할 수 있습니다. 프로퍼티의 계산값은 가로 텍스트에서는 직사각형의 너비를, 세로 텍스트에서는 직사각형의 높이를 설정합니다. 다른 차원(가로 텍스트의 높이, 세로 텍스트의 너비)은 무한한 길이입니다. 값이 0이면 줄바꿈 영역 생성이 비활성화됩니다.
초기 현재 텍스트 위치는 ‘text’ 요소(또는 ‘text’ 요소에 속성이 없으면 첫 번째 자식 ‘tspan’ 요소)의 ‘x’ 및 ‘y’ 속성에서 가져옵니다. 왼쪽에서 오른쪽 텍스트의 경우 초기 현재 텍스트 위치는 직사각형 왼쪽에 있습니다. 오른쪽에서 왼쪽 텍스트의 경우 직사각형 오른쪽에 있습니다. 세로 텍스트의 경우 초기 현재 텍스트 위치는 직사각형 위쪽에 있습니다.
그런 다음 직사각형(줄바꿈 영역)은 text-anchor 프로퍼티에 따라 고정되며 줄바꿈 영역의 가장자리를 사용하여 시작, 중앙 및 끝 위치를 결정합니다.
inline-size 프로퍼티로 텍스트를 줄바꿈하는 방법은 작성자가 텍스트 블록의 너비 또는 높이에 제한을 주는 사전 서식 지정된 SVG 텍스트의 확장입니다. 따라서 ‘x’ 및 ‘y’ 속성과 direction 및 text-anchor 프로퍼티를 함께 사용하여 텍스트의 첫 줄을 배치합니다.
| 이름: | inline-size |
|---|---|
| 값: | auto | <length-percentage> |
| 초기값: | auto |
| 적용 대상: | ‘text’ 요소 |
| 상속: | 아니요 |
| 백분율: | 현재 SVG 뷰포트의 너비(가로 텍스트) 또는 높이(세로 텍스트)를 참조합니다 (단위 참조) |
| 미디어: | 시각 |
| 계산값: | 절대 길이 또는 백분율 |
| 애니메이션 유형: | 계산값에 따라 |
가로 텍스트를 줄바꿈하기 위해 inline-size를 사용하는 예입니다.
<svg xmlns="http://www.w3.org/2000/svg"
width="300" height="100" viewBox="0 0 300 100">
<text x="50" y="30" style="font: 20px sans-serif; inline-size: 200px">
이 텍스트는 200픽셀에서 줄바꿈됩니다.
</text>
</svg>
오른쪽에서 왼쪽으로 흐르는 가로 텍스트를 줄바꿈하기 위해 inline-size를 사용하는 예입니다.
<svg xmlns="http://www.w3.org/2000/svg"
width="300" height="100" viewBox="0 0 300 100">
<text x="250" y="30"
style="font: 20px PakType Naqsh; inline-size: 200px; direction: rtl;">
هذا النص يلتف في 200 بكسل.</text>
</svg>
오른쪽에서 왼쪽 텍스트의 가로 텍스트 줄바꿈입니다. 연한 파란색 선은 콘텐츠 영역의 한계를 나타냅니다. 콘텐츠 영역의 높이는 무한하다는 점에 유의하십시오. 빨간색 점은 초기 현재 텍스트 위치를 보여 줍니다.
일부 브라우저는 이 SVG 1.1 그림을 올바르게 렌더링하지 못할 수 있습니다. Batik과 Firefox는 올바르게 처리하는 것으로 보입니다. Chrome에 버그가 제출되었습니다.
세로 텍스트를 줄바꿈하기 위해 inline-size를 사용하는 예입니다.
<svg xmlns="http://www.w3.org/2000/svg"
width="100" height="300" viewBox="0 0 100 300">
<text x="62.5" y="25" inline-size="200"
style="font: 25px IPAMincho; inline-size: 200px; writing-mode: vertical-rl;">
テキストは10文字後に折り返されます。</text>
</svg>
세로 텍스트 줄바꿈입니다. 연한 파란색 선은 콘텐츠 영역의 한계를 나타냅니다. 콘텐츠 영역의 너비는 무한하다는 점에 유의하십시오. 빨간색 점은 초기 현재 텍스트 위치를 보여 줍니다.
이 SVG 1.1 이미지는 Firefox에서, nightly에서도 작동하지 않습니다. Firefox는 프레젠테이션 속성 'writing-mode'를 지원하지 않습니다. Firefox에 버그가 제출되었습니다.
중앙에 고정된 가로 텍스트를 줄바꿈하기 위해 inline-size를 사용하는 예입니다.
<svg xmlns="http://www.w3.org/2000/svg"
width="300" height="100" viewBox="0 0 300 100">
<text x="50" y="30" style="font: 20px sans-serif; inline-size: 200px; text-anchor: middle">
이 텍스트는 200픽셀에서 줄바꿈됩니다.
</text>
</svg>
텍스트 레이아웃은 CSS 기반 텍스트 렌더러에 텍스트 데이터와 스타일 정보 및 채울 하나 이상의 도형에 대한 설명을 포함하는 ‘text’ 요소의 콘텐츠를 전달하는 것으로 시작합니다. ‘text’ 요소는 블록 요소로 처리되고, 그 자손 ‘tspan’, ‘textPath’ 및 ‘a’ 요소는 인라인 요소로 처리됩니다. CSS 렌더러는 텍스트가 절대 배치된 것처럼 텍스트를 배치하여 얻은 위치와 함께 타이포그래피 문자 집합을 반환합니다.
타이포그래피 문자는 둘 이상의 글리프를 포함할 수 있습니다. 여기서는 타이포그래피 문자 내부 글리프의 상대적 배치가 타이포그래피 문자 자체에 캡슐화되어 있으며 사용자가 제어할 수 없다고 가정합니다.
콘텐츠 영역이 정의되면 주어진 ‘text’ 요소에 대한 타이포그래피 문자와 그 위치를 결정하기 위해 다음 알고리즘을 사용합니다:
이는 writing-mode가 horizontal-tb이면 박스 너비를 inline-size 값으로 설정하고, 그렇지 않으면 박스 높이를 inline-size 값으로 설정하여 텍스트를 배치한다는 의미입니다.
여러 CSS 프로퍼티는 SVG 텍스트 레이아웃에 영향을 주지 않거나 제한적으로만 영향을 줍니다:
이는 ‘text’ 요소가 블록 요소인 것처럼 처리되도록 보장합니다.
이는 ‘tspan’, ‘textPath’ 및 ‘a’ 요소가 인라인 요소인 것처럼 처리되도록 보장합니다. 참고: transform 프로퍼티는 인라인 요소에 영향을 주지 않습니다.
이는 ‘text’ 요소 내부의 그래픽 및 메타데이터 요소가 렌더링되지 않도록 보장합니다.
다양한 SVG 속성 및 프로퍼티는 콘텐츠 영역이 정의된 방식에 따라 타이포그래피 문자를 재배치할 수 있습니다:
다음 SVG 텍스트 레이아웃 알고리즘은 ‘text’ 요소의 하위 트리에 있는 DOM의 각 문자에 대한 출력 정보를 반환합니다. 이 정보에는 다음이 포함됩니다:
SVG 속성 ‘x’, ‘y’, ‘dx’, ‘dy’, 및 ‘rotate’ 에 제공된 배열은 주소 지정 가능한 문자를 기준으로 인덱싱됩니다. 그러나 재배치는 타이포그래피 문자에 적용됩니다. 타이포그래피 문자가 둘 이상의 문자에 대응하는 경우(예: 합자), 첫 번째 문자에 해당하는 배열 값만 타이포그래피 문자를 배치하는 데 사용됩니다. 타이포그래피 문자의 다른 문자에 대응하는 배열 값은 ‘x’ 및 ‘y’의 경우 건너뛰고, ‘dx’ 및 ‘dy’의 경우 누적하여 다음 타이포그래피 문자에 적용하며, ‘rotate’의 경우 배열의 마지막 값이면 뒤따르는 타이포그래피 문자에 적용합니다. 이는 예를 들어 글꼴에 특정 합자가 있는지 여부와 관계없이 속성 값이 동일한 문자에 적용되도록 보장합니다.
SVG 전용 텍스트 레이아웃 알고리즘은 다음과 같습니다:
white-space 프로퍼티가 줄바꿈을 발생시키지 않는 한 이는 한 줄의 텍스트가 됩니다.
result에서 인덱스 i인 각 배열 요소에 대해:
다음 ‘text’ 요소에 글리프 배치 속성으로 주소를 지정할 수 없는 축소 가능한 공백이 있으므로 (표준 글꼴 사용) "B" 글리프는 x=300에 배치됩니다.
<text x="100 200 300"> A B </text>
이는 "A" 앞의 공백과 "A"와 "B" 사이의 공백 문자 중 하나를 제외한 모두가 축소되거나 잘리기 때문입니다.
이는 text-anchor에 의해 이동된 청크가 여러 줄에 걸치지 않도록 보장합니다.
노드가 지정한 배치 조정(예: ‘x’ 속성 값)은 그 노드의 모든 문자와 노드 자손의 문자에도 적용됩니다. 그러나 자손 노드에 지정된 조정은 조상 노드의 조정을 재정의합니다. 이 절에서는 어떤 조정을 어떤 문자에 적용할지 결정합니다. 또한 result의 rotate 좌표를 직접 설정합니다.
node를 입력으로 받고 다음 단계를 수행하는 재귀 절차입니다:
i는 노드의 주소 지정 가능한 문자의 인덱스이고, j는 노드의 모든 문자의 인덱스입니다.
이 루프는 ‘x’, ‘y’, ‘dx’, ‘dy’ 및 ‘rotate’ 속성을 node 안의 콘텐츠에 적용합니다.
플래그를 false로 설정하면 ‘text’ 요소에 설정된 ‘x’ 및 ‘y’ 속성이 생성해서는 안 되는 경우 ‘textPath’ 요소에 anchored chunk를 생성하지 않도록 보장합니다.
‘x’ 속성은 경로 위의 세로 텍스트에서 무시됩니다.
‘y’ 속성은 경로 위의 가로 텍스트에서 무시됩니다.
‘textPath’ 요소는 항상 anchored chunk를 생성합니다.
‘dx’ 및 ‘dy’ 조정은 ‘textLength’ 속성으로 인한 조정보다 먼저 적용되고 ‘x’, ‘y’ 및 ‘rotate’ 조정은 이후에 적용됩니다.
node를 입력으로 받고 다음 단계를 수행하는 재귀 절차입니다:
자식 노드는 부모 노드보다 먼저 조정됩니다.
이 루프는 node 안의 타이포그래피 문자의 가장 왼쪽(가장 위쪽) 및 가장 오른쪽(가장 아래쪽) 범위를 찾고 강제 줄바꿈을 확인합니다.
사용자 에이전트는 node의 마지막 타이포그래피 문자를 "horizontal" 플래그가 true이고 direction이 lrt이면 양의 x 방향으로 delta만큼, "horizontal" 플래그가 true이고 direction이 rtl이면 음의 x 방향으로, 그렇지 않으면 양의 y 방향으로 이동해야 합니다. 사용자 에이전트는 최적의 타이포그래피를 위해 중간 타이포그래피 문자를 자유롭게 조정할 수 있습니다. 다음 단계는 ‘lengthAdjust’ 값이 spacing일 때 타이포그래피 문자를 조정하는 한 가지 방법을 나타냅니다.
각 결정된 자손 노드는 이 문맥에서 하나의 타이포그래피 문자인 것처럼 처리됩니다.
이 루프는 ‘x’ 및 ‘y’ 값을 적용하고, text-anchor 청크가 타이포그래피 문자 중간에서 시작하지 않도록 보장합니다.
이 루프는 각 anchored chunk를 순회합니다.
이 루프는 anchored chunk 안의 타이포그래피 문자의 가장 왼쪽(가장 위쪽) 및 가장 오른쪽(가장 아래쪽) 범위를 찾습니다.
여기서 텍스트 앵커링을 수행합니다.
여기서 ‘textPath’ 배치를 적용합니다.
사용자 에이전트는 ‘spacing’ 값이 'auto'이거나 ‘method’ 값이 'stretch'인 경우 고품질 조판을 보장하기 위해 필요한 추가 조정을 mid에 자유롭게 적용할 수 있습니다.
이는 하나의 닫힌 하위 경로에 대한 특수 줄바꿈 기준을 구현합니다.
mid = mid mod length로 설정합니다.
이는 ‘textPath’ 요소 뒤에 나타나는 모든 문자의 렌더링 시작점을 경로의 끝으로 설정합니다.
| SVG 2 요구 사항: | 텍스트 레이아웃 기능에 대해 CSS와 일치시킵니다. |
|---|---|
| 결의: | SVG 2는 SVG에 특정되지 않은 텍스트 레이아웃 (공백, bidi 등)에 CSS3 정의를 사용합니다. |
| 목적: | HTML과 SVG에서 텍스트 레이아웃의 명세 및 구현을 공유하기 쉽게 하기 위함입니다. |
| 담당자: | Cameron 및 Chris (ACTION-3004, ACTION-3005) |
이 옵션은 기본 SVG 1.1 텍스트 레이아웃에 해당합니다.
이는 기본 텍스트 레이아웃 방법이며 명시적으로 정의된 콘텐츠 영역이 없을 때 사용됩니다. 또한 경로 위의 텍스트를 배치하는 첫 단계로도 사용됩니다(규칙이 약간 수정됨). 이 레이아웃 방법에서는 자동 줄바꿈이나 단어 줄바꿈이 수행되지 않습니다. 명목상 텍스트는 무한한 너비와 높이의 직사각형 콘텐츠 영역 안에서 한 줄로 렌더링됩니다. 여러 줄의 텍스트는 줄바꿈을 미리 계산하고 다음 방법 중 하나를 사용하여 만들 수 있습니다:
SVG 2에서 새로 추가되었습니다.
다음 프로퍼티는 사전 서식 지정된 텍스트에 적용되지 않습니다: text-align, text-align-last, line-break, word-break, hyphens, word-wrap, 및 overflow-wrap.
여러 줄의 사전 서식 지정된 텍스트는 white-space 값 pre 또는 pre-line을 사용하여 만들 수 있습니다. 이 경우 줄바꿈 문자 또는 캐리지 리턴은 강제 줄바꿈으로 보존되어 새 라인 박스를 생성합니다. 라인 박스는 CSS 규칙에 따라 쌓입니다.
기본 CSS 텍스트 레이아웃 규칙에 따라 텍스트가 배치된 후 SVG 전용 규칙을 사용하여 타이포그래피 문자를 재배치할 수 있습니다. 절대 재배치는 ‘x’ 및 ‘y’ 속성에 절대 좌표를 지정하거나 강제 줄바꿈을 통해 지정할 수 있습니다. 절대 재배치는 text-anchor 프로퍼티의 영향을 받을 수 있습니다. 상대 재배치는 ‘dx’ 및 ‘dy’ 속성에 상대 좌표를 지정하여 수행할 수 있습니다. 해당 타이포그래피 문자는 ‘rotate’ 속성에 값 목록을 지정하여 임의로 회전할 수 있습니다. 절대 재배치(text-anchor 프로퍼티로 인한 모든 조정 포함)는 상대 재배치 및 회전보다 먼저 수행됩니다.
‘text’ 요소에 콘텐츠 영역이 지정되면 텍스트가 자동으로 줄바꿈됩니다. 콘텐츠 영역은 텍스트 줄바꿈을 위한 가장 바깥쪽 컨테이너를 정의합니다. 줄바꿈 영역은 콘텐츠 영역과 같습니다.
콘텐츠 영역이 inline-size 프로퍼티로 정의되는 경우, 처음 렌더링된 타이포그래피 문자에 대응하는 ‘x’ 및 ‘y’ 속성이 초기 현재 텍스트 위치를 정의합니다.
초기 현재 텍스트 위치를 결정하는 데 사용되는 경우를 제외하고 ‘text’ 및 ‘tspan’ 요소의 자동 줄바꿈 텍스트에서는 모든 ‘x’ 및 ‘y’ 값이 무시됩니다.
‘x’ 및 ‘y’ 속성은 줄바꿈 텍스트를 위한 SVG1.1 렌더러에 자연스러운 대체 메커니즘을 제공할 수 있습니다. 콘텐츠 제작자는 텍스트를 ‘x’ 및 ‘y’ 속성이 있는 ‘tspan’ 요소로 줄을 나누어 미리 배치할 수 있습니다. 그러면 예를 들어 대체 글꼴이 텍스트를 렌더링하는 데 사용되는 경우 SVG2 렌더러는 ‘x’ 및 ‘y’ 속성을 무시하고 대체 글꼴의 글꼴 메트릭을 사용하여 텍스트를 다시 배치합니다. SVG1.1 렌더러는 ‘x’ 및 ‘y’ 속성을 사용하여 텍스트를 렌더링하며, 렌더링이 도형과 일치하지 않더라도 일반적으로 읽을 수 있는 텍스트가 됩니다. 이 절의 많은 텍스트 줄바꿈 예제는 텍스트 줄바꿈을 구현하지 않은 브라우저에서 텍스트를 렌더링하기 위해 이 메커니즘에 의존합니다.
다음 예제는 도형 안에 텍스트를 배치할 때 발생하는 몇 가지 문제를 보여 줍니다.
임의의 도형인 줄바꿈 영역이 주어졌을 때 첫 번째 라인 박스는 상단(또는 세로 텍스트의 경우 측면)에 꼭 맞지 않을 수 있습니다. 이 경우 첫 번째 라인 박스는 맞을 때까지 이동합니다.
CSS에서는 도형의 가장자리를 일련의 1픽셀 × 1 픽셀 플로트로 취급합니다.
향후 CSS 명세에서는 서로 다른 줄바꿈 영역 간의 텍스트 정렬을 허용하기 위해 텍스트 첫 줄의 위치를 제어하는 데 사용할 수 있는 라인 그리드를 정의할 수 있습니다.
가능한 가장 작은 텍스트 블록으로 구성된 위쪽 라인 박스(작은 연한 파란색 직사각형)는 라인 박스가 줄바꿈 영역(연한 파란색 경로) 안에 들어갈 때까지 아래로 이동합니다. 라인 박스에는 여기서 1.25로 설정된 line-height 프로퍼티의 효과가 포함된다는 점에 유의하십시오. 빨간색 직사각형은 각 라인 박스의 글리프를 꼭 맞게 감쌉니다.
이는 줄바꿈 영역의 상단이 라인 그리드의 원점 역할을 했던 SVG 1.2 초안과 다른 것으로 보입니다. 첫 줄은 도형 안에 들어갈 때까지 줄 높이만큼 아래로 이동했습니다.
임의의 도형인 줄바꿈 영역이 주어졌을 때 한 줄의 텍스트가 둘 이상의 부분으로 나뉠 수 있습니다. 이 경우 각 부분에 대해 라인 박스를 생성합니다. 한 줄 텍스트의 모든 라인 박스 높이는 같아야 합니다 (모든 부분이 동일한 기준선을 갖도록 보장). 이 높이는 해당 텍스트 줄의 모든 글리프를 살펴 계산합니다.
이 기본 동작은 2016년 시드니 CSS/SVG 공동 워킹 그룹 회의에서 합의되었습니다.
향후 CSS 명세에서는 여러 부분으로 나뉜 도형의 어느 부분을 채울지 제어할 수 있도록 할 수 있습니다(예: 가장 오른쪽 부분만 채우기, 가장 왼쪽 부분만 채우기 등).
SVG는 ‘path’ 요소 또는 기본 도형의 동등한 경로로 정의된 경로를 따라 텍스트를 배치할 수 있습니다. 이는 텍스트를 ‘textPath’ 요소 안에 포함하여 지정하며, 이 요소는 ‘path’ 요소 또는 기본 도형을 가리키는 URL 참조가 있는 ‘href’ 속성을 갖거나, ‘path’ 속성에 경로 데이터를 직접 지정하는 값을 지정합니다.
기본 도형을 따라 텍스트를 배치하는 기능은 SVG 2에서 새로 추가되었습니다.
기본 도형을 따라 텍스트를 배치하는 것은 시드니 (2015) 회의에서 결의되었습니다.
경로를 지정하기 위해 'd' 속성을 직접 사용하는 기능이 SVG 2에 추가되었습니다. 'd' 속성은 런던 (2016) 편집자 회의에서 'd'가 프레젠테이션 속성으로 승격된 것과 동시에 'path'로 이름이 변경되었습니다.
경로 위의 텍스트는 개념적으로 한 줄의 사전 서식 지정된 텍스트를 경로를 따르도록 변환한 것과 같습니다. 별도로 명시되지 않는 한 사전 서식 지정된 텍스트에 적용되는 모든 프로퍼티는 경로 위의 텍스트에도 적용됩니다.
| SVG 2 요구 사항: | 텍스트 경로 늘이기 방법을 더 정밀하게 설명합니다. |
|---|---|
| 결의: | >'textPath' 요소의 method="stretch"를 명확히 합니다. |
| 목적: | 기능의 상호운용성을 개선합니다. |
| 담당자: | Cameron (조치 없음) |
‘path’ 속성과 ‘href’ 속성은 모두 타이포그래피 문자가 렌더링될 경로를 지정합니다.
두 속성이 모두 ‘textPath’ 요소에 지정되면 사용할 경로는 다음 우선순위를 따라야 합니다:
‘path’ 속성이 지정되었지만 경로 데이터가 유효한 경로 세그먼트를 하나도 생성하지 못하는 경우(예: 값이 빈 문자열이거나 유효한 경로 세그먼트가 하나라도 생성되기 전에 경로 데이터 오류가 발생하는 경우), 대신 ‘href’ 속성을 사용해야 합니다. ‘path’ 속성이 첫 번째 오류 전에 유효한 경로 세그먼트를 포함하면 경로 데이터의 오류 처리 규칙에 따라 오류가 발생한 지점까지 경로를 사용하며, ‘href’ 속성은 대체 수단으로 사용되지 않습니다.
사용자 에이전트의 경로를 따른 거리 알고리즘을 사용하여 계산한 초기 현재 텍스트 위치에 대한 경로 시작점으로부터의 오프셋으로, 경로를 ‘textPath’ 요소의 좌표계로 변환한 후 적용됩니다.
백분율이 아닌 <length>가 제공되면 ‘startOffset’은 ‘textPath’ 요소의 현재 사용자 좌표계에서 측정된 경로를 따른 거리를 나타냅니다.
백분율이 제공되면 ‘startOffset’은 전체 경로를 따른 백분율 거리를 나타냅니다. 따라서 startOffset="0%"는 경로의 시작점을 나타내고 startOffset="100%"는 경로의 끝점을 나타냅니다.
음수 값과 경로 길이보다 큰 값 (예: 150%)도 허용됩니다.
값을 0%-100% 범위로 제한하면 경로를 따라 텍스트가 이동하는 것과 같은 효과를 쉽게 만들 수 없습니다.
중간점이 경로 위에 있지 않은 타이포그래피 문자는 렌더링되지 않습니다.
‘startOffset’ 속성 값에 따른 렌더링입니다. 위에서 아래로: 기본값, 50%, -50%.
아래쪽 경로는 경로 왼쪽에 "path."만 표시해야 합니다. Chrome과 Safari 모두 0%에서 100% 범위를 벗어난 오프셋을 처리하지 못합니다. Chrome 버그 https://bugs.chromium.org/p/chromium/issues/detail?id=476554
하나의 닫힌 하위 경로로 구성된 경로 (기본 도형의 동등한 경로 포함)의 경우 타이포그래피 문자는 경로를 한 바퀴 완전히 따라 렌더링됩니다. 텍스트는 ‘startOffset’ 속성이 설정한 경로상의 위치에 text-anchor 프로퍼티가 결정한 대로 정렬됩니다. start (end) 값의 경우 텍스트는 줄의 시작(끝)에서 경로상의 초기 위치에 다시 도달할 때까지 렌더링됩니다. middle의 경우 텍스트는 중간점에서 양방향으로 렌더링되어 경로상의 초기 위치에서 양방향으로 동일한 거리에 있는 지점에 도달할 때까지 계속됩니다.
서로 다른 ‘startOffset’ 속성 값을 사용하여 ‘circle’을 참조하는 경로 위 텍스트의 렌더링입니다. 왼쪽: 0. 오른쪽: 75% 또는 -25%. 빨간색 원은 경로의 시작을 표시합니다( 원을 경로로 정규 분해한 후).
서로 다른 text-anchor 속성 값을 사용하여 ‘circle’을 참조하는 경로 위 텍스트의 렌더링입니다. 왼쪽: 'start'. 가운데: 'middle'. 오른쪽: 'end'. 빨간색 원은 경로의 시작을 표시합니다( 원을 경로로 정규 분해한 후). 파란색 사각형은 렌더링 시작의 기준점을 표시합니다( ‘startOffset’ 값 75%만큼 경로 시작에서 이동됨). 회색 화살표는 타이포그래피 문자 배치 방향과 타이포그래피 문자 배치가 멈추는 지점을 보여 줍니다. direction 프로퍼티 값이 rtl이면 화살표 방향은 반대가 됩니다.
모든 글리프를 렌더링하는 것은 시드니 (2015) 회의에서 기본 도형에 대해 합의되었습니다(회의록에는 누락됨). 하나의 닫힌 하위 경로로 된 경로와 'startOffset' 속성이 영향을 주는 한 번의 순환으로 줄바꿈을 제한하는 것은 런던 (2016) 편집자 회의에서 합의되었습니다.
경로를 따라 텍스트를 렌더링할 방법을 나타냅니다.
align 값은 타이포그래피 문자를 단순한 2×3 행렬 변환으로 렌더링하여 타이포그래피 문자의 늘이기/워핑이 없도록 함을 나타냅니다. 일반적으로 렌더링할 각 타이포그래피 문자에 대해 추가 회전, 크기 조정 및 이동 변환을 수행합니다. 그 결과 align에서는 타이포그래피 문자가 서로 연결되도록 설계된 글꼴(예: 필기체 글꼴)의 경우 텍스트가 경로를 따라 렌더링될 때 연결부가 올바르게 맞지 않을 수 있습니다.
stretch 값은 타이포그래피 문자의 윤곽을 경로로 변환한 다음 모든 끝점과 제어점을 경로에서 수직인 벡터를 따라 오도록 조정하여 글리프를 늘리고 경우에 따라 워핑함을 나타냅니다. 이 접근 방식에서는 필기체 문자 체계와 같은 연결된 타이포그래피 문자가 연결을 유지합니다. (수직이 아닌 직선 경로 세그먼트는 수평 직선 경로가 타이포그래피 문자가 렌더링되는 경로로부터 (대략) 일정한 오프셋을 갖도록 베지어 곡선으로 변환하는 것이 좋습니다.)
서로 다른 ‘method’ 값에 대한 경로 위 텍스트의 렌더링: 왼쪽: 'align'. 오른쪽: 'stretch'.
사용자 에이전트가 경로를 따라 렌더링할 타이포그래피 문자 사이의 간격을 어떻게 결정해야 하는지를 나타냅니다.
exact 값은 타이포그래피 문자를 경로 위 텍스트 레이아웃 규칙에 지정된 간격 규칙에 정확히 따라 렌더링해야 함을 나타냅니다.
auto 값은 사용자 에이전트가 시각적으로 보기 좋은 결과를 얻기 위해 타이포그래피 문자 사이의 간격을 조정하는 경로 위 텍스트 레이아웃 알고리즘을 사용해야 함을 나타냅니다.
텍스트가 배치되는 경로의 측면을 (경로 방향을 기준으로) 결정합니다. right 값을 지정하면 실질적으로 경로가 반전됩니다.
닫힌 하위 경로 및 기본 도형(예: 직사각형, 원 및 타원)의 안쪽 또는 바깥쪽에 텍스트를 배치할 수 있도록 SVG 2에 추가되었습니다.
'side' 추가는 시드니 (2015) 회의에서 결의되었습니다.
타이포그래피 문자가 렌더링될 경로를 설명하는 경로 데이터 문자열입니다. 속성이 지정되지 않았거나 경로 데이터가 유효한 경로 세그먼트를 생성하지 못하는 경우(예: 값이 빈 문자열이거나 유효한 경로 세그먼트보다 먼저 오류가 발생하는 경우) 대신 ‘href’로 지정된 경로를 사용합니다. 경로 데이터에 오류가 있지만 오류 전에 적어도 하나의 유효한 경로 세그먼트를 생성하면 경로 데이터의 오류 처리 규칙에 따라 경로의 유효한 부분을 사용합니다.
‘path’ 속성이 제공되지 않은 경우 글리프가 렌더링될 ‘path’ 요소 또는 기본 도형 요소에 대한 URL 참조입니다. 이 속성을 사용했는데 <url>이 유효하지 않은 참조인 경우(예: 해당 요소가 존재하지 않거나 참조된 요소가 ‘path’ 요소 또는 기본 도형이 아닌 경우), ‘textPath’ 요소는 오류 상태가 되며 사용자 에이전트는 해당 요소의 전체 콘텐츠를 렌더링해서는 안 됩니다.
URL 참조 속성 및 폐기된 XLink 속성에 정의된 공통 처리를 참조하십시오.
참조된 ‘path’ 요소 또는 기본 도형 요소 내부의 경로 데이터 좌표는 ‘path’ 요소가 정의된 좌표계가 아니라 현재 ‘text’ 요소와 동일한 좌표계에 있는 것으로 간주합니다. 참조된 ‘path’ 요소 또는 기본 도형 요소의 transform 속성은 현재 ‘text’ 요소의 현재 사용자 좌표계를 기준으로 한 추가 변환을 나타내며, 현재 ‘text’ 요소의 가능한 transform 프로퍼티로 인한 현재 사용자 좌표계 조정도 포함합니다. 예를 들어 다음 SVG 콘텐츠 조각:
<svg xmlns="http://www.w3.org/2000/svg"> <g transform="translate(25,25)"> <defs> <path id="path1" transform="scale(2)" d="M0,10 L40,20 80,10" fill="none" stroke="red"/> </defs> </g> <text transform="rotate(45)"> <textPath href="#path1">경로 위의 텍스트</textPath> </text> </svg>
는 다음과 동일한 효과를 가져야 합니다:
<svg xmlns="http://www.w3.org/2000/svg"> <g transform="rotate(45)"> <defs> <path id="path1" transform="scale(2)" d="M0,10 L40,20 80,10" fill="none" stroke="red"/> </defs> <text> <textPath href="#path1">경로 위의 텍스트</textPath> </text> </g> </svg>
그리고 다음과 동등해야 합니다:
<svg xmlns="http://www.w3.org/2000/svg"> <text transform="rotate(45)"> <textPath path="M0,20 L80,40 160,20" >경로 위의 텍스트</textPath> </text> </svg>
transform="translate(25,25)"는
‘textPath’ 요소에 영향을 주지
않지만,
transform="rotate(45)"는
‘text’와 경로 위의 텍스트의 참조 도형으로
‘path’ 요소를 사용하는 것 모두에 적용된다는
점에 유의하십시오. 또한
transform="scale(2)"는
경로의 크기를 조정하지만(단순한 선형 경로에서 모든 좌표에 2를 곱하는 것과 동등),
경로를 따라 배치된 텍스트의 크기는 조정하지 않습니다.
예 toap01은 경로 위 텍스트의 간단한 예를 제공합니다:
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="3.6cm" viewBox="0 0 1000 300" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<defs>
<path id="MyPath"
d="M 100 200
C 200 100 300 0 400 100
C 500 200 600 300 700 200
C 800 100 900 100 900 100" />
</defs>
<desc>예 toap01 - 경로 위의 간단한 텍스트</desc>
<use href="#MyPath" fill="none" stroke="red" />
<text font-family="Verdana" font-size="42.5" fill="blue" >
<textPath href="#MyPath">
우리는 올라갔다가 내려가고 다시 올라갑니다
</textPath>
</text>
<!-- 'rect' 요소를 사용하여 뷰포트 윤곽선을 표시합니다 -->
<rect x="1" y="1" width="998" height="298"
fill="none" stroke="blue" stroke-width="2" />
</svg>
예 toap01
예 toap02는 ‘textPath’ 요소 내부에 ‘tspan’ 요소를 포함하여 스타일 속성을 조정하고 특정 글리프를 렌더링하기 전에 현재 텍스트 위치를 조정할 수 있는 방법을 보여 줍니다. "up"이라는 단어의 첫 번째 출현은 빨간색으로 채워집니다. ‘dy’ 속성을 사용하여 "up"이라는 단어를 기준선에서 위로 올립니다.
‘x’, ‘y’, ‘dx’, ‘dy’ 및 ‘rotate’ 속성은 ‘text’ 및 ‘tspan’ 요소에만 지정할 수 있습니다 (하지만 경로 위 텍스트의 글리프 렌더링에 영향을 줄 수 있음 — 경로 위 텍스트 레이아웃 규칙 참조).
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="3.6cm" viewBox="0 0 1000 300" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<defs>
<path id="MyPath"
d="M 100 200
C 200 100 300 0 400 100
C 500 200 600 300 700 200
C 800 100 900 100 900 100" />
</defs>
<desc>예 toap02 - textPath 안의 tspan</desc>
<use href="#MyPath" fill="none" stroke="red" />
<text font-family="Verdana" font-size="42.5" fill="blue" >
<textPath href="#MyPath">
우리는
<tspan dy="-30" fill="red" >
올라갔다가
</tspan>
<tspan dy="30">
,
</tspan>
내려가고 다시 올라갑니다
</textPath>
</text>
<!-- 'rect' 요소를 사용하여 뷰포트 윤곽선을 표시합니다 -->
<rect x="1" y="1" width="998" height="298"
fill="none" stroke="blue" stroke-width="2" />
</svg>
예 toap02
예 toap03은 ‘textPath’ 요소의 ‘startOffset’ 속성을 사용하여 경로를 따른 특정 위치를 텍스트 문자열의 시작 위치로 지정하는 방법을 보여 줍니다. 경로 끝을 벗어난 글리프는 렌더링되지 않는다는 점에 유의하십시오 (경로 위 텍스트 레이아웃 규칙 참조).
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="3.6cm" viewBox="0 0 1000 300" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<defs>
<path id="MyPath"
d="M 100 200
C 200 100 300 0 400 100
C 500 200 600 300 700 200
C 800 100 900 100 900 100" />
</defs>
<desc>예 toap03 - startOffset 속성이 있는 경로 위 텍스트</desc>
<use href="#MyPath" fill="none" stroke="red" />
<text font-family="Verdana" font-size="42.5" fill="blue" >
<textPath href="#MyPath" startOffset="80%">
우리는 올라갔다가 내려가고 다시 올라갑니다
</textPath>
</text>
<!-- 'rect' 요소를 사용하여 뷰포트 윤곽선을 표시합니다 -->
<rect x="1" y="1" width="998" height="298"
fill="none" stroke="blue" stroke-width="2" />
</svg>
예 toap03
개념적으로 경로 위의 텍스트에서는 대상 경로를 가로 또는 세로 직선 세그먼트로 펼칩니다. 가로 텍스트 레이아웃 흐름의 경우 경로를 가상의 가로 선분으로 펼쳐 경로 시작이 선분의 왼쪽에 매핑되도록 합니다. 세로 텍스트 레이아웃 흐름의 경우 경로를 가상의 세로 선분으로 펼쳐 경로 시작이 선분의 위쪽에 매핑되도록 합니다. 표준 텍스트 레이아웃 규칙을 가상의 직선 세그먼트에 적용한 다음 결과를 대상 경로에 다시 매핑합니다. 세로 및 양방향 텍스트 레이아웃 규칙도 경로 위 텍스트에 적용됩니다.
경로를 따른 각 글리프의 방향은 개별적으로 결정됩니다.
가로 텍스트 레이아웃 흐름의 경우 주어진 글리프의 기본 방향(위쪽
방향)은 글리프가
부착된 경로의 교차점에서 시작하여
해당 교차점에서 곡선 각도보다 시계 반대 방향으로 90도인
방향을 가리키는 벡터를 따릅니다.
세로 텍스트 레이아웃 흐름의 경우 주어진 글리프의 기본 방향은
글리프가 부착된 경로의 교차점에서 시작하여
교차점에서 곡선 각도보다 180도인
방향을 가리키는 벡터를 따릅니다.
경로를 따른 기본 글리프 방향입니다. 왼쪽: 가로 텍스트. 오른쪽: 세로 텍스트.
예 toap04는 직선의 가로 또는 세로 텍스트에 대한 기본 텍스트 레이아웃 규칙을 보완하는 경로 위 텍스트의 특정 레이아웃 규칙을 설명하는 데 사용됩니다.
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="3.6cm" viewBox="0 0 1000 300" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<defs>
<path id="MyPath"
d="M 100 125
C 150 125 250 175 300 175
C 350 175 450 125 500 125
C 550 125 650 175 700 175
C 750 175 850 125 900 125" />
</defs>
<desc>예 toap04 - 경로 위 텍스트 레이아웃 규칙</desc>
<use href="#MyPath" fill="none" stroke="red" />
<text font-family="Verdana" font-size="60" fill="blue" letter-spacing="2" >
<textPath href="#MyPath">
치욕을 택할 것인가 전쟁을 택할 것인가
</textPath>
</text>
<!-- 'rect' 요소를 사용하여 뷰포트 윤곽선을 표시합니다 -->
<rect x="1" y="1" width="998" height="298"
fill="none" stroke="blue" stroke-width="2" />
</svg>
예 toap04
다음 그림은 ‘text’ 요소의 첫 번째 글리프를 처음으로 확대해 보여 줍니다.
위의 작은 점은 글리프가 경로에 부착되는 지점을 보여 줍니다. 글리프 주변의 상자는 글리프가 회전되어 수평축이 글리프가 경로에 부착되는 지점의 곡선 접선과 평행함을 보여 줍니다. 또한 상자는 글리프의 문자 너비 (즉, 가로 텍스트 레이아웃을 사용하여 글리프를 그릴 때 현재 텍스트 위치가 가로로 전진하는 양)를 보여 줍니다.
다음 그림은 상세한 레이아웃 규칙을 보여 주기 위해 더 확대합니다.
경로를 따른 왼쪽에서 오른쪽 가로 텍스트 레이아웃의 경우(즉, 글리프 방향이 인라인 기준 방향에 수직인 경우) 레이아웃 규칙은 다음과 같습니다:
경로를 따른 위에서 아래로의 세로 텍스트 레이아웃에는 이에 상응하는 규칙이 사용됩니다(즉, 글리프 방향이 인라인 기준 방향과 평행한 경우 레이아웃 규칙은 다음과 같습니다:
위 계산에서 경로상의 시작점 또는 경로상의 끝점이 경로 끝을 벗어나면 경로의 끝점에서 접선과 평행한 직선으로 경로를 끝점 너머까지 연장하여 경로상의 중간점을 계속 계산할 수 있도록 합니다.
인라인 기준 방향이 가로인 경우 ‘text’ 또는 ‘tspan’ 요소의 모든 ‘x’ 속성은 경로를 따른 새로운 절대 오프셋을 나타내므로 경로상의 시작점에 대한 명시적 새 값을 제공합니다. ‘text’ 또는 ‘tspan’ 요소의 모든 ‘y’ 속성은 무시됩니다. 인라인 기준 방향이 세로인 경우 ‘text’ 또는 ‘tspan’ 요소의 모든 ‘y’ 속성은 경로를 따른 새로운 절대 오프셋을 나타내므로 경로상의 시작점에 대한 명시적 새 값을 제공합니다. ‘text’ 또는 ‘tspan’ 요소의 모든 ‘x’ 속성은 무시됩니다.
‘textPath’ 안의 모든 문자를 배치한 후, 현재 텍스트 위치는 경로의 끝점으로 설정되며, 하나의 닫힌 루프인 경로의 경우 ‘startOffset’을 고려하여 조정합니다. 다시 말해, ‘textPath’ 요소 뒤에 오는(하지만 여전히 ‘text’ 요소 안에 있는) 텍스트에 명시적 배치 정보(‘x’ 및 ‘y’ 속성)가 없으면 경로 끝에서부터 배치됩니다.
명시적 배치 정보가 없는 ‘textPath’ 요소 뒤 텍스트의 시작점은 경로의 끝 (빨간색 점)입니다.
마지막 문자의 위치 대신 경로 끝을 선택한 이유는 작성자가 더 쉽게 예측할 수 있기 때문입니다 (글꼴 등에 의존하지 않음). 이는 런던 (2016) 편집자 회의에서 결정되었습니다. 다음도 참조하십시오: GitHub 이슈 84.
‘text’ 요소는 하나 이상의 청크로 렌더링됩니다. 각 청크(텍스트 레이아웃 알고리즘이 생성)는 문서 순서대로 하나씩 차례로 렌더링됩니다. 하나 이상의 글리프로 구성된 각 렌더링된 청크는 단일 경로인 것처럼 채워지고 스트로크됩니다.
이는 청크의 모든 글리프를 먼저 채운 다음 모든 글리프를 한 번에 스트로크하거나, paint-order 프로퍼티 값에 따라 그 반대로 해야 함을 의미합니다.
페인팅 목적상 ‘text’는 0개, 하나 또는 여러 개의 동등한 경로를 가지며, 각 청크마다 하나씩 있습니다. 각 동등한 경로는 해당 청크의 각 글리프마다 하나의 하위 경로로 구성됩니다.
fill-rule 프로퍼티는 SVG 텍스트 요소에 적용되지 않으므로 동등한 경로 내 하위 경로의 구체적인 순서는 중요하지 않습니다.
각 하위 경로 시작점의 구체적인 위치와 글리프 도형 주위를 경로가 진행하는 방향은 정의되지 않습니다. 그러나 사용자 에이전트는 주어진 글꼴과 글리프에 대해 일관되어야 합니다.
이는 텍스트의 대시 스트로크가 서로 다른 구현에서 같은 위치에 대시 패턴을 배치하지 않을 수 있음을 의미합니다.
CSS는 텍스트 스타일링을 위한 수많은 프로퍼티를 제공합니다. 일반적으로 SVG에 적용할 수 있는 것은 두 집합뿐입니다: 렌더링할 글리프를 결정하는 것 (font-family, font-style 등)과 문단 수준에 적용되는 것(direction, writing-mode, line-height, letter-spacing 등)입니다.
SVG 텍스트 요소에서 지원해야 하는 CSS 프로퍼티 목록은 스타일링 장에서 확인할 수 있습니다.
text-indent, line-break, word-break, hyphens, word-wrap, overflow-wrap.
또한 글꼴 선택을 위해 @font-face 규칙을 지원해야 하며 ::first-line 및 ::first-letter 의사 요소도 ‘text’ 요소에서 지원해야 합니다. 대화형 모드에서는 ::selection 의사 요소도 지원해야 합니다.
텍스트 레이아웃 및 렌더링에 영향을 주는 다른 CSS 프로퍼티도 SVG 사용자 에이전트가 지원할 수 있으며, 그 효과는 전체 SVG 텍스트 레이아웃 과정의 CSS 텍스트 레이아웃 단계 일부로 고려하는 것이 좋습니다.
예를 들어 SVG 2는 text-combine-upright 프로퍼티 지원을 요구하지 않지만 SVG 문맥에서 그 동작은 명확해야 합니다.
여러 CSS 프로퍼티는 SVG 텍스트 요소에 아무런 영향을 주어서는 안 됩니다:
또한 ::before 및 ::after 생성 콘텐츠 의사 요소는 SVG 텍스트 요소에 적용되어서는 안 됩니다.
향후 명세에서는 ::before 및 ::after 생성 콘텐츠 의사 요소 지원을 도입할 수 있습니다. 작성자는 이들이 무시되는 것에 의존해서는 안 됩니다.
이 절에서는 이 명세의 다른 곳에서 다루지 않으며 SVG에 특화된 프로퍼티를 다룹니다.
text-anchor 프로퍼티는 주어진 점을 기준으로 사전 서식 지정된 텍스트 문자열 또는 inline-size 프로퍼티에서 줄바꿈 영역이 결정되는 자동 줄바꿈 텍스트를 정렬(시작, 중앙 또는 끝 정렬)하는 데 사용됩니다. 다른 유형의 자동 줄바꿈 텍스트에는 적용되지 않으며 대신 text-align을 참조하십시오. 여러 줄 텍스트에서는 각 줄마다 정렬이 수행됩니다.
text-anchor 프로퍼티는 주어진 ‘text’ 요소 내의 각 개별 텍스트 청크에 적용됩니다. 각 텍스트 청크에는 초기 현재 텍스트 위치가 있으며, 이는 (문맥에 따라) ‘text’ 요소의 ‘x’ 및 ‘y’ 속성, 텍스트 청크에서 처음 렌더링되는 문자에 명시적으로 할당된 ‘tspan’ 요소의 ‘x’ 또는 ‘y’ 속성 값, 또는 ‘textPath’ 요소의 초기 현재 텍스트 위치를 결정한 결과인 사용자 좌표계상의 점을 나타냅니다. 각 텍스트 청크에는 텍스트 청크의 마지막 글리프를 배치한 후의 현재 텍스트 위치인 최종 현재 텍스트 위치도 있습니다. 위치는 text-anchor 프로퍼티를 적용하기 전에 결정됩니다.
| 이름: | text-anchor |
|---|---|
| 값: | start | middle | end |
| 초기값: | start |
| 적용 대상: | 텍스트 콘텐츠 요소 |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 대로 |
| 애니메이션 유형: | 불연속 |
값의 의미는 다음과 같습니다:
여러 줄 텍스트에서 text-anchor를 사용하는 예입니다.
<svg xmlns="http://www.w3.org/2000/svg"
width="300" height="100" viewBox="0 0 300 100">
<text x="150" y="30" style="font: 20px sans-serif; white-space: pre-line;
text-anchor: middle;">
이 여러 줄 텍스트는
중앙에 고정됩니다.</text>
</svg>
보존된 줄바꿈 문자는 두 텍스트 청크를 만들며, 각각 독립적으로 고정됩니다.
여러 줄 텍스트에서 text-anchor를 사용하는 또 다른 예입니다.
<svg xmlns="http://www.w3.org/2000/svg"
width="200" height="150" viewBox="0 0 200 150">
<path d="m 100,0 0,150" style="fill:none;stroke:#add8e6"/>
<text x="100 100 100" y="50 95 140"
style="font-size: 42px; text-anchor: middle">I❤SVG</text>
</svg>
이 프로퍼티는 SVG 2에서 제거되었습니다.
이 프로퍼티는 세로 텍스트에만 적용됩니다. SVG 2에서 폐기되었으며 CSS Writing Modes Level 3의 text-orientation 프로퍼티로 일부 대체되었습니다. 다음 SVG 1.1 값은 여전히 다음과 같이 text-orientation의 축약으로 별칭 처리하여 지원해야 합니다:
다른 모든 값은 유효하지 않은 값으로 처리해야 합니다.
‘kerning’ 프로퍼티는 SVG 2에서 제거되었습니다.
SVG 1.1은 글꼴 커닝 테이블을 사용하여 글리프 간 간격을 조정할지 결정하기 위해 'kerning' 프로퍼티를 사용합니다. 또한 <length> 값을 허용하며, 이 값이 제공되면 글리프 사이 간격에 추가됩니다( letter-spacing 프로퍼티에 의한 값에 추가). 이 프로퍼티는 SVG 2에서 글꼴 커닝 테이블 사용을 켜거나 끄는 것만 제어하는 CSS font-kerning 프로퍼티로 대체됩니다.
Chrome의 UseCounter 데이터는 2014년에 0.01%의 사용률을 보여 주었습니다. GitHub 이슈 80을 참조하십시오.
이 절에서는 이 명세의 다른 곳에서 다루지 않으며 SVG 전용 조정이 있거나 SVG 1.1에서 크게 변경된 CSS 프로퍼티를 다룹니다.
| SVG 2 요구 사항: | CSS3 Fonts를 참조합니다. |
|---|---|
| 결의: | SVG 2는 CSS3 Fonts에 의존합니다. |
| 목적: | 웹 글꼴 기능에 대해 CSS 2.1 및 CSS3와 일치시키고 글꼴의 고급 타이포그래피 기능에 접근할 수 있도록 하기 위함입니다. |
| 담당자: | Chris (ACTION-3123) |
font-variant 프로퍼티는 CSS Font Module에서 정의됩니다 ([css-font-3]).
CSS Font Module은 font-variant 프로퍼티의 의미를 CSS 2.1에서 정의된 것과 다르게 변경합니다. 이 프로퍼티는 하나의 글꼴 안에서 글꼴 변형을 선택하기 위한 축약으로 용도가 변경되었으며( 기능도 크게 확장되었습니다).
SVG 2는 모든 font-variant 본딧말 프로퍼티 (예: font-variant-ligatures)를 지원합니다.
SVG는 line-height 프로퍼티를 사용하여 여러 줄 텍스트 (가로 및 세로 텍스트 모두)에서 줄 사이에 추가되는 선행 간격의 양을 결정합니다. 경로 위의 텍스트에는 적용되지 않습니다.
여기에 제공된 추가 정보를 제외하면 line-height 프로퍼티의 규범적 정의는 CSS 2.1 명세 ([CSS2])에 있습니다.
CSS Inline Module Level 3은 'line-height' 정의를 업데이트할 수 있습니다.
writing-mode 프로퍼티는 CSS Writing Modes Module에서 정의됩니다 ([css-writing-modes-3]).
이 프로퍼티는 블록 흐름 방향, 다시 말해 텍스트 줄이 쌓이는 방향을 설정합니다. 결과적으로 텍스트가 가로 방향인지 세로 방향인지도 결정합니다.
SVG 2는 CSS Writing Modes Level 3을 'writing-mode' 프로퍼티 정의로 참조합니다. 이 명세는 프로퍼티에 새 값을 도입합니다. SVG 1.1 값은 폐기되었지만 지정된 값을 다음과 같이 계산값으로 변환하여 여전히 지원해야 합니다:
SVG 1.0에서는 이 프로퍼티를 인라인 기준 방향도 설정하는 것으로 해석할 수 있어 direction 프로퍼티와의 관계에서 역할에 대한 혼란이 생겼습니다. SVG 1.1은 direction의 역할을 조금 더 구체적으로 설명했지만 (예: direction이 text-anchor 프로퍼티의 기준점을 설정함) 여전히 해석의 여지가 있었습니다. SVG 1.0과 SVG 1.1 모두 여러 줄 텍스트를 허용하지 않았다는 사실도 혼란을 더했습니다.
이 프로퍼티는 ‘text’ 또는 ‘tspan’ 요소의
인라인 기준 방향을 지정합니다. 이는
text-anchor 및 inline-size 프로퍼티에서 사용하는 텍스트 줄의
시작
및 끝
지점을 정의합니다. 또한
unicode-bidi
프로퍼티 값이
embed 또는
bidi-override인 경우
문자가 배치되는 방향에도 영향을 줄 수 있습니다.
direction 프로퍼티는 인라인 기준 방향에 수직으로 배치된 글리프에만 적용되며, 일반적인 가로 방향의 라틴 또는 아랍어 텍스트와 위에서 아래로의 인라인 기준 방향을 기준으로 시계 방향으로 90도 회전한 좁은 셀의 라틴 또는 아랍어 문자를 포함합니다.
검토자께서는 이것이 CSS3 Writing Modes와 일치하는지 특별히 주의하여 확인해 주십시오.
여기에 제공된 추가 정보를 제외하면 direction 프로퍼티의 규범적 정의는 CSS Writing Modes Level 3 ([css-writing-modes-3])에 있습니다.
많은 경우 Unicode [UNICODE]의 양방향 알고리즘이 원하는 결과를 자동으로 생성하므로, 이러한 경우 작성자는 이 프로퍼티를 사용할 필요가 없습니다. 오른쪽에서 왼쪽으로 쓰는 언어를 사용하는 경우와 같은 다른 경우에는 가장 바깥쪽 svg 요소에 direction 프로퍼티를 추가하고 다음 예(템플릿으로 사용할 수 있음)처럼 해당 방향이 모든 텍스트 요소에 상속되도록 하는 것으로 충분할 수 있습니다:
<svg xmlns="http://www.w3.org/2000/svg"
width="100%" height="100%" viewBox="0 0 600 72"
direction="rtl" xml:lang="fa">
<title direction="ltr" xml:lang="en">오른쪽에서 왼쪽 텍스트</title>
<desc direction="ltr" xml:lang="en">
오른쪽에서 왼쪽 언어를 주로 사용하는 문서에서 'direction' 프로퍼티를
사용하는 간단한 예입니다.
</desc>
<text x="300" y="50" text-anchor="middle" font-size="36">داستان SVG 1.1 SE طولا ني است.</text>
</svg>
예
아래는 암시적 bidi 재정렬만으로 충분하지 않은 또 다른 예입니다:
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg"
width="100%" height="100%" viewBox="0 0 600 72"
direction="rtl" xml:lang="he">
<title direction="ltr" xml:lang="en">오른쪽에서 왼쪽 텍스트</title>
<desc direction="ltr" xml:lang="en">
오른쪽에서 왼쪽 언어를 주로 사용하는 문서에서 'direction' 및 'unicode-bidi' 프로퍼티를
사용하는 예입니다.
</desc>
<text x="300" y="50" text-anchor="middle" font-size="36"> כתובת MAC:‏
<tspan direction="ltr" unicode-bidi="embed">00-24-AF-2A-55-FC</tspan>
</text>
</svg>
예
이 프로퍼티는 CSS Line Layout Module 3 명세에서 정의됩니다. 다음을 참조하십시오: 'dominant-baseline'. [css-inline-3]
SVG 2는 이 프로퍼티 정의에 몇 가지 변경 사항을 도입합니다. 구체적으로:
SVG는 dominant-baseline 프로퍼티 값을 사용하여 ‘x’ 및 ‘y’ 속성을 기준으로 글리프를 정렬합니다. text-orientation 값 sideways의 경우 dominant-baseline의 auto 값은 alphabetic입니다. 그러나 하위 호환성을 위해 글리프는 central 값을 사용하여 ‘x’ 및 ‘y’ 속성에 정렬하는 것이 좋습니다.
이전 동작을 선호할 실제 사용 사례가 있다면 알려 주시기 바랍니다.
이 프로퍼티는 CSS Line Layout Module 3 명세에서 정의됩니다. 다음을 참조하십시오: 'alignment-baseline'. [css-inline-3]
새 콘텐츠에서는 vertical-align 프로퍼티 축약을 사용하는 것이 좋습니다.
SVG 2는 이 프로퍼티 정의에 몇 가지 변경 사항을 도입합니다. 구체적으로 'auto', 'before-edge' 및 'after-edge' 값이 제거되었습니다. 하위 호환성을 위해 'text-before-edge'는 'text-top'에 매핑하고 'text-after-edge'는 'text-bottom'에 매핑하는 것이 좋습니다. 'text-before-edge'와 'text-after-edge'는 모두 vertical-align 프로퍼티와 함께 사용하지 않는 것이 좋습니다.
이 프로퍼티는 CSS Line Layout Module 3 명세에서 정의됩니다. 다음을 참조하십시오: 'baseline-shift'. [css-inline-3]
새 콘텐츠에서는 vertical-align 프로퍼티 축약을 사용하는 것이 좋습니다.
'vertical-align'을 'alignment-baseline' 및 'baseline-shift'의 축약으로 변환하면서 'baseline' 값은 제거되었습니다. 이는 'alignment-baseline'의 값이기도 하고 길이 값 '0'과 중복되기 때문입니다.
| SVG 2 요구 사항: | 기준선 정렬 기능에 대해 CSS와 일치시킵니다. |
|---|---|
| 결의: | SVG 2는 ‘baseline-shift’를 폐기하고 대신 ‘vertical-align’을 사용합니다. |
| 목적: | CSS와 일치시키기 위함입니다. |
| 담당자: | Cameron (ACTION-3281) |
'baseline-shift'는 아래 첨자와 위 첨자를 정렬하는 데 중요합니다(Inkscape는 이 목적으로 사용합니다). 이는 CSS Inline Layout Module Level 3에 남아 있습니다. 'vertical-align'은 'baseline-shift'를 포함하여 여러 프로퍼티를 한 번에 변경하기 위한 축약입니다.
별도로 언급된 경우를 제외하고 letter-spacing 정의는 CSS Text Level 3을 참조하십시오.([css-text-3]).
SVG 1.1은 letter-spacing 프로퍼티에 백분율 값을 허용했습니다. SVG 뷰포트에 기반한 백분율 값은 유용하지 않은 것으로 간주되어 SVG 2에서 제거되었습니다. 이로써 'letter-spacing' 정의가 CSS와 일치합니다.
별도로 언급된 경우를 제외하고 word-spacing 정의는 CSS Text Level 3을 참조하십시오.([css-text-3]).
SVG 2는 word-spacing 프로퍼티의 백분율 값 의미를 변경합니다. SVG 1.1에서 백분율은 SVG 뷰포트 크기의 백분율로 추가 간격을 정의합니다. SVG 뷰포트에 기반한 백분율 값은 유용하지 않은 것으로 간주됩니다. SVG 2에서는 CSS Text Level 3에 따라 백분율이 영향을 받는 문자의 너비에 대한 백분율로 추가 간격을 정의합니다. 이로써 'word-spacing' 정의가 CSS와 일치합니다.
| SVG 2 요구 사항: | text-overflow 기능을 추가합니다. |
|---|---|
| 결의: | SVG 2에 text-overflow를 추가합니다. |
| 목적: | CSS와 일치시키고 모든 텍스트가 표시되지 않았음을 나타낼 수 있도록 하기 위함입니다. |
| 담당자: | Erik (ACTION-3003) |
SVG 2에서 새로 추가되었습니다. 미리 정의된 줄바꿈 영역을 넘치는 텍스트 문자열을 사용자 에이전트가 더 유용한 방식으로 처리할 수 있도록 추가되었습니다. SVG와 HTML/CSS 텍스트 처리를 일치시킵니다.
'text-overflow' 정의는 CSS3 Overflow 명세를 참조하십시오. [css-overflow-3]
SVG는 text-overflow 프로퍼티를 사용하여 예를 들어 white-space 프로퍼티 값이 nowrap일 때처럼 텍스트가 라인 박스를 넘칠 때 텍스트 콘텐츠 블록 요소가 렌더링되는 방식을 제어합니다. 이 프로퍼티는 사전 서식 지정된 텍스트 또는 경로 위 텍스트에는 적용되지 않습니다.
SVG에서 text-overflow는 텍스트 콘텐츠 블록 요소의 overflow 프로퍼티 계산값과 관계없이 유효하게 지정된 줄바꿈 영역이 있으면 효과가 있습니다.
text-overflow 프로퍼티 값이 ellipsis이면 렌더링할 텍스트가 줄바꿈 영역을 넘칠 경우 주어진 영역 안에 들어가도록 줄임표를 렌더링합니다. 렌더링 목적상 줄임표는 삽입된 지점의 문자를 대체한 것처럼 취급됩니다.
text-overflow 프로퍼티 값이 clip이면 줄바꿈 영역을 넘치는 모든 텍스트가 잘립니다. 문자는 부분적으로 렌더링될 수 있습니다.
text-overflow의 다른 모든 값은 지정되지 않은 것처럼 처리됩니다.
text-overflow의 효과는 순전히 시각적이며 줄임표 자체는 DOM의 일부가 되지 않는다는 점에 유의하십시오. 모든 DOM 메서드에서는 text-overflow가 적용되지 않았고 줄바꿈 영역이 텍스트를 제한하지 않은 것처럼 동작합니다.
다음 예는 text-overflow 사용을 보여 줍니다. 위쪽 줄은 텍스트가 일반적으로 렌더링되는 모습을 보여 줍니다( white-space 값 pre로 인해 텍스트가 넘치고 overflow 값 visible로 인해 표시됨). 가운데 줄은 text-overflow 값 clip인 텍스트를 보여 주고, 아래쪽 줄은 text-overflow 값 ellipsis인 텍스트를 보여 줍니다.
<svg xmlns="http://www.w3.org/2000/svg"
width="300" height="150" viewBox="0 0 300 150">
<style>
text { font: 25px sans-serif; white-space: pre; }
path { fill: none; stroke: #add8e6; }
</style>
<path d="m 50,0 0,150"/>
<path d="m 200,0 0,150"/>
<text x="50" y="35" inline-size="100" style="overflow:visible">SVG는 멋집니다</text>
<text x="50" y="85" inline-size="100" style="text-overflow:clip">SVG는 멋집니다</text>
<text x="50" y="135" inline-size="100" style="text-overflow:ellipsis">SVG는 멋집니다</text>
</svg>
text-overflow 프로퍼티를 텍스트 요소에 사용한 예로, 아래쪽 줄은 줄임표가 적용된 텍스트를 보여 줍니다.
이 프로퍼티는 쓸모가 없다는 주장도 있습니다. 숨겨진 텍스트를 노출하는 메커니즘과 결합한다면 더 유용할 것입니다(줄임표 위에 마우스를 올릴 때 툴팁?). text-overflow 프로퍼티는 줄 끝을 넘치는 텍스트만 처리합니다. 줄바꿈 영역 끝을 넘어가는 텍스트는 처리하지 않습니다.
SVG 2에서 새로 추가되었습니다. 공백 처리를 더 유용한 방식으로 제어할 수 있도록 white-space를 추가했습니다. SVG와 HTML/CSS 텍스트 처리를 일치시킵니다. ‘xml:space’는 새 콘텐츠에서 폐기되었으며 하위 호환성을 위해 유지됩니다.
SVG 2의 공백 렌더링은 white-space 프로퍼티로 제어됩니다. 이는 두 가지를 지정합니다:
값과 그 의미는 CSS Text Module Level 3에서 정의됩니다.[css-text-3]
white-space 값 pre-line을 사용하는 예입니다.
<svg xmlns="http://www.w3.org/2000/svg">
width="200" height="200" viewBox="0 0 200 200">
<text x="150" y="30" style="font: 20px IPAMincho; writing-mode: vertical-rl;
white-space: pre-line;">
千利奴流乎和加
餘多連曽津祢那
良牟有為能於久
耶万計不己衣天
阿佐伎喩女美之
恵比毛勢須</text>
</svg>
줄바꿈이 있는 여러 줄 세로 텍스트의 예입니다. 텍스트는 일본 시 이로하에서 가져왔습니다. 줄은 전통적인 위치에서 나뉩니다.
호환성을 위해 SVG 2는 주어진 ‘text’ 요소의 문자 데이터 내부 공백 문자 처리를 지정하기 위해 XML 속성 ‘xml:space’도 지원합니다. 새 콘텐츠에서는 ‘xml:space’를 사용하지 말고 대신 white-space 프로퍼티를 사용해야 합니다.
이 절은 xml:space에 대한 논의를 제한하고 대신 사용자 에이전트 스타일시트에서 white-space 프로퍼티를 사용하여 이를 정의하도록 단순화하는 것이 좋습니다. 해당 CSS Text 4 명세의 preserve-spaces 값은 'white-space-collapse' 프로퍼티에서 xml:space=preserve와 일치하도록 의도되었습니다. (fantasai는 동의했습니다 SVG 1.1의 특이한 xml:space="preserve" 동작과 일치하도록 white-space에 적절한 값을 추가하는 데.)
‘text’ 요소의 모든 자식 요소도 해당 자식 요소의 텍스트 콘텐츠에 적용되는 ‘xml:space’ 속성을 가질 수 있다는 점에 유의하십시오. SVG 사용자 에이전트에는 아래에 설명된 대로 이 속성과 관련된 특수 처리 규칙이 있습니다. 이는 XML 구문 분석 [XML] 및 DOM 구성 이후에 발생하는 동작입니다.
‘xml:space’는 다음 두 값 중 하나를 가질 수 있는 상속 가능한 속성입니다:
"a b"("a"와
"b" 사이에 공백 3개)는 "a b"("a"와 "b" 사이에 공백 1개)보다
"a"와 "b" 사이에 더 큰 간격을 만듭니다.
다음 예는 xml:space="default"를 사용할 때 줄 들여쓰기가 중요할 수 있음을 보여 줍니다. 아래 조각은 유사한 ‘text’ 요소 두 쌍을 보여 주며, 두 ‘text’ 요소 모두 xml:space="default"를 사용합니다. 이 예에서는 어떤 줄 끝에도 추가 공백이 없습니다 (즉, 줄바꿈이 마지막 보이는 문자 바로 뒤에서 발생함).
[01] <text xml:space='default'> [02] WS 예 [03] 들여쓴 줄 [04] </text> [05] <text xml:space='preserve'>WS 예 들여쓴 줄</text> [06] [07] <text xml:space='default'> [08]WS 예 [09]들여쓰지 않은 줄 [10] </text> [11] <text xml:space='preserve'>WS 예들여쓰지 않은 줄</text>
위의 첫 번째 ‘text’ 요소 쌍은 들여쓴 문자 데이터의 효과를 보여 줍니다. 첫 번째 ‘text’ 요소의 xml:space="default" 속성은 사용자 에이전트에 다음을 지시합니다:
위의 두 번째 ‘text’ 요소 쌍은 들여쓰지 않은 문자 데이터의 효과를 보여 줍니다. 세 번째 ‘text’ 요소의 xml:space="default" 속성은 사용자 에이전트에 다음을 지시합니다:
XML 파서는 줄바꿈 표시의 표준 표현 (예: 리터럴 2문자 시퀀스 "U+000D U+000A", CARRIAGE-RETURN LINE-FEED 또는 독립적인 리터럴 U+000D 또는 U+000A)을 문자 데이터를 애플리케이션에 전달하기 전에 단일 문자 U+000A로 변환해야 한다는 점에 유의하십시오. 따라서 SVG의 각 줄바꿈은 원래 리소스에서 어떤 줄바꿈 표현을 사용했는지에 관계없이 단일 문자 U+000A로 표현됩니다. (다음을 참조하십시오: XML 줄 끝 처리.)
문자 위치 번호에 기반하는 SVG 언어 또는 SVG DOM의 모든 기능, 예를 들어 ‘text’ 및 ‘tspan’ 요소의 ‘x’, ‘y’, ‘dx’, ‘dy’ 및 ‘rotate’ 속성은 여기에 설명된 공백 처리 규칙을 적용한 후의 문자 위치를 기준으로 합니다. 특히 xml:space="default"인 경우 처리 과정의 일부로 공백 문자가 제거되는 경우가 많습니다. 문자 위치 번호는 이 절의 규칙에 따라 공백 문자가 제거된 후의 텍스트 문자열을 인덱싱합니다.
공백 문자에 대응하는 글리프는 글리프 자체가 비어 있지 않더라도 보이지만 빈 공간으로만 표시하는 것이 좋습니다. 지원되지 않는 문자의 표시 [UNICODE]를 참조하십시오.
‘xml:space’ 속성은:
애니메이션 가능 여부: 아니요.
이전 SVG 1.1 콘텐츠는 ‘xml:space’를 사용합니다. 새 콘텐츠와 수정 중인 이전 콘텐츠는 white-space를 사용하고 기존 ‘xml:space’를 제거합니다. 그러나 사용자 에이전트는 동일한 요소에서 두 방법을 모두 사용하는 콘텐츠를 접할 수 있습니다. 어떤 요소에든 white-space 프로퍼티가 설정되어 있으면 ‘xml:space’ 값은 무시됩니다.
SVG의 텍스트는 밑줄, 윗줄 및/또는 취소선으로 장식할 수 있습니다. 장식의 위치와 스타일은 각각 text-decoration-line 및 text-decoration-style 프로퍼티, 또는 선 장식 절의 CSS Text Decoration Module Level 3 [(css-text-decor-3)] 명세에서 정의한 text-decoration 축약 프로퍼티로 결정됩니다.
텍스트 장식의 채우기와 스트로크는 텍스트 장식이 선언된 지점의 텍스트 채우기와 스트로크로 지정됩니다(아래 예 참조).
text-decoration-line 및 text-decoration-style 프로퍼티는 SVG 2에서 새로 추가되었습니다. SVG 1.1/CSS 2.1 text-decoration 프로퍼티는 하위 호환되는 방식으로 이러한 프로퍼티의 축약으로 변환됩니다.
텍스트와 장식이 그려지는 순서는 텍스트 장식의 페인팅 순서 절 CSS Text Decoration Module Level 3에서 정의됩니다. 텍스트 장식 자체의 페인트 순서(채우기/스트로크)는 텍스트 장식이 선언된 지점의 paint-order 프로퍼티 값으로 결정됩니다.
예 textdecoration01은 text-decoration의 예를 제공합니다. 첫 번째 텍스트 줄에는 text-decoration 값이 없으므로 초기값 text-decoration:none을 사용합니다. 두 번째 줄은 text-decoration:line-through을 보여 줍니다. 세 번째 줄은 text-decoration:underline을 보여 줍니다. 네 번째 줄은 장식이 text-decoration이 지정된 요소에 있는 동일한 채우기 및 스트로크 프로퍼티를 사용하여 렌더링되는 규칙을 보여 줍니다. text-decoration이 ‘text’ 요소에 지정되어 있으므로 ‘text’ 요소 내의 모든 텍스트는 ‘text’ 요소에 존재하는 것과 동일한 채우기 및 스트로크 프로퍼티로 밑줄이 렌더링됩니다 (즉, 파란색 채우기, 빨간색 스트로크). 여러 단어가 서로 다른 채우기 및 스트로크 프로퍼티 값을 갖더라도 마찬가지입니다. 그러나 "different"라는 단어는 text-decoration 값을 명시적으로 지정하므로 그 밑줄은 "different"라는 단어를 둘러싼 ‘tspan’ 요소의 채우기 및 스트로크 프로퍼티를 사용하여 렌더링됩니다 (즉, 노란색 채우기, darkgreen 스트로크):
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>예 textdecoration01 - 'text-decoration' 프로퍼티의 동작</desc>
<rect x="1" y="1" width="1198" height="398" fill="none" stroke="blue" stroke-width="2" />
<g font-size="60" fill="blue" stroke="red" stroke-width="1" >
<text x="100" y="75">일반 텍스트</text>
<text x="100" y="165" text-decoration="line-through" >취소선이 있는 텍스트</text>
<text x="100" y="255" text-decoration="underline" >밑줄이 있는 텍스트</text>
<text x="100" y="345" text-decoration="underline" >
<tspan>한 </tspan>
<tspan fill="yellow" stroke="purple" >단어의 </tspan>
<tspan fill="yellow" stroke="black" >밑줄이 </tspan>
<tspan fill="yellow" stroke="darkgreen" text-decoration="underline" >다르게 </tspan>
<tspan fill="yellow" stroke="blue" >표시됩니다</tspan>
</text>
</g>
</svg>
예 textdecoration01
텍스트 선택 기능이 있는 시스템(예: 마우스 같은 포인팅 장치가 있는 시스템)에서 동작하고 복사/붙여넣기 작업을 위한 시스템 클립보드가 있는 적합한 SVG 뷰어는 다음을 지원해야 합니다:
텍스트 선택 작업은 다음 조건이 모두 발생할 때 시작됩니다:
텍스트 선택 작업이 진행되는 동안(예: 사용자가 지정된 마우스 버튼을
계속 누르는 동안) 다른
그래픽 요소와 관련된 모든 이벤트는 무시되며(즉, 텍스트 선택 작업은
모달임), SVG 사용자 에이전트는
::selection 의사 클래스의 스타일을 적용하여 어떤 문자가 선택되었는지를 동적으로 표시해야 합니다.
텍스트 선택 과정에서
포인터가 이동함에 따라 텍스트 선택 작업의 끝 글리프는
동일한 ‘text’ 요소 안에서
글리프 셀이
포인터에 가장 가까운 글리프입니다.
‘text’ 요소 내에서
선택 시작과 선택 끝 사이에 위치하는
모든 문자는
캔버스상의 위치와
선택 끝점 위에 있을 수 있는 어떤 그래픽 요소와도 관계없이
강조 표시되어야 합니다.
텍스트 선택 작업이 끝나면(예: 사용자가 지정된 마우스 버튼을 놓음) 선택된 텍스트는 포인팅 장치 활성화 이벤트(예: 마우스 버튼 누름) 같은 텍스트 선택을 취소하는 이벤트가 발생할 때까지 강조 표시된 상태로 유지됩니다.
텍스트 선택 작업 중 강조 표시할 문자를 결정하는 자세한 규칙은 텍스트 선택 구현 참고 사항에 제공됩니다.
시스템 클립보드가 있는 시스템의 경우 SVG 사용자 에이전트는 현재 선택된 텍스트를 시스템 클립보드로 복사하는 작업을 시작할 사용자 인터페이스를 제공해야 합니다. SVG 사용자 에이전트가 선택된 텍스트 문자열을 일반 텍스트용 시스템의 적절한 클립보드 형식으로 게시하는 것으로 충분하지만, 주어진 텍스트 문자열과 관련된 다양한 글꼴 프로퍼티를 캡처하는 서식 있는 텍스트 대안도 게시하는 것이 좋습니다.
양방향 텍스트의 경우 사용자 에이전트는 논리적 순서로 텍스트 선택을 지원해야 하며, 문자 양방향 재정렬로 인해 글리프의 불연속적인 강조 표시가 발생합니다. 사용자 에이전트는 양방향 텍스트 레이아웃 알고리즘이 적용된 후의 시각적 렌더링 순서로 양방향 텍스트를 선택하는 대체 기능을 제공할 수 있으며, 그 결과 선택된 문자 데이터가 논리적으로 불연속일 수 있습니다. 이 경우 사용자가 양방향 텍스트를 클립보드에 복사하도록 요청하면 사용자 에이전트는 시각적으로 선택된 문자만 클립보드에 복사하도록 적절히 조정해야 합니다.
SVG 작성자와 SVG 생성기는 웹 브라우저 같은 SVG 보기 애플리케이션에서 올바른 순서의 텍스트 선택을 용이하게 하도록 텍스트 문자열의 순서를 지정하는 것이 좋습니다. 즉, 텍스트의 DOM 순서는 텍스트의 자연스러운 읽기 순서와 일치하는 것이 좋습니다.
다음 구현 참고 사항은 텍스트 선택 작업 중 어떤 문자가 선택되는지 결정하는 알고리즘을 설명합니다.
텍스트 선택 작업이 발생하는 동안(예: 사용자가 마우스를 클릭하고 끌어 선택 영역을 지정하는 동안) 사용자 에이전트는 각각 두 문자 사이의 텍스트 문자열 위치를 나타내는 선택 시작 위치와 선택 끝 위치를 결정합니다. 선택 시작 위치와 선택 끝 위치를 결정한 후 사용자 에이전트는 적절한 문자를 선택하며, 결과 텍스트 선택은 다음 중 하나로 구성됩니다:
포인팅 장치가 있는 시스템에서 선택 시작 위치를 결정하기 위해 SVG 사용자 에이전트는 선택 작업을 시작하는 이벤트 시점의 현재 포인터 위치를 기준으로 렌더링된 글리프에 대응하는 문자 사이의 어느 경계가 가장 적합한 대상(예: 가장 가까움)인지 결정합니다(예: 마우스 다운 이벤트). 그런 다음 사용자 에이전트는 선택 작업이 완료될 때까지 추적합니다(예: 마우스 드래그 후 최종적으로 마우스 업). 선택 작업이 끝나면 사용자 에이전트는 어느 문자 사이 경계가 선택 끝 위치에 가장 적합한 대상(예: 가장 가까움)인지 결정합니다.
양방향성으로 인해 문자 재정렬이 발생하지 않았다면 선택은 선택 시작 위치와 선택 끝 위치 사이의 모든 문자로 구성됩니다. 예를 들어 ‘text’ 요소가 문자열 "abcdef"를 포함하고 선택 시작 위치와 선택 끝 위치가 각각 0과 3이라면("a"의 왼쪽을 위치 0으로 가정), 선택은 "abc"로 구성됩니다.
사용자 에이전트가 양방향 텍스트 선택을 구현하고 선택이 논리적 순서에서 연속하지 않은 문자 사이에서 시작(또는 끝)되는 경우, 선택의 일부로 간주할 수 있는 문자 조합이 여러 개일 수 있습니다. 잠재적인 선택 옵션 조합 중에서 선택하는 알고리즘은 텍스트 문자열의 시각적 렌더링 순서와 가장 가깝게 일치하는 선택 옵션을 선택해야 합니다.
여러 문자가 분리할 수 없게 하나 이상의 주어진 글리프 집합에 매핑되는 경우 사용자 에이전트는 글리프 집합 중간에서 선택을 시작하지 못하게 하거나 글리프 집합이 차지하는 영역의 일부를 해당 글리프에 대응하는 문자에 할당하려고 시도할 수 있습니다.
마우스 같은 포인팅 장치를 지원하는 시스템에서는 주어진 텍스트에 이벤트 핸들러나 링크가 연결되어 이벤트 처리 우선순위 규칙 때문에 텍스트 선택을 차단할 수 있더라도 사용자 에이전트는 텍스트를 선택할 수 있는 메커니즘을 제공해야 합니다( 포인터 이벤트 참조). 한 가지 구현 옵션: 마우스 같은 포인팅 장치를 지원하는 플랫폼에서 사용자 에이전트는 문자 셀 주변에 작은 추가 영역을 제공하여 텍스트 선택 작업은 시작하지만 이벤트 핸들러나 링크는 시작하지 않도록 할 수 있습니다.
| SVG 2 요구 사항: | ‘text’ 요소를 윤곽 경로 데이터로 변환하는 DOM 메서드를 제공합니다. |
|---|---|
| 결의: | ‘text’ 요소를 윤곽 경로 데이터로 변환하는 DOM 메서드를 추가하며, 이 기능을 FXTF로 이동할 수 있습니다. |
| 목적: | 텍스트를 경로로 조작할 수 있도록 하기 위함입니다. |
| 담당자: | Cameron (ACTION-3076) |
| 상태: | 향후 희망 목록 |
SVGTextContentElement 인터페이스는 자식 텍스트 콘텐츠 렌더링을 지원하는 요소에서 구현됩니다.
이 인터페이스의 메서드에서 문자에 대한 인덱스 또는 문자 수를 참조하는 경우 이러한 참조는 각각 UTF-16 코드 단위에 대한 인덱스 또는 UTF-16 코드 단위 수로 해석해야 합니다. 이는 CharacterData 인터페이스의 메서드가 문자 데이터 내 인덱스와 개수로 UTF-16 코드 단위를 사용하는 DOM Level 2 Core와 일관성을 유지하기 위함입니다. 따라서 예를 들어 ‘text’ 요소의 텍스트 콘텐츠가 U+10000 같은 하나의 비-BMP 문자라면 해당 요소에서 getNumberOfChars를 호출하면 그 문자 하나를 표현하는 데 두 개의 UTF-16 코드 단위( 서로게이트 쌍)가 사용되므로 2를 반환합니다.
[Exposed=Window] interface SVGTextContentElement : SVGGraphicsElement { // lengthAdjust 유형 const unsigned short LENGTHADJUST_UNKNOWN = 0; const unsigned short LENGTHADJUST_SPACING = 1; const unsigned short LENGTHADJUST_SPACINGANDGLYPHS = 2; [SameObject] readonly attribute SVGAnimatedLength textLength; [SameObject] readonly attribute SVGAnimatedEnumeration lengthAdjust; long getNumberOfChars(); float getComputedTextLength(); float getSubStringLength(unsigned long charnum, unsigned long nchars); SVGPoint getStartPositionOfChar(unsigned long charnum); SVGPoint getEndPositionOfChar(unsigned long charnum); SVGRect getExtentOfChar(unsigned long charnum); float getRotationOfChar(unsigned long charnum); long getCharNumAtPosition(optional DOMPointInit point = {}); undefined selectSubString(unsigned long charnum, unsigned long nchars); };
SVGTextContentElement에 정의된 숫자 길이 조정 유형 상수는 ‘lengthAdjust’ 속성이 취할 수 있는 키워드 값을 나타내는 데 사용됩니다. 그 의미는 다음과 같습니다:
| 상수 | 의미 |
|---|---|
| LENGTHADJUST_SPACING | spacing 키워드. |
| LENGTHADJUST_SPACINGANDGLYPHS | spacingAndGlyphs 키워드. |
| LENGTHADJUST_UNKNOWN | 그 밖의 값. |
textLength IDL 속성은 ‘textLength’ 콘텐츠 속성을 반영합니다.
‘textLength’ 콘텐츠 속성의 초기값은 요소에 대해 사용자 에이전트가 계산한 길이와 같도록 정의됩니다. 다시 말해 콘텐츠 속성이 없으면 IDL 프로퍼티는 동일한 요소에서 getComputedTextLength가 반환하는 값과 동일한 기본 길이로 초기화되며, 사용자 단위의 길이로 표현됩니다.
lengthAdjust IDL 속성은 ‘lengthAdjust’ 콘텐츠 속성을 반영합니다. ‘lengthAdjust’의 숫자 유형 값은 위의 숫자 길이 조정 유형 상수 표에 설명된 대로입니다.
getNumberOfChars 메서드는 렌더링되는지 여부와 관계없이 현재 요소 안에서 렌더링에 사용할 수 있는 주소 지정 가능한 문자의 총 개수를 반환합니다. getNumberOfChars()가 호출되면 다음 단계를 실행합니다:
getComputedTextLength 메서드는 요소 내부 텍스트의 "길이"를 계산하는 데 사용됩니다. getComputedTextLength()가 호출되면 다음 단계를 실행합니다:
getSubStringLength 메서드는 요소 내부 텍스트의 하위 문자열에 대한 서식 지정된 텍스트 advance 거리를 계산하는 데 사용됩니다. getSubStringLength(charnum, nchars)가 호출되면 다음 단계를 실행합니다:
이는 예를 들어 하위 문자열에 일부만 포함되는 합자가 있는 경우 타이포그래피 문자의 advance와 그 뒤의 letter-spacing 또는 word-spacing 공간이 첫 번째 문자의 텍스트 길이에 할당됨을 의미합니다.
이전 버전의 SVG는 이 메서드와 getComputedTextLength가 자식 요소의 ‘dx’ 또는 ‘dy’로 인한 인라인 방향의 배치 조정도 포함하도록 요구하여, 반환값이 사용자 에이전트가 ‘textLength’에 대해 계산한 값과 동등하도록 했습니다. 그러나 이는 명세가 불충분했고, 구현도 불충분했으며, 이점도 의심스러웠으므로 구현과 일치하도록 단순화되었습니다.
텍스트 길이 메서드 변경은 2015년 8월 파리 대면 회의에서 결의되었습니다.
요소 element 내 인덱스 index의 문자에 대해 문자에 대응하는 타이포그래피 문자를 찾으려면 다음 단계를 실행합니다:
getStartPositionOfChar 메서드는 텍스트 레이아웃이 수행된 후 타이포그래피 문자의 위치를 가져오는 데 사용됩니다. getStartPositionOfChar(charnum)가 호출되면 다음 단계를 실행합니다:
getEndPositionOfChar 메서드는 텍스트 레이아웃이 수행된 후 타이포그래피 문자의 뒤쪽 위치를 가져오는 데 사용됩니다. getEndPositionOfChar(charnum)가 호출되면 다음 단계를 실행합니다:
getExtentOfChar 메서드는 주어진 타이포그래피 문자에 대응하는 글리프 셀의 밀착 경계 상자를 계산하는 데 사용됩니다. getExtentOfChar(charnum)가 호출되면 다음 단계를 실행합니다:
getRotationOfChar 메서드는 타이포그래피 문자의 회전을 가져오는 데 사용됩니다. getRotationOfChar(charnum)가 호출되면 다음 단계를 실행합니다:
getCharNumAtPosition 메서드는 좌표계의 주어진 위치에 텍스트 글리프를 렌더링하게 한 문자를 찾는 데 사용됩니다. 문자와 글리프의 관계가 일대일이 아니므로 관련 타이포그래피 문자의 첫 번째 문자만 반환됩니다. getCharNumAtPosition(point)가 호출되면 다음 단계를 실행합니다:
selectSubString 메서드는 요소 안의 텍스트를 선택하는 데 사용됩니다. selectSubString(charnum, nchars)가 호출되면 다음 단계를 실행합니다:
이 요소의 텍스트 하위 문자열을 문자 인덱스 charnum에서 시작하여 앞으로 nchars개 문자를 선택합니다. 이 메서드가 호출되면 다음 단계를 따라야 합니다:
인수 검사와 예외 발생을 무시하면 이는 다음을 수행하는 것과 동등합니다:
var selection = document.getSelection(); selection.removeAllRanges(); var range = new Range(); range.setStart(textContentElement, charnum); range.setEnd(textContentElement, charnum + nchars); selection.addRange(range);
이 메서드는 Selection API의 기능을 중복하므로 폐기되었습니다.
SVGTextPositioningElement 인터페이스는 개별 텍스트 글리프를 배치하는 속성을 지원하는 요소에서 구현됩니다. 이는 SVGTextElement 및 SVGTSpanElement에 의해 상속됩니다.
[Exposed=Window] interface SVGTextPositioningElement : SVGTextContentElement { [SameObject] readonly attribute SVGAnimatedLengthList x; [SameObject] readonly attribute SVGAnimatedLengthList y; [SameObject] readonly attribute SVGAnimatedLengthList dx; [SameObject] readonly attribute SVGAnimatedLengthList dy; [SameObject] readonly attribute SVGAnimatedNumberList rotate; };
해당 x, y, dx, dy 및 rotate IDL 속성은 각각 ‘x’, ‘y’, ‘dx’, ‘dy’ 및 ‘rotate’ 콘텐츠 속성을 반영합니다.
SVGTextElement 객체는 DOM의 ‘text’ 요소를 나타냅니다.
[Exposed=Window] interface SVGTextElement : SVGTextPositioningElement { };
SVGTSpanElement 객체는 DOM의 ‘tspan’ 요소를 나타냅니다.
[Exposed=Window] interface SVGTSpanElement : SVGTextPositioningElement { };
SVGTextPathElement 객체는 DOM의 ‘textPath’ 요소를 나타냅니다.
[Exposed=Window] interface SVGTextPathElement : SVGTextContentElement { // textPath 메서드 유형 const unsigned short TEXTPATH_METHODTYPE_UNKNOWN = 0; const unsigned short TEXTPATH_METHODTYPE_ALIGN = 1; const unsigned short TEXTPATH_METHODTYPE_STRETCH = 2; // textPath 간격 유형 const unsigned short TEXTPATH_SPACINGTYPE_UNKNOWN = 0; const unsigned short TEXTPATH_SPACINGTYPE_AUTO = 1; const unsigned short TEXTPATH_SPACINGTYPE_EXACT = 2; [SameObject] readonly attribute SVGAnimatedLength startOffset; [SameObject] readonly attribute SVGAnimatedEnumeration method; [SameObject] readonly attribute SVGAnimatedEnumeration spacing; }; SVGTextPathElement includes SVGURIReference;
SVGTextPathElement에 정의된 숫자 메서드 유형 상수는 ‘method’ 속성이 취할 수 있는 키워드 값을 나타내는 데 사용됩니다. 그 의미는 다음과 같습니다:
| 상수 | 의미 |
|---|---|
| TEXTPATH_METHODTYPE_ALIGN | align 키워드. |
| TEXTPATH_METHODTYPE_STRETCH | stretch 키워드. |
| TEXTPATH_METHODTYPE_UNKNOWN | 그 밖의 값. |
SVGTextPathElement에 정의된 숫자 간격 유형 상수는 ‘spacing’ 속성이 취할 수 있는 키워드 값을 나타내는 데 사용됩니다. 그 의미는 다음과 같습니다:
| 상수 | 의미 |
|---|---|
| TEXTPATH_SPACINGTYPE_AUTO | auto 키워드. |
| TEXTPATH_SPACINGTYPE_EXACT | exact 키워드. |
| TEXTPATH_SPACINGTYPE_UNKNOWN | 그 밖의 값. |
startOffset IDL 속성은 ‘startOffset’ 콘텐츠 속성을 반영합니다.
method IDL 속성은 ‘method’ 콘텐츠 속성을 반영합니다. 해당 ‘method’의 숫자 유형 값은 위의 숫자 메서드 유형 상수 표에 설명된 대로입니다.
spacing IDL 속성은 ‘spacing’ 콘텐츠 속성을 반영합니다. 해당 ‘spacing’의 숫자 유형 값은 위의 숫자 간격 유형 상수 표에 설명된 대로입니다.
도형을 정의하는 그래픽 요소 – ‘path’ 요소, 기본 도형, 및 텍스트 콘텐츠 요소 – 는 객체 내부를 페인팅하는 채우기와 객체 윤곽을 따라 페인팅하는 스트로크를 통해 렌더링됩니다. 채우기와 스트로크는 모두 페인팅 연산입니다. SVG 2는 그래픽 요소의 채우기와 스트로크를 페인팅하는 데 사용할 수 있는 다양한 페인트를 지원합니다:
요소를 채우고 스트로크하는 데 사용할 페인트는 fill 및 stroke 프로퍼티를 사용하여 지정합니다. 다음 절에서는 이러한 프로퍼티에 사용할 수 있는 다양한 값을 설명합니다.
fill-opacity 및 stroke-width 같은 다른 프로퍼티도 채우기 및 스트로크 페인트가 캔버스에 적용되는 방식에 영향을 줍니다. 아래의 채우기 프로퍼티 및 스트로크 프로퍼티 절에서 이러한 프로퍼티를 설명합니다.
일부 그래픽 요소 – ‘path’ 요소 및 기본 도형 – 는 꼭짓점 또는 해당 경로를 따라 다른 위치에 마커 기호를 그릴 수도 있습니다. 아래의 마커 절에서는 마커를 정의하고 사용하는 방법을 설명합니다.
SVG 2는 도형에 마커를 추가합니다. 도쿄 F2F에서 결의되었습니다.
| SVG 2 요구 사항: | 현재 채우기 페인트, 스트로크 페인트 등을 참조하기 위한 새로운 페인트 값을 추가합니다. |
|---|---|
| 결의: | SVG 2에 새로운 페인트 값 currentFillPaint, currentStrokePaint 등을 추가합니다 |
| 목적: | 무엇보다 마커 색상을 스트로크 색상과 쉽게 일치시키기 위함입니다. |
| 담당자: | Chris (ACTION-3094) |
| SVG 2 추가 사항: | 채우기와 스트로크에 여러 페인트를 허용합니다. |
|---|---|
| 결의: | SVG 2에서 fill 및 stroke 프로퍼티에 여러 페인트를 허용합니다. |
| 목적: | 교차 해칭을 만들거나 단색 채우기 위에 부분적으로 투명한 패턴을 올리는 등의 작업에 유용합니다. |
| 담당자: | Tav (ACTION-3500) |
| 연기됨: | SVG 2에서는 제외되었지만 나중에 CSS Fill and Stroke Level 3와 동기화하여 추가할 예정입니다. |
아래에서 정의하는 fill 및 stroke 프로퍼티는 도형과 텍스트의 내부 및 그 주변 스트로크를 렌더링하는 데 사용할 페인트를 지정하는 데 사용됩니다. 페인트 명세는 캔버스에 색상 값을 적용하는 방식을 설명하며 하나 이상의 페인트 레이어로 구성됩니다. 이러한 페인트 레이어에서는 네 가지 유형의 페인트가 지원됩니다: 단색, 그라디언트, 및 패턴.
<paint> 값은 다음과 같이 정의됩니다:
<paint> = none | <color> | <url> [none | <color>]? | context-fill | context-stroke
가능한 값은 다음과 같습니다:
<paint> 값에서는 페인트 서버 참조 뒤에 선택적으로 <color> 또는 키워드 none이 올 수 있습니다. 이 선택적 값이 주어지면 <color> 값 또는 none 값은 레이어의 페인트 서버 참조가 유효하지 않은 경우(존재하지 않는 요소를 가리키거나 유효한 페인트 서버가 아닌 경우) 사용할 대체 값입니다.
이는 CSS 배경 구문과 약간 다르다는 점에 유의하십시오. CSS에서는 background 값의 마지막 레이어에 배경 이미지와 색상을 지정하면 이미지와 색상이 모두 렌더링됩니다.
<paint>의 페인트 서버 참조가 유효하지 않고 대체 값도 제공되지 않으면 해당 레이어에는 페인트가 렌더링되지 않습니다.
이는 페인트 서버 참조가 유효하지 않고 대체 색상이 지정되지 않으면 문서가 오류 상태가 되던 SVG 1.1의 동작에서 변경되었습니다.
<rect width="100" height="100" fill="url(#MyHatch) powderblue">
왼쪽 직사각형은 MyHatch가 정의된 경우 예상되는 채우기를 보여 줍니다. 오른쪽 직사각형은 MyHatch가 없는 경우 예상되는 채우기를 보여 줍니다.
모든 <color> 값에 대해 CSS Color Module Level 3에서 정의된 모든 색상 구문을 지원해야 하며, 여기에는 rgb(), rgba(), hsl(), hsla(), 확장 색상 키워드 및 currentColor 값이 포함됩니다.
context-fill 및 context-stroke 값은 페인팅되는 요소의 컨텍스트 요소의 fill 또는 stroke 프로퍼티에 대해 생성된 페인트 레이어에 대한 참조입니다. 요소의 컨텍스트 요소는 다음과 같이 정의됩니다:
컨텍스트 요소가 없는데 이러한 키워드를 사용하면 페인트가 적용되지 않습니다.
컨텍스트 페인트 레이어에 페인트 서버 참조가 포함되면 페인트 서버 요소와 콘텐츠를 크기 조정하는 데 사용하는 좌표 공간과 경계 상자는 컨텍스트 요소의 것입니다. 다시 말해 이러한 키워드로 참조한 모든 그라디언트와 패턴은 주 도형에서 마커까지 또는 use 요소 섀도 트리 안의 한 요소에서 다른 요소까지 연속되는 것이 좋습니다.
참조된 fill 또는 stroke의 값이 context-fill 및 context-stroke 값이면 이러한 컨텍스트 참조는 재귀적입니다.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<style>
path {
fill: none;
stroke-width: 4px;
marker: url(#diamond);
}
</style>
<path d="M 10,50 v -20 h 40 v -20" stroke="red"/>
<path d="M 30,70 v -20 h 40 v -20" stroke="green"/>
<path d="M 50,90 v -20 h 40 v -20" stroke="blue"/>
<marker id="diamond" markerWidth="12" markerHeight="12" refX="6" refY="6"
markerUnits="userSpaceOnUse">
<circle cx="6" cy="6" r="3"
fill="white" stroke="context-stroke" stroke-width="2"/>
</marker>
</svg>
color의 정의는 CSS Color Module Level 3 명세를 참조하십시오. [css-color-3]
color 프로퍼티는 fill, stroke, stop-color, flood-color 및 lighting-color 프로퍼티에 잠재적인 간접 값 currentColor를 제공하는 데 사용됩니다. 이 프로퍼티는 SVG 요소에 다른 효과를 주지 않습니다.
다음 예에서는 HTML 문서에서 상속된 color 프로퍼티 값을 사용하여 인라인 SVG 조각의 SVG 텍스트 색상을 설정하는 방법을 보여 줍니다.
<!DOCTYPE html>
<style>
body { color: #468; font: 16px sans-serif }
svg { border: 1px solid #888; background-color: #eee }
</style>
<p>아래 다이어그램을 참조하십시오:</p>
<svg width="200" height="100">
<g fill="currentColor">
<text x="70" y="55" text-anchor="end">시작</text>
<text x="130" y="55">정지</text>
<path d="M 85,45 h 25 v -5 l 10,10 -10,10 v -5 h -25 z"/>
</g>
</svg>
아래 다이어그램을 참조하십시오:
SVG 조각의 텍스트와 화살표는 상속된 color 프로퍼티와 같은 색으로 채워집니다.
| 이름: | fill |
|---|---|
| 값: | <paint> |
| 초기값: | black |
| 적용 대상: | 도형 및 텍스트 콘텐츠 요소 |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 대로이지만 <color> 값은 계산되고 <url> 값은 절대값으로 변환됩니다 |
| 애니메이션 유형: | 계산값에 따라 |
fill 프로퍼티는 주어진 그래픽 요소의 내부를 페인팅합니다. 페인팅할 영역은 도형 윤곽 내부의 모든 영역으로 구성됩니다. 도형 내부를 결정하기 위해 모든 하위 경로를 고려하며 내부는 현재 fill-rule 프로퍼티 값과 연결된 규칙에 따라 결정됩니다. 도형의 너비가 0인 기하학적 윤곽도 페인팅할 영역에 포함됩니다.
채우기 연산은 하위 경로의 마지막 점과 첫 번째 점을 연결하기 위해 추가 "closepath" 명령을 경로에 추가한 것처럼 채우기 연산을 수행하여 열린 하위 경로를 채웁니다. 따라서 채우기 연산은 ‘path’ 요소 내부의 열린 하위 경로 (즉, closepath 명령이 없는 하위 경로)와 ‘polyline’ 요소 모두에 적용됩니다.
| 이름: | fill-rule |
|---|---|
| 값: | nonzero | evenodd |
| 초기값: | nonzero |
| 적용 대상: | 도형 및 텍스트 콘텐츠 요소 |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 대로 |
| 애니메이션 유형: | 불연속 |
fill-rule 프로퍼티는 캔버스의 어느 부분이 도형 내부에 포함되는지 결정하는 데 사용할 알고리즘 (또는 감기 규칙)을 나타냅니다. 단순하고 교차하지 않는 경로의 경우 어느 영역이 "내부"에 있는지 직관적으로 명확합니다; 그러나 자신과 교차하거나 하나의 하위 경로가 다른 하위 경로를 둘러싸는 더 복잡한 경로에서는 "내부"의 해석이 그리 명확하지 않습니다.
fill-rule 프로퍼티는 도형의 내부를 결정하는 두 가지 방법을 제공합니다:
이 규칙은 캔버스의 한 점에서 임의의 방향으로 무한대까지 광선을 그은 다음 도형의 세그먼트가 광선을 가로지르는 지점을 조사하여 그 점의 "내부 여부"를 결정합니다. 카운트를 0에서 시작하여 경로 세그먼트가 광선을 왼쪽에서 오른쪽으로 가로지를 때마다 1을 더하고 오른쪽에서 왼쪽으로 가로지를 때마다 1을 뺍니다. 교차 횟수를 계산한 후 결과가 0이면 점은 경로 바깥쪽에 있습니다. 그렇지 않으면 안쪽에 있습니다. 다음 그림은 nonzero 규칙을 보여 줍니다:
자기 교차 및 둘러싸인 하위 경로가 있는 경로에 nonzero 채우기 규칙을 적용한 효과입니다.
이 규칙은 캔버스의 한 점에서 임의의 방향으로 무한대까지 광선을 그은 다음 주어진 도형의 경로 세그먼트 중 광선이 가로지르는 개수를 세어 그 점의 "내부 여부"를 결정합니다. 이 수가 홀수이면 점은 내부에 있고, 짝수이면 점은 외부에 있습니다. 다음 그림은 evenodd 규칙을 보여 줍니다:
자기 교차 및 둘러싸인 하위 경로가 있는 경로에 evenodd 채우기 규칙을 적용한 효과입니다.
위 설명에서는 경로 세그먼트가 광선과 일치하거나 광선에 접하는 경우 어떻게 해야 하는지는 지정하지 않습니다. 어떤 광선도 사용할 수 있으므로 이러한 문제가 있는 교차가 없는 다른 광선을 선택하면 됩니다.
| 이름: | fill-opacity |
|---|---|
| 값: | <'opacity'> |
| 초기값: | 1 |
| 적용 대상: | 도형 및 텍스트 콘텐츠 요소 |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 값을 숫자로 변환하고 [0,1] 범위로 제한한 값 |
| 애니메이션 유형: | 계산값에 따라 |
fill-opacity는 현재 객체의 채우기를 페인팅하는 데 사용하는 페인팅 연산의 불투명도를 지정합니다. ( 도형 및 텍스트 페인팅 참조).
그룹 불투명도를 지정하는 opacity 프로퍼티도 참조하십시오.
| SVG 2 요구 사항: | 크기가 조정되지 않는 스트로크를 지원합니다. |
|---|---|
| 결의: | SVG 2에는 크기가 조정되지 않는
스트로크가 포함됩니다. SVG 2에는 ‘vector-effect’ 프로퍼티가 포함됩니다. |
| 목적: | 예를 들어 지도에서 일반적인 것처럼 페이지를 확대/축소할 때 너비가 변하지 않는 스트로크를 지원하기 위함입니다. |
| 담당자: | Chris 또는 Erik (조치 없음) |
| 참고: | 이는 보다 일반적인 크기 비조정 기능의 일부가 될 수 있다는 점에 유의하십시오. |
이 절에서는 작성자가 페인트, 두께, 대시 사용, 경로 세그먼트의 연결 및 캡 처리를 포함하여 스트로크의 다양한 측면을 제어할 수 있도록 하는 여러 프로퍼티를 정의합니다.
모든 경우에 대시 패턴 관련 프로퍼티처럼 방향성의 영향을 받는 모든 스트로크 프로퍼티는 그래픽 요소가 시작되는 지점과 동일한 지점에서 스트로크 연산이 시작되도록 렌더링해야 합니다. 특히 ‘path’ 요소에서는 경로의 시작점이 최초 "moveto" 명령의 첫 번째 점입니다.
대시 패턴처럼 그래픽 요소의 윤곽을 따라 진행한 정도에 계산이 의존하는 스트로크 프로퍼티의 경우 거리 계산에 SVG 사용자 에이전트의 표준 경로를 따른 거리 알고리즘을 사용해야 합니다.
그라디언트나 패턴 같은 복합 페인트 서버를 사용하여 스트로크를 수행할 때 스트로크 연산은 현재 그래픽 요소의 기하와 관련 스트로크 프로퍼티가 정의하는 기하 도형을 동등한 ‘path’ 요소로 변환한 다음 주어진 페인트 서버를 사용하여 채웠을 때 발생하는 결과와 동일해야 합니다.
| 이름: | stroke |
|---|---|
| 값: | <paint> |
| 초기값: | none |
| 적용 대상: | 도형 및 텍스트 콘텐츠 요소 |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 대로이지만 <color> 값은 계산되고 <url> 값은 절대값으로 변환됩니다 |
| 애니메이션 유형: | 계산값에 따라 |
stroke 프로퍼티는 주어진 그래픽 요소의 윤곽을 따라 페인팅합니다.
‘path’ 요소에 스트로크를 적용할 때 moveto로 구성되지만 이후 선 그리기 명령이 없는 하위 경로에는 스트로크가 적용되지 않습니다. 'M 10,10 L 10,10' 또는 'M 30,30 Z' 같은 다른 유형의 길이가 0인 하위 경로도 stroke-linecap 프로퍼티 값이 butt이면 스트로크가 적용되지 않습니다. 경로의 스트로크를 계산하는 자세한 방법은 아래의 스트로크 도형 정의를 참조하십시오.
| SVG 2 요구 사항: | 스트로크 위치를 지정하는 방법을 포함합니다. |
|---|---|
| 결의: | SVG 2에는 스트로크 위치를 지정하는 방법을 포함합니다. |
| 목적: | 스트로크가 경로의 안쪽 또는 바깥쪽에 위치할 수 있도록 하기 위함입니다. |
| 담당자: | Cameron (ACTION-3162) |
| 참고: | 제안 페이지를 참조하십시오. |
| 이름: | stroke-opacity |
|---|---|
| 값: | <'opacity'> |
| 초기값: | 1 |
| 적용 대상: | 도형 및 텍스트 콘텐츠 요소 |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 값을 숫자로 변환하고 [0,1] 범위로 제한한 값 |
| 애니메이션 유형: | 계산값에 따라 |
stroke-opacity 프로퍼티는 현재 객체에 스트로크를 페인팅하는 데 사용하는 페인팅 연산의 불투명도를 지정합니다. ( 도형 및 텍스트 페인팅 참조.) fill-opacity와 같습니다.
그룹 불투명도를 지정하는 opacity 프로퍼티도 참조하십시오.
| 이름: | stroke-width |
|---|---|
| 값: | <length-percentage> | <number> |
| 초기값: | 1px |
| 적용 대상: | 도형 및 텍스트 콘텐츠 요소 |
| 상속: | 예 |
| 백분율: | 현재 SVG 뷰포트의 정규화된 대각선을 참조합니다(단위 참조) |
| 미디어: | 시각 |
| 계산값: | 절대 길이 또는 백분율이며, 숫자는 먼저 절대 길이로 변환됩니다 |
| 애니메이션 유형: | 계산값에 따라 |
이 프로퍼티는 현재 객체의 스트로크 너비를 지정합니다. 값이 0이면 스트로크가 페인팅되지 않습니다. 음수 값은 유효하지 않습니다. <number> 값은 사용자 단위의 값을 나타냅니다.
| 이름: | stroke-linecap |
|---|---|
| 값: | butt | round | square |
| 초기값: | butt |
| 적용 대상: | 도형 및 텍스트 콘텐츠 요소 |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 대로 |
| 애니메이션 유형: | 불연속 |
stroke-linecap은 열린 하위 경로에 스트로크를 적용할 때 그 끝에 사용할 도형을 지정하며, 열린 경로인지 닫힌 경로인지와 관계없이 길이가 0인 하위 경로에 그릴 도형도 지정합니다. 가능한 값은 다음과 같습니다:
이 값은 각 하위 경로의 각 끝에서 스트로크를 나타내는 도형이 스트로크 너비와 같은 지름을 가진 반원만큼 확장됨을 나타냅니다. 하위 경로가 열려 있든 닫혀 있든 길이가 0이면 그 결과 해당 하위 경로의 스트로크는 하위 경로의 점을 중심으로 하는 완전한 원 하나로만 구성됩니다.
이 값은 각 하위 경로 끝에서 스트로크를 나타내는 도형이 스트로크 너비와 같은 너비를 가지며 길이가 스트로크 너비의 절반인 직사각형만큼 확장됨을 나타냅니다. 하위 경로가 열려 있든 닫혀 있든 길이가 0이면 결과적으로 해당 하위 경로의 스트로크는 스트로크 너비와 같은 변 길이를 가지며 하위 경로의 점을 중심으로 하고, 두 변이 해당 하위 경로 점의 유효 접선과 평행하도록 방향이 지정된 정사각형 하나로만 구성됩니다. 길이가 0인 하위 경로에서 접선을 결정하는 방법에 대한 자세한 내용은 ‘path’ 요소 구현 참고 사항을 참조하십시오.
세 가지 유형의 선 캡입니다.
선 캡이 갖는 도형에 대한 더 정확한 설명은 아래의 캡 도형 정의를 참조하십시오.
| 이름: | stroke-linejoin |
|---|---|
| 값: | miter | round | bevel |
| 초기값: | miter |
| 적용 대상: | 도형 및 텍스트 콘텐츠 요소 |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 대로 |
| 애니메이션 유형: | 불연속 |
stroke-linejoin은 경로나 기본 도형에 스트로크를 적용할 때 모서리에 사용할 도형을 지정합니다. 자세한 내용은 경로 구현 참고 사항을 참조하십시오.
세 가지 유형의 선 연결입니다.
| 이름: | stroke-miterlimit |
|---|---|
| 값: | <number> |
| 초기값: | 4 |
| 적용 대상: | 도형 및 텍스트 콘텐츠 요소 |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 대로 |
| 애니메이션 유형: | 계산값에 따라 |
두 선 세그먼트가 날카로운 각도로 만나고 stroke-linejoin에 miter 값이 지정된 경우 연결부가 경로를 스트로크하는 선의 두께보다 훨씬 멀리 확장될 수 있습니다. stroke-miterlimit은 선 연결이 확장될 수 있는 정도에 제한을 둡니다.
이전 버전의 SVG 명세에서는 0과 1 사이의 값도 오류라고 명시했지만, 사용자 에이전트의 CSS 파서에서는 이것이 제대로 구현되지 않았습니다. 실제로 모든 마이터 연결은 0과 1 사이의 마이터 한계를 초과합니다.
miter 값의 경우 사용자 좌표계에서 세그먼트 사이의 각도 θ가 주어지면 마이터 길이는 다음과 같이 계산합니다:
miter length = stroke-width / sin(theta / 2)
역사적으로 마이터 길이는 교차하는 경로 세그먼트의 안쪽 스트로크 가장자리에서 마이터 끝까지의 거리로 정의되었습니다. 실제로는 직선 경로 세그먼트에서만 이 정의를 따릅니다. 위의 각도에 기반한 마이터 길이 정의는 연결 지점에서 경로 세그먼트의 접선에만 의존하므로 경로 세그먼트의 곡률과 관계없이 일관된 결과를 제공합니다.
왼쪽: 마이터 길이의 역사적 정의입니다. 오른쪽: 경로 세그먼트가 연결되는 지점에서 경로에 대한 접선이 동일한 서로 다른 두 경로입니다. 마이터 연결의 동작(베벨로 대체되거나 잘리는 위치)은 두 경로에서 동일합니다. 안쪽 스트로크 가장자리가 교차하는 위치에는 의존하지 않습니다.
마이터 길이를 스트로크 너비로 나눈 값이 stroke-miterlimit을 초과하면 다음 값의 경우:
stroke-miterlimit을 초과할 때 선 연결에 미치는 효과입니다. 올리브색 녹색 점선은 stroke-miterlimit 값이 3일 때 마이터 한계의 위치를 보여 줍니다. 회색 영역은 마이터 한계가 없을 때 연결부가 어떻게 보이는지를 보여 줍니다.
선 연결이 갖는 도형에 대한 더 정확한 설명은 아래의 선 연결 도형 정의를 참조하십시오.
| 이름: | stroke-dasharray |
|---|---|
| 값: | none | <dasharray> |
| 초기값: | none |
| 적용 대상: | 도형 및 텍스트 콘텐츠 요소 |
| 상속: | 예 |
| 백분율: | 현재 SVG 뷰포트의 정규화된 대각선을 참조합니다(단위 참조) |
| 미디어: | 시각 |
| 계산값: | 쉼표로 구분된 절대 길이 또는 백분율 목록이며, 숫자는 먼저 절대 길이로 변환되거나 지정된 키워드입니다 |
| 애니메이션 유형: | 본문 참조 |
여기서:
<dasharray> = [ [ <length-percentage> | <number> ]+ ]#
stroke-dasharray 프로퍼티는 경로의 스트로크 도형을 형성하는 데 사용하는 대시와 간격 패턴을 제어합니다.
사용할 대시 패턴을 지정합니다. <dasharray>는 쉼표 및/또는 공백으로 구분된 <number> 또는 <length-percentage> 값의 목록입니다. <number> 값은 사용자 단위의 값을 나타냅니다. 각 값은 스트로크를 페인팅할 경로상의 길이(대시)와 페인팅하지 않을 길이(간격)를 지정합니다. 첫 번째 값과 그 이후 목록의 매 두 번째 값은 대시 길이를 지정하고, 그 밖의 값은 대시 사이의 간격 길이를 지정합니다. 목록에 값이 홀수 개 있으면 짝수 개가 되도록 반복합니다. (따라서 stroke-dasharray: 5,3,2의 렌더링 동작은 stroke-dasharray: 5,3,2,5,3,2와 동일합니다.)
결과로 얻은 짝수 길이 대시 패턴은 각 하위 경로를 따라 반복됩니다. 대시 패턴은 각 하위 경로의 시작에서 재설정되고 다시 시작됩니다.
목록의 값 중 하나라도 음수이면 <dasharray> 값은 유효하지 않습니다. 목록의 모든 값이 0이면 스트로크는 대시 없이 실선으로 렌더링됩니다.
대시 스트로크입니다. 대시 패턴은 20,10입니다. 빨간색 선은 실제로 스트로크되는 경로를 보여 줍니다.
‘path’ 요소의 ‘pathLength’ 속성은 stroke-dasharray에 영향을 줍니다: 각 대시와 간격 길이는 ‘pathLength’로 지정한 작성자의 경로 길이를 기준으로 해석됩니다.
stroke-dasharray 값은 가산되지 않습니다. 보간 시 stroke-dasharray 값은 다음과 같이 결합합니다:
path {
stroke-dasharray: 20 40 10;
}
path:hover {
transition-property: stroke-dasharray;
transition-duration: 0.5s;
stroke-dasharray: 40 20;
}
두 값 목록을 보간하기 위해 먼저 양쪽 목록에서 대시 패턴을 반복합니다:
stroke-dasharray: 20 40 10 20 40 10;
stroke-dasharray: 40 20 40 20 40 20;
그런 다음 각 항목을 계산값에 따라 결합합니다.
| 이름: | stroke-dashoffset |
|---|---|
| 값: | <length-percentage> | <number> |
| 초기값: | 0 |
| 적용 대상: | 도형 및 텍스트 콘텐츠 요소 |
| 상속: | 예 |
| 백분율: | 현재 SVG 뷰포트의 정규화된 대각선을 참조합니다(단위 참조) |
| 미디어: | 시각 |
| 계산값: | 절대 길이 또는 백분율이며, 숫자는 먼저 절대 길이로 변환됩니다 |
| 애니메이션 유형: | 계산값에 따라 |
stroke-dashoffset 프로퍼티는 경로 시작에서 스트로크 대시 처리를 시작할 반복 대시 패턴 내의 거리를 지정합니다. 값이 음수이면 효과는 대시 오프셋 d와 동일합니다:
d = s - (abs(stroke-dashoffset) mod s)
여기서 s는 대시 배열 값의 합입니다.
0이 아닌 대시 오프셋을 가진 대시 스트로크입니다. 대시 패턴은 20,10이고 대시 오프셋은 15입니다. 빨간색 선은 실제로 스트로크되는 경로를 보여 줍니다.
stroke-dasharray와 마찬가지로 stroke-dashoffset도 ‘path’ 요소의 ‘pathLength’ 속성으로 지정한 작성자의 경로 길이를 기준으로 해석됩니다.
아래 예는 실제 경로 길이와 크게 다른 ‘pathLength’를 사용하여 스트로크 대시 처리를 더 쉽게 제어하는 방법을 보여 줍니다.
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="300" height="150">
<defs>
<path id="p" d="M -50,0 A 50,50 0 0 0 50,0 A 50,50 0 0 0 -50,0 z"
pathLength="80"/>
<g id="chip" stroke-width="10">
<circle cy="5" r="55" fill="#000" fill-opacity="0.15" stroke="none"/>
<use xlink:href="#p"/>
<use xlink:href="#p" fill="none" stroke="#eee" stroke-width="10"
stroke-dasharray="10 10" stroke-dashoffset="5"/>
<g fill="none" stroke-width="5" stroke-dasharray="0 20" stroke-linecap="round">
<use xlink:href="#p" stroke="#eee" stroke-dashoffset="10"/>
<use xlink:href="#p" stroke-dashoffset="0"/>
</g>
<circle r="40" fill="#000" fill-opacity="0.15"
stroke-width="2" stroke="white"/>
</g>
</defs>
<rect width="100%" height="100%" fill="#063"/>
<use xlink:href="#chip" x="140" y="75" fill="#00c" stroke="#00c"/>
<use xlink:href="#chip" x="160" y="85" fill="#000" stroke="#000"/>
<use xlink:href="#chip" x="170" y="65" fill="#c00" stroke="#c00"/>
</svg>
각 칩 주위의 넓은 흰색 대시 네 개와 작은 원형 대시 여덟 개는 작성자가 지정한 ‘pathLength’ 값 '80'을 기준으로 배치되어 원하는 stroke-dasharray 및 stroke-dashoffset 값을 쉽게 계산할 수 있습니다.
대시가 배치되는 경로상의 위치에 대한 더 정확한 설명은 아래의 대시 위치 정의를 참조하십시오.
| SVG 2 요구 사항: | 스트로크 대시 처리를 더 정확하게 지정합니다. |
|---|---|
| 결의: | SVG 2는 스트로크 대시 처리를 더 정확하게 지정합니다. |
| 목적: | 기본 도형과 경로 세그먼트에서 대시의 시작점을 정의하기 위함입니다. |
| 담당자: | Cameron (조치 없음) |
요소의 스트로크 도형은 stroke 프로퍼티가 채우는 도형입니다. ‘text’ 요소는 여러 청크로 렌더링될 수 있으므로 각 청크는 자체 스트로크 도형을 가집니다. 다음 알고리즘은 위의 스트로크 프로퍼티를 고려한 ‘path’, 기본 도형 또는 개별 ‘text’ 청크의 이상적인 스트로크 도형을 설명합니다. 설명된 이상적인 스트로크 도형은 최상의 구현 사례를 정의하지만 성능상의 이유로 구현이 이 설명에서 어느 정도 벗어나는 것은 허용됩니다.
스트로크에 대해 페인팅되는 도형이 플랫폼마다 달라질 수 있는 예입니다.
<svg viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg"> <path d="M 1,3 C 8,2 8,6 7,6" stroke-width="4" fill="none" stroke="skyblue"/> <path d="M 1,3 C 8,2 8,6 7,6" stroke-width="0.075" fill="none" stroke="black"/> </svg>
index와 last를 선택할 때 길이가 0인 세그먼트가 포함되는지는 중요하지 않습니다.
‘path’ 또는 기본 도형의 동등한 경로에 있는 주어진 하위 경로의 대시 위치는 각 대시의 하위 경로를 따른 시작 거리와 끝 거리를 나타내는 값 쌍의 시퀀스입니다. 이는 다음과 같이 결정됩니다:
하위 경로를 따라 주어진 position의 시작 및 끝 캡 도형은 다음과 같이 결정합니다:
길이가 0이 아닌 단일 하위 경로를 가진 경로에 사용된 서로 다른 세 stroke-linecap 값입니다. 흰색 선은 경로 자체이고 두꺼운 회색 영역은 스트로크입니다. 위쪽 행에서 녹색 선은 경로 끝점의 접선에 수직인 선을 나타내며 분홍색 영역은 캡입니다. 아래쪽 행은 수직선 및 캡 강조 없이 스트로크를 보여 줍니다.
하위 경로의 주어진 세그먼트에 대한 선 연결 도형은 다음과 같이 결정합니다:
이는 예를 들어 'M 100,100 h 100 h 100'은 두 직선 세그먼트 사이에 선 연결 도형을 생성하지 않지만 'M 100,100 h 100 h -100'은 생성한다는 의미입니다.
분홍색으로 표시된 둥근 선 연결 도형의 구성입니다. 흰색 선은 한 점에서 만나는 두 세그먼트를 가진 원래 경로이고, 회색 영역은 스트로크입니다.
이 장에서는 페인팅과 관련된 vector-effect를 설명합니다. vector-effect의 관점에 대해서는 여기를 참조하십시오.
| SVG 2 요구 사항: | 마커를 개선합니다. |
|---|---|
| 결의: | SVG 2의 마커를 개선합니다. |
| 목적: | 작성자가 SVG 마커에서 일반적으로 겪는 문제를 해결하기 위함입니다. |
| 담당자: | Cameron (ACTION-3286) |
마커는 임의의 도형 요소를 따라 특정 위치에 페인팅되는 그래픽 객체입니다.
marker-start 및 marker-end 프로퍼티는 도형의 첫 번째 및 마지막 꼭짓점에 마커를 배치하는 데 사용할 수 있고, marker-mid 프로퍼티는 그 밖의 모든 꼭짓점(첫 번째와 마지막 제외)에 마커를 배치하는 데 사용할 수 있습니다. marker-start 및 marker-end는 예를 들어 경로에 화살촉을 추가하는 데 사용할 수 있습니다. 이러한 프로퍼티를 사용하여 배치한 마커를 꼭짓점 마커라고 합니다.
SVG 2에서는 꼭짓점 마커만 사용할 수 있습니다. 다른 명세에서 새로운 유형의 마커를 추가할 예정입니다.
마커의 그래픽은 ‘marker’ 요소로 정의합니다. marker-start, marker-end 및 marker-mid 프로퍼티는 함께 마커 프로퍼티라고 하며, ‘marker’ 요소를 참조합니다.
마커는 애니메이션할 수 있으며 ‘use’ 요소와 마찬가지로 애니메이션 효과는 문서에서 현재 사용 중인 모든 마커에 표시됩니다.
주어진 요소의 마커는 아래에서 위로 다음 순서로 페인팅됩니다:
‘marker’ 요소는 도형에 마커를 그리는 데 사용할 그래픽을 정의합니다.
속성 정의:
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| markerUnits | strokeWidth | userSpaceOnUse | strokeWidth | 예 |
‘markerUnits’ 속성은 ‘markerWidth’, ‘markerHeight’ 속성과 ‘marker’ 콘텐츠의 좌표계를 정의합니다. 값의 의미는 다음과 같습니다:
‘markerUnits’ 값이 strokeWidth이면 마커의 크기는 스트로크의 사용자 좌표계에서 스트로크 너비에 영향을 주는 모든 변환을 적용한 후의 stroke-width를 기준으로 합니다. 이는 예를 들어 vector-effect 속성의 값이 non-scaling-stroke이면 마커도 크기가 조정되지 않는다는 의미입니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| markerWidth, markerHeight | <length-percentage> | <number> | 3 | 예 |
‘markerWidth’ 및 ‘markerHeight’ 속성은 ‘viewBox’ 및 ‘preserveAspectRatio’ 속성에 따라 마커가 맞춰질 SVG 뷰포트의 크기를 나타냅니다. 두 속성 중 하나라도 값이 0이면 마커는 아무것도 렌더링하지 않습니다. 두 속성 중 하나라도 음수이면 오류입니다( 오류 처리 참조).
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| refX | <length-percentage> | <number> | left | center | right | 0 | 예 |
| refY | <length-percentage> | <number> | top | center | bottom | 0 | 예 |
SVG 2에서 새로 추가됨: 기하 키워드(‘symbol’에서의 사용과 일치).
marker/symbol의 refX/refY에 top/center/bottom, left/center/right 키워드를 추가합니다. 런던 F2F에서 결의되었습니다. 값은 'background-position'에서 영감을 받았습니다.
‘refX’ 및 ‘refY’ 속성은 도형에서 마커의 위치에 정확히 배치할 마커의 기준점을 정의합니다. 길이와 숫자는 ‘viewBox’ 및 ‘preserveAspectRatio’ 속성을 적용한 후 마커 콘텐츠의 좌표계에 있는 것으로 해석해야 합니다. 백분율 값은 ‘refX’의 경우 ‘viewBox’ 너비의 백분율로, ‘refY’의 경우 ‘viewBox’ 높이의 백분율로 해석해야 합니다.
키워드 값은 다음 백분율로 평가되어야 합니다:
| 키워드 | 동등한 백분율 |
|---|---|
| left | 0% |
| center | 50% |
| right | 100% |
| top | 0% |
| bottom | 100% |
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| orient | auto | auto-start-reverse | <angle> | <number> | 0 | 예(비가산) |
‘orient’ 속성은 도형에서 마커의 위치에 배치할 때 마커를 어떻게 회전할지를 나타냅니다. 값의 의미는 다음과 같습니다:
마커는 마커가 배치되는 위치에서 경로를 기준으로 한 방향을 양의 x축이 가리키도록 방향이 지정됩니다( 마커 렌더링 참조).
marker-start로 배치된 경우 마커는 'auto'가 지정되었을 때 사용할 방향과 180° 다른 방향으로 지정됩니다. 그 밖의 모든 마커에서 'auto-start-reverse'는 'auto'와 같은 의미입니다.
이를 통해 하나의 화살촉 마커를 정의하여 경로의 시작과 끝 모두에 사용할 수 있으며, 즉 양쪽 끝에서 바깥쪽을 가리키게 할 수 있습니다.
| 이름: | marker-start, marker-mid, marker-end |
|---|---|
| 값: | none | <marker-ref> |
| 초기값: | none |
| 적용 대상: | 도형 |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 대로이지만 <marker-ref>의 일부인 <url> 값은 절대값으로 변환됩니다 |
| 애니메이션 유형: | 불연속 |
여기서:
<marker-ref> = <url>
marker-start 및 marker-end 프로퍼티는 각각 주어진 도형의 첫 번째 및 마지막 꼭짓점에 그릴 마커를 지정하는 데 사용됩니다. marker-mid는 그 밖의 모든 꼭짓점 (즉, 첫 번째와 마지막을 제외한 모든 꼭짓점)에 그릴 마커를 지정하는 데 사용됩니다. marker-start, marker-mid 및 marker-end의 가능한 값은 다음과 같습니다:
모든 도형에서 마커 위치를 계산할 때 사용해야 하는 경로는 동등한 경로입니다.
‘polyline’ 및 ‘path’을 제외한 모든 도형 요소에서는 마지막 꼭짓점이 첫 번째 꼭짓점과 같습니다. 이 경우 marker-start 및 marker-end 값이 모두 none이 아니면 마지막 꼭짓점에 두 개의 마커가 렌더링됩니다. ‘path’ 요소에서는 각 닫힌 하위 경로의 마지막 꼭짓점이 첫 번째 꼭짓점과 같습니다. marker-start는 경로 데이터의 첫 번째 꼭짓점에만 렌더링해야 합니다. marker-end는 경로 데이터의 마지막 꼭짓점에만 렌더링해야 합니다. marker-mid는 경로 데이터의 첫 번째 꼭짓점과 경로 데이터의 마지막 꼭짓점을 제외한 모든 꼭짓점에 렌더링해야 합니다.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 30">
<defs>
<marker id="m1" viewBox="0 0 10 10" refX="5" refY="5"
markerWidth="8" markerHeight="8">
<circle cx="5" cy="5" r="5" fill="green"/>
</marker>
<marker id="m2" viewBox="0 0 10 10" refX="5" refY="5"
markerWidth="6.5" markerHeight="6.5">
<circle cx="5" cy="5" r="5" fill="skyblue" opacity="0.9"/>
</marker>
<marker id="m3" viewBox="0 0 10 10" refX="5" refY="5"
markerWidth="5" markerHeight="5">
<circle cx="5" cy="5" r="5" fill="maroon" opacity="0.85"/>
</marker>
</defs>
<path d="M10,10 h10 v10 z m20,0 h10 v10 z m20,0 h10 v10 z"
fill="none" stroke="black"
marker-start="url(#m1)"
marker-mid="url(#m2)"
marker-end="url(#m3)"
/>
</svg>
닫힌 하위 경로를 포함하는 경로 데이터에서는 각 닫힌 하위 경로의 첫 번째/마지막 꼭짓점에 두 마커가 그려집니다. 가장 왼쪽 닫힌 하위 경로에서는 marker-mid가 marker-start 위에 그려집니다. 가운데 닫힌 하위 경로에서는 두 개의 marker-mid가 서로 겹쳐 그려집니다. 가장 오른쪽 닫힌 하위 경로에서는 marker-end가 marker-mid 위에 그려집니다.
marker-start 및 marker-end는 각 하위 경로가 아니라 전체 경로의 첫 번째 및 마지막 꼭짓점을 참조한다는 점에 유의하십시오.
다음 예는 두 경로 끝에 화살촉을 형성하기 위해 삼각형 마커 기호를 꼭짓점 마커로 사용하는 모습을 보여 줍니다.
<svg xmlns="http://www.w3.org/2000/svg"
width="275" height="200" viewBox="0 0 275 200">
<defs>
<marker id="Triangle" viewBox="0 0 10 10" refX="1" refY="5"
markerUnits="strokeWidth" markerWidth="4" markerHeight="3"
orient="auto">
<path d="M 0 0 L 10 5 L 0 10 z" fill="context-stroke"/>
</marker>
</defs>
<g fill="none" stroke-width="10" marker-end="url(#Triangle)">
<path stroke="crimson" d="M 100,75 C 125,50 150,50 175,75"/>
<path stroke="olivedrab" d="M 175,125 C 150,150 125,150 100,125"/>
</g>
</svg>
삼각형은 경로 끝에 배치되고 올바른 방향을 가리키도록 자동으로 방향이 지정됩니다. context-stroke를 사용하면 삼각형의 채우기가 각 ‘path’의 스트로크와 일치합니다.
| 이름: | marker |
|---|---|
| 값: | none | <marker-ref> |
| 초기값: | 축약 프로퍼티에는 정의되지 않음 |
| 적용 대상: | 도형 |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 개별 프로퍼티 참조 |
| 애니메이션 유형: | 불연속 |
marker 프로퍼티는 marker-start, marker-mid 및 marker-end 프로퍼티의 값을 설정합니다. marker의 값은 대응하는 세 본딧말 프로퍼티 모두에 직접 사용됩니다.
‘orient’를 'auto'로 지정하여 마커의 방향을 자동으로 정할 때는 다음 규칙을 사용합니다:
그리는 각 마커에 대해 마커가 올바르게 배치되고 크기가 지정되도록 임시 새 사용자 좌표계를 다음과 같이 설정합니다:
사용자 에이전트 스타일시트는 ‘marker’ 요소의 overflow 프로퍼티를 hidden으로 설정하므로 기본적으로 마커의 SVG 뷰포트 경계에 직사각형 클리핑 경로가 생성된다는 점에 유의하십시오.
프로퍼티는 ‘marker’를 참조하는 요소에서 마커 콘텐츠로 상속되지 않습니다. 그러나 정의 안의 요소에서 fill 또는 stroke에 context-stroke 값을 사용하면 하나의 마커를 마커를 참조하는 요소의 스타일과 일치하도록 설계할 수 있습니다.
마커와 상호작용할 수 없습니다. 예를 들어 렌더링된 마커를 마우스로 클릭하거나 위로 이동해도 클릭 또는 mouseover 같은 이벤트는 ‘marker’ 또는 그 자식에 전달되지 않습니다.
마커는 직접 렌더링되지 않으며 렌더링하려면 마커 프로퍼티 중 하나에서 참조해야 합니다. ‘marker’ 요소의 display 값은 사용자 에이전트 스타일시트에서 항상 none으로 설정해야 하며, 이 선언은 다른 모든 CSS 규칙 또는 프레젠테이션 속성보다 우선해야 합니다. ‘marker’ 요소는 해당 ‘marker’ 요소 또는 그 조상의 display 프로퍼티가 none으로 설정되어 있어도 참조할 수 있습니다.
마커의 렌더링 효과는 참조된 ‘marker’ 요소의 콘텐츠를 마커의 각 인스턴스에 대해 별도의 노출되지 않는 DOM 트리로 깊은 복제한 것과 같습니다. 복제된 DOM 트리는 노출되지 않으므로 SVG DOM에는 복제된 마커 인스턴스가 표시되지 않습니다.
참조된 ‘marker’ 요소를 노출되지 않는 DOM 트리로 개념적으로 깊게 복제하면 참조된 요소와 그 콘텐츠에서 CSS 캐스케이드 ([CSS2], 제6장) 및 프로퍼티 상속으로 발생한 모든 프로퍼티 값도 복사됩니다. 원본(즉, 참조된) 요소는 정식 문서 구조의 일부이므로 CSS 선택자를 적용할 수 있습니다. 개념적으로 복제된 DOM 트리에는 그 콘텐츠가 정식 문서 구조의 일부가 아니므로 CSS 선택자를 적용할 수 없습니다.
설명을 위해 앞에서 본 마커 예를 다시 사용합니다:
<?xml version="1.0" standalone="no"?>
<svg width="4in" height="2in"
viewBox="0 0 4000 2000"
xmlns="http://www.w3.org/2000/svg">
<defs>
<marker id="Triangle"
viewBox="0 0 10 10" refX="0" refY="5"
markerUnits="strokeWidth"
markerWidth="4" markerHeight="3"
orient="auto">
<path d="M 0 0 L 10 5 L 0 10 z" />
</marker>
</defs>
<rect x="10" y="10" width="3980" height="1980"
fill="none" stroke="blue" stroke-width="10" />
<desc>경로 끝에 화살촉을 배치합니다.
</desc>
<path d="M 1000 750 L 2000 750 L 2500 1250"
fill="none" stroke="black" stroke-width="100"
marker-end="url(#Triangle)" />
</svg>
위 파일의 렌더링 효과는 시각적으로 다음과 동일합니다:
<?xml version="1.0" standalone="no"?>
<svg width="4in" height="2in"
viewBox="0 0 4000 2000"
xmlns="http://www.w3.org/2000/svg">
<desc>마커 예제 파일과 동일한 효과를 생성하지만
마커를
사용하지 않는 파일입니다.
</desc>
<rect x="10" y="10" width="3980" height="1980"
fill="none" stroke="blue" stroke-width="10" />
<!-- 경로는 이전과 같이 그려지지만 마커 프로퍼티는 없습니다 -->
<path d="M 1000 750 L 2000 750 L 2500 1250"
fill="none" stroke="black" stroke-width="100" />
<!-- 다음 로직은 경로의 마지막 꼭짓점에
마커를 그리는 것을 시뮬레이션합니다. -->
<!-- 먼저 사용자 좌표계의 원점을 이동하여
이제 원점이 경로의 끝점과 정렬되도록 합니다. -->
<g transform="translate(2500,1250)" >
<!-- 마커에 orient="auto"가 지정되어 있고 경로의 마지막 세그먼트가
45도 방향으로 진행하므로
좌표계를 45도 회전합니다. -->
<g transform="rotate(45)" >
<!-- 이 경우 'strokeWidth' 값을 갖는 'markerUnits' 속성이
나타내는 좌표계와 일치하도록 좌표계를
크기 조정합니다. 따라서 좌표계를
현재 'stroke-width' 프로퍼티 값인 100으로 크기 조정합니다. -->
<g transform="scale(100)" >
<!-- 마커 내부의 (refX,refY)가 꼭짓점과 정렬되도록
좌표계를
(-refX*viewBoxToMarkerUnitsScaleX, -refY*viewBoxToMarkerUnitsScaleY)만큼 이동합니다.
이 경우 preserveAspectRatio의 기본값
('xMidYMid meet')을 사용합니다. 이는 SVG 뷰포트 안에 viewBox 전체가
맞도록('meet') 균일 배율
(즉, viewBoxToMarkerUnitsScaleX=viewBoxToMarkerUnitsScaleY)을 찾고
중앙 정렬('xMidYMid')한다는 의미입니다. 이 경우 균일 배율은
markerHeight/viewBoxHeight=3/10=.3입니다. 따라서
(-refX*.3,-refY*.3)=(0*.3,-5*.3)=(0,-1.5)만큼 이동합니다. -->
<g transform="translate(0,-1.5)" >
<!-- 사용자 에이전트 스타일시트가 마커의 'overflow' 프로퍼티 값을
'hidden'으로 지정하므로 암시적 클리핑 경로가 있습니다.
이를 구현하기 위해 SVG 뷰포트 경계에 클리핑 경로를 생성합니다.
이 경우 균일 배율, markerWidth/viewBoxWidth와
markerHeight/viewBoxHeight의 서로 다른 비율 및
'xMidYMid' 정렬 때문에 SVG 뷰포트가 viewBox의 왼쪽과 오른쪽으로
0.5단위씩 확장된다는 점에 유의하십시오 -->
<clipPath id="cp1" >
<rect x="-0.5" y="0" width="4" height="3" />
</clipPath>
<g clip-path="url(#cp1)" >
<!-- 좌표계를 viewBox 단위로 설정하기 위해 균일 배율
markerHeight/viewBoxHeight=3/10=.3으로 좌표계를
크기 조정합니다. -->
<g transform="scale(.3)" >
<!-- 이 'g' 요소는 원래 'marker' 요소의
캐스케이드 및 프로퍼티 상속으로 발생한 모든 프로퍼티 값을 가집니다.
이 예에서는 'marker' 요소나 'marker'의 조상에 fill 또는 stroke가 지정되지 않았으므로
각각 초기값
"black"과 "none"이 사용됩니다. -->
<g fill="black" stroke="none" >
<!-- 'marker' 요소의 콘텐츠를 펼칩니다. -->
<path d="M 0 0 L 10 5 L 0 10 z" />
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>
| SVG 2 요구 사항: | 도형에서 채우기, 스트로크 및 마커 페인팅 순서를 제어할 수 있도록 지원합니다. |
|---|---|
| 결의: | SVG 2는 ‘paint-order’ 프로퍼티 제안을 채택하되 이름이 달라질 수 있습니다. 프로퍼티 이름은 이제 결정되었습니다. 2013년 11월 15일 회의록을 참조하십시오. |
| 목적: | 요소를 복제하지 않고 스트로크를 채우기 아래에 페인팅하려는 일반적인 요구를 해결하기 위함입니다. |
| 담당자: | Cameron (ACTION-3285) |
| 이름: | paint-order |
|---|---|
| 값: | normal | [ fill || stroke || markers ] |
| 초기값: | normal |
| 적용 대상: | 도형 및 텍스트 콘텐츠 요소 |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 대로 |
| 애니메이션 유형: | 불연속 |
SVG 2에서 새로 추가되었습니다. 주로 ‘text’ 요소를 복제하지 않고 텍스트의 스트로크를 채우기 아래에 페인팅할 수 있도록 추가되었습니다.
paint-order 프로퍼티는 도형과 텍스트가 렌더링되는 세 가지 페인트 연산, 즉 채우기, 스트로크 및 있을 수 있는 모든 마커의 순서를 제어합니다.
이 프로퍼티의 값이 normal이면 요소는 표준 페인팅 연산 순서로 페인팅됩니다: 먼저 채우기를 페인팅하고 그 다음 스트로크, 마지막으로 마커를 페인팅합니다.
다른 키워드 중 하나를 사용하면 요소를 페인팅하는 페인트 연산 순서는 왼쪽에서 오른쪽으로 지정된 순서를 따릅니다. 세 키워드 중 하나라도 생략하면 생략된 것은 마지막에 paint-order: normal에서 페인팅되는 순서대로 페인팅됩니다.
이는 예를 들어 paint-order: stroke가 paint-order: stroke fill markers와 동일한 렌더링 동작을 갖는다는 의미입니다.
다음 예는 paint-order 프로퍼티를 사용하여 스트로크된 텍스트를 더 보기 좋은 방식으로 렌더링하는 방법을 보여 줍니다.
<svg xmlns="http://www.w3.org/2000/svg"
width="600" height="150" viewBox="0 0 600 150">
<style>
text {
font: 80px bold sans-serif; stroke-linejoin: round;
text-anchor: middle; fill: peachpuff; stroke: crimson;
}
</style>
<text x="150" y="100" style="stroke-width: 6px;">pizazz</text>
<text x="450" y="100" style="stroke-width: 12px; paint-order: stroke;">pizazz</text>
</svg>
채우기 아래에 스트로크를 페인팅한 텍스트입니다.
| 이름: | color-interpolation |
|---|---|
| 값: | auto | sRGB | linearRGB |
| 초기값: | sRGB |
| 적용 대상: | 컨테이너 요소, 그래픽 요소, 그라디언트 요소, ‘use’ 및 ‘animate’ |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 대로 |
| 애니메이션 유형: | 불연속 |
SVG 사용자 에이전트는 SVG 콘텐츠를 처리하면서 여러 지점에서 색상 보간 및 합성을 수행합니다. color-interpolation 프로퍼티는 다음 그래픽 연산에 사용할 색 공간을 제어합니다:
필터 효과의 경우 color-interpolation-filters 프로퍼티가 사용할 색 공간을 제어합니다. [filter-effects-1]
color-interpolation 프로퍼티는 sRGB 색 공간 또는 (광 에너지 선형) 선형화된 RGB 색 공간에서 수행되는 색상 연산 중 하나를 선택합니다. 적절한 색 공간을 선택한 후에는 성분별 선형 보간을 사용합니다. color-interpolation 값의 의미는 다음과 같습니다:
sRGB 색 공간 (즉, 2.2 감마 곡선을 가진 비선형)과 선형화된 RGB 색 공간(즉, 감마 곡선 없이 sRGB 삼자극 값으로 표현한 색상 값) 사이의 변환 공식은 sRGB 명세 [SRGB]에서 확인할 수 있습니다. 설명을 위해 다음 공식은 sRGB에서 선형화된 RGB로의 변환을 보여 줍니다. 여기서 Csrgb는 세 sRGB 색상 성분 중 하나이고, Clinear는 대응하는 선형화된 RGB 색상 성분이며 모든 색상 값은 0과 1 사이입니다:
if C_srgb <= 0.04045 C_linear = C_srgb / 12.92 else if c_srgb > 0.04045 C_linear = ((C_srgb + 0.055) / 1.055) ^ 2.4
사용자 에이전트가 범위를 벗어난 색상 값을 지원하는 경우 이러한 값도 위 공식을 사용하여 변환합니다.
자식 요소가 배경에 블렌딩될 때 블렌딩 유형은 부모의 color-interpolation 값이 아니라 자식의 color-interpolation 프로퍼티 값으로 결정됩니다. ‘href’ 속성을 사용하여 다른 그라디언트를 참조하는 그라디언트의 경우 그라디언트는 fill 또는 stroke 프로퍼티가 직접 참조하는 그라디언트 요소의 color-interpolation 프로퍼티 값을 사용합니다. 색상을 애니메이션할 때는 애니메이션되는 요소의 color-interpolation 프로퍼티 값에 따라 색상 보간을 수행합니다.
| 이름: | shape-rendering |
|---|---|
| 값: | auto | optimizeSpeed | crispEdges | geometricPrecision |
| 초기값: | auto |
| 적용 대상: | 도형 |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 대로 |
| 애니메이션 유형: | 불연속 |
shape-rendering 프로퍼티는 ‘path’ 요소와 원 및 직사각형 같은 기본 도형 등의 벡터 그래픽 요소를 렌더링할 때 어떤 절충을 할지 구현에 힌트를 제공합니다. 값의 의미는 다음과 같습니다:
| 이름: | text-rendering |
|---|---|
| 값: | auto | optimizeSpeed | optimizeLegibility | geometricPrecision |
| 초기값: | auto |
| 적용 대상: | ‘text’ |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 대로 |
| 애니메이션 유형: | 불연속 |
text-rendering 프로퍼티는 텍스트를 렌더링할 때 어떤 절충을 할지 구현에 힌트를 제공합니다. 값의 의미는 다음과 같습니다:
| 이름: | image-rendering |
|---|---|
| 값: | auto | optimizeQuality | optimizeSpeed |
| 초기값: | auto |
| 적용 대상: | 이미지 |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 대로 |
| 애니메이션 유형: | 불연속 |
CSS Image Values and Replacement Content Module Level 4는 향후 이 프로퍼티를 다시 정의할 수 있습니다. 특히 확대할 때 스무딩과 픽셀화된 외관 유지 중에서 선택할 수 있도록 해야 합니다.
image-rendering 프로퍼티는 이미지 처리를 수행할 때 속도와 품질 사이를 어떻게 절충할지 구현에 힌트를 제공합니다. 값의 의미는 다음과 같습니다:
모든 경우에 원본 데이터 및/또는 대상 장치가 인덱스 색상을 사용하더라도 리샘플링은 트루컬러(예: 24비트) 색 공간에서 수행해야 합니다. 고품질 SVG 뷰어는 선형 색 공간을 사용하여 이미지 리샘플링을 수행하는 것이 좋습니다.
will-change의 정의는 CSS Will Change Module Level 1 명세를 참조하십시오.
will-change 프로퍼티는 콘텐츠에 이루어질 변경 유형에 관한 힌트를 사용자 에이전트에 제공하여 사용자 에이전트가 주어진 요소에 대해 렌더링 최적화를 수행할 가능성을 높이는 데 사용됩니다.
will-change 프로퍼티는 모든 SVG 그래픽 요소에 적용되지만 SVG 요소는 스크롤을 지원하지 않으므로 scroll-position 값은 아무런 효과가 없습니다.
다음 예는 will-change를 사용하여 요소의 transform 프로퍼티가 변경될 것임을 사용자 에이전트에 미리 알리고, 사용자 에이전트가 해당 요소를 자체 GPU 레이어에 렌더링하여 스크립트로 수행되는 transform 변경이 부드럽게 보이도록 할 수 있음을 보여 줍니다.
<svg xmlns="http://www.w3.org/2000/svg">
<style>
#background { fill: lemonchiffon; }
#star {
fill: cornflowerblue;
stroke: navy; stroke-width: 5px; stroke-linejoin: round;
paint-order: stroke fill;
will-change: transform;
}
text { font: 24px sans-serif; user-select: none; }
</style>
<g onmousemove="drag(evt.clientX, evt.clientY);"
onmouseup="dragging = false;">
<rect id="background" width="100%" height="100%"/>
<text x="10" y="30">별을 드래그하세요!</text>
<path id="star" transform="translate(200,150)"
d="M 0.00,-40.00 -11.76,-16.18 -38.04,-12.36 -19.02,6.18 -23.51,32.36
0.00,20.00 23.51,32.36 19.02,6.18 38.04,-12.36 11.76,-16.18 z"
onmousedown="dragging = true;"/>
</g>
<script>
var dragging = false;
var star = document.getElementById("star");
function drag(x, y) {
if (dragging) {
star.setAttribute("transform", "translate(" + x + "," + y + ")");
}
}
</script>
</svg>
SVG 요소에서 will-change를 지원하는 사용자 에이전트에서는 별을 레이어에 렌더링하여 캔버스에서 드래그할 때 빠르게 합성할 수 있습니다. 대화형 SVG 문서 보기.
will-change 프로퍼티는 SVG Tiny 1.2에서 정의된 ‘buffered-rendering’ 프로퍼티를 대체합니다.
SVGMarkerElement 객체는 DOM의 ‘marker’ 요소를 나타냅니다.
[Exposed=Window] interface SVGMarkerElement : SVGElement { // 마커 단위 유형 const unsigned short SVG_MARKERUNITS_UNKNOWN = 0; const unsigned short SVG_MARKERUNITS_USERSPACEONUSE = 1; const unsigned short SVG_MARKERUNITS_STROKEWIDTH = 2; // 마커 방향 유형 const unsigned short SVG_MARKER_ORIENT_UNKNOWN = 0; const unsigned short SVG_MARKER_ORIENT_AUTO = 1; const unsigned short SVG_MARKER_ORIENT_ANGLE = 2; const unsigned short SVG_MARKER_ORIENT_AUTO_START_REVERSE = 3; [SameObject] readonly attribute SVGAnimatedLength refX; [SameObject] readonly attribute SVGAnimatedLength refY; [SameObject] readonly attribute SVGAnimatedEnumeration markerUnits; [SameObject] readonly attribute SVGAnimatedLength markerWidth; [SameObject] readonly attribute SVGAnimatedLength markerHeight; [SameObject] readonly attribute SVGAnimatedEnumeration orientType; [SameObject] readonly attribute SVGAnimatedAngle orientAngle; attribute DOMString orient; undefined setOrientToAuto(); undefined setOrientToAngle(SVGAngle angle); }; SVGMarkerElement includes SVGFitToViewBox;
SVGMarkerElement에 정의된 숫자 마커 단위 유형 상수는 ‘markerUnits’ 속성이 취할 수 있는 키워드 값을 나타내는 데 사용됩니다. 그 의미는 다음과 같습니다:
| 상수 | 의미 |
|---|---|
| SVG_MARKERUNITS_USERSPACEONUSE | userSpaceOnUse 키워드. |
| SVG_MARKERUNITS_STROKEWIDTH | strokeWidth 키워드. |
| SVG_MARKERUNITS_UNKNOWN | 그 밖의 값. |
SVGMarkerElement에 정의된 숫자 마커 방향 유형 상수는 ‘orient’ 속성이 취할 수 있는 값의 유형을 나타내는 데 사용됩니다. 그 의미는 다음과 같습니다:
| 상수 | 의미 |
|---|---|
| SVG_MARKER_ORIENT_AUTO | auto 키워드. |
| SVG_MARKER_ORIENT_AUTO_START_REVERSE | auto-start-reverse 키워드. |
| SVG_MARKER_ORIENT_ANGLE | 방향 각도를 나타내는 <angle> 또는 <number> 값. |
| SVG_MARKER_ORIENT_UNKNOWN | 그 밖의 값. |
markerUnits IDL 속성은 ‘markerUnits’ 콘텐츠 속성을 반영합니다. ‘markerUnits’의 숫자 유형 값은 위의 숫자 마커 단위 유형 상수 표에 설명된 대로입니다.
orientType, orientAngle 및 orient IDL 속성은 모두 ‘orient’ 콘텐츠 속성을 반영합니다. ‘orient’의 숫자 유형 값은 다음과 같습니다:
| 값 | 숫자 유형 값 |
|---|---|
| auto | SVG_MARKER_ORIENT_AUTO |
| auto-start-reverse | SVG_MARKER_ORIENT_AUTO_START_REVERSE |
| <angle> | <number> | SVG_MARKER_ORIENT_ANGLE |
refX, refY, markerWidth 및 markerHeight IDL 속성은 각각 ‘refX’, ‘refY’, ‘markerWidth’ 및 ‘markerHeight’ 콘텐츠 속성을 반영합니다.
setOrientToAuto 메서드는 ‘orient’ 속성 값을 'auto'로 설정하는 데 사용됩니다. setOrientToAuto()가 호출되면 ‘orient’ 속성을 단순히 'auto'로 설정합니다.
setOrientToAngle 메서드는 ‘orient’ 속성 값을 특정 각도 값으로 설정하는 데 사용됩니다. setOrientToAngle(angle)가 호출되면 ‘orient’ 속성은 angle을 값으로 사용하여 재직렬화됩니다.
이 절에서는 객체의 fill 또는 stroke를 다른 곳에 있는 리소스로 정의할 수 있게 하는 방법인 페인트 서버를 다룹니다. 이를 통해 문서 전체에서 리소스를 재사용할 수 있습니다. 객체의 채우기와 스트로크에 대한 일반적인 설명은 페인팅: 채우기 및 스트로크 절을 참조하십시오.
SVG는 여러 유형의 페인트 서버를 정의합니다:
| SVG 2 요구 사항: | 도형에 임의의 채우기를 사용합니다. |
|---|---|
| 결의: | SVG 2는 임의의 요소로부터 채우기와 스트로크를 지원해야 합니다. |
| 목적: | 예를 들어 비디오나 이미지를 채우기 소스로 사용할 수 있도록 하기 위함입니다. |
| 담당자: | Alex? (조치 없음) |
두 유형의 페인트 서버입니다. 왼쪽에서 오른쪽으로: 선형 그라디언트. 패턴.
페인트 서버는 fill 또는 stroke 프로퍼티에 URL 참조를 포함하여 사용합니다(즉, fill="url(#MyLightPurple)").
프로퍼티는 조상에서 페인트 서버 요소로 상속됩니다; 프로퍼티는 페인트 서버 요소를 참조하는 요소에서는 상속되지 않습니다.
페인트 서버 요소는 절대로 직접 렌더링되지 않으며, 유일한 용도는 fill 및 stroke 프로퍼티를 사용하여 참조할 수 있는 대상으로 사용되는 것입니다. 이러한 요소의 display 값은 사용자 에이전트 스타일시트에서 항상 none으로 설정해야 하며, 이 선언은 다른 모든 CSS 규칙이나 프레젠테이션 속성보다 높은 중요도를 가져야 합니다. 페인트 서버 요소는 페인트 서버 요소 또는 그 조상의 display 프로퍼티가 none으로 설정되어 있어도 참조할 수 있습니다.
대부분의 페인트 서버 요소는 ‘href’ 속성을 허용하며, 이를 사용하여 호환되는 페인트 서버 요소를 템플릿으로 정의할 수 있습니다. 현재 요소에 대응하는 속성이 지정되지 않은 경우 템플릿 요소에 정의된 속성을 초기값 대신 사용합니다. 또한 현재 요소에 설명 요소 이외의 자식 콘텐츠가 없으면, 템플릿 요소의 자식 콘텐츠를 복제하여 이를 대체합니다.
설명 콘텐츠를 제외하는 것은 ‘pattern’에 대해 SVG 2에서 새로 추가되었으며, 그라디언트의 동작과 일치하고, 모든 SVG 요소에서 설명 콘텐츠를 유효하게 만드는 변경 사항과도 일치합니다.
또한 새로 추가된 사항으로, 템플릿 상호 참조는 외부 파일 리소스를 참조할 수 있으며 (SVG 1.1의 서로 다른 장에서는 이 점에 대해 일관되지 않은 지침이 있었습니다), 자식 요소의 "상속"은 섀도 트리를 통해 표현됩니다.
템플릿화는 임의의 수준까지 간접적으로 이루어질 수 있습니다 (외부 파일 리소스에 대한 보안 제한으로 인해 참조가 유효하지 않게 될 수 있음). 따라서 참조된 템플릿 요소에 관련 자식 콘텐츠가 없거나 지정된 속성을 정의하지 않으면, 속성 값 또는 복제된 콘텐츠는 템플릿 자체의 ‘href’ 속성이 참조하는 다른 요소에서 파생됩니다.
이 장의 각 ‘href’ 속성 설명은 템플릿화 과정의 한계를 다음과 같이 정의합니다:
지정된 속성 중 하나라도 현재 요소에 정의되어 있지 않거나, 현재 요소에 설명 요소 이외의 자식 요소가 없으면, 사용자 에이전트는 참조된 리소스를 식별하기 위해 URL을 처리해야 합니다. URL 참조가 유효하지 않은 것이 아니면, URL의 대상 요소를 다음과 같이 템플릿 요소로 사용합니다:
현재 요소에 정의되지 않은 지정 속성 각각에 대해 사용자 에이전트는 템플릿 요소의 속성 값을 결정하고 이를 현재 요소의 값으로 사용해야 합니다. 템플릿 값은 필요한 경우 재귀적인 상호 참조에서 파생됩니다. 속성의 초기값은 모든 유효한 URL 참조가 소진된 후에만 대체됩니다.
현재 요소에 설명 요소 이외의 자식 요소가 없으면, 사용자 에이전트는 이 요소에 대한 섀도 트리를 생성해야 하며, 이 섀도 트리는 use 요소 섀도 트리와 동등하게 동작해야 하지만, 호스트는 현재 페인트 서버 요소입니다. 섀도 트리로 복제되는 요소 인스턴스의 참조된 문서 하위 트리에 있는 소스 요소는 다음과 같습니다:
페인트 서버 요소에 섀도 트리가 있으면, 해당 트리의 요소 인스턴스를 페인트 서버 효과를 렌더링하는 데 마치 페인트 서버 요소 자체의 자식인 것처럼 사용해야 합니다.
템플릿화를 위한 use 요소 섀도 트리 모델을 사용하면 복제된 콘텐츠가 원본과 다른 스타일을 상속할 수 있습니다. 이 동작은 SVG 2에서 새로 정의되었습니다; SVG 1.1에서는 상속된 페인트 서버 콘텐츠에 적용되는 스타일 방식을 정의하지 않았습니다.
그라디언트는 그리기 표면의 점 사이에서 이루어지는 부드러운 색상 전환으로 구성됩니다. SVG는 두 유형의 그라디언트를 제공합니다:
그라디언트가 정의되면 그래픽 요소의 fill 또는 stroke 프로퍼티가 그라디언트를 참조하도록 설정하여 해당 그라디언트로 채우거나 스트로크할 수 있습니다.
선형 및 방사형 그라디언트의 색상 전환은 그라디언트 벡터를 따른 일련의 색상 스톱으로 정의됩니다. 그라디언트 법선은 벡터의 색상을 표면에 어떻게 페인팅하는지를 정의합니다. 선형 그라디언트에서 법선은 벡터에 수직인 선입니다. 방사형 그라디언트에서 법선은 벡터와 직각으로 교차하는 원입니다. 각 그라디언트 법선은 벡터가 결정한 하나의 색상으로 페인팅됩니다.
그라디언트 벡터가 표시된 선형 및 방사형 그라디언트입니다. 벡터는 작은 원으로 표시된 세 개의 스톱으로 구성됩니다. 각 그라디언트마다 하나의 그라디언트 법선이 표시됩니다.
선형 및 방사형 그라디언트에서 그라디언트 벡터를 따라 두 스톱 사이의 색상 값은 각 스톱의 색상을 각 스톱으로부터의 거리에 따라 가중하여 채널별로 선형 보간한 값입니다.
$V = C0.rgba + (C1.rgba - C0.rgba) * ((D - C0.offset) / (C1.offset - C0.offset));
여기서 각 채널에 대해:
그래픽 요소가 그라디언트를 참조하면, 개념적으로 그래픽 요소는 그라디언트 법선을 포함한 그라디언트 벡터의 복사본을 가져와 자체 기하의 일부로 취급하는 것이 좋습니다. 그래픽 요소의 기하에 적용되는 모든 변환은 복사된 그라디언트 벡터와 그라디언트 법선에도 적용됩니다. 참조된 그라디언트에 지정된 모든 그라디언트 변환은 그라디언트에 그래픽 요소 변환이 적용되기 전에 적용됩니다.
선형 그라디언트는 ‘linearGradient’ 요소로 정의됩니다.
‘linearGradient’의 ‘x1’,‘y1’, ‘x2’ 및 ‘y2’ 속성은 프레젠테이션 속성이 아니라는 점에 유의하십시오; 사용값은 CSS 스타일의 영향을 받지 않습니다. ‘gradientTransform’ 속성은 transform 프로퍼티의 프레젠테이션 속성입니다.
‘x1’, ‘y1’, ‘x2’ 및 ‘y2’ 속성의 좌표계를 정의합니다.
gradientUnits="userSpaceOnUse"이면, ‘x1’, ‘y1’, ‘x2’, 및 ‘y2’ 는 그라디언트 요소가 참조되는 시점에 적용되는 현재 사용자 좌표계 (즉, fill 또는 stroke 프로퍼티를 통해 그라디언트 요소를 참조하는 요소의 사용자 좌표계)를 가져온 다음 ‘gradientTransform’ 속성이 지정하는 변환을 적용한 결과의 좌표계에서 값을 나타냅니다. 백분율은 현재 SVG 뷰포트를 기준으로 하는 값을 나타냅니다.
gradientUnits="objectBoundingBox"이면, 속성의 사용자 좌표계는 ‘x1’, ‘y1’, ‘x2’ 및 ‘y2’ 그라디언트가 적용되는 요소의 경계 상자를 사용하여 설정하고 (객체 경계 상자 단위 참조), 그런 다음 ‘gradientTransform’ 속성이 지정하는 변환을 적용합니다. 백분율은 객체의 경계 상자를 기준으로 하는 값을 나타냅니다.
gradientUnits="objectBoundingBox"이고 ‘gradientTransform’ 이 항등 행렬이면, 선형 그라디언트의 법선은 객체 경계 상자 공간 (즉, (0,0)이 객체 경계 상자의 위쪽/왼쪽에 있고 (1,1)이 객체 경계 상자의 아래쪽/오른쪽에 있는 추상 좌표계)에서 그라디언트 벡터에 수직입니다. 객체의 경계 상자가 정사각형이 아니면 객체 경계 상자 공간에서 처음에는 그라디언트 벡터에 수직인 그라디언트 법선이 사용자 공간에서는 그라디언트 벡터에 수직이 아닌 것으로 렌더링될 수 있습니다. 그라디언트 벡터가 경계 상자의 축 중 하나와 평행하면 그라디언트 법선은 계속 수직으로 유지됩니다. 이 변환은 경계 상자 공간에서 사용자 좌표계로의 비균일 크기 조정 변환을 적용하기 때문에 발생합니다.
그라디언트 좌표계에서 대상 좌표계로의 선택적 추가 변환 정의를 포함합니다 (즉, 'userSpaceOnUse' 또는 'objectBoundingBox'). 이를 통해 그라디언트를 기울이는 등의 작업을 할 수 있습니다. 이 추가 변환 행렬은 이전에 정의된 모든 변환의 뒤에 곱해집니다 (즉, 오른쪽에 삽입됩니다). 여기에는 객체 경계 상자 단위에서 사용자 좌표계로 변환하는 데 필요한 암시적 변환도 포함됩니다.
‘x1’, ‘y1’, ‘x2’ 및 ‘y2’는 선형 그라디언트의 그라디언트 벡터를 정의합니다. 이 그라디언트 벡터는 그라디언트 스톱이 매핑되는 시작점과 끝점을 제공합니다. ‘x1’, ‘y1’, ‘x2’ 및 ‘y2’의 값은 숫자 또는 백분율일 수 있습니다.
‘x1’을 참조하십시오.
‘x1’을 참조하십시오.
‘x1’을 참조하십시오.
그라디언트가 대상 직사각형의 경계 안에서 시작하거나 끝나는 경우 어떻게 되는지를 나타냅니다.
spreadMethod의 세 가지 가능한 값을 왼쪽에서 오른쪽으로 보여 줍니다: pad, reflect, repeat. 그라디언트 벡터는 경계 상자 너비의 40%에서 60%까지 이어집니다.
템플릿 그라디언트 요소에 대한 URL 참조입니다; 유효하려면 참조가 다른 ‘linearGradient’ 또는 ‘radialGradient’ 요소를 가리켜야 합니다.
페인트 서버를 템플릿으로 사용하는 과정과 URL 참조 속성 및 폐기된 XLink 속성에 정의된 공통 처리를 참조하십시오.
템플릿에서 복사될 지정 속성은 다음과 같습니다:
‘x1’ = ‘x2’ 이고 ‘y1’ = ‘y2’이면, 페인팅할 영역은 마지막 그라디언트 스톱의 색상과 불투명도를 사용하여 단일 색상으로 페인팅됩니다.
예 lingrad01은 선형 그라디언트 페인트 서버를 참조하여 직사각형을 채우는 방법을 보여 줍니다.
<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg"
version="1.1"
viewBox="0 0 300 200" >
<title>예 lingrag01</title>
<desc>선형 그라디언트 페인트 서버를 사용하여 직사각형을 채웁니다.</desc>
<defs>
<linearGradient id="MyGradient">
<stop offset="5%" stop-color="#A8F" />
<stop offset="95%" stop-color="#FDC" />
</linearGradient>
</defs>
<!-- 직사각형은 선형 그라디언트 페인트 서버를 사용하여 채워집니다 -->
<rect fill="url(#MyGradient)"
stroke="black"
stroke-width="2"
x="25" y="25" width="250" height="150"/>
</svg>
예 lingrad01
방사형 그라디언트는 ‘radialGradient’ 요소로 정의됩니다.
‘radialGradient’의 ‘cx’,‘cy’, 및 ‘r’ 속성은 프레젠테이션 속성이 아니라는 점에 유의하십시오; 사용값은 CSS 스타일의 영향을 받지 않습니다. ‘gradientTransform’ 속성은 transform 프로퍼티의 프레젠테이션 속성입니다.
속성 ‘cx’, ‘cy’, ‘r’, ‘fx’, ‘fy’, 및 ‘fr’의 좌표계를 정의합니다.
gradientUnits="userSpaceOnUse"이면, ‘cx’, ‘cy’, ‘r’, ‘fx’, ‘fy’, 및 ‘fr’ 은 그라디언트 요소가 참조되는 시점에 적용되는 현재 사용자 좌표계 (즉, fill 또는 stroke 프로퍼티를 통해 그라디언트 요소를 참조하는 요소의 사용자 좌표계)를 가져온 다음 ‘gradientTransform’ 속성이 지정하는 변환을 적용한 결과의 좌표계에서 값을 나타냅니다. 백분율은 현재 SVG 뷰포트를 기준으로 하는 값을 나타냅니다.
gradientUnits="objectBoundingBox"이면, 속성의 사용자 좌표계는 ‘cx’, ‘cy’, ‘r’, ‘fx’, ‘fy’, 및 ‘fr’ 그라디언트가 적용되는 요소의 경계 상자를 사용하여 설정하고 (객체 경계 상자 단위 참조), 그런 다음 ‘gradientTransform’ 속성이 지정하는 변환을 적용합니다. 백분율은 객체의 경계 상자를 기준으로 하는 값을 나타냅니다.
gradientUnits="objectBoundingBox"이고 ‘gradientTransform’ 이 항등 행렬이면, 방사형 그라디언트의 링은 객체 경계 상자 공간 (즉, (0,0)이 객체 경계 상자의 위쪽/왼쪽에 있고 (1,1)이 객체 경계 상자의 아래쪽/오른쪽에 있는 추상 좌표계)을 기준으로 원형입니다. 객체의 경계 상자가 정사각형이 아니면 객체 경계 상자 공간에서 개념적으로 원형인 링은 경계 상자 공간에서 사용자 좌표계로의 비균일 크기 조정 변환을 적용하기 때문에 타원형으로 렌더링됩니다.
그라디언트 좌표계에서 대상 좌표계로의 선택적 추가 변환 정의를 포함합니다 (즉, 'userSpaceOnUse' 또는 'objectBoundingBox'). 이를 통해 그라디언트를 기울이는 등의 작업을 할 수 있습니다. 이 추가 변환 행렬은 이전에 정의된 모든 변환의 뒤에 곱해집니다 (즉, 오른쪽에 삽입됩니다). 여기에는 객체 경계 상자 단위에서 사용자 좌표계로 변환하는 데 필요한 암시적 변환도 포함됩니다.
‘cx’, ‘cy’ 및 ‘r’은 방사형 그라디언트의 끝 원을 정의합니다. 그라디언트는 100% 그라디언트 스톱이 이 끝 원의 둘레에 매핑되도록 그려집니다.
‘cx’를 참조하십시오.
‘cx’를 참조하십시오.
음수 값은 오류입니다 (오류 처리 참조).
‘fx’, ‘fy’, 및 ‘fr’은 방사형 그라디언트의 시작 원을 정의합니다. 그라디언트는 0% 그라디언트 스톱이 이 시작 원의 둘레에 매핑되도록 그려집니다.
요소가 'fx' 값을 지정하는 요소를 참조하면 'fx' 값은 참조된 요소에서 상속됩니다.
이 다이어그램은 ‘fr’이 ‘r’의 50%인 경우 기하 속성이 어떻게 정의되는지를 보여 줍니다. 작은 원은 가장 바깥쪽 원의 중심 (‘cx’,‘cy’)을 표시하고, 십자 표시는 가장 안쪽 원의 중심 (‘fx’,‘fy’)을 표시합니다. 점선은 두 개의 그라디언트 벡터를 보여 줍니다. 벡터는 가장 안쪽 원과 가장 바깥쪽 원의 대응하는 점을 연결합니다. 바깥쪽 원 외부 영역은 마지막 stop-color로 페인팅되고, 안쪽 원 내부 영역은 첫 번째 stop-color로 페인팅됩니다.
‘fx’를 참조하십시오.
요소가 'fy' 값을 지정하는 요소를 참조하면 'fy' 값은 참조된 요소에서 상속됩니다.
SVG 2에서 새로 추가되었습니다. Canvas와 일치시키기 위해 추가되었습니다.
‘fr’은 초점 원의 반지름입니다. ‘fx’를 참조하십시오.
음수 값은 오류입니다 (오류 처리 참조).
속성이 지정되지 않으면 '0%' 값이 지정된 것과 같은 효과를 냅니다. 요소가 'fr' 값을 지정하는 요소를 참조하면 'fr' 값은 참조된 요소에서 상속됩니다.
| SVG 2 요구 사항: | 방사형 그라디언트에서 초점 원 반지름을 지정할 수 있도록 합니다. |
|---|---|
| 결의: | SVG 2의 ‘radialGradient’에 ‘fr’ 속성을 추가합니다. |
| 목적: | Canvas와 일치시키기 위함입니다. 오프셋이 0인 스톱은 ‘fx’, ‘fy’ 및 ‘fr’ 속성이 정의한 원을 따라 위치합니다. |
| 담당자: | Erik (ACTION-3098) |
그라디언트가 그라디언트로 페인팅되는 객체의 경계 안에서 시작하거나 끝나는 경우 어떻게 되는지를 나타냅니다. ‘linearGradient’ 요소의 ‘spreadMethod’ 속성과 동일한 값과 의미를 가집니다.
템플릿 그라디언트 요소에 대한 URL 참조입니다; 유효하려면 참조가 ‘linearGradient’ 요소 또는 다른 ‘radialGradient’ 요소를 가리켜야 합니다.
페인트 서버를 템플릿으로 사용하는 과정과 URL 참조 속성 및 폐기된 XLink 속성에 정의된 공통 처리를 참조하십시오.
템플릿에서 복사될 지정 속성은 다음과 같습니다:
URL 참조 속성 및 폐기된 XLink 속성에 정의된 공통 처리를 참조하십시오.
| SVG 2 요구 사항: | 초점이 원 위에 있는 방사형 그라디언트를 명확히 합니다. |
|---|---|
| 결의: | 초점이 원의 가장자리에 있고 repeat를 사용하는 경우 반복 색상의 첫 번째 스톱과 마지막 스톱 사이의 거리는 0이므로 페인트는 모든 그라디언트 스톱의 평균인 색상을 생성해야 합니다. |
| 목적: | 방사형 그라디언트의 상호운용성을 개선하기 위함입니다. |
| 담당자: | Erik (ACTION-3097) |
| 참고: | SVG 1.1은 'repeat'에서 초점이 원의 가장자리에 있을 때 어떻게 해야 하는지 정의하지 않습니다. 반복 색상의 첫 번째 스톱과 마지막 스톱 사이의 거리는 0입니다. 페인트는 모든 그라디언트 스톱의 가중 평균(오프셋 기준) 색상을 생성해야 하는 것으로 결의되었습니다. |
SVG 2에서 변경되었습니다. SVG 1.1에서는 초점이 끝 원 바깥에 있으면 끝 원 위로 이동해야 했습니다. Canvas와 일치시키기 위해 변경되었습니다.
초점이 끝 원 밖에 위치하도록 허용하는 것은 Rigi Kaltbad 워킹 그룹 회의에서 결의되었습니다.
‘fx’, ‘fy’ 및 ‘fr’이 정의하는 시작 원이 ‘cx’, ‘cy’, 및 ‘r’이 정의하는 끝 원 바깥에 있으면 두 원에 접하는 원뿔이 사실상 생성됩니다. 원뿔 외부 영역은 그라디언트의 영향을 받지 않습니다 (투명한 검정).
시작 원이 끝 원과 완전히 겹치면 그라디언트가 그려지지 않습니다. 영역은 그대로 유지됩니다(투명한 검정).
초점(시작) 원이 끝 원 바깥에 있는 방사형 그라디언트입니다. 초점 원은 오른쪽의 더 작은 원입니다. 그라디언트에는 spreadMethod="reflect"가 설정되어 있습니다.
spreadMethod="repeat"가 설정된 두 방사형 그라디언트입니다. 왼쪽에서는 초점이 ‘cx’, ‘cy’, 및 ‘r’이 정의한 원의 오른쪽 안쪽 바로 근처에 있습니다. 오른쪽에서는 초점이 원 위에 있습니다. 이 경우 원주 오른쪽에 페인팅되는 영역은 그라디언트 벡터 색상의 가중 평균과 같은 채우기를 갖습니다.
위 그림 오른쪽 그라디언트의 오른쪽 영역 처리는 Canvas와 다르며, Canvas에서는 해당 영역이 투명한 검정이 됩니다. 이 차이는 SVG 1.1과의 호환성을 유지하기 위한 것입니다.
가중 평균에 사용하는 색 공간은 그라디언트가 보간되는 색 공간과 같습니다. 다음을 참조하십시오: Rigi Kaltbad 워킹 그룹 회의.
예 radgrad01은 방사형 그라디언트 페인트 서버를 참조하여 직사각형을 채우는 방법을 보여 줍니다.
<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 300 200" >
<title>예 radgrad01</title>
<desc>방사형 그라디언트 페인트 서버를 참조하여 직사각형을 채웁니다.</desc>
<defs>
<radialGradient id="MyGradient"
gradientUnits="userSpaceOnUse"
cx="150" cy="100"
r="100">
<stop offset="0%" stop-color="#A8F" />
<stop offset="50%" stop-color="#FDC" />
<stop offset="100%" stop-color="#A8F" />
</radialGradient>
</defs>
<!-- 직사각형은 방사형 그라디언트 페인트 서버를 사용하여 채워집니다 -->
<rect fill="url(#MyGradient)"
stroke="black"
stroke-width="2"
x="25" y="25" width="250" height="150"/>
</svg>
예 radgrad01
그라디언트에서 사용할 색상 벡터는 ‘stop’ 요소로 정의되며, 이 요소는 ‘linearGradient’ 또는 ‘radialGradient’ 요소의 자식 요소입니다.
SVG 1.1에서는 위 문장이 "색상의 램프..."로 되어 있었지만, "ramp"는 이 절의 다른 곳에서는 사용되지 않습니다.
그라디언트 스톱이 배치되는 위치를 나타냅니다. 선형 그라디언트에서는 ‘offset’ 속성이 그라디언트 벡터를 따른 위치를 나타냅니다. 방사형 그라디언트에서는 가장 안쪽/가장 작은 원의 가장자리에서 가장 바깥쪽/가장 큰 원의 가장자리까지의 비율 거리로 나타냅니다.
stop-color 프로퍼티는 해당 그라디언트 스톱에서 사용할 색상을 나타냅니다. currentColor 키워드 및 기타 색상 구문은 fill 및 stroke 프로퍼티의 <paint> 지정과 동일한 방식으로 지정할 수 있습니다.
그라디언트와 관련하여 SVG는 'transparent' 키워드를 CSS와 다르게 취급합니다. SVG는 미리 곱해진 공간에서 그라디언트를 계산하지 않으므로 'transparent'는 실제로 투명한 검정을 의미합니다. stop-color를 'transparent' 값으로 지정하는 것은 stop-color를 'black' 값으로 지정하고 stop-opacity를 '0' 값으로 지정하는 것과 같습니다.
stop-opacity 프로퍼티는 주어진 그라디언트 스톱의 불투명도를 정의합니다. 그라디언트 계산에 사용하는 불투명도 값은 stop-opacity 값과 stop-color 값의 불투명도를 곱한 값입니다. 명시적인 불투명도 정보를 포함하지 않는 stop-color 값 유형의 경우 해당 성분의 불투명도는 1로 취급해야 합니다.
두 그라디언트 스톱의 오프셋 값이 같으면 뒤쪽 그라디언트 스톱이 겹치는 지점의 색상 값을 제어합니다. 특히:
<stop offset="0" stop-color="white"/> <stop offset=".2" stop-color="red"/> <stop offset=".2" stop-color="blue"/> <stop offset="1" stop-color="black"/>
는 대략 다음과 같은 효과를 가집니다:
<stop offset="0" stop-color="white"/> <stop offset=".1999999999" stop-color="red"/> <stop offset=".2" stop-color="blue"/> <stop offset="1" stop-color="black"/>
즉, 흰색에서 빨간색으로 부드럽게 변하고, 그 다음 빨간색에서 파란색으로 갑자기 전환되며, 이어서 파란색에서 검은색으로 부드럽게 변하는 그라디언트입니다.
패턴은 x와 y 방향으로 고정 간격마다 복제("타일링")하여 페인팅할 영역을 덮을 수 있는 미리 정의된 그래픽 객체를 사용하여 객체를 채우거나 스트로크하는 데 사용됩니다. 패턴은 ‘pattern’ 요소를 사용하여 정의한 다음 주어진 그래픽 요소의 fill 및 stroke 프로퍼티에서 참조하여 해당 요소가 패턴으로 채워지거나 스트로크되어야 함을 나타냅니다.
‘x’, ‘y’, ‘width’, ‘height’ 및 ‘patternUnits’ 속성은 무한 캔버스 어딘가의 기준 직사각형을 정의합니다. 기준 직사각형의 위쪽/왼쪽은 (x, y)에 있고 아래쪽/오른쪽은 (x + width, y + height)에 있습니다. 이론적으로 타일링은 이러한 직사각형의 연속을 X와 Y (양수 및 음수) 방향으로 무한히 확장하며, m 및 n의 가능한 각 정수 값에 대해 (x + m*width, y + n* height)에서 직사각형이 시작됩니다.
‘pattern’의 ‘x’,‘y’, ‘width’ 및 ‘height’ 속성은 프레젠테이션 속성이 아니라는 점에 유의하십시오; 사용값은 CSS 스타일의 영향을 받지 않습니다. ‘patternTransform’ 속성은 transform 프로퍼티의 프레젠테이션 속성입니다.
‘x’, ‘y’, ‘width’ 및 ‘height’ 속성의 좌표계를 정의합니다.
patternUnits="userSpaceOnUse"이면, ‘x’, ‘y’, ‘width’ 및 ‘height’ 은 ‘pattern’ 요소가 참조되는 시점에 적용되는 현재 사용자 좌표계 (즉, fill 또는 stroke 프로퍼티를 통해 ‘pattern’ 요소를 참조하는 요소의 사용자 좌표계)를 가져온 다음 ‘patternTransform’ 속성이 지정하는 변환을 적용한 결과의 좌표계에서 값을 나타냅니다. 백분율은 현재 SVG 뷰포트를 기준으로 하는 값을 나타냅니다.
patternUnits="objectBoundingBox"이면, 속성의 사용자 좌표계는 ‘x’, ‘y’, ‘width’ 및 ‘height’ 패턴이 적용되는 요소의 경계 상자를 사용하여 설정하고 (객체 경계 상자 단위 참조), 그런 다음 ‘patternTransform’ 속성이 지정하는 변환을 적용합니다. 백분율은 객체의 경계 상자를 기준으로 하는 값을 나타냅니다.
‘pattern’ 콘텐츠의 좌표계를 정의합니다. ‘viewBox’ 속성이 지정되어 있으면 이 속성은 아무런 효과가 없다는 점에 유의하십시오.
patternContentUnits="userSpaceOnUse"이면, ‘pattern’ 요소 콘텐츠의 사용자 좌표계는 ‘pattern’ 요소가 참조되는 시점에 적용되는 현재 사용자 좌표계 (즉, fill 또는 stroke 프로퍼티를 통해 ‘pattern’ 요소를 참조하는 요소의 사용자 좌표계)를 가져온 다음 ‘patternTransform’ 속성이 지정하는 변환을 적용한 결과의 좌표계입니다.
patternContentUnits="objectBoundingBox"이면, ‘pattern’ 요소 콘텐츠의 사용자 좌표계는 패턴이 적용되는 요소의 경계 상자를 사용하여 설정하고 (객체 경계 상자 단위 참조), 그런 다음 ‘patternTransform’ 속성이 지정하는 변환을 적용합니다.
패턴 좌표계에서 대상 좌표계로의 선택적 추가 변환 정의를 포함합니다 (즉, 'userSpaceOnUse' 또는 'objectBoundingBox'). 이를 통해 패턴 타일을 기울이는 등의 작업을 할 수 있습니다. 이 추가 변환 행렬은 이전에 정의된 모든 변환의 뒤에 곱해집니다 (즉, 오른쪽에 삽입됩니다). 여기에는 객체 경계 상자 단위에서 사용자 좌표계로 변환하는 데 필요한 암시적 변환도 포함됩니다.
‘x’, ‘y’, ‘width’ 및 ‘height’은 패턴 타일을 배치하고 간격을 두는 방식을 나타냅니다. 이러한 속성은 ‘patternUnits’ 및 ‘patternTransform’ 속성 조합이 지정하는 좌표 공간에서 좌표와 값을 나타냅니다.
‘x’를 참조하십시오.
‘x’를 참조하십시오.
음수 값은 오류입니다 (오류 처리 참조). 값이 0이면 요소의 렌더링이 비활성화됩니다(즉, 페인트가 적용되지 않음).
‘x’를 참조하십시오.
음수 값은 오류입니다(오류 처리 참조). 값이 0이면 요소의 렌더링이 비활성화됩니다(즉, 페인트가 적용되지 않음).
템플릿 요소에 대한 URL 참조이며, 유효하려면 다른 ‘pattern’ 요소를 가리켜야 합니다.
페인트 서버를 템플릿으로 사용하는 과정과 URL 참조 속성 및 폐기된 XLink 속성에 정의된 공통 처리를 참조하십시오.
템플릿에서 복사될 지정 속성은 다음과 같습니다:
SVG의 사용자 에이전트 스타일시트는 ‘pattern’ 요소의 overflow 프로퍼티를 hidden으로 설정하며, 이로 인해 패턴 타일 경계에 직사각형 클리핑 경로가 생성됩니다. overflow 프로퍼티를 재정의하지 않는 한 패턴 직사각형 바깥으로 나가는 패턴 내부의 모든 그래픽은 잘립니다. 아래의 예 pattern01은 패턴 타일에 맞춘 클리핑 효과를 보여 줍니다.
overflow 프로퍼티가 visible로 설정되면 패턴 경계 바깥의 패턴 렌더링 동작은 현재 정의되어 있지 않다는 점에 유의하십시오. 향후 SVG 버전에서는 오버플로를 표시하도록 요구할 수 있습니다. SVG 구현자는 작성자가 기대하는 동작이므로 오버플로를 렌더링하는 것이 권장됩니다. 오버플로가 렌더링되는 경우 패턴 타일은 각 행에서 왼쪽에서 오른쪽으로 렌더링하고 행은 위에서 아래로 렌더링하는 것이 좋습니다.
GitHub 이슈 129를 참조하십시오.
‘pattern’의 콘텐츠는 새 좌표계를 기준으로 합니다. ‘viewBox’ 속성이 있으면 새 좌표계는 ‘pattern’ 요소의 ‘x’, ‘y’, ‘width’, ‘height’ 및 ‘patternUnits’ 속성이 정의한 영역에 ‘viewBox’ 및 ‘preserveAspectRatio’의 표준 규칙을 사용하여 맞춰집니다. ‘viewBox’ 속성이 없으면 새 좌표계의 원점은 (x, y)이며, 여기서 x는 ‘pattern’ 요소의 ‘x’ 속성으로 설정되고, y는 ‘pattern’ 요소의 ‘y’ 속성으로 설정됩니다. 따라서 다음 예에서는:
<pattern x="10" y="10" width="20" height="20"> <rect x="5" y="5" width="10" height="10"/> </pattern>
직사각형의 위쪽/왼쪽은 패턴 타일의 원점에서 오른쪽으로 5단위, 아래로 5단위 떨어진 곳에 있습니다.
‘viewBox’ 속성은 ‘x’, ‘y’, ‘width’, ‘height’ 및 ‘patternUnits’ 속성으로 새 패턴 좌표계를 생성하는 데 필요한 모든 변환 위에 추가로 적용되는 보조 변환을 도입합니다.
‘pattern’ 요소 콘텐츠에 연결된 이벤트 속성 및 이벤트 리스너는 처리되지 않습니다; ‘pattern’ 요소의 렌더링 측면만 처리됩니다.
예 pattern01은 패턴 페인트 서버를 참조하여 직사각형을 채우는 방법을 보여 줍니다. 각 삼각형의 파란색 스트로크가 위쪽과 왼쪽에서 약간 잘려 있다는 점에 유의하십시오. 이는 SVG의 사용자 에이전트 스타일시트가 ‘pattern’ 요소의 overflow 프로퍼티를 hidden으로 설정하여 패턴이 패턴 타일 경계에 맞춰 잘리기 때문입니다.
<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg"
version="1.1"
viewBox="0 0 300 200" >
<title>예 pattern01</title>
<desc>패턴 페인트 서버를 사용하여 타원을 채웁니다.</desc>
<defs>
<pattern id="TrianglePattern"
patternUnits="userSpaceOnUse"
x="0" y="0" width="50" height="50"
viewBox="0 0 10 10" >
<path d="M 0 0 L 7 0 L 3.5 7 z"
fill="plum"
stroke="blue" />
</pattern>
</defs>
<!-- 타원은 삼각형 패턴 페인트 서버를 사용하여 채워집니다 -->
<ellipse fill="url(#TrianglePattern)"
stroke="black"
stroke-width="2"
cx="150" cy="100" rx="125" ry="75" />
</svg>
예 pattern01
SVGGradientElement 인터페이스는 그라디언트 페인트 서버 요소 인터페이스의 기본 인터페이스로 사용됩니다.
[Exposed=Window] interface SVGGradientElement : SVGElement { // 확산 방식 유형 const unsigned short SVG_SPREADMETHOD_UNKNOWN = 0; const unsigned short SVG_SPREADMETHOD_PAD = 1; const unsigned short SVG_SPREADMETHOD_REFLECT = 2; const unsigned short SVG_SPREADMETHOD_REPEAT = 3; [SameObject] readonly attribute SVGAnimatedEnumeration gradientUnits; [SameObject] readonly attribute SVGAnimatedTransformList gradientTransform; [SameObject] readonly attribute SVGAnimatedEnumeration spreadMethod; }; SVGGradientElement includes SVGURIReference;
SVGGradientElement에 정의된 숫자 확산 방식 유형 상수는 ‘spreadMethod’ 속성이 취할 수 있는 키워드 값을 나타내는 데 사용됩니다. 그 의미는 다음과 같습니다:
| 상수 | 의미 |
|---|---|
| SVG_SPREADMETHOD_PAD | pad 키워드. |
| SVG_SPREADMETHOD_REFLECT | reflect 키워드. |
| SVG_SPREADMETHOD_REPEAT | repeat 키워드. |
| SVG_SPREADMETHOD_UNKNOWN | 그 밖의 값. |
gradientUnits IDL 속성은 ‘gradientUnits’ 콘텐츠 속성을 반영합니다. 그라디언트 요소의 ‘gradientUnits’ 속성에 대한 숫자 유형 값은 다음과 같습니다:
| 값 | 숫자 유형 값 |
|---|---|
| userSpaceOnUse | SVG_UNIT_TYPE_USERSPACEONUSE |
| objectBoundingBox | SVG_UNIT_TYPE_OBJECTBOUNDINGBOX |
gradientTransform IDL 속성은 transform 프로퍼티의 계산값과 ‘linearGradient’ 및 ‘radialGradient’ 요소의 'gradientTransform' 프레젠테이션 속성을 반영합니다.
spreadMethod IDL 속성은 ‘spreadMethod’ 콘텐츠 속성을 반영합니다. 그라디언트 요소의 ‘spreadMethod’ 속성에 대한 숫자 유형 값은 위의 숫자 확산 유형 상수 표에 설명된 대로입니다.
SVGLinearGradientElement 객체는 DOM의 ‘linearGradient’ 요소를 나타냅니다.
[Exposed=Window] interface SVGLinearGradientElement : SVGGradientElement { [SameObject] readonly attribute SVGAnimatedLength x1; [SameObject] readonly attribute SVGAnimatedLength y1; [SameObject] readonly attribute SVGAnimatedLength x2; [SameObject] readonly attribute SVGAnimatedLength y2; };
x1, y1, x2 및 y2 IDL 속성은 각각 ‘x1’, ‘y1’, ‘x2’ 및 ‘y2’ 콘텐츠 속성을 반영합니다
SVGRadialGradientElement 객체는 DOM의 ‘radialGradient’ 요소를 나타냅니다.
[Exposed=Window] interface SVGRadialGradientElement : SVGGradientElement { [SameObject] readonly attribute SVGAnimatedLength cx; [SameObject] readonly attribute SVGAnimatedLength cy; [SameObject] readonly attribute SVGAnimatedLength r; [SameObject] readonly attribute SVGAnimatedLength fx; [SameObject] readonly attribute SVGAnimatedLength fy; [SameObject] readonly attribute SVGAnimatedLength fr; };
cx, cy, r, fx, fy 및 fr IDL 속성은 각각 ‘cx’, ‘cy’, ‘r’, ‘fx’, ‘fy’ 및 ‘fr’ 콘텐츠 속성을 반영합니다
SVGStopElement 객체는 DOM의 ‘stop’ 요소를 나타냅니다.
[Exposed=Window] interface SVGStopElement : SVGElement { [SameObject] readonly attribute SVGAnimatedNumber offset; };
offset IDL 속성은 ‘offset’ 콘텐츠 속성을 반영합니다.
SVGStopElement에는 ‘path’ 속성을 반영하는 IDL 속성이 없다는 점에 유의하십시오.
SVGPatternElement 객체는 DOM의 ‘pattern’ 요소를 나타냅니다.
[Exposed=Window] interface SVGPatternElement : SVGElement { [SameObject] readonly attribute SVGAnimatedEnumeration patternUnits; [SameObject] readonly attribute SVGAnimatedEnumeration patternContentUnits; [SameObject] readonly attribute SVGAnimatedTransformList patternTransform; [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; }; SVGPatternElement includes SVGFitToViewBox; SVGPatternElement includes SVGURIReference;
patternUnits 및 patternContentUnits IDL 속성은 각각 ‘patternUnits’ 및 ‘patternContentUnits’ 콘텐츠 속성을 반영합니다. ‘patternUnits’ 및 ‘patternContentUnits’에 대한 숫자 유형 값은 다음과 같습니다:
| 값 | 숫자 유형 값 |
|---|---|
| userSpaceOnUse | SVG_UNIT_TYPE_USERSPACEONUSE |
| objectBoundingBox | SVG_UNIT_TYPE_OBJECTBOUNDINGBOX |
patternTransform IDL 속성은 transform 프로퍼티의 계산값과 ‘patternTransform’ 프레젠테이션 속성을 반영합니다.
x, y, width 및 height IDL 속성은 각각 ‘x’, ‘y’, ‘width’ 및 ‘height’ 콘텐츠 속성을 반영합니다.
SVG 콘텐츠는 SVG 언어에서 다음 기능을 활용하여 상호작용할 수 있습니다(즉, 사용자가 시작한 이벤트에 응답할 수 있습니다):
이 장에서는 이벤트가 어떤 상황에서 트리거되는지를 포함하여 상호작용형 SVG에서의 스크립팅과 DOM 이벤트 처리를 설명합니다.
관련 정보는 다른 장에서 확인할 수 있습니다:
| SVG 2 요구 사항: | 앵커 변경 이벤트를 지원합니다. |
|---|---|
| 결의: | SVG 2는 HTML의 문서 전체 이벤트(hashchange 포함)를 적절한 경우 SVG 문서에 적용하도록 추가하는 것을 고려합니다. |
| 목적: | 작성자가 HTML body 또는 루트 요소에서 사용할 수 있는 것과 동일한 이벤트 리스너 속성 집합을 루트 SVG 요소에서 사용할 수 있도록 하기 위함입니다. |
| 담당자: | Cameron (ACTION-3278) |
| SVG 2 요구 사항: | 적절한 인터페이스에 이벤트 리스너 속성을 둡니다. |
|---|---|
| 결의: | SVG 2는 HTML의 유사한 변경에 따라 모든 이벤트 리스너 속성을 Element로 이동합니다. |
| 목적: | HTML과 일치시키기 위함입니다. |
| 담당자: | Cameron (ACTION-3283) |
| SVG 2 요구 사항: | 이벤트 핸들러에서 evt를 event의 별칭으로 도입합니다. |
|---|---|
| 결의: | 이벤트 핸들러에서 evt를 event의 별칭으로 도입하여 ISSUE-2176을 해결하기로 결정합니다. |
| 목적: | HTML과 일치시키기 위함입니다. |
| 담당자: | Cameron (ACTION-3093) |
| SVG 2 요구 사항: | 드래그 앤 드롭 기능을 지원합니다. |
|---|---|
| 결의: | SVG 2는 드래그 앤 드롭 기능을 요구할 수 있으며, 이를 위해 HTML5의 기능을 조사합니다. |
| 목적: | SVG에서 드래그 앤 드롭을 더 쉽게 하고 HTML과 일치시키기 위함입니다. |
| 담당자: | Erik (ACTION-3328) |
SVG의 다음 측면은 이벤트의 영향을 받습니다:
SVG 1.1에 정의된 여러 이벤트인 SVGLoad, SVGError 등은 UI EVENTS 및 HTML에 정의된 동일한 접두사 없는 이벤트로 대체되었습니다.
SVG에서 이벤트를 사용하는 좀 더 현대적인 예가 있어야 합니다. 예: 터치 이벤트(터치 이벤트 명세 참조). 장치 방향 이벤트도 관심 대상일 수 있습니다.
다음 표에는 이 명세에서 정의한 이벤트 또는 정의된 명세와 비교하여 추가 요구 사항이나 명확화가 있는 이벤트가 나열되어 있습니다.
첫 번째 열의 이벤트 이름은 애니메이션을 시작하거나 끝낼 수 있는 이벤트를 정의하기 위해 SVG의 애니메이션 요소에서 사용할 이름입니다. 두 번째 열의 UI 이벤트 이름은 DOM 이벤트 리스너를 정의할 때 사용할 이름입니다 ([DOM], 3.6절).
HTML 또는 UI Events에 도입된 이벤트처럼 표에 나열되지 않은 이벤트의 경우, 해당 이벤트 유형이 SVG의 애니메이션 요소에서 사용할 이름입니다.
주어진 유형의 이벤트가 버블링되는지 또는 취소할 수 있는지에 관한 표의 요구 사항은
사용자 에이전트가 생성하고
디스패치하는 이벤트에만 적용됩니다. Document 인터페이스의 createEvent 메서드를
사용하여 스크립트에서 생성한 해당 유형의 이벤트는
initEvent
메서드로 버블링되거나 취소 가능하게 만들 수 있습니다.
| 이벤트 이름 및 설명 | UI 이벤트 이름 | 이벤트 분류 | 이벤트 속성 이름 |
|---|---|---|---|
|
load load 이벤트는 해당 외부 리소스의 로드가 완료되었을 때 구조적으로 외부인 요소 및 Window에만 디스패치됩니다. Window와의 관계 때문에 ‘svg’ 요소의 load 이벤트는 문서의 모든 리소스가 완전히 로드된 경우에만 디스패치된다는 점에 유의하십시오. 구조적으로 외부인 요소의 load 이벤트와 error 이벤트는 상호 배타적이며, 해당 요소를 처리할 때 이 이벤트 중 하나만 디스패치해야 합니다. load 이벤트는 버블링되지 않으며 취소할 수 없습니다. 이전 SVG 명세에서는 load 이벤트를 SVGLoad라고 불렀으며, 관련 리소스가 완전히 로드되기 전이라도 요소를 파싱한 직후에 디스패치될 수 있었습니다. |
(동일) | 없음 | onload |
|
unload 가장 바깥쪽 svg 요소에만 적용됩니다. unload 이벤트는 DOM 구현이 문서를 창이나 프레임에서 제거할 때 발생합니다. unload 이벤트는 버블링되지 않으며 취소할 수 없습니다. |
(동일) | 없음 | onunload |
|
error error 이벤트는 구조적으로 외부인 요소가 제대로 로드되지 않거나 스크립트 실행 중 오류가 발생할 때 발생합니다. error 이벤트는 버블링되지만 취소할 수 없습니다. |
(동일) | 없음 | onerror |
|
beginEvent 애니메이션 요소가 시작될 때 발생합니다. 자세한 내용은 SMIL Animation 명세의 Interface TimeEvent 설명을 참조하십시오. |
없음 | 없음 | onbegin |
|
endEvent 애니메이션 요소가 끝날 때 발생합니다. 자세한 내용은 SMIL Animation 명세의 Interface TimeEvent 설명을 참조하십시오. |
없음 | 없음 | onend |
|
repeatEvent 애니메이션 요소가 반복될 때 발생합니다. 첫 번째 반복 이후 요소가 반복될 때마다 발생합니다. 자세한 내용은 SMIL Animation 명세의 Interface TimeEvent 설명을 참조하십시오. |
없음 | 없음 | onrepeat |
UI Events의 이벤트 유형에 대해 이벤트 리스너에 전달되는 매개변수의 자세한 내용은 ([uievents]) 및 ([DOM]) 명세에서 확인할 수 있습니다. 다른 이벤트 유형의 경우 이벤트 리스너에 전달되는 매개변수는 이 명세의 다른 곳에서 설명합니다.
마찬가지로 애니메이션 요소의 ‘begin’ 및 ‘end’ 속성에서 사용하는 event-value 타이밍 지정자는 관련 요소에 디스패치된 "버블링" 및 "대상에서" 단계 이벤트에 응답할 때만 구체적인 시간으로 해석됩니다.
SVG DOM은 UI Events에 정의된 모든 인터페이스와 모든 이벤트 유형, 그리고 Clipboard API and events에 정의된 이벤트 유형과 호환됩니다 ([uievents], [clipboard-apis]).
SVG 네임스페이스의 모든 요소는 이러한 이벤트에 대한 이벤트 속성을 지원하며; 일치하는 IDL 프로퍼티는 GlobalEventHandlers 믹스인을 통해 기본 SVGElement 인터페이스에 포함됩니다.
SVG DOM 지원의 일부로 적합한 SVG 소프트웨어는
이러한 명세에 정의된 모든(폐기되지 않고 구식이 아닌) 이벤트 유형을
소프트웨어 사용 환경에서 관련 이벤트가 발생할 수 있는 경우
지원해야 합니다.
사용자 상호작용을 지원하지 않는 SVG 소프트웨어도
load 및 error 이벤트처럼 상호작용 없이 발생할 수 있는 이벤트를
지원해야 합니다.
SVG 애니메이션 요소는 (SVG Animations Level 2 명세에 정의됨) 추가 이벤트와 이벤트 속성을 지원합니다. 다음 이벤트 유형은 애니메이션의 상태 변경으로 인해 트리거됩니다.
이러한 애니메이션 이벤트에 대한 이벤트 속성은 다른 요소에는 아무런 효과가 없습니다.
상호작용을 지원하는 사용자 에이전트에서는 작성자가 사용자 인터페이스 이벤트에 응답하도록 SVG 문서를 정의하는 것이 일반적입니다. 가능한 사용자 이벤트 집합에는 포인터 이벤트, 키보드 이벤트 및 문서 이벤트가 포함됩니다.
사용자 인터페이스(UI) 이벤트에 응답하여 작성자는 애니메이션을 시작하거나, 다른 웹 페이지로 하이퍼링크하거나, 문서의 일부를 강조 표시하거나(예: 포인터 아래에 있는 그래픽 요소의 색상을 변경), "롤오버"를 시작하거나(예: 이전에 숨겨져 있던 일부 그래픽 요소를 포인터 근처에 표시), 원격 데이터베이스와 통신하는 스크립트를 실행할 수 있습니다.
포인터 장치에서 수행되는 사용자 동작 때문에 발생하는 사용자 인터페이스 이벤트를 포인터 이벤트라고 합니다.
많은 시스템은 마우스나 트랙볼 같은 포인터 장치를 지원합니다. 마우스를 사용하는 시스템에서 포인터 이벤트는 마우스 이동 및 마우스 클릭과 같은 동작으로 구성됩니다. 다른 포인터 장치를 사용하는 시스템에서는 포인팅 장치가 마우스 클릭과 같은 효과를 내는 누르기 버튼과 같은 동등한 사용자 동작 메커니즘을 제공하여 마우스 동작을 에뮬레이션하는 경우가 많습니다.
각 포인터 이벤트에 대해 SVG 사용자 에이전트는 주어진 포인터 이벤트의 대상 요소를 결정합니다. 대상 요소는 이벤트 시점에 포인터 아래에 관련 그래픽 콘텐츠가 있는 가장 위쪽 그래픽 요소입니다. (요소의 관련 그래픽 콘텐츠가 포인터 아래에 있는지, 따라서 어떤 상황에서 해당 그래픽 요소가 포인터 이벤트의 대상 요소가 될 수 있는지를 결정하는 방법에 대한 설명은 pointer-events 프로퍼티를 참조하십시오.) 요소가 표시되지 않으면(즉, 해당 요소 또는 그 조상의 display 프로퍼티 값이 none이면) 해당 요소는 포인터 이벤트의 대상이 될 수 없습니다.
포인터 이벤트의 대상 요소가 존재하면 이벤트는 일반적인 이벤트 흐름에 따라 해당 요소에 디스패치됩니다 ([uievents], 3.1절). ‘use’ 요소 또는 스크립트를 통해 생성된 섀도 트리의 경우, 이벤트는 이벤트 디스패치 [dom]를 따라야 합니다
포인터 이벤트의 대상 요소가 존재하지 않으면 이벤트는 무시됩니다.
요소 또는 영역과 포인터 장치가 상호작용하는 데에는 서로 다른 두 가지 측면이 있습니다:
포인터 이벤트가 긍정적인 히트 테스트 결과를 내는지는 포인터의 위치, 그래픽 요소의 크기와 도형, 그리고 요소의 pointer-events 프로퍼티 계산값에 따라 달라집니다. 아래의 pointer-events 프로퍼티 정의는 주어진 유형의 그래픽 요소에서 포인터 이벤트에 반응하는 정확한 영역을 설명합니다.
‘svg’ 요소는 그래픽 요소가 아니며, 적합한 SVG 독립형 파일에서 가장 바깥쪽 svg 요소는 포인터 이벤트의 대상이 되지 않지만, 이벤트가 이 요소까지 버블링될 수 있다는 점에 유의하십시오. 포인터 이벤트가 그래픽 요소에서 긍정적인 히트 테스트 결과를 내지 않으면, 컨텍스트 메뉴 표시와 같은 사용자 에이전트별 창 동작을 호출하는 것이 좋습니다.
이 명세는 다른 문서 내에서 참조 또는 포함을 통해 임베드된 SVG 이미지의 가장 바깥쪽 svg 요소에서 포인터 이벤트의 동작을 정의하지 않습니다. 예를 들어 HTML 문서에 임베드된 가장 바깥쪽 svg 요소가 마우스 클릭 이벤트를 가로채는지 여부입니다; 향후 명세에서 이 동작을 정의할 수 있지만, 이 명세의 목적상 동작은 구현별입니다.
사용자 인터페이스 이벤트의 대상인 요소는 요소 유형 및 스크립트 이벤트 리스너, CSS 의사 클래스 일치 또는 이벤트 기반 타이밍을 사용하는 선언적 애니메이션과 같은 명시적으로 연결된 상호작용이 있는지 여부에 따라 특정 상호작용 동작을 가질 수 있습니다. DOM 이벤트를 디스패치한 후 주어진 대상 요소에 대한 사용자 인터페이스 이벤트 처리 알고리즘과 순서는 다음과 같습니다:
preventDefault()
DOM 메서드를 호출하면 이 요소에 대한 추가 처리는 수행하지 않고,
이벤트는 이벤트 디스패치 및 DOM 이벤트 흐름
처리를 따릅니다([uievents]);:hover,
:active 또는 :focus와 일치하면 관련 클래스
프로퍼티를 적용합니다;
상황에 따라 작성자는 특정 그래픽 요소가 어떤 조건에서 포인터 이벤트의 대상이 될 수 있는지 제어하려 할 수 있습니다. 예를 들어 작성자는 포인터가 주어진 도형의 스트로크된 둘레 위에 있을 때만 주어진 요소가 포인터 이벤트를 받도록 할 수 있습니다. 다른 경우에는 주어진 요소가 모든 상황에서 포인터 이벤트를 무시하도록 하여 그 아래에 있는 그래픽 요소가 포인터 이벤트의 대상이 되도록 할 수 있습니다.
마스킹과 클리핑의 효과는 포인터 이벤트와 관련하여 서로 다릅니다. 클리핑 경로는 기하학적 경계이며 주어진 점은 명확하게 해당 경계의 안쪽 또는 바깥쪽에 있습니다; 따라서 클리핑된 요소의 렌더링된 영역에서는 포인터 이벤트를 정상적으로 캡처해야 하지만, 클리핑 경로 정의에 설명된 대로 잘린 영역에서는 캡처해서는 안 됩니다. 반면 마스크는 이진 전환이 아니라 픽셀 연산이며, 완전히 투명한 경우와 거의 투명하지만 완전히 투명하지 않은 경우에 서로 다른 동작을 하는 것은 임의적으로 혼란스러울 수 있습니다; 따라서 마스크가 적용된 요소에서는 마스크가 불투명도 0이 되는 영역에서도 포인터 이벤트를 계속 캡처해야 합니다. 작성자가 마스크의 투명한 부분을 통해 포인터 이벤트가 아래 요소로 전달되도록 하는 효과를 원하면 마스킹과 클리핑을 조합하여 사용할 수 있습니다.
filter 프로퍼티는 포인터 이벤트 처리에 영향을 주지 않으며, 이 문맥에서는 filter가 지정되지 않은 것처럼 취급해야 합니다.
예를 들어 stroke가 red인 원(즉, 윤곽이 단색 빨간색)과 fill이 none인 원(즉, 내부가 페인팅되지 않음)이 fill이 blue인 직사각형 바로 위에 렌더링된다고 가정합니다. 작성자는 포인터가 원의 둘레 위에 있을 때만 원이 포인터 이벤트의 대상이 되기를 원할 수 있습니다. 포인터가 원 내부에 있을 때는 아래의 직사각형이 포인터 이벤트의 대상 요소가 되기를 원할 수 있습니다.
pointer-events 프로퍼티는 주어진 요소가 어떤 상황에서 포인터 이벤트의 대상 요소가 될 수 있는지를 지정합니다. 다음 항목이 처리되는 상황에 영향을 줍니다:
| 이름: | pointer-events |
|---|---|
| 값: | auto | bounding-box | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | none |
| 초기값: | auto |
| 적용 대상: | 컨테이너 요소, 그래픽 요소 및 ‘use’ |
| 상속: | 예 |
| 백분율: | 해당 없음 |
| 미디어: | 시각 |
| 계산값: | 지정된 대로 |
| 애니메이션 유형: | 불연속 |
텍스트 요소의 경우 히트 테스트는 문자 셀 단위로 수행됩니다:
래스터 이미지의 경우 히트 테스트는 전체 이미지 단위로 수행됩니다(즉, 이미지의 직사각형 영역이 이미지가 이벤트를 받는지 여부를 결정합니다):
‘foreignObject’ 요소의 경우 히트 테스트는 요소의 직사각형 영역인 객체 경계 상자에서 수행됩니다. 위의 래스터 이미지 처리를 참조하십시오. 사용자 에이전트는 ‘foreignObject’ 요소의 외부 콘텐츠도 히트 테스트의 대상이 되도록 허용할 수 있습니다.
opacity, fill-opacity, stroke-opacity, fill 및 stroke 프로퍼티 값은 이벤트 처리에 영향을 주지 않습니다.
SVG는 이 절에서 설명한 대로 SVG에 맞게 수정된 HTML과 동일한 포커스 모델을 사용합니다. 각 문서에서 한 번에 최대 하나의 요소만 포커스될 수 있습니다; 문서 전체가 시스템 포커스를 가지면 이 요소가 모든 키보드 이벤트의 대상이 됩니다.
요소가 포커스되면
해당 요소는 CSS
:focus 의사 클래스와 일치합니다.
상호작용형 사용자 에이전트는 키보드 또는 다른 비포인팅 장치의
사용자 입력 이벤트 때문에 포커스가 변경될 때
포커스를 시각적으로 나타내야 하며(일반적으로 윤곽선으로),
항상 포커스를 표시할 수도 있습니다.
작성자는 :focus 의사 클래스를 사용하여
시각적 표시를 그래픽에 더 적합한 표시
(예: 도형의 스트로크)로 대체할 수 있지만
포커스의 시각적 표시를 완전히 제거하는 데 사용해서는 안 됩니다.
다음 SVG 요소는 상호작용형 문서에서 포커스 가능합니다. use 요소 섀도 트리에 있는 이러한 요소의 모든 인스턴스도 포커스할 수 있습니다. HTML 포커스 모델의 목적상 상호작용형 사용자 에이전트는 이들을 포커스 가능 영역으로 취급해야 하며, 해당 tabindex 포커스 플래그는 설정되어야 합니다:
사용자 에이전트가 제공하는 컨트롤의 경우 요소는 각 하위 컨트롤마다 하나 이상의 포커스 가능 영역을 가질 수 있습니다.
또한 유효한 링크인 모든 ‘a’ 요소는 포커스 가능하며, 사용자 에이전트가 일반적으로 링크의 키보드 탐색을 위한 대체 방법을 제공하지 않는 한 해당 tabindex 포커스 플래그를 설정해야 합니다.
SVG Tiny 1.2 focusable 속성을 사용한 콘텐츠와의 호환성을 위해, 사용자 에이전트는 해당 속성 값이 true인 요소를 포커스 가능한 것으로 취급하는 것이 좋습니다. 새 콘텐츠에서 작성자는 focusable 속성을 생략하거나 대응하는 tabindex 값 0과 함께만 사용하는 것이 좋습니다.
사용자 에이전트는 다른 요소도 포커스 가능하게 취급할 수 있으며, 특히 키보드 상호작용이 유일하거나 주요한 사용자 입력 수단인 경우 그렇습니다. 특히 사용자 에이전트는 키보드 포커스를 사용하여 ‘title’ 요소 텍스트를 툴팁으로 표시하도록 지원할 수 있으며, 마우스, 포인터 또는 포커스 이벤트에 대한 리스너가 할당된 요소까지 포커스가 도달하도록 허용할 수 있습니다. 작성자는 이 동작에 의존해서는 안 됩니다; 모든 상호작용 요소는 키보드 상호작용을 직접 지원해야 합니다.
순차 포커스 순서는 모든 포커스 가능 요소 집합에서 생성되며, SVG 요소의 ‘tabindex’ 속성을 HTML 요소의 tabindex 속성과 동일한 방식으로 처리합니다. use 요소 섀도 트리 안의 콘텐츠는 ‘use’ 요소의 자식 콘텐츠인 것처럼 포커스 순서에 삽입됩니다.
사용자 에이전트가 SVG 문서의 스크롤 또는 패닝을 지원하고, 포커스가 현재 SVG 뷰포트 밖에 있는 요소로 이동하면 사용자 에이전트는 포커스된 요소가 SVG 뷰포트 안에 들어올 때까지 문서를 스크롤하거나 패닝하는 것이 좋습니다.
HTML에서와 마찬가지로 포커스 가능하지만 정의된 활성화 동작이 없는 SVG 요소는 아무것도 하지 않는 활성화 동작을 가집니다 (스크립트가 이에 명시적으로 응답하지 않는 한).
이는 ‘tabindex’ 속성 때문에만
포커스 가능한 요소가
마우스가 아닌 활성화에 응답하여
click 이벤트를 발생시킨다는 의미입니다
(예: 요소가 포커스된 상태에서 "enter" 키를 누름).
인라인 HTML과 SVG가 혼합된 문서의 경우 포커스는 문서 전체에 대해 처리되며 (결합된 순차 포커스 순서 사용), 각 인라인 SVG 또는 HTML 조각을 격리된 하위 문서로 처리하지 않습니다.
예를 들어 다음 문서에서 Tab을 누르면 A, B, C 요소 사이를 이 순서로 포커스가 순환합니다.
<!DOCTYPE html> <button id="A" tabindex="1">첫 번째 항목</button> <button id="C" tabindex="2">세 번째 항목</button> <svg width="200" height="200"> <text id="B" tabindex="1" x="100" y="100">두 번째 항목</text> </svg>
SVG 요소에는 HTML의 accesskey 속성에 해당하는 것이 없다는 점에 유의하십시오.
사용자 에이전트가 지원하는 모든 이벤트 유형에 대해 SVG는 이벤트 핸들러 콘텐츠 속성 [HTML]과 동일한 요구 사항을 따라 이를 이벤트 속성으로 지원합니다. 이벤트 속성은 모든 SVG 요소에서 사용할 수 있습니다.
이벤트 속성의 콘텐츠는 항상 ECMAScript로 해석되며, 미디어 유형 'application/ecmascript'로 처리한 것과 같습니다. [rfc2046][rfc4329]
이벤트 속성은 애니메이션할 수 없습니다.
구현자는 이벤트 속성 설정을
EventTarget에
EventListener를
생성하고 등록하는 것으로 볼 수 있습니다.
이러한 이벤트 리스너는 addEventListener의 useCapture 인수에
false를 지정한 것처럼
"버블링" 및 "대상에서" 단계에 대해서만 호출됩니다.
이 EventListener는
EventTarget에 등록될 수 있는
다른 모든 것과 동일한 방식으로 동작합니다.
이벤트 리스너를 나타내는 속성이 변경되면, 이는 이전에 등록된 EventListener를 제거하고 새 것을 등록하는 것으로 볼 수 있습니다. 또한 이벤트 속성이 EventTarget의 다른 EventListeners와 관련하여 어떤 순서로 이벤트를 받을지에 대해서는 명세에서 정하지 않습니다.
ECMAScript에서 이벤트 리스너를 설정하는 한 가지 방법은
함수를 정의하고 그 함수를 addEventListener 메서드에 전달하는 것입니다:
function myAction1(evt) {
// 이벤트를 처리합니다
}
// ... 나중에 ...
myElement.addEventListener("click", myAction1, false)
ECMAScript에서 이벤트 속성의 문자 데이터 콘텐츠는 이벤트에 응답하여 호출되는 ECMAScript 함수의 정의가 됩니다. 등록된 모든 ECMAScript 이벤트 리스너 함수와 마찬가지로 이 함수는 Event 객체를 매개변수로 받고 Event 객체의 이름은 evt입니다. 예를 들어 다음과 같이 작성할 수 있습니다:
<rect onclick="MyClickHandler(evt)" .../>
이는 Event
객체 evt를
함수 MyClickHandler에 전달합니다.
아래는 애니메이션 이벤트 속성의 정의입니다. 이들은 애니메이션 요소에 지정할 수 있습니다.
속성 정의:
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| onbegin, onend, onrepeat | (아래 참조) | (없음) | 아니요 |
| SVG 2 요구 사항: | ‘script’에서 async/defer를 허용하는 것을 고려합니다. |
|---|---|
| 결의: | SVG 2는 ‘script’에서 async/defer를 허용합니다. |
| 목적: | HTML과 일치시키기 위함입니다. |
| 담당자: | Cameron (ACTION-3280) |
| SVG 2 요구 사항: | SVG Tiny 1.2 스크립트 처리 모델을 통합합니다. |
|---|---|
| 결의: | SVG 2는 인라인 스크립트 가능 콘텐츠가 HTML5와 호환되는 방식으로 처리되는 방법을 정의합니다 |
| 목적: | HTML과 SVG 전체에서 일관된 스크립트 실행 동작을 제공하기 위함입니다. |
| 담당자: | Cameron (ACTION-3282) |
‘script’ 요소는 HTML의 ‘script’ 요소와 동일하며, 따라서 스크립트(예: ECMAScript)를 위한 위치입니다. 모든 ‘script’ 요소 안에서 정의된 모든 함수는 현재 문서 전체에서 "전역" 범위를 가집니다.
스크립트의 텍스트 콘텐츠는 절대로 직접 렌더링되지 않습니다; ‘script’ 요소의 display 값은 사용자 에이전트 스타일시트에서 항상 none으로 설정해야 하며, 이 선언은 다른 모든 CSS 규칙이나 프레젠테이션 속성보다 높은 중요도를 가져야 합니다.
‘script’ 요소를 실행하려고 시도하기 전에 ‘type’의 해석된 미디어 유형 값을 검사해야 합니다. SVG 사용자 에이전트가 해당 스크립팅 언어를 지원하지 않으면 ‘script’ 요소를 실행해서는 안 됩니다.
이 예는
‘circle’ 요소의
‘onclick’ 이벤트
속성에서 호출되는 circle_click 함수를 정의합니다.
아래 왼쪽 그림은 초기 이미지입니다. 아래 오른쪽 그림은
원을 클릭한 후의 결과를 보여 줍니다.
<?xml version="1.0" standalone="no"?>
<svg width="6cm" height="5cm" viewBox="0 0 600 500"
xmlns="http://www.w3.org/2000/svg">
<desc>예 script01 - onclick 이벤트에서 ECMAScript 함수를 호출합니다
</desc>
<!-- 클릭할 때마다 반지름을 변경하는 ECMAScript -->
<script type="application/ecmascript"> <![CDATA[
function circle_click(evt) {
var circle = evt.target;
var currentRadius = circle.getAttribute("r");
if (currentRadius == 100)
circle.setAttribute("r", currentRadius*2);
else
circle.setAttribute("r", currentRadius*0.5);
}
]]> </script>
<!-- 그리기 영역의 윤곽선을 파란색 선으로 표시합니다 -->
<rect x="1" y="1" width="598" height="498" fill="none" stroke="blue"/>
<!-- 각 클릭 이벤트에 반응합니다 -->
<circle onclick="circle_click(evt)" cx="300" cy="225" r="100"
fill="red"/>
<text x="300" y="480"
font-family="Verdana" font-size="35" text-anchor="middle">
원을 클릭하여 크기를 변경하세요
</text>
</svg>
|
속성 정의:
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| crossorigin | [ anonymous | use-credentials ]? | (속성의 HTML 정의 참조) | 예 |
crossorigin 속성은 CORS 설정 속성이며, 별도로 지정되지 않는 한 html [HTML]과 동일한 처리 규칙을 따릅니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| type | (아래 참조) | application/ecmascript | 아니요 |
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| href | URL [URL] | (없음) | 아니요 |
URL은 링크 장에 설명된 대로 처리되고 리소스를 가져옵니다.
SVGScriptElement 객체는 DOM의 ‘script’ 요소를 나타냅니다.
[Exposed=Window] interface SVGScriptElement : SVGElement { [Reflect] attribute DOMString type; attribute DOMString? crossOrigin; }; SVGScriptElement includes SVGURIReference;
crossOrigin IDL 속성은 ‘crossorigin’ 콘텐츠 속성을 반영합니다.
인터넷에서 리소스는 URL (국제화 리소스 식별자)을 사용하여 식별됩니다. 예를 들어 http://example.com에 있는 someDrawing.svg라는 SVG 파일은 다음과 같은 URL을 가질 수 있습니다:
http://example.com/someDrawing.svg
URL은 URL의 일부로 URL 조각 식별자를 포함하여 XML 문서 안의 특정 요소를 지정할 수도 있습니다. URL 조각 식별자를 포함하는 URL은 선택적인 기본 URL, 그 뒤의 "#" 문자, 그리고 URL 조각 식별자로 구성됩니다. 예를 들어 다음 URL은 someDrawing.svg 파일에서 ID가 "Lamppost"인 요소를 지정하는 데 사용할 수 있습니다:
http://example.com/someDrawing.svg#Lamppost
다음 중 어느 하나에 해당하면 유효하지 않은 참조입니다:
유효하지 않은 참조는 오류일 수도 있고 아닐 수도 있습니다 (오류 처리 참조). 이는 참조하는 프로퍼티 또는 속성이 대체 동작을 정의하는지에 따라 달라집니다.
국제화 리소스 식별자(URL)는 URI(Uniform Resource Identifier)를 더 일반화한 보완 개념입니다. URL은 범용 문자 집합 [UNICODE]의 문자 시퀀스입니다. URI는 훨씬 더 제한된 문자 집합으로 구성됩니다. 모든 URI는 이미 적합한 URL입니다. URL에서 URI로의 매핑은 URL 명세에서 정의되므로, XML 문서에서 리소스를 식별할 때 URI 대신 URL을 사용할 수 있습니다. 프로토콜이 URL을 직접 지원하지 않는 경우 네트워크에서 확인하기 위해 URL을 URI로 변환할 수 있습니다.
이전 버전의 SVG는 XLink를 따라 URL 참조 유형을 URI 또는 특정 이스케이프 절차를 적용한 후 URL이 되어야 하는 문자 시퀀스로 정의했습니다. 이 이스케이프 절차는 XLink 1.0 명세 [xlink]와 W3C XML Schema Part 2: Datatypes 명세 [xmlschema-2]에 반복되었습니다. 이러한 복사는 오류와 불일치 가능성을 만들었지만, 당시 URL 명세가 아직 표준화되지 않았기 때문에 이루어졌습니다.
이 명세에서는 이 "URI 또는 문자 시퀀스 + 알고리즘"에 올바른 용어인 URL을 사용하며, URL을 URI로 바꾸는 이스케이프 방법은 이후 IETF Proposed Standard가 된 URL 명세 [rfc3987]를 참조하여 정의합니다. 다른 W3C 명세도 시간이 지나면서 이러한 중복된 이스케이프 절차 설명을 제거하고 URL을 직접 참조하도록 개정될 것으로 예상됩니다.
SVG에서 두 요소 사이의 대부분의 구조적 관계는 ‘href’ 속성의 URL 값을 사용하여 지정됩니다.
링크 관계를 설명하기 위해 이 명세에서는 속성 및 프로퍼티 값에 두 가지 서로 다른 데이터 유형을 사용합니다: URL 및 <url>. 이 장의 링크 지침은 두 구문 중 어느 것으로 지정된 URL에도 적용됩니다.
URL 데이터 유형은 단순한 URL 문자열입니다. SVG에서 두 요소 사이의 대부분의 구조적 관계는 ‘href’ 속성의 URL 값을 사용하여 지정됩니다.
<url>은 URL과 다르며 CSS url() 함수 값을 나타냅니다.
(자세한 내용은 CSS Values and Units [css-values] 참조). <url>은
프레젠테이션 속성 및 해당 CSS 프로퍼티에 사용할 수 있습니다
[css-values].
URL은 구조적 관계를 위한 프레젠테이션 속성의 유효한 값이 아닙니다. 프레젠테이션 속성이 아닌 어떤 속성도 <url>을 값으로 허용하지 않습니다.
SVG는 다른 객체에 대한 절대 및 상대 URL 참조를 광범위하게 사용합니다. 예를 들어 ‘linearGradient’ 요소는 다른 그라디언트 요소를 기반으로 할 수 있으므로, 두 요소 사이의 차이만 지정하면 되며, ‘href’ 속성의 URL로 원본 그라디언트를 참조합니다:
<linearGradient id="SourceGradient">...</linearGradient>
<linearGradient id="MyGradient"
href="#SourceGradient">...</linearGradient>
해당 그라디언트로 직사각형을 채우려면 직사각형의 fill 프로퍼티 값을 관련 ‘linearGradient’ 요소에 대한 URL 참조를 포함하도록 설정할 수 있습니다; 다음은 예입니다:
<rect fill="url(#MyGradient)"/>
URL 참조는 일반적으로 ‘href’ 속성으로 지정됩니다. 이 속성 값은 원하는 리소스(또는 조각 식별자가 있는 경우 보조 리소스)에 대한 참조를 형성합니다. ‘href’ 속성 값은 URL이어야 합니다.
어떤 애플리케이션도 값이 URL 참조인지 검사하는 것은 실용적이지 않으므로, 이 명세는 이 점에서 URL 명세를 따르며 SVG 저작 도구에 그러한 적합성 검사 요구 사항을 부과하지 않습니다. 유효하지 않은 URL 때문에 SVG 문서가 부적합해지는 것은 아닙니다. SVG 사용자 에이전트는 URL 참조 처리에 지정된 대로 필요한 경우에만 URL을 처리하면 됩니다.
이전 버전의 SVG에서는 ‘href’ 속성이 XLink 네임스페이스 [xlink]에 지정되었습니다. 이 사용 방식은 이제 폐기되었으며 대신 URL 참조는 네임스페이스가 없는 ‘href’ 속성을 사용하여 지정하는 것이 좋습니다.
하위 호환성을 위해 폐기된 ‘xlink:href’ 속성은 역시 폐기된 ‘xlink:title’ 속성과 함께 아래에 정의되어 있습니다.
속성 정의:
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| xlink:href | URL [URL] | (없음) | (아래 참조) |
하위 호환성을 위해 ‘href’ 속성이 있는 요소는 XLink 네임스페이스 [xlink]의 ‘href’ 속성도 인식합니다.
‘href’ 속성이 XLink 네임스페이스와 네임스페이스 없는 형식 둘 다에 존재하면, 네임스페이스가 없는 속성 값을 사용해야 합니다. XLink 네임스페이스의 속성은 무시해야 합니다.
적합한 SVG 생성기는 네임스페이스가 없는 ‘href’ 속성을 생성해야 합니다. 그러나 하위 호환성을 제공하기 위해 XLink 네임스페이스의 ‘href’ 속성도 함께 생성할 수 있습니다.
이 속성은 대응하는 ‘href’ 속성이 애니메이션 가능한 것으로 정의된 경우에만 애니메이션할 수 있습니다.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| xlink:title | <anything> | (없음) | 아니요 |
링크 또는 리소스의 의미를 사람이 읽을 수 있는 방식으로 설명하기 위한 폐기된 속성입니다. 새 콘텐츠에서는 ‘title’ 자식 요소를 사용하고 ‘xlink:title’ 속성은 사용하지 않는 것이 좋습니다.
이 정보의 사용 방식은 수행되는 처리 유형에 크게 의존합니다. 예를 들어 시각 장애인 사용자가 사용하는 애플리케이션에서 제목을 제공하거나, 링크 표를 만들거나, 사용자가 시작 리소스 위에 마우스 포인터를 올렸을 때 나타나는 도움말 텍스트를 표시하는 데 사용할 수 있습니다.
‘title’ 속성을 사용하는 경우 XLink 네임스페이스에 있어야 합니다. XML Linking Language (XLink) [xlink]를 참조하십시오.
폐기된 XLink 속성 ‘xlink:href’ 또는 ‘xlink:title’을 사용할 때는 명시적인 XLink 네임스페이스 선언을 제공해야 합니다 [xml-names], 이러한 XLink 네임스페이스 선언을 제공하는 한 가지 간단한 방법은 XLink 속성을 사용하는 콘텐츠의 ‘svg’ 요소에 XLink 네임스페이스용 ‘xmlns’ 속성을 포함하는 것입니다. 예:
<svg xmlns:xlink="http://www.w3.org/1999/xlink" ...> <image xlink:href="foo.png" .../> </svg>
URL은 필요해지는 시점에 다음과 같이 리소스를 식별하기 위해 처리됩니다:
레거시 ‘xlink:href’ 속성은 대응하는 ‘href’ 속성을 처리할 시점에 처리하지만, 요소에 그러한 ‘href’ 속성이 없는 경우에만 처리합니다.
URL 처리에는 세 단계가 포함됩니다: 절대 URL 생성; 문서 가져오기(필요한 경우); 대상 요소 식별(필요한 경우).
URL 참조는 처리가 유효하지 않은 참조 또는 대상 리소스 식별 중 하나의 결과를 낼 때까지 확인되지 않은 상태입니다. 구조적으로 외부인 요소의 프레젠테이션 속성이 아닌 속성에 있는 확인되지 않은 참조는 load 이벤트가 발생하지 못하게 합니다. 사용자 에이전트는 동일 문서 URL 참조가 아닌 참조의 확인에 시간 제한을 둘 수 있으며, 그 이후에는 참조를 네트워크 오류로 취급합니다 (따라서 유효하지 않은 참조로 취급).
동적 문서의 동일 문서 URL 참조에서는 속성 또는 프로퍼티의 수정이나 애니메이션, 또는 DOM에서 요소가 제거되는 것으로 인해 URL 참조가 확인되지 않은 상태로 돌아갈 수 있습니다. 사용자 에이전트는 참조된 리소스를 식별하기 위해 URI 확인을 다시 시도해야 합니다.
URL 참조가 상대 URL이면 사용하기 전에 절대 형식을 계산해야 합니다. 절대 URL은 다음 방법 중 하나를 사용하여 생성하는 것이 좋습니다:
‘xml:base’
속성은
XML 문서에서만 영향을 줍니다;
여기에는 SVG 문서와 XHTML 문서는 포함되지만 XML이 아닌 HTML 문서는 포함되지 않습니다.
반면 base
요소는
문서 기본
URL을 변경하여
모든 SVG 또는 HTML 문서의 상대 URL에 영향을 줍니다.
HTTP와 같은 프로토콜이 URL을 직접 지원하지 않으면, 사용자 에이전트는 URL을 URL 명세 [rfc3987]의 3.1절에 설명된 대로 URI로 변환해야 합니다.
절대 URL을 생성한 후:
링크 활성화에 따라 URL이 처리되고 있다면 사용자 에이전트는 HTML 명세 [HTML]에 설명된 URL로 이동하는 알고리즘을 따라야 합니다. 이 알고리즘의 결과는 ‘target’ 브라우징 컨텍스트, 브라우징 컨텍스트 간 보안 제한, 그리고 링크가 해당 브라우징 컨텍스트에 현재 포함된 문서와 같은 문서를 가리키는지 여부에 따라 달라집니다 (이 경우 문서를 다시 로드하지 않고 조각으로 이동합니다). 이동한 문서가 SVG 문서라면 SVG 콘텐츠로의 링크에 설명된 대로 대상 동작을 조정합니다.
처리 중인 URL이 전체 문서 파일을 참조하는 경우에만 유효하다면 (예: ‘image’ 및 ‘script’ 요소의 ‘href’ 속성), URL이 동일 문서를 가리키는지 여부와 관계없이 문서 가져오기에 표시된 대로 계속합니다.
그 밖의 모든 경우 URL은 이 SVG 문서에서 사용할 리소스를 가리킵니다. 사용자 에이전트는 대상 조각을 URL의 나머지 부분에서 분리하도록 URL을 구문 분석하고 이를 문서 기본 URL과 비교해야 합니다. 대상 조각 이외의 모든 부분이 같으면 이는 동일 문서 URL 참조이며, URL 처리는 현재 문서를 참조 문서로 하여 대상 요소 식별에 표시된 대로 계속해야 합니다.
그렇지 않으면 URL은 별도의 문서를 참조하며, 사용자 에이전트는 문서 가져오기에 표시된 대로 URL 처리를 계속해야 합니다.
CSS Values and Units에 정의된 대로, 스타일 프로퍼티의 조각만 있는 URL은 프로퍼티가 선언된 파일과 관계없이 동일 문서 URL 참조로 취급해야 합니다.
SVG 프로퍼티와 속성은 다른 문서를 참조할 수 있습니다. 이러한 URL을 처리할 때 사용자 에이전트는 다음 조건을 제외하고 이 절에 설명된 대로 참조된 문서를 가져오는 것이 좋습니다:
URL 참조가 SVG 애니메이션 요소의 href 속성에서 온 경우, 동일 문서 URL 참조만 허용됩니다 [svg-animation]. 다른 문서를 가리키는 URL은 유효하지 않으며 문서를 가져와서는 안 됩니다.
참조를 포함하는 문서가 안전한 정적 모드 또는 안전한 애니메이션 모드로 처리되고 있다면, 외부 파일 참조는 허용되지 않습니다. 참조가 data URL이 아닌 한 사용자 에이전트는 참조를 네트워크 오류가 발생한 것처럼 취급하여 이를 유효하지 않은 참조로 만들어야 합니다.
브라우징 컨텍스트 또는 사용자 에이전트의 다른 보안 제한이 외부 파일 접근을 막는다면 사용자 에이전트는 참조를 네트워크 오류가 발생한 것처럼 취급해야 합니다.
인터넷에서 외부 리소스를 가져올 때 사용자 에이전트는 HTML [HTML]에 정의된 잠재적으로 CORS가 활성화된 요청을 다음과 같은 corsAttributeState로 사용해야 합니다:
base
요청의 origin은
SVG ‘script’ 요소를
HTML
script 요소처럼,
SVG ‘image’
요소를 HTML img 요소처럼 취급하여
HTML과 동일한 규칙으로 계산합니다.
기본 origin 동작은 taint로 설정해야 합니다.
향후 SVG 명세에서는 ‘href’ 속성이 있는 다른 SVG 요소에 CORS 참조를 활성화할 수 있습니다.
가져오기 알고리즘이 오류 또는 빈 응답 본문을 결과로 내면 참조 URL은 유효하지 않은 참조로 취급합니다.
유효한 응답이 반환되고 참조에 대한 유효한 URL 대상에 특정 요소 유형이 포함되어 있다면, 사용자 에이전트는 하위 리소스 문서 처리로 계속해야 합니다. 그렇지 않으면(전체 문서 URL 참조만 유효한 경우) 가져온 문서가 참조된 리소스입니다.
그렇지 않으면 대상 요소를 식별하기 위해 하위 리소스를 구문 분석해야 합니다. 가져온 문서가 사용자 에이전트가 문서 객체 모델을 생성하도록 구문 분석할 수 있는 유형이면, 안전한 정적 모드로 처리해야 합니다 (즉, 추가 외부 리소스를 가져오지 않고 스크립트를 실행하거나 애니메이션을 재생하지 않습니다). 외부 하위 리소스 참조에 대해 생성된 문서 모델은 변경 불가능(읽기 전용)해야 하며 수정할 수 없습니다.
가져온 파일에서 문서 객체 모델을 생성할 수 있다면 URL 처리는 구문 분석된 하위 리소스 문서를 참조 문서로 하여 대상 요소 식별에 표시된 대로 계속해야 합니다. 사용자 에이전트는 문서를 완전히 구문 분석하기 전에 대상 식별 절차를 시작할 수 있습니다.
사용자 에이전트는 외부 리소스 URL과 이에 연결된 구문 분석된 문서 목록을 유지할 수 있으며, 리소스의 처리 모드, 캐싱 및 CORS 요구 사항을 위반하지 않는 한 이후 참조에서 해당 문서를 재사용할 수 있습니다.
특정 요소에 대한 URL 참조에서, 참조가 유효한지는 해당 요소를 참조된 문서 안에서 찾을 수 있는지, 그리고 허용된 유형인지에 따라 달라집니다.
이전 처리 단계에서 식별한 참조 문서 (외부 하위 리소스 문서 또는 현재 문서)를 사용하여, 대상 요소를 다음과 같이 식별합니다:
URL이 대상 조각에서 특정 요소를 지정하지 않으면 대상 요소는 참조된 문서의 루트 요소입니다.
그렇지 않으면 URL은 특정 요소를 대상으로 합니다. 일치하는 요소가 현재 참조 문서에 존재하면 그것이 대상 요소입니다.
그렇지 않으면 현재 일치하는 요소가 없습니다. 참조된 문서가 변경 불가능하면 URL 참조는 유효하지 않습니다. 외부 하위 리소스 문서는 완전히 구문 분석된 후 항상 변경 불가능하며; 현재 문서도 동적 대화형 모드 이외의 모드로 처리되는 경우 구문 분석된 후 변경 불가능합니다.
그렇지 않으면 URL을 성공적으로 확인하여 대상 요소를 정의할 수 있을 때까지, 또는 문서가 변경 불가능해질 때까지 (예: 비동적 문서가 구문 분석을 완료함) 참조된 문서의 변경을 관찰합니다.
대상 요소는 해당 참조에 대한 유효한 URL 대상인 경우에만 참조된 리소스를 제공합니다.
‘href’(또는 ‘xlink:href’) 속성의 유효한 대상 요소 유형은 해당 속성을 가진 요소에 따라 다음과 같습니다:
이 명세에서 정의한 스타일 프로퍼티의 유효한 대상 요소 유형은 다음과 같습니다:
대상 요소 또는 이미지 파일에 대한 참조를 모두 허용하는 참조의 경우 (예: mask 프로퍼티), 사용자 에이전트는 대상 요소를 식별하고 그것이 유효한 대상인지 결정해야 합니다. 확인된 대상 요소가 허용된 요소 유형이 아니면 참조된 리소스는 전체 문서 파일이며; 대상 조각은 다른 이미지와 마찬가지로 해당 파일을 처리하는 데 사용됩니다.
그 밖의 모든 경우 확인된 대상 요소 유형(또는 문서 유형)이 URL 참조에 허용되지 않으면 이는 유효하지 않은 참조입니다.
SVG는 링크(하이퍼링크 또는 웹 링크라고도 함)를 나타내기 위한 ‘a’ 요소를 제공합니다. ‘a’ 요소는 ‘href’ 또는 ‘xlink:href’ 속성이 있으면 링크를 형성합니다; 이러한 속성이 없으면 ‘a’ 요소는 링크를 위한 비활성 자리표시자입니다.
SVG 1.1은 XLink 명세([XLink])를 기준으로 링크를 정의하며, XLink 네임스페이스에 정의된 속성을 사용했습니다. SVG 2는 HTML 링크와 일치하는 기본 네임스페이스의 대체 속성 집합을 사용하며 XLink 속성을 폐기합니다.
‘a’ 요소는 다른 ‘a’ 요소를 제외하고 부모가 포함할 수 있는 모든 요소를 포함할 수 있으며; 그래픽 링크 콘텐츠와 텍스트 링크 콘텐츠 모두에 같은 요소를 사용합니다. 링크는 중첩할 수 없습니다; ‘a’ 요소가 다른 하이퍼링크 요소의 자손이면 (SVG 네임스페이스인지 다른 네임스페이스인지와 관계없이), 사용자 에이전트는 해당 href 속성을 무시하고 비활성으로 취급해야 합니다. 유효하지 않은 ‘a’ 요소도 일반 컨테이너 요소로 계속 렌더링해야 합니다.
유효하지 않은 중첩 링크의 렌더링은 위험 상태이며, 알 수 없는 요소의 렌더링에 관한 결정과 동기화될 가능성이 높습니다.
포인터 이벤트 처리에서는 링크된 히트 영역을 ‘a’ 요소 자체의 경계 상자가 아니라 그 안에 포함된 각 별도 렌더링 요소에 대해 (각 요소의 pointer-events 프로퍼티 값에 따라) 정의합니다. 사용자 에이전트는 모든 링크가 포커스 가능하고 키보드 명령으로 활성화할 수 있도록 보장해야 합니다.
원격 리소스(링크의 대상)는 ‘a’ 요소의 ‘href’ 속성이 지정한 URL로 정의됩니다. 원격 리소스는 어떤 웹 리소스든 될 수 있습니다(예: 이미지, 비디오 클립, 사운드 클립, 프로그램, 다른 SVG 문서, HTML 문서, 현재 문서 안의 요소, 다른 문서 안의 요소 등). 사용자가 링크를 활성화하면 (마우스로 클릭, 키보드 입력, 음성 명령 등), 사용자 에이전트는 지정된 리소스 문서를 가져오고 이를 표시하거나 다운로드 파일로 제공하려고 시도하는 것이 좋습니다.
예 link01은 타원에 링크를 할당합니다.
<?xml version="1.0" standalone="no"?>
<svg width="5cm" height="3cm" viewBox="0 0 5 3" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<desc>예 link01 - 타원에 있는 링크
</desc>
<rect x=".01" y=".01" width="4.98" height="2.98"
fill="none" stroke="blue" stroke-width=".03"/>
<a href="https://www.w3.org">
<ellipse cx="2.5" cy="1.5" rx="2" ry="1"
fill="red" />
</a>
</svg>
예 link01
위 SVG 파일을 SVG와 HTML을 모두 지원하는 사용자 에이전트에서 보면, 타원을 클릭할 때 현재 창 또는 프레임이 W3C 홈페이지로 대체됩니다.
속성 정의:
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| href | URL [URL] | (없음) | 예 |
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| target | _self | _parent | _top | _blank | <XML-Name> | _self | 예 |
부모 문서가 HTML 또는 XHTML 문서에 임베드된 경우나 탭 브라우저로 보는 경우처럼 최종 리소스에 가능한 대상이 여러 개 있을 때 이 속성을 사용하는 것이 좋습니다. 이 속성은 링크가 활성화될 때 문서를 열 브라우징 컨텍스트 (예: 브라우저 탭 또는 (X)HTML iframe이나 object 요소)의 이름을 지정합니다:
브라우징 컨텍스트 및 브라우징 컨텍스트 간 탐색 동작의 보안 제한에 대한 규범적 정의는 HTML [HTML], 특히 웹 페이지 로드에 관한 장에 있습니다.
이전 버전의 SVG는 특수 target 값 '_replace'를 정의했습니다. 이는 제대로 구현된 적이 거의 없으며, '_replace'와 '_self'의 차이는 브라우징 컨텍스트에 대한 HTML 정의의 변경으로 중복되었습니다. 현재 SVG 문서를 대체하려면 '_self'를 사용하십시오.
'_new' 값은 target에 대한 유효한 값이 아닙니다. 새 탭/창에서 문서를 열려면 '_blank'를 사용하십시오.
| 이름 | 값 | 초기값 | 애니메이션 가능 여부 |
|---|---|---|---|
| download | 임의의 값(비어 있지 않으면 값은 제안된 파일 이름을 나타냄) | (없음) | 아니요 |
| ping | 공백으로 구분된 유효하고 비어 있지 않은 URL 토큰 [HTML] | (없음) | 아니요 |
| rel | 공백으로 구분된 키워드 토큰 [HTML] | (없음) | 아니요 |
| hreflang | BCP 47 언어 태그 문자열 [HTML] | (없음) | 아니요 |
| type | MIME 유형 문자열 [HTML] | (없음) | 아니요 |
| referrerpolicy | 리퍼러 정책 문자열 [REFERRERPOLICY] | (없음) | 아니요 |
a 요소에 정의된 것과 같습니다.
SVG 워킹 그룹은 HTML 명세에서 이러한 속성의 처리 모델과 알고리즘을 명확히 하기를 기다리고 있습니다. 이러한 속성은 HTML 명세에 지정된 대로 정의와 알고리즘을 따르는 것이 좋습니다.
진행 중인 명확화 작업에 대한 자세한 내용은 다음을 참조하십시오:SVG 콘텐츠는 흔히 어떤 것의 그림이나 도면을 나타내므로 문서의 특정 뷰로 링크해야 하는 경우가 많으며, 여기서 뷰는 문서의 특정 부분을 확대하여 표시하도록 초기 변환을 나타냅니다.
| SVG 2 요구 사항: | 조각 식별자 링크 탐색에 관한 SVG 1.1 SE 텍스트와 SVG Tiny 1.2 텍스트를 통합하고 미디어 조각을 추가합니다. |
|---|---|
| 결의: | SVG 2에는 미디어 조각 식별자가 포함됩니다. |
| 목적: | Media Fragments URI와 일치시키기 위함입니다. |
| 담당자: | Cyril (ACTION-3442) |
SVG 문서의 특정 뷰로 링크하려면 조각 식별자가 있는 URL 참조가 올바르게 구성된 SVG 조각 식별자여야 합니다. SVG 조각 식별자는 MIME 미디어 유형 "image/svg+xml"인 리소스를 찾는 URL의 "선택자" 또는 "조각 식별자" 부분의 의미를 정의합니다.
SVG 조각 식별자는 다음 형식일 수 있습니다:
SVG 조각 식별자는 다음과 같이 정의됩니다:
SVGFragmentIdentifier ::= BareName *( "&" timesegment ) | SVGViewSpec *( "&" timesegment ) | spacesegment *( "&" timesegment ) | timesegment *( "&" spacesegment ) BareName ::= XML_Name SVGViewSpec ::= 'svgView(' SVGViewAttributes ')' SVGViewAttributes ::= SVGViewAttribute | SVGViewAttribute ';' SVGViewAttributes SVGViewAttribute ::= viewBoxSpec | preserveAspectRatioSpec | transformSpec viewBoxSpec ::= 'viewBox(' ViewBoxParams ')' preserveAspectRatioSpec = 'preserveAspectRatio(' AspectParams ')' transformSpec ::= 'transform(' TransformParams ')'
여기서:
SVG 뷰 박스 매개변수는 CSS Transforms 명세에서 정의한 순서대로 적용됩니다 (예: SVG 뷰는 먼저 ViewBoxParams에 정의된 대로 변환되고, 그 다음 TransformParams에 정의된 대로 변환됩니다).
조각 명세에는 공백을 사용할 수 있습니다. SVG 뷰 명세 안의 숫자 값을 구분하는 데 쉼표를 사용하고 (예: #svgView(viewBox(0,0,200,200))), 속성을 구분하는 데 세미콜론을 사용합니다(예: #svgView(viewBox(0,0,200,200);preserveAspectRatio(none))).
조각 식별자는 CSS Object Model (CSSOM) 명세에 정의된 규칙에 따라 URL 이스케이프할 수 있습니다. 예를 들어 세미콜론을 %3B로 이스케이프하여 세미콜론으로 구분된 URL 목록을 애니메이션할 수 있습니다. 그렇지 않으면 세미콜론이 목록 구분자로 해석되기 때문입니다.
네 가지 유형의 SVGViewAttribute는 어떤 순서로든 나타날 수 있지만, 올바르게 구성된 SVGViewSpec에서 각 유형은 최대 한 번만 나타날 수 있습니다.
소스 문서가 SVG 문서로 링크할 때, 예를 들어 HTML 앵커 요소 ([HTML]; 즉, HTML의 <a href=...> 요소) 또는 XLink 명세 [xlink]를 통하는 경우, SVG 조각 식별자는 SVG 문서의 초기 뷰를 다음과 같이 지정합니다:
‘view’ 요소는 다음과 같이 정의됩니다:
viewTarget 속성을 제거하기로 결의했습니다.
결의: Paris 2015 F2F Day 3.
담당자: BogdanBrinza.
SVGElement 객체는 DOM의 ‘a’ 요소를 나타냅니다.
[Exposed=Window] interface SVGAElement : SVGGraphicsElement { [Reflect, SameObject] readonly attribute SVGAnimatedString target; [Reflect] attribute DOMString download; [Reflect] attribute USVString ping; [Reflect] attribute DOMString rel; [Reflect="rel", SameObject, PutForwards=value] readonly attribute DOMTokenList relList; [Reflect] attribute DOMString hreflang; [Reflect] attribute DOMString type; attribute DOMString referrerPolicy; }; SVGAElement includes SVGURIReference; SVGAElement includes HyperlinkElementUtils;
URL 설정 알고리즘을 SVGAElement에 적용하면:
href 업데이트를 SVGAElement에 수행하려면:
referrerPolicy IDL 속성은 ‘referrerpolicy’ 콘텐츠 속성을 반영하며, 알려진 값으로만 제한됩니다.
SVGViewElement 객체는 DOM의 ‘view’ 요소를 나타냅니다.
[Exposed=Window] interface SVGViewElement : SVGElement {}; SVGViewElement includes SVGFitToViewBox;
이 부록은 규범적입니다.
이 부록에는 SVG 문서 객체 모델 정의에 대한 전체 Web IDL이 포함되어 있습니다.
[Exposed=Window] interface SVGElement : Element { [SameObject] readonly attribute SVGAnimatedString className; readonly attribute SVGSVGElement? ownerSVGElement; readonly attribute SVGElement? viewportElement; }; SVGElement includes GlobalEventHandlers; SVGElement includes HTMLOrSVGOrMathMLElement; dictionary SVGBoundingBoxOptions { boolean fill = true; boolean stroke = false; boolean markers = false; boolean clipped = false; }; [Exposed=Window] interface SVGGraphicsElement : SVGElement { [SameObject] readonly attribute SVGAnimatedTransformList transform; SVGRect getBBox(optional SVGBoundingBoxOptions options = {}); SVGMatrix? getCTM(); SVGMatrix? getScreenCTM(); }; SVGGraphicsElement includes SVGTests; [Exposed=Window] interface SVGGeometryElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedNumber pathLength; boolean isPointInFill(optional DOMPointInit point = {}); boolean isPointInStroke(optional DOMPointInit point = {}); float getTotalLength(); SVGPoint getPointAtLength(float distance); }; [Exposed=Window] interface SVGNumber { attribute float value; }; [Exposed=Window] interface SVGLength { // 길이 단위 유형 const unsigned short SVG_LENGTHTYPE_UNKNOWN = 0; const unsigned short SVG_LENGTHTYPE_NUMBER = 1; const unsigned short SVG_LENGTHTYPE_PERCENTAGE = 2; const unsigned short SVG_LENGTHTYPE_EMS = 3; const unsigned short SVG_LENGTHTYPE_EXS = 4; const unsigned short SVG_LENGTHTYPE_PX = 5; const unsigned short SVG_LENGTHTYPE_CM = 6; const unsigned short SVG_LENGTHTYPE_MM = 7; const unsigned short SVG_LENGTHTYPE_IN = 8; const unsigned short SVG_LENGTHTYPE_PT = 9; const unsigned short SVG_LENGTHTYPE_PC = 10; readonly attribute unsigned short unitType; attribute float value; attribute float valueInSpecifiedUnits; attribute DOMString valueAsString; undefined newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits); undefined convertToSpecifiedUnits(unsigned short unitType); }; [Exposed=Window] interface SVGAngle { // 각도 단위 유형 const unsigned short SVG_ANGLETYPE_UNKNOWN = 0; const unsigned short SVG_ANGLETYPE_UNSPECIFIED = 1; const unsigned short SVG_ANGLETYPE_DEG = 2; const unsigned short SVG_ANGLETYPE_RAD = 3; const unsigned short SVG_ANGLETYPE_GRAD = 4; readonly attribute unsigned short unitType; attribute float value; attribute float valueInSpecifiedUnits; attribute DOMString valueAsString; undefined newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits); undefined convertToSpecifiedUnits(unsigned short unitType); }; [Exposed=Window] interface SVGNumberList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); SVGNumber initialize(SVGNumber newItem); getter SVGNumber getItem(unsigned long index); SVGNumber insertItemBefore(SVGNumber newItem, unsigned long index); SVGNumber replaceItem(SVGNumber newItem, unsigned long index); SVGNumber removeItem(unsigned long index); SVGNumber appendItem(SVGNumber newItem); setter undefined (unsigned long index, SVGNumber newItem); }; [Exposed=Window] interface SVGLengthList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); SVGLength initialize(SVGLength newItem); getter SVGLength getItem(unsigned long index); SVGLength insertItemBefore(SVGLength newItem, unsigned long index); SVGLength replaceItem(SVGLength newItem, unsigned long index); SVGLength removeItem(unsigned long index); SVGLength appendItem(SVGLength newItem); setter undefined (unsigned long index, SVGLength newItem); }; [Exposed=Window] interface SVGStringList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); DOMString initialize(DOMString newItem); getter DOMString getItem(unsigned long index); DOMString insertItemBefore(DOMString newItem, unsigned long index); DOMString replaceItem(DOMString newItem, unsigned long index); DOMString removeItem(unsigned long index); DOMString appendItem(DOMString newItem); setter undefined (unsigned long index, DOMString newItem); }; [Exposed=Window] interface SVGAnimatedBoolean { attribute boolean baseVal; readonly attribute boolean animVal; }; [Exposed=Window] interface SVGAnimatedEnumeration { attribute unsigned short baseVal; readonly attribute unsigned short animVal; }; [Exposed=Window] interface SVGAnimatedInteger { attribute long baseVal; readonly attribute long animVal; }; [Exposed=Window] interface SVGAnimatedNumber { attribute float baseVal; readonly attribute float animVal; }; [Exposed=Window] interface SVGAnimatedLength { [SameObject] readonly attribute SVGLength baseVal; [SameObject] readonly attribute SVGLength animVal; }; [Exposed=Window] interface SVGAnimatedAngle { [SameObject] readonly attribute SVGAngle baseVal; [SameObject] readonly attribute SVGAngle animVal; }; [Exposed=Window] interface SVGAnimatedString { attribute (DOMString or TrustedScriptURL) baseVal; readonly attribute DOMString animVal; }; [Exposed=Window] interface SVGAnimatedRect { [SameObject] readonly attribute SVGRect baseVal; [SameObject] readonly attribute SVGRect animVal; }; [Exposed=Window] interface SVGAnimatedNumberList { [SameObject] readonly attribute SVGNumberList baseVal; [SameObject] readonly attribute SVGNumberList animVal; }; [Exposed=Window] interface SVGAnimatedLengthList { [SameObject] readonly attribute SVGLengthList baseVal; [SameObject] readonly attribute SVGLengthList animVal; }; [Exposed=Window] interface SVGUnitTypes { // 단위 유형 const unsigned short SVG_UNIT_TYPE_UNKNOWN = 0; const unsigned short SVG_UNIT_TYPE_USERSPACEONUSE = 1; const unsigned short SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2; }; interface mixin SVGTests { [SameObject] readonly attribute SVGStringList requiredExtensions; [SameObject] readonly attribute SVGStringList systemLanguage; }; interface mixin SVGFitToViewBox { [SameObject] readonly attribute SVGAnimatedRect viewBox; [SameObject] readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio; }; interface mixin SVGURIReference { [SameObject] readonly attribute SVGAnimatedString href; }; partial interface Document { readonly attribute SVGSVGElement? rootElement; }; [Exposed=Window] interface SVGSVGElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; attribute float currentScale; [SameObject] readonly attribute SVGPoint currentTranslate; NodeList getIntersectionList(SVGRect rect, SVGElement? referenceElement); NodeList getEnclosureList(SVGRect rect, SVGElement? referenceElement); boolean checkIntersection(SVGElement element, SVGRect rect); boolean checkEnclosure(SVGElement element, SVGRect rect); undefined deselectAll(); [NewObject] SVGNumber createSVGNumber(); [NewObject] SVGLength createSVGLength(); [NewObject] SVGAngle createSVGAngle(); [NewObject] SVGPoint createSVGPoint(); [NewObject] SVGMatrix createSVGMatrix(); [NewObject] SVGRect createSVGRect(); [NewObject] SVGTransform createSVGTransform(); [NewObject] SVGTransform createSVGTransformFromMatrix(optional DOMMatrix2DInit matrix = {}); Element? getElementById(DOMString elementId); // 호출해도 아무 효과가 없는 폐기된 메서드이지만, // 호환성을 위해 유지됩니다. unsigned long suspendRedraw(unsigned long maxWaitMilliseconds); undefined unsuspendRedraw(unsigned long suspendHandleID); undefined unsuspendRedrawAll(); undefined forceRedraw(); }; SVGSVGElement includes SVGFitToViewBox; SVGSVGElement includes WindowEventHandlers; [Exposed=Window] interface SVGGElement : SVGGraphicsElement { }; [Exposed=Window] interface SVGDefsElement : SVGGraphicsElement { }; [Exposed=Window] interface SVGDescElement : SVGElement { }; [Exposed=Window] interface SVGMetadataElement : SVGElement { }; [Exposed=Window] interface SVGTitleElement : SVGElement { }; [Exposed=Window] interface SVGSymbolElement : SVGGraphicsElement { }; SVGSymbolElement includes SVGFitToViewBox; [Exposed=Window] interface SVGUseElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; }; SVGUseElement includes SVGURIReference; [Exposed=Window] interface SVGUseElementShadowRoot : ShadowRoot { }; [Exposed=Window] interface ShadowAnimation : Animation { constructor(Animation source, (Element or CSSPseudoElement) newTarget); [SameObject] readonly attribute Animation sourceAnimation; }; [Exposed=Window] interface SVGSwitchElement : SVGGraphicsElement { }; interface mixin GetSVGDocument { Document getSVGDocument(); }; [Exposed=Window] interface SVGStyleElement : SVGElement { [Reflect] attribute DOMString type; [Reflect] attribute DOMString media; [Reflect] attribute DOMString title; attribute boolean disabled; }; SVGStyleElement includes LinkStyle; [Exposed=Window] interface SVGTransform { // 변환 유형 const unsigned short SVG_TRANSFORM_UNKNOWN = 0; const unsigned short SVG_TRANSFORM_MATRIX = 1; const unsigned short SVG_TRANSFORM_TRANSLATE = 2; const unsigned short SVG_TRANSFORM_SCALE = 3; const unsigned short SVG_TRANSFORM_ROTATE = 4; const unsigned short SVG_TRANSFORM_SKEWX = 5; const unsigned short SVG_TRANSFORM_SKEWY = 6; readonly attribute unsigned short type; [SameObject] readonly attribute SVGMatrix matrix; readonly attribute float angle; undefined setMatrix(optional DOMMatrix2DInit matrix = {}); undefined setTranslate(float tx, float ty); undefined setScale(float sx, float sy); undefined setRotate(float angle, float cx, float cy); undefined setSkewX(float angle); undefined setSkewY(float angle); }; [Exposed=Window] interface SVGTransformList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); SVGTransform initialize(SVGTransform newItem); getter SVGTransform getItem(unsigned long index); SVGTransform insertItemBefore(SVGTransform newItem, unsigned long index); SVGTransform replaceItem(SVGTransform newItem, unsigned long index); SVGTransform removeItem(unsigned long index); SVGTransform appendItem(SVGTransform newItem); setter undefined (unsigned long index, SVGTransform newItem); // 다른 목록 인터페이스에 공통적이지 않은 추가 메서드입니다. SVGTransform createSVGTransformFromMatrix(optional DOMMatrix2DInit matrix = {}); SVGTransform? consolidate(); }; [Exposed=Window] interface SVGAnimatedTransformList { [SameObject] readonly attribute SVGTransformList baseVal; [SameObject] readonly attribute SVGTransformList animVal; }; [Exposed=Window] interface SVGPreserveAspectRatio { // 정렬 유형 const unsigned short SVG_PRESERVEASPECTRATIO_UNKNOWN = 0; const unsigned short SVG_PRESERVEASPECTRATIO_NONE = 1; const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMIN = 2; const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3; const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4; const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMID = 5; const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMID = 6; const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMID = 7; const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMAX = 8; const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9; const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10; // Meet-or-slice 유형 const unsigned short SVG_MEETORSLICE_UNKNOWN = 0; const unsigned short SVG_MEETORSLICE_MEET = 1; const unsigned short SVG_MEETORSLICE_SLICE = 2; attribute unsigned short align; attribute unsigned short meetOrSlice; }; [Exposed=Window] interface SVGAnimatedPreserveAspectRatio { [SameObject] readonly attribute SVGPreserveAspectRatio baseVal; [SameObject] readonly attribute SVGPreserveAspectRatio animVal; }; [Exposed=Window] interface SVGPathElement : SVGGeometryElement { }; [Exposed=Window] interface SVGRectElement : SVGGeometryElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; [SameObject] readonly attribute SVGAnimatedLength rx; [SameObject] readonly attribute SVGAnimatedLength ry; }; [Exposed=Window] interface SVGCircleElement : SVGGeometryElement { [SameObject] readonly attribute SVGAnimatedLength cx; [SameObject] readonly attribute SVGAnimatedLength cy; [SameObject] readonly attribute SVGAnimatedLength r; }; [Exposed=Window] interface SVGEllipseElement : SVGGeometryElement { [SameObject] readonly attribute SVGAnimatedLength cx; [SameObject] readonly attribute SVGAnimatedLength cy; [SameObject] readonly attribute SVGAnimatedLength rx; [SameObject] readonly attribute SVGAnimatedLength ry; }; [Exposed=Window] interface SVGLineElement : SVGGeometryElement { [SameObject] readonly attribute SVGAnimatedLength x1; [SameObject] readonly attribute SVGAnimatedLength y1; [SameObject] readonly attribute SVGAnimatedLength x2; [SameObject] readonly attribute SVGAnimatedLength y2; }; interface mixin SVGAnimatedPoints { [SameObject] readonly attribute SVGPointList points; [SameObject] readonly attribute SVGPointList animatedPoints; }; [Exposed=Window] interface SVGPointList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); SVGPoint initialize(SVGPoint newItem); getter SVGPoint getItem(unsigned long index); SVGPoint insertItemBefore(SVGPoint newItem, unsigned long index); SVGPoint replaceItem(SVGPoint newItem, unsigned long index); SVGPoint removeItem(unsigned long index); SVGPoint appendItem(SVGPoint newItem); setter undefined (unsigned long index, SVGPoint newItem); }; [Exposed=Window] interface SVGPolylineElement : SVGGeometryElement { }; SVGPolylineElement includes SVGAnimatedPoints; [Exposed=Window] interface SVGPolygonElement : SVGGeometryElement { }; SVGPolygonElement includes SVGAnimatedPoints; [Exposed=Window] interface SVGTextContentElement : SVGGraphicsElement { // lengthAdjust 유형 const unsigned short LENGTHADJUST_UNKNOWN = 0; const unsigned short LENGTHADJUST_SPACING = 1; const unsigned short LENGTHADJUST_SPACINGANDGLYPHS = 2; [SameObject] readonly attribute SVGAnimatedLength textLength; [SameObject] readonly attribute SVGAnimatedEnumeration lengthAdjust; long getNumberOfChars(); float getComputedTextLength(); float getSubStringLength(unsigned long charnum, unsigned long nchars); SVGPoint getStartPositionOfChar(unsigned long charnum); SVGPoint getEndPositionOfChar(unsigned long charnum); SVGRect getExtentOfChar(unsigned long charnum); float getRotationOfChar(unsigned long charnum); long getCharNumAtPosition(optional DOMPointInit point = {}); undefined selectSubString(unsigned long charnum, unsigned long nchars); }; [Exposed=Window] interface SVGTextPositioningElement : SVGTextContentElement { [SameObject] readonly attribute SVGAnimatedLengthList x; [SameObject] readonly attribute SVGAnimatedLengthList y; [SameObject] readonly attribute SVGAnimatedLengthList dx; [SameObject] readonly attribute SVGAnimatedLengthList dy; [SameObject] readonly attribute SVGAnimatedNumberList rotate; }; [Exposed=Window] interface SVGTextElement : SVGTextPositioningElement { }; [Exposed=Window] interface SVGTSpanElement : SVGTextPositioningElement { }; [Exposed=Window] interface SVGTextPathElement : SVGTextContentElement { // textPath 메서드 유형 const unsigned short TEXTPATH_METHODTYPE_UNKNOWN = 0; const unsigned short TEXTPATH_METHODTYPE_ALIGN = 1; const unsigned short TEXTPATH_METHODTYPE_STRETCH = 2; // textPath 간격 유형 const unsigned short TEXTPATH_SPACINGTYPE_UNKNOWN = 0; const unsigned short TEXTPATH_SPACINGTYPE_AUTO = 1; const unsigned short TEXTPATH_SPACINGTYPE_EXACT = 2; [SameObject] readonly attribute SVGAnimatedLength startOffset; [SameObject] readonly attribute SVGAnimatedEnumeration method; [SameObject] readonly attribute SVGAnimatedEnumeration spacing; }; SVGTextPathElement includes SVGURIReference; [Exposed=Window] interface SVGImageElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; [SameObject] readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio; attribute DOMString? crossOrigin; }; SVGImageElement includes SVGURIReference; [Exposed=Window] interface SVGForeignObjectElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; }; [Exposed=Window] interface SVGMarkerElement : SVGElement { // 마커 단위 유형 const unsigned short SVG_MARKERUNITS_UNKNOWN = 0; const unsigned short SVG_MARKERUNITS_USERSPACEONUSE = 1; const unsigned short SVG_MARKERUNITS_STROKEWIDTH = 2; // 마커 방향 유형 const unsigned short SVG_MARKER_ORIENT_UNKNOWN = 0; const unsigned short SVG_MARKER_ORIENT_AUTO = 1; const unsigned short SVG_MARKER_ORIENT_ANGLE = 2; const unsigned short SVG_MARKER_ORIENT_AUTO_START_REVERSE = 3; [SameObject] readonly attribute SVGAnimatedLength refX; [SameObject] readonly attribute SVGAnimatedLength refY; [SameObject] readonly attribute SVGAnimatedEnumeration markerUnits; [SameObject] readonly attribute SVGAnimatedLength markerWidth; [SameObject] readonly attribute SVGAnimatedLength markerHeight; [SameObject] readonly attribute SVGAnimatedEnumeration orientType; [SameObject] readonly attribute SVGAnimatedAngle orientAngle; attribute DOMString orient; undefined setOrientToAuto(); undefined setOrientToAngle(SVGAngle angle); }; SVGMarkerElement includes SVGFitToViewBox; [Exposed=Window] interface SVGGradientElement : SVGElement { // 확산 방식 유형 const unsigned short SVG_SPREADMETHOD_UNKNOWN = 0; const unsigned short SVG_SPREADMETHOD_PAD = 1; const unsigned short SVG_SPREADMETHOD_REFLECT = 2; const unsigned short SVG_SPREADMETHOD_REPEAT = 3; [SameObject] readonly attribute SVGAnimatedEnumeration gradientUnits; [SameObject] readonly attribute SVGAnimatedTransformList gradientTransform; [SameObject] readonly attribute SVGAnimatedEnumeration spreadMethod; }; SVGGradientElement includes SVGURIReference; [Exposed=Window] interface SVGLinearGradientElement : SVGGradientElement { [SameObject] readonly attribute SVGAnimatedLength x1; [SameObject] readonly attribute SVGAnimatedLength y1; [SameObject] readonly attribute SVGAnimatedLength x2; [SameObject] readonly attribute SVGAnimatedLength y2; }; [Exposed=Window] interface SVGRadialGradientElement : SVGGradientElement { [SameObject] readonly attribute SVGAnimatedLength cx; [SameObject] readonly attribute SVGAnimatedLength cy; [SameObject] readonly attribute SVGAnimatedLength r; [SameObject] readonly attribute SVGAnimatedLength fx; [SameObject] readonly attribute SVGAnimatedLength fy; [SameObject] readonly attribute SVGAnimatedLength fr; }; [Exposed=Window] interface SVGStopElement : SVGElement { [SameObject] readonly attribute SVGAnimatedNumber offset; }; [Exposed=Window] interface SVGPatternElement : SVGElement { [SameObject] readonly attribute SVGAnimatedEnumeration patternUnits; [SameObject] readonly attribute SVGAnimatedEnumeration patternContentUnits; [SameObject] readonly attribute SVGAnimatedTransformList patternTransform; [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; }; SVGPatternElement includes SVGFitToViewBox; SVGPatternElement includes SVGURIReference; [Exposed=Window] interface SVGScriptElement : SVGElement { [Reflect] attribute DOMString type; attribute DOMString? crossOrigin; }; SVGScriptElement includes SVGURIReference; [Exposed=Window] interface SVGAElement : SVGGraphicsElement { [Reflect, SameObject] readonly attribute SVGAnimatedString target; [Reflect] attribute DOMString download; [Reflect] attribute USVString ping; [Reflect] attribute DOMString rel; [Reflect="rel", SameObject, PutForwards=value] readonly attribute DOMTokenList relList; [Reflect] attribute DOMString hreflang; [Reflect] attribute DOMString type; attribute DOMString referrerPolicy; }; SVGAElement includes SVGURIReference; SVGAElement includes HyperlinkElementUtils; [Exposed=Window] interface SVGViewElement : SVGElement {}; SVGViewElement includes SVGFitToViewBox;
다음 참고 사항은 소프트웨어 개발자가 콘텐츠를 SVG 언어 기능에서 요구하는 형식으로 변환하거나 그 형식에서 변환할 때 사용할 수 있는 알고리즘과 기타 전략을 설명합니다.
다른 경로 세그먼트 표기법과 일관성을 유지하기 위해, SVG 경로의 호는 곡선의 시작점과 끝점을 기준으로 정의됩니다.
이 타원 호 매개변수화를 끝점 매개변수화라고 합니다. 끝점 매개변수화의 장점 중 하나는 모든 경로 명령이 새로운 "현재 점"의 좌표로 끝나는 일관된 경로 구문을 사용할 수 있다는 것입니다.
그러나 이것이 소프트웨어나 수학에서 사용되는 호 기하를 설명하는 유일한 방법은 아닙니다. 이 절에서는 대안인 중심 매개변수화와 이를 SVG의 끝점 매개변수화에서 또는 끝점 매개변수화로 변환하는 방법을 설명합니다.
SVG 경로 명령에 나타나는 타원 호는 다음 매개변수로 순서대로 설명됩니다:
(x1, y1)은 이전 경로 명령의 마지막 두 매개변수에서 얻은 경로상의 현재 점의 절대 좌표입니다.
rx 및 ry는 타원의 반지름(장반경 및 단반경이라고도 함)입니다.
φ는 현재 좌표계의 x축에서 타원의 x축까지의 각도입니다.
fA는 큰 호 플래그이며, 180도 이하를 차지하는 호를 선택하면 0이고 180도보다 큰 호를 선택하면 1입니다.
fS는 스윕 플래그이며, 중심과 호를 잇는 선이 감소하는 각도를 따라 스윕하면 0이고, 증가하는 각도를 따라 스윕하면 1입니다.
(x2, y2)는 호의 마지막 점의 절대 좌표입니다.
타원 호 위의 임의의 점 (x, y)은 다음 2차원 행렬 방정식으로 설명할 수 있습니다:
(식 3.1)
x = rx*cos(θ)*cos(φ) - ry*sin(θ)*sin(φ) + cx
y = rx*cos(θ)*sin(φ) + ry*sin(θ)*cos(φ) + cy
(cx, cy)는 타원 중심의 좌표입니다.
rx 및 ry는 타원의 반지름(장반경 및 단반경이라고도 함)입니다.
φ는 현재 좌표계의 x축에서 타원의 x축까지의 각도입니다.
θ는 점 (x, y)이 위치하는 호 둘레의 각도이며 다음 범위입니다:
타원을 늘인 다음 회전한 원으로 생각한다면 θ1, θ2 및 Δθ는 각각 늘이기 및 회전 연산 이전 호의 시작 각도, 끝 각도 및 스윕 각도입니다. 이는 그래픽 API에서 일반적인 대안적인 매개변수화로 이어지며, 이를 중심 매개변수화라고 합니다. 다음 절에서는 중심 매개변수화와 끝점 매개변수화 사이를 양방향으로 매핑하는 공식을 제공합니다.
다음 변수가 주어졌다고 합니다:
cx cy rx ry φ θ1 Δθ
찾아야 하는 값은 다음과 같습니다:
x1 y1 x2 y2 fA fS
다음 공식을 사용하여 구할 수 있습니다:
|
|
(식 4.1) |
|
|
(식 4.2) |
|
|
(식 4.3) |
|
|
(식 4.4) |
다음 변수가 주어졌다고 합니다:
x1 y1 x2 y2 fA fS rx ry φ
찾아야 하는 값은 다음과 같습니다:
cx cy θ1 Δθ
원점을 (x1, y1)과 (x2, y2)를 잇는 선의 중점에 배치하도록 평행 이동한 다음 좌표축을 타원의 축과 맞도록 회전하면 방정식이 단순해집니다. 변환된 모든 좌표는 프라임을 붙여 표기합니다. 이들은 필요한 중심 매개변수화 변수를 찾는 과정의 중간값으로 계산됩니다. 이 절차는 다음 단계로 구성됩니다:
1단계: 계산 (x1′, y1′)
|
|
(식 5.1) |
2단계: 계산 (cx′, cy′)
|
|
(식 5.2) |
여기서 fA ≠ fS이면 + 부호를 선택하고, fA = fS이면 − 부호를 선택합니다.
3단계: 계산 (cx, cy) 기준: (cx′, cy′)
|
|
(식 5.3) |
4단계: 계산 θ1 및 Δθ
일반적으로 두 벡터 (ux, uy) 및 (vx, vy) 사이의 각도는 다음과 같이 계산할 수 있습니다
|
|
(식 5.4) |
여기서 나타나는 ± 부호는 ux vy − uy vx의 부호입니다.
이 각도 함수를 사용하여 θ1 및 Δθ를 다음과 같이 나타낼 수 있습니다:
|
|
(식 5.5) |
|
|
(식 5.6) |
여기서 Δθ는 다음을 만족하도록 −360° < Δθ < 360° 범위로 고정합니다:
fS = 0이면 Δθ < 0,
그렇지 않고 fS = 1이면 Δθ > 0.
즉, fS = 0이고 (식 5.6)의 오른쪽이 0보다 크면 360°를 빼고, fS = 1이고 오른쪽이 0보다 작으면 360°를 더합니다. 그 밖의 모든 경우에는 그대로 둡니다.
이 절에서는 경로 구현 참고 사항에 설명된 대로 범위를 벗어난 rx 및 ry에 필요한 수학적 조정을 설명합니다. 알고리즘상 이러한 조정은 다음 단계로 구성됩니다:
1단계: 반지름이 0이 아닌지 확인
rx = 0 또는 ry = 0이면, 이를 (x1, y1)에서 (x2, y2)까지의 직선으로 취급하고 중지합니다. 그렇지 않으면,
2단계: 반지름이 양수인지 확인
rx 및 ry의 절대값을 취합니다:
|
|
(식 6.1) |
3단계: 반지름이 충분히 큰지 확인
방정식 (식 5.1)의 프라임 좌표 값을 사용하여 다음을 계산합니다
|
|
(식 6.2) |
위 방정식의 결과가 1 이하이면 rx 및 ry를 더 변경할 필요가 없습니다. 위 방정식의 결과가 1보다 크면 다음과 같이 대체합니다
|
|
(식 6.3) |
4단계: 계산 계속
끝점에서 중심 매개변수화로 변환 알고리즘의 계산과 같이 나머지 타원 호 계산을 계속합니다. 참고: 이 절의 반지름 수정 결과로 타원의 중심에 대한 방정식 (5.2)는 항상 적어도 하나의 해를 가집니다(즉, 피제곱근은 절대로 음수가 아닙니다). 방정식 (식 6.3)을 사용하여 반지름을 확대하는 경우 (식 5.2)의 피제곱근은 0이며 타원 중심에 대한 해는 정확히 하나입니다.
이 절은 참고 사항입니다.
SVG의 실수 정밀도는 단정밀도입니다. 지도와 기술 도면처럼 단정밀도를 초과하는 정보 표현이 필요한 기술 데이터를 처리하는 적합한 SVG 생성기는 적합한 SVG 뷰어에서 일관된 표시를 보장하기 위해 이 절에 설명된 절차를 따르는 것이 권장됩니다.
CTM을 생성할 때 적어도 배정밀도 부동 소수점을 사용해야 한다는 점을 이용하면 단정밀도보다 더 높은 유효 정밀도로 표시할 수 있습니다 (적합한 SVG 뷰어 절의 CTM 생성 처리 참조). 이를 활용하는 콘텐츠 생성 단계는 다음과 같습니다:
| 분할 전 | 분할 후 | |
|---|---|---|
|
|
| 1단계: 콘텐츠 분할 | 5단계: 더 작은 유효 자릿수와 적절한 translate로 타일 배치 | |
|---|---|---|
![]() |
![]() |
|
| 이 예는 사용자 좌표계가 일곱 자리인 타일을 사용하여 여덟 자리의 유효 숫자를 제공합니다. | ||
이 부록은 참고 사항이며 규범적이지 않습니다.
이 부록에서는 SVG의 접근성 기능과 SVG를 지원하는 데 사용되는 접근성 관련 명세, 그리고 이들이 지원하도록 설계된 관련 W3C 웹 콘텐츠 접근성 지침(WCAG) 2.0 [WCAG2] 요구 사항을 중점적으로 설명합니다.
이 절에서는 SVG 접근성 관련 명세 및 저작 지침을 열거합니다.
SVG는 시간에 따라 벡터 그래픽을 변경하여 애니메이션 효과를 만드는 기능을 지원합니다. SVG 콘텐츠는 다음과 같은 방식으로 애니메이션할 수 있습니다:
SVG는 이러한 애니메이션 방법 중 어느 것에 대해서도 지원을 의무화하지 않습니다. 그러나 이를 지원하는 사용자 에이전트는 SVG 문서 및 다른 문서의 SVG 조각에서도 이를 지원할 것으로 기대됩니다. 선언적 또는 스크립트 기반 애니메이션을 지원하는 사용자 에이전트는 적합성 장에 정의된 처리 모드 기반 제한과, use 요소 섀도 트리의 애니메이션에 대한 특별 요구 사항을 준수해야 합니다.
이 부록은 참고 사항이며 규범적이지 않습니다.
다음은 SVG 언어의 요소입니다:
이 부록은 참고 사항이며 규범적이지 않습니다.
다음 표에는 SVG 언어에 정의된 모든 속성이 나열되어 있습니다. 단, 프레젠테이션 속성은 제외하며, 이는 아래 프레젠테이션 속성 절에서 다룹니다. 각 속성에 대해 해당 속성을 지정할 수 있는 요소도 함께 제시합니다.
스타일링 장에서 설명한 대로, 각 프로퍼티에는 대응하는 프레젠테이션 속성이 있습니다. 아래 표에는 프레젠테이션 속성이 나열되어 있습니다.
alignment-baseline, baseline-shift, clip, clip-path, clip-rule, color, color-interpolation, color-interpolation-filters, cursor, direction, display, dominant-baseline, fill, fill-opacity, fill-rule, filter, flood-color, flood-opacity, font-family, font-size, font-size-adjust, font-stretch, font-style, font-variant, font-weight, glyph-orientation-horizontal, glyph-orientation-vertical, image-rendering, letter-spacing, lighting-color, marker-end, marker-mid, marker-start, mask, mask-type, opacity, overflow, paint-order, path-length, pointer-events, shape-rendering, stop-color, stop-opacity, stroke, stroke-dasharray, stroke-dashoffset, stroke-linecap, stroke-linejoin, stroke-miterlimit, stroke-opacity, stroke-width, text-anchor, text-decoration, text-rendering, transform, transform-origin, unicode-bidi, vector-effect, visibility, word-spacing 및 writing-mode이 부록은 참고 사항이며 규범적이지 않습니다.
| 이름 | 값 | 초기값 | 적용 대상 | 상속 | 백분율 | 미디어 | 애니메이션 유형 | 계산값 |
|---|---|---|---|---|---|---|---|---|
| color-interpolation | auto | sRGB | linearRGB | sRGB | 컨테이너 요소, 그래픽 요소, 그라디언트 요소, ‘use’ 및 ‘animate’ | yes | N/A | visual | discrete | as specified |
| cx | <length-percentage> | 0 | ‘circle’ 및 ‘ellipse’ 요소 | no | 현재 SVG 뷰포트의 너비를 기준으로 함(다음을 참조: 단위) | by computed value | 절대 길이 또는 백분율 | |
| cy | <length-percentage> | 0 | ‘circle’ 및 ‘ellipse’ 요소 | no | 현재 SVG 뷰포트의 높이를 기준으로 함(다음을 참조: 단위) | visual | by computed value | 절대 길이 또는 백분율 |
| fill | <paint> (다음을 참조: 페인트 지정) | black | 도형 및 텍스트 콘텐츠 요소 | yes | N/A | visual | by computed value | 지정된 대로이지만 <color> 값은 계산하고 <url> 값은 절대값으로 만듦 |
| fill-opacity | <‘opacity’> | 1 | 도형 및 텍스트 콘텐츠 요소 | yes | N/A | visual | by computed value | 지정된 값을 숫자로 변환하고 [0,1] 범위로 제한한 값 |
| fill-rule | nonzero | evenodd | nonzero | 도형 및 텍스트 콘텐츠 요소 | yes | N/A | visual | discrete | as specified |
| image-rendering | auto | optimizeSpeed | optimizeQuality | auto | 이미지 | yes | N/A | visual | discrete | as specified |
| marker | 개별 프로퍼티 참조 | 개별 프로퍼티 참조 | 도형 | yes | N/A | visual | discrete | 개별 프로퍼티 참조 |
| marker-end marker-mid marker-start |
none | <url> | none | 도형 | yes | N/A | visual | discrete | 지정된 대로이지만 <url> 값(<marker-ref>의 일부)은 절대값으로 만듦 |
| paint-order | normal | [ fill || stroke || markers ] | normal | 도형 및 텍스트 콘텐츠 요소 | yes | N/A | visual | discrete | as specified |
| pointer-events | auto | bounding-box | visiblePainted | visibleFill | visibleStroke |
visible | painted | fill | stroke | all | none |
auto | 컨테이너 요소, 그래픽 요소 및 ‘use’ | yes | N/A | visual | discrete | as specified |
| r | <length-percentage> | 0 | ‘circle’ 요소 | no | 현재 SVG 뷰포트의 정규화된 대각선을 기준으로 함(다음을 참조: 단위) | by computed value | 절대 길이 또는 백분율 | |
| rx | <length-percentage> | auto | auto | ‘ellipse’, ‘rect’ 요소 | no | 현재 SVG 뷰포트의 너비를 기준으로 함(다음을 참조: 단위) | by computed value | 절대 길이 또는 백분율 | |
| ry | <length-percentage> | auto | auto | ‘ellipse’, ‘rect’ 요소 | no | 현재 SVG 뷰포트의 높이를 기준으로 함(다음을 참조: 단위) | visual | by computed value | 절대 길이 또는 백분율 |
| shape-rendering | auto | optimizeSpeed | crispEdges | geometricPrecision |
auto | 도형 | yes | N/A | visual | discrete | as specified |
| stop-color | <‘color’> | black | ‘stop’ 요소 | no | N/A | visual | by computed value | |
| stop-opacity | <‘opacity’> | 1 | ‘stop’ 요소 | no | N/A | visual | by computed value | 지정된 값을 숫자로 변환하고 [0,1] 범위로 제한한 값 |
| stroke | <paint> (다음을 참조: 페인트 지정) | none | 도형 및 텍스트 콘텐츠 요소 | yes | N/A | visual | by computed value | 지정된 대로이지만 <color> 값은 계산하고 <url> 값은 절대값으로 만듦 |
| stroke-dasharray | none | <dasharray> | none | 도형 및 텍스트 콘텐츠 요소 | yes | 현재 SVG 뷰포트의 정규화된 대각선을 기준으로 함 | visual | 본문 참조 | 쉼표로 구분된 절대 길이 또는 백분율 목록으로, 숫자는 먼저 절대 길이로 변환하거나 지정된 키워드를 사용 |
| stroke-dashoffset | <length-percentage> | <number> | 0 | 도형 및 텍스트 콘텐츠 요소 | yes | 현재 SVG 뷰포트의 정규화된 대각선을 기준으로 함 | visual | by computed value | 절대 길이 또는 백분율로; 숫자는 먼저 절대 길이로 변환 |
| stroke-linecap | butt | round | square | butt | 도형 및 텍스트 콘텐츠 요소 | yes | N/A | visual | discrete | as specified |
| stroke-linejoin | miter | round | bevel | miter | 도형 및 텍스트 콘텐츠 요소 | yes | N/A | visual | discrete | as specified |
| stroke-miterlimit | <number> (음수가 아님) | 4 | 도형 및 텍스트 콘텐츠 요소 | yes | N/A | visual | by computed value | as specified |
| stroke-opacity | <‘opacity’> | 1 | 도형 및 텍스트 콘텐츠 요소 | yes | N/A | visual | by computed value | 지정된 값을 숫자로 변환하고 [0,1] 범위로 제한한 값 |
| stroke-width | <length-percentage> | <number> | 1px | 도형 및 텍스트 콘텐츠 요소 | yes | 현재 SVG 뷰포트의 정규화된 대각선을 기준으로 함 | visual | by computed value | 절대 길이 또는 백분율로; 숫자는 먼저 절대 길이로 변환 |
| text-anchor | start | middle | end | start | 텍스트 콘텐츠 요소 | yes | N/A | visual | discrete | as specified |
| text-rendering | auto | optimizeSpeed | optimizeLegibility | geometricPrecision |
auto | ‘text’ 요소 | yes | N/A | visual | discrete | as specified |
| vector-effect | non-scaling-stroke | none | none | 그래픽 요소 및 ‘use’ | no | N/A | visual | discrete | as specified |
| x | <length-percentage> | 0 | ‘svg’, ‘rect’, ‘image’, ‘foreignObject’ 요소 | no | 현재 SVG 뷰포트의 너비를 기준으로 함(다음을 참조: 단위) | by computed value | 절대 길이 또는 백분율 | |
| y | <length-percentage> | 0 | ‘svg’, ‘rect’, ‘image’, ‘foreignObject’ 요소 | no | 현재 SVG 뷰포트의 높이를 기준으로 함(다음을 참조: 단위) | visual | by computed value | 절대 길이 또는 백분율 |
이 부록은 참고 사항이며 규범적이지 않습니다.
다음은 이 명세에 정의된 모든 IDL 인터페이스의 목록입니다:
이 부록은 규범적입니다.
이 부록은 BCP 13 및 W3CRegMedia에 따라 새 MIME 미디어 유형 "image/svg+xml"을 등록합니다.
image
svg+xml
없음.
charset
[rfc7303] 또는 그 후속 문서에 지정된 application/xml 미디어 유형과 동일합니다.
application/xml과 동일합니다. [rfc7303] 3.2절 또는 그 후속 문서를 참조하십시오.
SVG 워킹 그룹의 보안 및 개인정보 보호 자체 평가 결과는 https://github.com/w3c/svgwg/wiki/SVG-2-Security-&-Privacy-Review에 있습니다.
다른 XML 유형과 마찬가지로, 그리고 [rfc7303] 10절에서 언급했듯이 악의적으로 구성된 XML 엔티티를 반복적으로 확장하면 많은 양의 메모리를 소비할 수 있으며, 이로 인해 제약된 환경의 XML 프로세서가 실패할 수 있습니다.
여러 SVG 요소에서 임의의 URI를 참조할 수 있습니다. 이 경우 [rfc3986] 7절의 보안 문제를 고려하는 것이 좋습니다.
HTML과 마찬가지로 SVG 문서는 이미지, 스타일시트 및 스크립팅 언어 같은 외부 미디어를 참조할 수 있습니다. 스크립팅 언어는 실행 가능한 콘텐츠입니다. 이 경우 해당 형식의 미디어 유형 등록에 있는 보안 고려 사항이 적용되어야 합니다.
또한 SVG 및 일반적인 XML의 확장성 기능 때문에 "image/svg+xml"이 여기에서 설명한 것 이상의 보안 영향을 갖는 콘텐츠를 설명할 수 있습니다. 그러나 프로세서가 게시된 명세의 규범적 의미 체계만 따르면 이 콘텐츠는 SVG 네임스페이스 밖에 있으며 무시해야 합니다. 프로세서가 추가 콘텐츠를 인식하여 처리하거나 해당 콘텐츠의 추가 처리를 다른 프로세서에 전달하는 경우에만 보안 문제가 발생할 가능성이 있습니다. 그리고 그러한 경우에는 이 등록 문서의 범위를 벗어납니다.
SVG 워킹 그룹의 보안 및 개인정보 보호 자체 평가 결과는 https://github.com/w3c/svgwg/wiki/SVG-2-Security-&-Privacy-Review에 있습니다.
SVG의 ‘requiredExtensions’ 및 ‘systemLanguage’ 속성은 사용자 에이전트 호스트 환경의 구성을 조사할 수 있는 일부 기회를 제공할 수 있습니다. ‘requiredExtensions’는 사용자 에이전트가 사용자 지정 확장을 지원하는지 확인함으로써, ‘systemLanguage’은 한 언어의 다른 언어에 대한 선호도를 확인함으로써 그렇게 할 수 있습니다.
게시된 명세는 무엇보다도 SVG 네임스페이스와 다른 네임스페이스 모두에서 인식되지 않는 요소와 속성을 처리할 때 따라야 하는 동작을 규정하는 처리 의미 체계를 설명합니다.
SVG는 확장 가능하므로 적합한 "image/svg+xml" 프로세서는 수신한 콘텐츠가 올바른 형식의 XML일 것으로 예상해야 하지만, 콘텐츠가 특정 DTD 또는 Schema에 유효하다거나 프로세서가 문서의 모든 요소와 속성을 인식한다고 보장할 수는 없습니다.
SVG에는 게시된 테스트 스위트와, 보고서 작성 시점에 어떤 구현이 어떤 테스트를 통과했는지를 보여 주는 관련 구현 보고서가 있습니다. 이 정보는 새 테스트가 추가되거나 구현이 개선됨에 따라 주기적으로 업데이트됩니다.
이 미디어 유형 등록은 SVG 1.1 명세의 부록 P에서 발췌한 것입니다.
SVG는 HTML과 함께 웹 브라우저에서 사용되며, 휴대전화와 디지털 카메라에서, 데스크톱 출판의 그래픽 자산 교환 형식으로, 산업 공정 시각화, 디스플레이 표지판 및 확장 가능한 정적 또는 상호작용형 그래픽 기능이 필요한 많은 다른 애플리케이션에서 사용됩니다.
확장자 'svgz'는 'svg.gz'의 별칭으로 사용된다는 점에 유의하십시오 [rfc1952], 즉 image/svg+xml 유형의 옥텟 스트림을 이후 gzip으로 압축한 것입니다.
Macintosh 파일 유형 코드 'svgz'(모두 소문자)는 GZIP [rfc1952]으로 압축된 "svg "의 별칭으로 사용됩니다. 즉, image/svg+xml 유형의 옥텟 스트림을 이후 gzip으로 압축한 것입니다.
org.w3c.svg는 public.image 및 public.xml을 준수합니다
Chris Lilley (www-svg@w3.org) 또는 GitHub에 이슈를 제기하십시오: https://github.com/w3c/svgwg/issues/685
COMMON
없음
SVG 명세는 World Wide Web Consortium의 SVG 워킹 그룹 작업 산출물입니다.
W3C가 이 명세에 대한 변경 제어권을 가집니다.
이 부록은 참고 사항이며 규범적이지 않습니다.
이 부록은 SVG 1.1 제2판 권고안 이후 이루어진 변경 사항을 요약합니다. 최초 SVG 2 후보 권고안 이후의 변경 사항은 강조 표시되어 있습니다.
명세를 더 읽기 쉽게 만들기 위해 여러 스타일상의 변경이 이루어졌습니다. 여기에는 다음이 포함됩니다:
위에 나열된 편집상 변경 사항 외에도 다음과 같은 실질적인 추가, 변경 및 제거가 이루어졌습니다.
zoomAndPan 속성 및 관련 텍스트를 제거했습니다.
이슈 논의
suspendRedraw, unsuspendRedraw 및
unsuspendRedrawAll 메서드를 폐기했습니다.
body 이벤트 핸들러 콘텐츠 속성 및 IDL 속성과 마찬가지로
Window에서 발생하는
이벤트용임을 정의했습니다.
SVGElementInstance 및 SVGElementInstanceList 인터페이스와
SVGUseElement 인터페이스의 대응 속성을 제거했습니다.
viewport 속성을 제거했습니다.
zoomAndPan 속성 및 관련 텍스트를 제거했습니다.
이슈 논의
instanceRoot 및 animatedInstanceRoot
프로퍼티를 제거했습니다.
모든 브라우저에서 제거되었기 때문입니다.
이슈 논의
SVGPathSeg* 및 SVGAnimatedPathData 인터페이스와 SVGPathElement의 관련
메서드를 제거했습니다.<number>에서 <length>로
변경했습니다.
csswg-drafts#13901
(결의, 2026년
5월 20일)
stroke-linejoin에서
miter-clip 및 arcs 값 제거 (이슈 #1065)zoomAndPan 속성 및 관련 텍스트를 제거했습니다.text IDL 프로퍼티를 추가했습니다.(none) 초기값을 반영할 때만 적용되며,
다른 명세(예: Geometry)에 정의된 인터페이스에도 적용됨을 명확히 했습니다.