CSS 채우기 및 스트로크 모듈 레벨 3

W3C 첫 공개 작업 초안,

이번 버전:
https://www.w3.org/TR/2017/WD-fill-stroke-3-20170413/
최신 발행 버전:
https://www.w3.org/TR/fill-stroke-3/
편집자 초안:
https://drafts.fxtf.org/fill-stroke/
이슈 추적:
명세 내 인라인
GitHub 이슈
편집자:
Elika J. Etemad / fantasai (초청 전문가)
Tab Atkins-Bittner (Google)
이전 편집자:
(Mozilla Corporation)

초록

이 모듈은 텍스트와 SVG 도형의 채우기 및 스트로크와 관련된 CSS 기능을 포함한다.

이 문서의 상태

이 절은 이 문서가 공개된 시점의 문서 상태를 설명한다. 다른 문서가 이 문서를 대체할 수 있다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 https://www.w3.org/TR/의 W3C 기술 보고서 색인에서 확인할 수 있다.

이 문서는 첫 공개 작업 초안이다.

첫 공개 작업 초안으로 공개되었다고 해서 W3C 회원의 승인을 의미하지는 않는다. 이 문서는 초안 문서이며 언제든지 다른 문서에 의해 갱신되거나 대체되거나 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 적절하지 않다.

이 명세에 대한 논의에는 GitHub 이슈를 사용하는 것이 권장된다. 이슈를 등록할 때는 제목에 “fill-stroke”라는 텍스트를 넣어야 하며, 가급적 다음과 같이 작성하는 것이 좋다: “[fill-stroke] …의견 요약…”. 모든 이슈와 의견은 보관되며, 과거 아카이브도 있다.

이 문서는 CSS 작업 그룹SVG 작업 그룹에서 발행했다.

이 문서는 2004년 2월 5일 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었다. W3C는 각 그룹의 산출물과 관련하여 이루어진 모든 특허 공개(CSS)의 공개 목록모든 특허 공개(SVG)의 공개 목록을 유지한다. 이 페이지에는 특허 공개 방법에 대한 안내도 포함되어 있다. 개인이 필수 청구항을 포함한다고 믿는 특허에 대해 실제 지식을 가지고 있는 경우, 해당 개인은 W3C 특허 정책 6절에 따라 그 정보를 공개해야 한다.

이 문서는 2017년 3월 1일 W3C 프로세스 문서의 적용을 받는다.

1. 소개

도형을 정의하는 텍스트와 SVG 그래픽 요소—path 요소, 그리고 rect 같은 기본 도형—은 객체의 내부를 칠하는 채우기와, 객체의 윤곽선을 따라 칠하는 스트로크를 통해 렌더링된다.

이 명세는 요소의 채우기와 스트로크의 모양 및 형태를 제어하는 여러 속성을 정의함으로써, 텍스트와 SVG 그래픽 요소가 어떻게 채워지고 스트로크되는지를 설명한다.

SVG2의 페인트 지정을 삽입할 것.

텍스트 장식을 처리할 것. 이슈다른 이슈를 참고.

2. 페인트

페인트는 추상적인 기하를 보이게 하는 것이다. 이는 색, 패턴, 이미지, 그라디언트 및 기타 2D 그래픽으로 구성된다. <color> 타입은 0차원 페인트를 나타내며, [CSS3-COLOR]에서 정의된다. <paint> 타입은 2차원 페인트를 나타내며, 그 구문은 다음과 같다:

<paint> = none | <image> | <svg-paint>
none

페인트가 적용되지 않음을 나타낸다.

<image>

[CSS3-IMAGES]에서 정의되며 이미지 참조와 그라디언트를 포함한다.

<svg-paint>

SVG 페인트 서버를 참조하며, §2.1 SVG 전용 페인트에서 정의된다.

2.1. SVG 전용 페인트

<svg-paint> = child | child( <integer> )
child

칠해지는 요소의 마지막 자식 페인트 서버 요소를 참조한다.

그러한 자식이 없으면, none처럼 동작한다.

child(<integer>)

함수형 표기법은, 인자로 양의 정수를 받아들이며, 칠해지는 요소의 n번째 자식 페인트 서버 요소 (::nth-child()와 마찬가지로 1부터 시작)를 참조한다.

그러한 자식이 없으면, none처럼 동작한다.

1보다 작은 인자는 유효하지 않다.

w3c/csswg-drafts/383[css-images][css-masking][paint] url() 처리의 모호함

context-fillcontext-stroke는 명세에 통합될 필요가 있지만, <paint> 값이 아니라, 각각의 개별 strokefill 하위 속성의 키워드로 속해야 한다. 더 많은 WG 논의와, 이를 위해 비교적 상당한 편집을 하기 전에 이것이 유지될 SVG2 기능이라는 확인이 필요하다.

CSS Images 4 §3.4.1 Paint Sources는 SVG 페인트 서버 좌표 공간을 처리하는 방법을 정의한다. 여기서 복사할 것인가, 참조할 것인가, 아니면 다른 방식인가?

3. 채우기

채우기는 SVG 도형의 윤곽선 내부 또는 인라인(또는 SVG 텍스트) 박스의 글리프 내부를 칠한다. 배경 [CSS3BG]과 유사하게, 채우기는 단색(fill-color) 및/또는 이미지 패턴(fill-image 등)이 될 수 있다.

fill 단축 속성을 사용하여 채우기를 설정하는 것이 강력히 권장된다. 개별 페인팅 장문 속성은 하나의 개별 측면을 변경할 필요가 있을 때만 사용해야 한다.

box-decoration-break, fill-break, 그리고 stroke-break의 단축 속성인 box-break 속성을 추가할 것인가?

3.1. 여러 채우기의 레이어링

박스의 채우기는 여러 레이어를 가질 수 있다. 레이어 수는 fill-image 속성의 쉼표로 구분된 값의 수에 의해 결정된다. none 값도 여전히 레이어를 만든다.

목록 값을 가지는 속성은 배경 이미지의 경우와 정확히 동일하게 상호작용하며, 이는 CSS Backgrounds 3 §3.1 여러 배경 이미지의 레이어링에 정의되어 있다.

3.2. 채우기 기하

3.2.1. SVG 도형을 위한 감기 규칙: fill-rule 속성

이름: fill-rule
값: nonzero | evenodd
초기값: nonzero
적용 대상: SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 지정된 대로
정규 순서: 문법 기준
애니메이션 가능: 아니오

fill-rule 속성은 캔버스의 어느 부분이 도형 내부에 포함되는지를 결정하는 데 사용하는 규칙을 나타낸다. 단순하고 교차하지 않는 경로의 경우, 어떤 영역이 “내부”에 있는지는 직관적으로 명확하다. 그러나 자기 자신과 교차하는 경로처럼 더 복잡한 경로나, 한 하위 경로가 다른 하위 경로를 둘러싸는 경우에는 “내부”의 해석이 그렇게 명확하지 않다.

fill-rule 속성은 도형의 내부를 결정하는 방법으로 두 가지 옵션을 제공한다:

nonzero
이 규칙은 캔버스의 한 점에서 임의의 방향으로 무한대까지 광선을 그은 다음, 도형의 선분이 그 광선을 가로지르는 위치를 검사하여 그 점의 “내부성”을 결정한다. 카운트를 0에서 시작하여, 경로 선분이 광선을 왼쪽에서 오른쪽으로 가로지를 때마다 1을 더하고, 오른쪽에서 왼쪽으로 가로지를 때마다 1을 뺀다. 교차를 모두 센 뒤, 결과가 0이면 그 점은 경로의 바깥쪽이다. 그렇지 않으면 안쪽이다.
자기 교차와 둘러싸인 하위 경로가 있는 경로에서 nonzero 채우기 규칙의 효과.
evenodd
이 규칙은 캔버스의 한 점에서 임의의 방향으로 무한대까지 광선을 그은 다음, 그 광선이 주어진 도형의 경로 선분과 교차하는 횟수를 세어 그 점의 “내부성”을 결정한다. 이 수가 홀수이면 점은 안쪽이고, 짝수이면 점은 바깥쪽이다.
자기 교차와 둘러싸인 하위 경로가 있는 경로에서 evenodd 채우기 규칙의 효과.

참고: 위 설명은 경로 선분이 광선과 일치하거나 광선에 접하는 경우 어떻게 해야 하는지를 지정하지 않는다. 어떤 광선이든 사용할 수 있으므로, 그러한 문제가 있는 교차를 만들지 않는 다른 광선을 선택하면 된다.

이 속성은 텍스트 (SVG이든 CSS이든)에는 적용되지 않는다. 텍스트 글리프의 “내부”는 본질적으로 정의되어 있기 때문이다.

이것도 레이어화해야 하는가?

3.2.2. 분할된 채우기: fill-break 속성

이름: fill-break
값: bounding-box | slice | clone
초기값: bounding-box
적용 대상: 모든 요소
상속: 예?
백분율: 해당 없음
미디어: 시각
계산값: 지정된 대로
정규 순서: 문법 기준
애니메이션 가능: 아니오

이 속성은 분할된 박스의 기하가 채우기에 대해 어떻게 처리되는지를 지정한다.

값은 다음 의미를 가진다: FRAGMENTATION에서 복사

3.3. 채우기 페인트

3.3.1. 채우기 색: fill-color 속성

이름: fill-color
값: <color>
초기값: currentcolor
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 계산된 색
정규 순서: 문법 기준
애니메이션 가능: 색처럼

이 속성은 요소의 채우기 색을 설정한다. 이 색은 모든 채우기 이미지 뒤에 그려진다.

작성자는 텍스트의 색을 설정할 때 color 속성을 사용하는 것이 권장되며, fill-color를 사용하는 것은 권장되지 않는다.

background-color와 달리, 채우기 색은 fill-image의 최종 레이어가 none이거나 유효하지 않은 이미지인 경우에만 그려져야 한다. 그것이 유효한 이미지라면, 채우기 색은 그려지면 안 된다.

참고: 이는 단일 레이어 이미지 구문에 "fallback color"를 내장한 SVG의 기존 fill 속성 동작과 맞추기 위해 필요하다. CSS에서는 이를 image() 함수로 더 잘 달성할 수 있으며, 이 함수는 fallback을 명시적으로 만든다.

fill-colorstroke-color처럼 레이어화되어야 하며, 그래야 두 속성 집합의 일관성이 최대가 된다.

SVG 사용자 에이전트는 자신의 사용자 에이전트 스타일 시트에 다음 규칙 (또는 그에 상응하는 것)을 포함해야 한다:

@namespace svg "http://www.w3.org/2000/svg";
svg:svg:root, *|*:not(svg|*) > svg:svg {
  fill-color: black;
}

3.3.2. 채우기 이미지 소스: fill-image 속성

이름: fill-image
값: <paint>#
초기값: none
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 지정된 대로, URL은 절대 URL로 변환
정규 순서: 문법 기준
애니메이션 가능: 이미지의 반복 가능한 목록처럼

이 속성은 요소의 채우기 이미지를 설정한다. 이미지는 처음 지정한 것이 맨 위(사용자에게 가장 가까운 쪽)에 그려지고, 이후의 각 이미지는 앞 이미지 뒤에 그려진다. 값은 background-image와 동일하게, 필요한 변경을 거쳐 해석된다.

3.3.3. 채우기 배치 영역: fill-origin 속성

이름: fill-origin
값: match-parent | fill-box | stroke-box | content-box | padding-box | border-box
초기값: match-parent
적용 대상: 모든 요소
상속: 아니오
백분율: 해당 없음
미디어: 시각
계산값: 지정된 대로
정규 순서: 문법 기준
애니메이션 가능: 아니오

이 속성은 채우기의 좌표계를 지정하고, 채우기 배치 영역을 설정한다. 값은 다음 의미를 가진다:

match-parent
부모와 동일한 채우기 배치 영역을 사용한다. 부모가 없으면, 초기 컨테이닝 블록을 사용한다.
content-box
padding-box
border-box
박스 자신의 content-box/padding-box/border-box를 채우기 배치 영역으로 사용한다. SVG 도형의 경우, content-boxpadding-boxfill-box로 취급되며, border-boxstroke-box로 취급된다.
fill-box
SVG 도형 또는 SVG 텍스트의 경우, 요소의 객체 바운딩 박스를 사용한다. CSS 박스의 경우, 요소와 모든 in-flow 또는 float된 자손의 텍스트 글리프 윤곽선의 바운딩 박스를 사용한다.
stroke-box
SVG 도형 또는 SVG 텍스트의 경우, 요소의 스트로크 바운딩 박스를 사용한다. CSS 박스의 경우, 요소와 모든 in-flow 또는 float된 자손의 텍스트 글리프 스트로크 윤곽선의 바운딩 박스를 사용한다.

SVG UA 스타일 시트는 다음 규칙을 포함하도록 수정된다:

svg:svg {
  fill-origin: content-box;
}

채우기 페인팅 영역은 크기가 무한하다. 페인팅할 때, 채우기 색/이미지는 영향을 받는 텍스트의 글리프 영역 또는 영향을 받는 SVG 도형의 채우기 기하와 교차된다.

SVG 페인트 서버는 *Units 속성 안에 자체 originator 정보를 가지고 다니지만, SVGWG가 CSS originator에 주의를 기울이게 하는 새 값을 추가할 수도 있다. 또는 여기에서 auto 초기값을 추가하여, 페인트 서버를 참조하는 경우에는 페인트 서버의 정보에 따르고, 그렇지 않으면 match-parent가 되게 할 수 있다.

3.3.4. 채우기 이미지 배치: fill-position 속성

이름: fill-position
값: <position>#
초기값: 0% 0%
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 목록이며, 각 항목은 왼쪽 위 원점으로부터의 한 쌍의 오프셋(수평 및 수직)으로 구성되고 각각은 절대 길이와 백분율의 조합으로 주어진다
정규 순서: 문법 기준
애니메이션 가능: 길이, 백분율 또는 calc의 단순 목록으로 이루어진 반복 가능한 목록처럼

채우기 이미지가 지정된 경우, 이 속성은 (크기 조정 후) 해당 채우기 배치 영역 내에서 그 초기 위치를 지정한다. 값은 background-position과 동일하게, 필요한 변경을 거쳐 해석된다.

3.3.5. 채우기 이미지 크기 지정: fill-size 속성

이름: fill-size
값: <bg-size>#
초기값: auto
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 지정된 대로, 단 길이는 절대값으로 변환되고 생략된 auto 키워드는 채워짐
정규 순서: 문법 기준
애니메이션 가능: 길이, 백분율 또는 calc의 단순 목록으로 이루어진 반복 가능한 목록처럼

채우기 이미지의 크기를 지정한다. 값은 background-size와 동일하게, 필요한 변경을 거쳐 해석된다.

3.3.6. 채우기 이미지 타일링: fill-repeat 속성

이름: fill-repeat
값: <repeat-style>#
초기값: repeat
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 목록이며, 각 항목은 차원마다 하나씩 두 개의 키워드로 구성됨
정규 순서: 문법 기준
애니메이션 가능: 아니오

채우기 이미지의 크기를 지정하고 위치를 정한 뒤 어떻게 타일링할지를 지정한다. 값은 background-repeat와 동일하게, 필요한 변경을 거쳐 해석된다.

3.3.7. 채우기 단축 표기: fill 속성

이름: fill
값: 수정이 적용된 <background>
초기값: 개별 속성 참고
적용 대상: 개별 속성 참고
상속: 개별 속성 참고
백분율: 해당 없음
미디어: 시각
계산값: 개별 속성 참고
정규 순서: 문법 기준
애니메이션 가능: 개별 속성 참고

이 속성은 모든 채우기 페인팅 속성—fill-color, fill-image, fill-origin, fill-position, fill-size, 그리고 fill-repeat을 하나의 선언에서 설정하는 단축 속성이다. 생략된 값은 초기값으로 설정된다. 다만 생략된 fill-colortransparent로 설정되고, 생략된 fill-originfill-box로 설정된다.

이 단축 속성을 통해 설정할 때 fill-origin의 기본값은 무엇이어야 하는가? content-box인가 fill-box인가? fill-box는 Zapfino처럼 화려하거나 넘치는 글꼴에 더 잘 작동하지만, content-box보다 계산 비용이 훨씬 크다.

SVG에는 특수한 색 fallback 구문이 있다—이미지 뒤에 오는 색은 이미지가 실패한 경우에만 그려진다. 이는 background와 맞추려는 우리의 의도와 충돌한다. 왜냐하면 fill: url(#foo) red;는 red로 채운 다음 #foo를 그리는 것이 *아니기* 때문이다. 절충안: fill-color는 fallback 색이지만, none유효하지 않은 이미지 모두 fallback을 트리거한다. 따라서 fill: url(#foo) red;는 #foo가 없을 때만 red를 그리며(SVG처럼), 하지만 fill: url(#foo), red (마지막 레이어의 none red와 동등함)는 red와 #foo를 둘 다 그린다(background처럼).

3.4. 채우기 투명도

3.4.1. 채우기 불투명도: fill-opacity 속성

이름: fill-opacity
값: <‘opacity’>
초기값: 1
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 지정된 값을 <number>로 변환하고, 범위 [0,1]로 제한한 값
정규 순서: 문법 기준
애니메이션 가능: 숫자처럼

fill-opacity 속성은 요소를 채우는 데 사용되는 페인팅 작업의 불투명도를 지정한다. opacity와 마찬가지로, 0 또는 0% 값은 완전히 투명함을 의미하고, 1 또는 100% 값은 완전히 불투명함을 의미한다.

4. 스트로크(윤곽선)

스트로크는 SVG 도형의 윤곽선 또는 인라인(또는 SVG 텍스트) 박스의 글리프 윤곽선을 따라 테두리를 그린다. 그 결과 영역은 채우기 영역과 유사하게 채워질 수 있다. 스트로크는 단색(stroke-color) 및/또는 이미지 패턴(stroke-image 등)이 될 수 있다.

stroke 단축 속성을 사용하여 스트로크를 설정하는 것이 강력히 권장된다. 개별 페인팅 장문 속성은 하나의 개별 측면을 변경할 필요가 있을 때만 사용해야 한다.

기본적으로 스트로크채우기 위에 그려진다. SVG 텍스트 또는 SVG 도형에서는 그리기 순서가 paint-order 속성으로 제어된다.

paint-order가 SVG가 아닌 텍스트에도 적용되어야 하는가?

4.1. 여러 스트로크의 레이어링

박스의 스트로크는 여러 레이어를 가질 수 있다. 레이어 수는 stroke-image 속성의 쉼표로 구분된 값의 수와 stroke-color 속성의 쉼표로 구분된 값의 수 중 더 큰 값으로 결정된다. none 값도 여전히 레이어를 만든다.

두 속성의 길이가 다르면, 값은 끝에서부터 정렬되며, stroke-color의 앞쪽 누락 값은 transparent가 기본값이 되고, stroke-image의 앞쪽 누락 값은 none이 기본값이 된다.

목록 값을 가지는 속성은 배경 이미지의 경우와 정확히 동일하게 상호작용하며, 이는 CSS Backgrounds 3 §3.1 여러 배경 이미지의 레이어링에 정의되어 있다.

stroke-color는 반드시 transparent로 앞쪽을 채워야 한다. 그렇지 않으면 이미지 로드에 실패했을 때 여러 이미지 레이어가 무작위로 단색으로 fallback될 것이다. 일반적으로 스트로크와 채우기의 앞쪽을 초기값으로 채우게 할 것인가, 아니면 나머지 속성들이 배경처럼 목록을 반복해야 하는가?

4.2. 스트로크 기하

현재 우리는 SVGWG 결의에 따라 스트로크 페인트 속성과 stroke-width를 레이어화하고 있다. 다른 기하 속성도 레이어화해야 하는가? 그것들은 비슷한 사용 사례를 가지지만, 다소 더 틈새적이다. API의 일관성은 중요하다. 구현/테스트 노력을 들일 가치가 있는가? 어려운 사례: stroke-dasharray, 왜냐하면 "commas anywhere lol" 구문을 가지기 때문이다.

4.2.1. 스트로크 두께: stroke-width 속성

이름: stroke-width
값: <length-percentage>#
초기값: 1px
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 스케일된 뷰포트 크기 기준
미디어: 시각
계산값: 절대 길이 또는 백분율
정규 순서: 문법 기준
애니메이션 가능: <length-percentage>처럼

이 속성은 윤곽선 위의 스트로크 폭을 지정한다. 0 값은 해당 레이어에 스트로크가 그려지지 않게 한다. 음수 값은 유효하지 않다.

스케일된 뷰포트 크기는 뷰포트 너비와 높이의 기하 평균이다.

4.2.2. 스트로크 배치: stroke-align 속성

이름: stroke-align
값: center | inset | outset
초기값: center
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 지정된 대로
정규 순서: 문법 기준
애니메이션 가능: 아니오

이 속성은 작성자가 윤곽선을 따라 스트로크를 정렬할 수 있게 한다.

center
각 하위 경로의 스트로크는 윤곽선 위에 가운데 정렬된다.
inset
각 하위 경로의 스트로크는 윤곽선의 “안쪽” (채우기 영역 안쪽)에 놓인다.

stroke-linejoin 속성은 무시되어야 한다.

stroke-linejoin이 무시되는가? 내부 모서리에는 여전히 필요하다.

outset
각 하위 경로의 스트로크는 윤곽선의 “바깥쪽” (채우기 영역 바깥쪽)에 놓인다.
텍스트는 쉽고, 단순한 닫힌 비자기교차 경로도 쉽지만, 다른 범주도 존재하며 좋은 정의가 필요하다.

이것은 열린 경로 선분에 어떻게 적용되는가? 한 제안은 열린 경로에서 outsetleft의 별칭으로, insetright의 별칭으로 삼는 것이다. 끝 캡은 어떻게 처리되는가?

  1. stroke-align center 값을 가진 스트로크.

  2. 채우기 영역.

  3. 명세에 따른(?) stroke-align inset 값의 스트로크(스트로크는 채우기 영역 안쪽에만 그려짐).

  4. stroke-align outset 값의 스트로크 (채우기 영역을 차단하여 구현됨).

  5. stroke-align inset 값의 스트로크, 대안 해석.

  6. 명세에 따른(?) stroke-align outset 값의 스트로크.

  7. 대안 left 값을 가진 stroke-align 스트로크. 분홍색은 둥근 line-cap을 표시한다.

이것은 루프가 있는 경로에 어떻게 적용되는가? 아래 그림에서 빨간 원 안의 영역은 (그림처럼) 스트로크된 부분인가? 채우기 규칙이 nonzero라면 내부 모서리가 스트로크되는가? 그렇다면 어떻게 되는가? (아래에는 스트로크 없이 표시됨.)

  • 위쪽 행: 일반 스트로크. 왼쪽 스트로크. 오른쪽 스트로크.

  • 가운데 행: 채우기 규칙 nonzero, 스트로크 없음. 바깥쪽 스트로크. 안쪽 스트로크.

  • 아래쪽 행: 채우기 규칙 evenodd, 스트로크 없음. 바깥쪽 스트로크. 안쪽 스트로크.

대시는 어떻게 처리되는가? 원래 경로를 기준으로 하는가?

  1. 일반 대시 패턴.

  2. 대시 패턴 또는 원래 경로를 기준으로 한 대시 패턴. 대시 부분 안쪽에서 온 밝은 회색 영역에 유의하라 (단순히 클리핑 경로를 사용하는 것만으로는 올바른 결과가 나오지 않는다).

  3. 오프셋 경로의 중심을 기준으로 한 대시 패턴. 밝은 회색은 inset 경로의 중심을 기준으로 한 대시 패턴을 나타낸다.

4.2.3. 스트로크 끝 모양: stroke-linecap 속성

이름: stroke-linecap
값: butt | round | square
초기값: butt
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 지정된 대로
정규 순서: 문법 기준
애니메이션 가능: 아니오

stroke-linecap은 열린 하위 경로 (대시 스트로크의 선분, 또는 닫히지 않은 path 요소 등) 가 스트로크될 때 그 끝에 사용할 모양을 지정한다. 가능한 값은 다음과 같다:

butt
각 하위 경로의 스트로크는 두 끝점을 넘어 확장되지 않는다. (따라서 길이가 0인 하위 경로에는 스트로크가 없다.)
round
각 하위 경로의 각 끝에서, 스트로크는 스트로크 폭의 절반과 같은 반지름을 가진 반원만큼 확장된다. (길이가 0인 하위 경로의 스트로크는 그 하위 경로의 점을 중심으로 하는 완전한 원이다.)
square
각 하위 경로의 끝에서, 스트로크는 스트로크 폭과 같은 너비를 가지며 길이는 스트로크 폭의 절반인 직사각형만큼 확장된다. (길이가 0인 하위 경로의 스트로크는 변의 길이가 스트로크 폭과 같고, 그 하위 경로의 점을 중심으로 하며, 두 변이 그 하위 경로의 점에서 유효 접선과 평행하도록 배향된 정사각형이다. 길이가 0인 하위 경로에서 접선을 결정하는 방법에 대한 자세한 내용은 §4.6 스트로크 모양 계산을 참고하라.)

곡선 윤곽선의 대시 끝에 직사각형을 추가하면 보기 좋지 않다. 윤곽선을 따라 stroke-width/2만큼 대시를 확장하기만 해야 한다.

세 가지 유형의 line cap.

line cap이 가지는 모양에 대한 더 정확한 설명은 아래의 캡 모양 정의를 참고하라.

4.2.4. 스트로크 모서리 모양: stroke-linejoin 속성

이름: stroke-linejoin
값: [ crop | arcs | miter ] || [ bevel | round | stupid ]
초기값: miter
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 지정된 대로
정규 순서: 문법 기준
애니메이션 가능: 아니오

stroke-linejoin은 경로나 기본 도형이 스트로크될 때 그 모서리에 사용할 모양을 지정한다. 이는 두 부분으로 구성된다. [ crop | arcs | miter ]는 스트로크 모서리를 확장할지 여부와 그 방법을 지정하고, [ bevel | round | stupid ]stroke-miterlimit에 의해 길이가 제한될 때 모서리의 "cap"을 렌더링하는 방법을 지정한다.

crop
스트로크는 볼록한 모서리를 형성하는 데 필요한 최소한의 양만큼 모서리 너머로 확장된다.

이는 miter와 동일하게 동작하지만, stroke-miterlimit이 최소값인 1을 가진 것처럼 동작하도록 강제한다.

miter
경로 선분을 연결하는 데 날카로운 모서리가 사용된다. 모서리는 경로 선분의 접선에서 스트로크의 바깥쪽 가장자리를 서로 만날 때까지 확장하여 형성된다.
arcs
경로 선분을 연결하는 데 arcs 모서리가 사용된다. arcs 모양은 결합점에서 스트로크의 바깥쪽 가장자리를, 결합점에서의 바깥쪽 가장자리와 같은 곡률을 가진 호로 확장하여 형성된다.
bevel
모서리는 그 대각선에 수직인 선에 의해 stroke-miterlimit에서 잘린다.
round
모서리는 bevel의 경우처럼 잘리고, 잘린 스트로크 가장자리에 접하는 채워진 호가 추가되어 모서리를 둥글게 한다.
fallback
stroke-miterlimit을 초과하면, 이는 crop bevel이 지정된 것처럼 동작한다.

fallback을 그냥 제거할 수 있는가? 이것은 stupid 값이며, SVG1에 miterlimit에서 클리핑하는 동작이 없었기 때문에만 유용하다. 문제는 사람들이 현재 대부분 *우연히* bevel 동작을 제대로 얻고 있는 것인지, 그리고 자신의 join이 miterlimit까지 확장되고 초과 모서리만 잘리는 것에 만족할 것인지, 아니면 현재 지정된 불연속 동작을 실제로 원했는지이다. 임계점은 29도와 30도 사이에 있다.

[ crop | arcs | miter ]가 생략되면, 기본값은 crop이다. [ bevel | round | fallback ]이 생략되면, 기본값은 fallback이다.

네 가지 유형의 line join
각 유형의 join이 정확히 어떻게 형성되는지 더 자세히 살펴본 것. 각 경우에서 흰색 점선은 스트로크되는 경로이고, 검은색은 linejoin을 적용하기 전의 스트로크 자체이다. 분홍색 영역은 bevel, round, miter linejoin에서 모서리에 추가되는 추가 스트로크이다.

4.2.5. 스트로크 모서리 한계: stroke-miterlimit 속성

이름: stroke-miterlimit
값: <number>
초기값: 4
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 숫자
정규 순서: 문법 기준
애니메이션 가능: 아니오

이 속성은 두 스트로크 선분이 모서리에서 만날 때 miter 또는 arcs join의 최대 크기를 지정한다. (join의 겉보기 “크기”—안쪽 모서리와 바깥쪽 모서리 사이의 거리—는 각도가 작아질수록 무한대에 가까워진다.)

이 속성은 stroke-aligninset일 때 효과가 없다.

값은 다음 의미를 가진다:

<number>
join의 크기에 대한 한계를 그 모서리 대각선stroke-width의 비율로 지정한다. 1보다 작은 값은 유효하지 않다(그리고 선언을 유효하지 않게 만든다).

miter linejoin의 경우, 대각선의 길이는 두 선분 사이의 각도로부터 stroke-width / sin(θ/2)로 계산된다. linejoin은 두 경로 선분 사이의 각도를 이등분하는 선에 수직으로 잘린다.

arcs linejoin의 경우, 대각선의 길이는 두 선분이 교차하는 지점에서 두 선분 사이의 각도를 이등분하는 선에 접하고 join의 끝점을 지나는 원호를 따라 계산된다. linejoin은 이 호에 수직으로 잘린다.

각도를 추가해야 하는가? miterlimit 숫자는 물리적 정당성이 있지만, 실험 없이는 이해하기 어렵다.

4.2.6. 분할된 스트로크: stroke-break 속성

이름: stroke-break
값: bounding-box | slice | clone
초기값: bounding-box
적용 대상: 모든 요소
상속: ?
백분율: 해당 없음
미디어: 시각
계산값: 지정된 대로
정규 순서: 문법 기준
애니메이션 가능: 아니오

이 속성은 분할된 박스의 기하가 스트로크에 대해 어떻게 처리되는지를 지정한다.

값은 다음 의미를 가진다: FRAGMENTATION에서 복사

4.3. 스트로크 대시

4.3.1. 스트로크 대시 패턴: stroke-dasharray 속성

이름: stroke-dasharray
값: none | <length-percentage>+#
초기값: none
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 스케일된 뷰포트 크기 기준
미디어: 시각
계산값: 지정된 대로
정규 순서: 문법 기준
애니메이션 가능: 길이, 백분율 또는 calc의 반복 목록처럼

이 속성은 경로를 스트로크하는 데 사용되는 대시와 간격의 패턴을 제어한다.

none
대시 없음: 스트로크가 연속적으로 그려진다.
<length-percentage>+#
사용할 대시 패턴을 지정한다. 각 <length-percentage> 값은 스트로크의 다음 대시 또는 간격의 길이를 나타낸다 (첫 번째 대시부터 시작하여 이후 번갈아 적용됨). 패턴은 스트로크의 길이에 걸쳐 반복된다. (값의 개수가 홀수이면, 짝수 개의 값을 만들기 위해 중복된 것처럼 동작한다.) 대시 패턴은 각 하위 경로의 시작에서 재설정되어 새로 시작한다.

음수 값은 유효하지 않다. 모든 값이 0이면 none으로 처리된다.

SVG는 쉼표 구분을 허용한다. 하위 호환성을 위해 CSS에서도 이를 허용해야 하는가? (제발 아니라고 해 달라.)

대시 길이를 스트로크의 폭에 상대적으로 지정하는 방법이 필요하다. (예를 들어 정사각형 대시를 만들기 위해.)

대시 길이를 경로의 길이에 상대적으로 지정하는 방법이 필요하다. (예를 들어 스크립트 없이 "self-drawing SVG" 효과를 만들기 위해.)

대시 스트로크. 대시 패턴은 20 10이다. 빨간 선은 스트로크되는 실제 경로를 나타낸다.

4.3.2. 스트로크 대시 시작 위치: stroke-dashoffset 속성

이름: stroke-dashoffset
값: <length-percentage>
초기값: 0
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 스케일된 뷰포트 크기 기준
미디어: 시각
계산값: 지정된 대로
정규 순서: 문법 기준
애니메이션 가능: 정수의 반복 목록처럼

이 속성은 경로의 시작에서 대시를 시작할 반복 대시 패턴 안쪽의 거리를 지정한다. 값은 음수일 수 있다.

0이 아닌 대시 오프셋을 가진 대시 스트로크. 대시 패턴은 20 10이고 대시 오프셋은 15이다. 빨간 선은 스트로크되는 실제 경로를 나타낸다.

대시가 배치될 경로상의 위치에 대한 더 정확한 설명은 §4.6.3 대시 위치를 참고하라.

4.3.3. 모서리 제어: stroke-dash-cornerstroke-dash-justify 속성

이름: stroke-dash-corner
값: none | <length>
초기값: none
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 지정된 값, 길이는 절대값으로 변환
정규 순서: 문법 기준
애니메이션 가능: <length>이면 예

stroke-dash-corner 속성은 스트로크된 도형의 꼭짓점에 대시가 항상 칠해질지를 제어한다. 모서리 대시가 칠해지는 점에는 도형의 동등 경로 안의 모든 선분의 시작점과 끝점이 포함된다.

none

이 속성은 대시에 특별한 효과를 주지 않는다: 대시는 경로를 따라 연속적으로 위치 지정/크기 지정된다.

<length>

주어진 <length>의 대시가 도형의 각 꼭짓점에 칠해져야 한다. 열린 도형의 경우, 첫 번째 모서리 대시는 경로의 시작에서 시작하도록 배치되고, 마지막 모서리 대시는 경로의 끝에서 끝나도록 배치된다. 열린 도형의 다른 모서리 대시와, 닫힌 도형의 모든 모서리 대시는 해당 꼭짓점을 중심으로 배치된다.

열린 도형의 첫 번째와 마지막 꼭짓점의 모서리 대시는 다른 것들의 절반 길이여야 하는가? 작성자가 이를 제어할 수 있어야 하는가?

모서리 대시 사이의 어떤 대시 패턴도 그것들과 맞닿지 않도록 padding을 지정하는 방법이 있어야 하는가?

모서리는 대시 패턴에서 첫 번째 대시의 역할을 맡아야 하므로, 각 선분의 "내부"는 간격으로 시작하고 끝나야 한다. 각 선분에서 패턴의 첫 번째 대시를 자동으로 건너뛸 것인가?

첫 번째 대시의 길이를 모서리로 사용하는 키워드.

stroke-dash-cornernone이 아니면, 대시 패턴 (stroke-dasharray로 지정됨)은 각 경로 선분에서 선분의 모서리 대시 사이 공간에 별도로 반복된다.

모서리 대시가 겹치게 될 때 어떻게 되는지를 정의해야 한다.

이 속성이 활성화될 때 정렬을 자동으로 트리거해야 하는가? 그렇지 않으면 기본적으로 어리석어 보이는 결과가 생긴다.

각 모서리에 사각형이 있고 그 사이에 짧은 대시가 있는 이미지를 보여줌.
대시 스트로크와 모서리 대시가 칠해진 사각형으로, stroke-dasharray: 0 8px; stroke-dash-corner: 32px;로 설정된다.
이름: stroke-dash-justify
값: none | [ stretch | compress ] || [ dashes || gaps ]
초기값: none
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 지정된 값, 길이는 절대값으로 변환
정규 순서: 문법 기준
애니메이션 가능: 아니오

stroke-dash-justify 속성은 스트로크의 대시 패턴이 요소의 각 하위 경로를 따라 정수 횟수만큼 반복되도록 조정될지와 그 방법을 지정한다.

none

대시 패턴은 조정되지 않는다: 하위 경로 끝에서 그 지점까지 진행한 만큼으로 잘린다.

stretch

대시 패턴이 하위 경로에 정수 횟수로 맞지 않을 때, 맞도록 대시 또는 간격(또는 둘 다)이 길어진다는 것을 나타낸다.

compress

대시 패턴이 하위 경로에 정수 횟수로 맞지 않을 때, 맞도록 대시 또는 간격(또는 둘 다)이 짧아진다는 것을 나타낸다.

dashes

대시 패턴을 늘리거나 줄일 때, 대시의 길이가 조정된다는 것을 나타낸다.

gaps

대시 패턴을 늘리거나 줄일 때, 간격의 길이가 조정된다는 것을 나타낸다.

stretchcompress가 둘 다 지정되지 않으면, 조정량이 더 적은 쪽이 기본값이 된다.

dashesgaps가 둘 다 지정되지 않으면, 기본값은 ???이다.

기본값은 아마 간격만 조정하는 것이어야 한다.

대시 패턴이 조정될 목표 길이는 stroke-dash-corner 속성의 값에 따라 달라진다:

대시 패턴에서 대시와 간격 길이의 조정은 길이에 계수를 곱하여 수행되며, 이 계수는 대시 패턴이 목표 길이에 정수 횟수만큼 맞게 만드는 1에 가장 가까운 숫자이다. stretch가 사용되면, 계수는 1과 2 사이의 숫자이고, compress가 사용되면, 계수는 0과 1 사이의 숫자이다.

stretch가 지정되었지만 대시 패턴이 목표 길이보다 길면, 조정은 수행되지 않는다.

너무 길 때 선분을 가운데 정렬해야 하는가?

compress가 지정되었지만, 대시 패턴의 조정 가능한 부분을 목표 길이에 맞도록 충분히 줄일 수 없으면, 줄일 수 있는 부분은 0으로 설정해야 한다.

스트로크가 대시로 끝날지 간격으로 끝날지를 제어할 수 있게 하고 싶은가? 닫힌 경로의 경우 끝에 간격이 있는 것이 좋을 가능성이 높고, 열린 경로의 경우 끝에 대시가 있는 것이 더 나을 가능성이 높다. 이에 대한 제어를 생략하고, 경로가 닫혔는지에 따라 자동으로 처리할 수도 있을까?

세 개의 다른 경로에 사용된 동일한 대시 스트로크로, 각각에서 정수 횟수만큼 맞도록 조정된 것.

4.4. 스트로크 페인트

4.4.1. 스트로크 색: stroke-color 속성

이름: stroke-color
값: <color>#
초기값: transparent
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 계산된 색
정규 순서: 문법 기준
애니메이션 가능: 색처럼

이 속성은 요소의 스트로크 색들을 설정한다. stroke-image와 마찬가지로, 스트로크 색은 처음 지정한 것이 맨 위 (사용자에게 가장 가까운 쪽)에 그려지고 이후의 각 색은 앞 색 뒤에 그려진다.

스트로크 색은 해당 레이어의 stroke-imagenone이거나 유효하지 않은 이미지인 경우에만 그려진다. (다시 말해, 각 레이어는 이미지 또는 색 중 하나를 그리며, 둘 다 지정된 경우 이미지를 우선한다.)

참고: 이는 단일 레이어 이미지 구문에 "fallback color"를 내장한 SVG의 기존 stroke 속성 동작과 맞추기 위해 필요하다. CSS에서는 이를 image() 함수로 더 잘 달성할 수 있으며, 이 함수는 fallback을 명시적으로 만든다.

4.4.2. 스트로크 이미지 소스: stroke-image 속성

이름: stroke-image
값: <paint>#
초기값: none
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 지정된 대로, URL은 절대 URL로 변환
정규 순서: 문법 기준
애니메이션 가능: 이미지의 반복 가능한 목록처럼

이 속성은 요소의 스트로크 이미지를 설정한다. 이미지는 처음 지정한 것이 맨 위 (사용자에게 가장 가까운 쪽)에 그려지고 이후의 각 이미지는 앞 이미지 뒤에 그려진다. 값은 background-image와 동일하게, 필요한 변경을 거쳐 해석된다.

4.4.3. 스트로크 배치 영역: stroke-origin 속성

이름: stroke-origin
값: match-parent | fill-box | stroke-box | content-box | padding-box | border-box
초기값: match-parent
적용 대상: 모든 요소
상속: 아니오
백분율: 해당 없음
미디어: 시각
계산값: 지정된 대로
정규 순서: 문법 기준
애니메이션 가능: 아니오

이 속성은 스트로크의 좌표계를 지정하고, 스트로크 배치 영역을 설정한다. 값은 다음 의미를 가진다:

match-parent
부모와 동일한 스트로크 배치 영역을 사용한다. 부모가 없으면, 초기 컨테이닝 블록을 사용한다.
content-box
padding-box
border-box
박스 자신의 content-box/padding-box/border-box를 스트로크 배치 영역으로 사용한다. SVG 도형의 경우, content-boxpadding-boxfill-box로 취급되며, border-boxstroke-box로 취급된다.
fill-box
SVG 도형 또는 SVG 텍스트의 경우, 요소의 객체 바운딩 박스를 사용한다. CSS 박스의 경우, 요소와 모든 in-flow 또는 float된 자손의 텍스트 글리프 윤곽선의 바운딩 박스를 사용한다.
stroke-box
SVG 도형 또는 SVG 텍스트의 경우, 요소의 스트로크 바운딩 박스를 사용한다. CSS 박스의 경우, 요소와 모든 in-flow 또는 float된 자손의 텍스트 글리프 스트로크 윤곽선의 바운딩 박스를 사용한다.

SVG UA 스타일 시트는 다음 규칙을 포함하도록 수정된다:

svg:svg {
  stroke-origin: content-box;
}

스트로크 페인팅 영역은 크기가 무한하다. 페인팅할 때, 스트로크 색/이미지는 영향을 받는 텍스트의 글리프 스트로크 또는 영향을 받는 SVG 도형의 스트로크 기하와 교차된다.

SVG 페인트 서버는 *Units 속성 안에 자체 originator 정보를 가지고 다니지만, SVGWG가 CSS originator에 주의를 기울이게 하는 새 값을 추가할 수도 있다. 또는 여기에서 auto 초기값을 추가하여, 페인트 서버를 참조하는 경우에는 페인트 서버의 정보에 따르고, 그렇지 않으면 match-parent가 되게 할 수 있다.

4.4.4. 스트로크 이미지 배치: stroke-position 속성

이름: stroke-position
값: <position>#
초기값: 0% 0%
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 목록이며, 각 항목은 왼쪽 위 원점으로부터의 한 쌍의 오프셋(수평 및 수직)으로 구성되고 각각은 절대 길이와 백분율의 조합으로 주어진다
정규 순서: 문법 기준
애니메이션 가능: 길이, 백분율 또는 calc의 단순 목록으로 이루어진 반복 가능한 목록처럼

스트로크 이미지가 지정된 경우, 이 속성은 (크기 조정 후) 해당 스트로크 배치 영역 내에서 그 초기 위치를 지정한다. 값은 background-position과 동일하게, 필요한 변경을 거쳐 해석된다.

4.4.5. 스트로크 이미지 크기 지정: stroke-size 속성

이름: stroke-size
값: <bg-size>#
초기값: auto
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 지정된 대로, 단 길이는 절대값으로 변환되고 생략된 auto 키워드는 채워짐
정규 순서: 문법 기준
애니메이션 가능: 길이, 백분율 또는 calc의 단순 목록으로 이루어진 반복 가능한 목록처럼

스트로크 이미지의 크기를 지정한다. 값은 background-size와 동일하게, 필요한 변경을 거쳐 해석된다.

4.4.6. 스트로크 이미지 타일링: stroke-repeat 속성

이름: stroke-repeat
값: <repeat-style>#
초기값: repeat
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 목록이며, 각 항목은 차원마다 하나씩 두 개의 키워드로 구성됨
정규 순서: 문법 기준
애니메이션 가능: 아니오

스트로크 채우기 이미지의 크기를 지정하고 위치를 정한 뒤 어떻게 타일링할지를 지정한다. 값은 background-repeat와 동일하게, 필요한 변경을 거쳐 해석된다.

4.4.7. 스트로크 단축 표기: stroke 속성

이름: stroke
값: 수정이 적용된 <background>
초기값: 개별 속성 참고
적용 대상: 개별 속성 참고
상속: 개별 속성 참고
백분율: 해당 없음
미디어: 시각
계산값: 개별 속성 참고
정규 순서: 문법 기준
애니메이션 가능: 개별 속성 참고

이 속성은 모든 스트로크 페인팅 속성—stroke-color, stroke-image, stroke-origin, stroke-position, stroke-size, 그리고 stroke-repeat을 하나의 선언에서 설정하는 단축 속성이다. 생략된 값은 초기값으로 설정된다. 다만 생략된 stroke-colortransparent로 설정되고, 생략된 stroke-originstroke-box로 설정된다.

4.5. 스트로크 투명도

4.5.1. 스트로크 불투명도: stroke-opacity 속성

이름: stroke-opacity
값: <‘opacity’>
초기값: 1
적용 대상: 인라인 박스 및 SVG 도형
상속:
백분율: 해당 없음
미디어: 시각
계산값: 지정된 값을 <number>로 변환하고, 범위 [0,1]로 제한한 값
정규 순서: 문법 기준
애니메이션 가능: 숫자처럼

stroke-opacity 속성은 현재 객체를 스트로크하는 데 사용되는 페인팅 작업의 불투명도를 지정한다. opacity와 마찬가지로, 0 또는 0% 값은 완전히 투명함을 의미하고, 1 또는 100% 값은 완전히 불투명함을 의미한다.

4.6. 스트로크 모양 계산

4.6.1. 스트로크 경로

모든 경우에, 대시 패턴과 관련된 것처럼 방향성의 영향을 받는 모든 스트로크 속성은 그래픽 요소가 시작하는 지점과 동일한 지점에서 스트로크 작업이 시작되도록 렌더링되어야 한다. 특히 path 요소의 경우, 경로의 시작은 최초 “moveto” 명령의 첫 번째 점이다.

그래픽 요소의 윤곽선을 따라 진행되는 정도에 의존하여 계산되는 대시 패턴과 같은 스트로크 속성의 경우, 거리 계산은 SVG 사용자 에이전트의 표준 경로를 따른 거리 알고리즘을 사용해야 한다.

그라디언트나 pattern과 같은 복잡한 페인트 서버를 사용하여 스트로크가 수행되는 경우, 스트로크 작업은 현재 그래픽 요소의 기하와 그에 연관된 스트로크 속성으로 정의되는 기하 도형이 동등한 path 요소로 변환된 다음 주어진 페인트 서버를 사용하여 채워졌을 때 발생했을 결과와 동일해야 한다.

단일 “moveto”로 구성된 하위 경로는 스트로크되지 않아야 한다. 길이가 0인 하위 경로는 stroke-linecap 속성 값이 butt이면 스트로크되지 않아야 하지만, stroke-linecap 속성 값이 round 또는 square이면 스트로크되어야 하며, 각각 주어진 점을 중심으로 한 원 또는 정사각형을 생성한다. 길이가 0인 하위 경로의 예로는 'M 10,10 L 10,10', 'M 20,20 h 0', 'M 30,30 z', 그리고 'M 40,40 c 0,0 0,0 0,0'이 있다.

이는 아래의 스트로크 모양 계산 요구사항과 중복되어야 한다. 이 절에서는 요구사항을 규범적으로가 아니라 설명적으로 표현해야 한다.

4.6.2. 스트로크 모양

요소의 스트로크 모양stroke 속성에 의해 채워지는 모양이다. 다음 알고리즘은 위의 스트로크 속성을 고려하여 텍스트, path, 또는 기본 도형의 스트로크 모양이 무엇인지를 설명한다:
  1. shape를 빈 모양으로 둔다.

  2. path를 요소의 동등 경로로 둔다.

  3. path의 각 subpath에 대해:

    1. positionssubpath대시 위치로 둔다.

    2. positions 안의 각 쌍 (start, end)에 대해:

      1. dash를 다음을 포함하는 모양으로 둔다. subpath를 따라 startend 사이의 모든 거리에 대해, 그 거리에서 subpath에 수직인 선 위에 있으며 해당 위치에서 subpath 위의 점으로부터 stroke-width 거리 이내에 있는 모든 점.

      2. dashdash와 위치 start에서의 하위 경로의 시작 캡 모양의 합집합으로 설정한다.

      3. dashdash와 위치 end에서의 하위 경로의 끝 캡 모양의 합집합으로 설정한다.

      4. indexlast를 하위 경로를 따라 거리 start 및 end에 있는 하위 경로의 경로 선분 인덱스로 둔다.

        참고: index와 last를 선택할 때 길이가 0인 선분이 포함되는지는 중요하지 않다.

      5. index < last인 동안:

        1. dashdash와 선분 인덱스 index에서의 하위 경로의 line join 모양의 합집합으로 설정한다.

        2. index를 index + 1로 설정한다.

      6. shapeshapedash의 합집합으로 설정한다.

  4. shape를 반환한다.

4.6.3. 대시 위치

이 절은 아직 stroke-dash-cornerstroke-dash-justify를 처리하지 않는다.

path 또는 기본 도형의 동등 경로에서 주어진 하위 경로에 대한 대시 위치는 값 쌍의 시퀀스이며, 각 쌍은 하위 경로의 스트로크를 형성하는 각 대시에 대해 하위 경로를 따른 시작 거리와 끝 거리를 나타낸다. 이는 다음과 같이 결정된다:
  1. pathlength를 하위 경로의 길이로 둔다.

  2. dashes를 요소의 stroke-dasharray 값의 목록으로 두되, 필요한 경우 요소 수가 짝수가 되도록 반복한다. 속성 값이 none이면 목록은 단일 값 0을 가진다.

  3. countdashes 안의 값 개수로 둔다.

  4. sumdashes 안의 값들의 합으로 둔다.

  5. sum = 0이면, 단일 쌍 (0, pathlength)을 가진 시퀀스를 반환한다.

  6. positions를 빈 시퀀스로 둔다.

  7. offset을 요소의 stroke-dashoffset 속성 값으로 둔다.

  8. offset이 음수이면, offsetsum − abs(offset)로 설정한다.

  9. offsetoffset mod sum으로 설정한다.

  10. indexsum(dashesi, 0 ≤ i ≤ index) ≥ offset를 만족하는 가장 작은 정수로 둔다.

  11. dashlengthmin(sum(dashesi, 0 ≤ i ≤ index) − offset, pathlength)로 둔다.

  12. index mod 2 = 0이면, positions에 쌍 (0, dashlength)을 추가한다.

  13. positiondashlength로 둔다.

  14. position < pathlength인 동안:

    1. index(index + 1) mod count로 설정한다.

    2. dashlengthmin(dashesindex, pathlengthposition)로 둔다.

    3. index mod 2 = 0이면, positions에 쌍 (position, position + dashlength)을 추가한다.

    4. positionposition + dashlength로 설정한다.

  15. positions를 반환한다.

4.6.4. 캡 모양

하위 경로를 따라 주어진 position에서의 시작 및 끝 캡 모양은 다음과 같이 결정된다:
  1. stroke-linecapbutt이면, 빈 모양을 반환한다.

  2. 그렇지 않고, stroke-linecapround이면:

    1. 이것이 시작 캡이면, 반지름이 stroke-width인 반원을 다음 조건을 만족하도록 배치하여 반환한다:

      • 직선 가장자리는 그 위의 거리 position에서 하위 경로에 수직인 선과 평행하다.

      • 직선 가장자리의 중점은 하위 경로를 따라 거리 position에 있는 점에 있다.

      • 호의 중점에서 직선 가장자리의 중점으로 향하는 방향은 그 위의 거리 position에서의 하위 경로 방향과 같다.

    2. 그렇지 않으면, 이것은 끝 캡이다. 반지름이 stroke-width인 반원을 다음 조건을 만족하도록 배치하여 반환한다:

      • 직선 가장자리는 그 위의 거리 position에서 하위 경로에 수직인 선과 평행하다.

      • 직선 가장자리의 중점은 하위 경로를 따라 거리 position에 있는 점에 있다.

      • 직선 가장자리의 중점에서 호의 중점으로 향하는 방향은 그 위의 거리 position에서의 하위 경로 방향과 같다.

  3. 그렇지 않으면, stroke-linecapsquare이다:

    1. 이것이 시작 캡이면, 변의 길이가 stroke-widthstroke-width / 2인 직사각형을 다음 조건을 만족하도록 배치하여 반환한다:

      • 더 긴 가장자리 A와 B는 그 위의 거리 position에서 하위 경로에 수직인 선과 평행하다.

      • A의 중점은 start에 있다.

      • B의 중점에서 A의 중점으로 향하는 방향은 그 위의 거리 position에서의 하위 경로 방향과 같다.

    2. 그렇지 않으면, 이것은 끝 캡이다. 변의 길이가 stroke-widthstroke-width / 2인 직사각형을 다음 조건을 만족하도록 배치하여 반환한다:

      • 더 긴 가장자리 A와 B는 그 위의 거리 position에서 하위 경로에 수직인 선과 평행하다.

      • A의 중점은 end에 있다.

      • A의 중점에서 B의 중점으로 향하는 방향은 그 위의 거리 position에서의 하위 경로 방향과 같다.

길이가 0이 아닌 단일 하위 경로가 있는 경로에 사용된 세 가지 서로 다른 stroke-linecap 값. 흰색 선은 경로 자체이고 두꺼운 회색 영역은 스트로크이다.

위쪽 행에서 초록색 선은 경로 끝점에서의 접선에 대한 수직선을 나타내며 분홍색 영역은 캡이다. 아래쪽 행은 수직선과 캡 강조 표시가 없는 스트로크를 보여준다.

4.6.5. Line Join 모양

하위 경로의 주어진 선분에 대한 line join 모양은 다음과 같이 결정된다:
  1. P를 선분의 끝에 있는 점으로 둔다.

  2. A를 선분 끝의 접선과 평행한 선으로 둔다.

  3. B를 다음 선분 시작의 접선과 평행한 선으로 둔다.

  4. AB가 같은 선이면, 빈 모양을 반환한다.

  5. |Aleft|와 |Aright|를 하위 경로 방향을 기준으로 A의 왼쪽과 오른쪽에 각각 stroke-width / 2 거리만큼 떨어진 A와 평행한 선으로 둔다.

  6. |Bleft|와 |Bright|를 하위 경로 방향을 기준으로 B의 왼쪽과 오른쪽에 각각 stroke-width / 2 거리만큼 떨어진 B와 평행한 선으로 둔다.

  7. |P1|, |P2| 및 |P3|를 다음과 같이 결정되는 점으로 둔다:

    1. 하위 경로의 방향을 고려할 때 AB 사이의 더 작은 각도가 이 선들의 오른쪽에 있으면, |P1|와 |P2|는 |Aleft|와 |Bleft| 위에서 P에 가장 가까운 점이고, |P3|는 |Aleft|와 |Bleft|의 교점이다.

    2. 그렇지 않으면, |P1|와 |P2|는 |Aright|와 |Bright| 위에서 P에 가장 가까운 점이고, |P3|는 |Aright|와 |Bright|의 교점이다.

  8. bevel을 세 점 P, |P1| 및 |P2|로 형성되는 삼각형으로 둔다.

  9. stroke-linejoinround이면, bevel과, P를 중심으로 하고 |P1|와 |P2|를 호의 두 끝점으로 가지는 반지름 stroke-width의 원 부채꼴의 합집합을 반환한다.

  10. stroke-linejoinarcs이면, |P1|와 |P2|에서 스트로크 가장자리에 접하고 그 점들에서의 가장자리와 같은 곡률을 가지는 원을 찾는다(아래 참고). 두 곡률이 모두 0이면, miter-clip으로 넘어간다.

    이 원들 (또는 곡률이 0인 경우에는 선)을 사용하여 스트로크 가장자리를 확장한다:

    • 두 원(또는 원과 선)이 교차하지 않으면, miter-clip으로 넘어간다.

    • 두 원(또는 원과 선)이 교차하면, line join 영역은 P를 |P1| 및 |P2|와 연결하는 선들과, P에 가장 가까운 교점과 |P1| 및 |P2| 사이의 원(또는 호와 선)에 의해 정의되는 호로 정의된다.

      다음으로, §4.2.5 스트로크 모서리 한계: stroke-miterlimit 속성에서 정의한 대로 miter limit를 계산한다. line join 영역 중 miter limit를 넘어 확장되는 부분을 잘라낸다. 결과 영역을 반환한다.

      참고: 곡률은 어떤 변환도 적용되기 전에 사용자 공간에서 계산된다는 점에 유의하라.

  11. stroke-linejoinmiter 또는 miter-clip이면, line join 영역은 bevel과 세 점 |P1|, |P2| 및 |P3|로 형성되는 삼각형의 합집합이다.

  12. θ를 A와 B 사이의 각도로 둔다. 1 / sin(θ / 2) ≤ stroke-miterlimit이면, line join 영역을 반환한다.

  13. stroke-linejoinmiter-clip이면, line join 영역 중 miter limit를 넘어 확장되는 부분을 잘라내고 이 영역을 반환한다.

  14. bevel을 반환한다.

분홍색으로 표시된 round line join 모양의 구성. 흰색 선은 원래 경로이며, 한 점으로 모이는 두 선분을 가지고 있고, 회색 영역은 스트로크이다.
분홍색으로 표시된 arcs line join 모양의 구성. 흰색 선은 원래 경로이며, 한 점으로 모이는 두 선분을 가지고 있고, 회색 영역은 스트로크이다. 점선은 결합점에서 선분에 접하고 선분의 곡률을 가지는 원을 보여준다. 올리브색 원 (점선 원과 동심인 원)은 join 모양을 정의한다.

4.6.6. Arcs Linejoin

arcs linejoin은 경로 선분 끝에서 바깥쪽 스트로크 가장자리에 접하고 같은 곡률을 가지는 원을 찾아야 한다. 이러한 원 중 하나를 찾으려면, 먼저 경로 선분 끝에서의 곡률 κ를 계산한다(아래 참고). 다음으로, 이 곡률에 대응하는 원의 반지름을 찾는다: r = 1/κ. 스트로크를 고려하기 위해 stroke-width / 2만큼 반지름을 늘리거나 줄인다: rc = r ± stroke-width/2. 원의 중심은 경로 끝의 법선 위에 있으며, 끝에서의 바깥쪽 스트로크 가장자리로부터 rc만큼 떨어져 있다.
선의 경우:
곡률은 무한대이다. 바깥쪽 스트로크 가장자리를 선으로 확장한다.
타원 호의 경우:

여기서:

호 선분의 시작 또는 끝에서의 매개변수 θ는 타원 호 구현 참고의 공식을 사용하여 찾을 수 있다. (참고로, 일부 렌더러는 렌더링 전에 타원 호를 cubic Bézier로 변환하므로 여기의 방정식이 필요하지 않을 수도 있다.)

quadratic Bézier의 경우:

여기서 κ(0)과 κ(1)은 각각 경로 선분의 시작과 끝에서의 부호 있는 곡률이고, P들은 quadratic Bézier를 정의하는 세 점이다.

cubic Bézier의 경우:

여기서 κ(0)과 κ(1)은 각각 경로 선분의 시작과 끝에서의 부호 있는 곡률이고, P들은 cubic Bézier를 정의하는 네 점이다. 참고로, P0와 P1 또는 P2와 P3이 퇴화된 경우, 곡률은 무한대가 되며 join을 구성할 때 선을 사용해야 한다.

4.7. 완전한 세계 구문

SVG에서 온 stroke-* 속성과 값은 SVG의 다소 일관성 없는 명명 체계를 상속한다. 오늘 설계했다면 우리는 이를 다르게 이름 붙였을 것이다. 아마 alias/shorthand를 통해 이 방향으로 얼마나 이동할 수 있는지 살펴봐야 한다.

기존 구문 새 구문
stroke stroke-paint
stroke 단축 표기
stroke-alignment stroke-align: inset | outset | center
stroke-opacity 변경 없음
stroke-width 변경 없음
stroke-linecap stroke-cap: none | round | square
stroke-linejoin stroke-corner-shape: bevel | round | [ arc | miter ] [ bevel | round ]?
stroke-miterlimit stroke-corner-limit
stroke-dasharray stroke-dash-array
stroke-dashoffset stroke-dash-offset
stroke-dashcorner stroke-dash-corner
stroke-dashadjust stroke-dash-justify: none | [ stretch | compress ] || [ dashes | gaps ]
stroke-dash 단축 표기

5. 텍스트 장식의 채우기 및 스트로크

텍스트 장식에 대한 채우기와 스트로크를 처리하기 위해, fillstroke 속성의 두 집합이 정의된다: 하나는 선 장식을 위한 text-decoration-* 접두사이고, 하나는 text-emphasis-* 접두사로 된 강조 표시를 위한 것이다. 이 속성들은 위의 fillstroke 속성과 정확히 유사하지만, 다음을 제외한다:

이들은 반드시 at-risk가 되어야 하며, 다음 레벨로 미뤄질 가능성도 있다.

6. 개인정보 보호 및 보안 고려사항

이 명세는 새로운 개인정보 보호 또는 보안 고려사항을 도입하지 않는다.

적합성

문서 규약

적합성 요구사항은 설명적 주장과 RFC 2119 용어의 조합으로 표현된다. 이 문서의 규범적 부분에서 핵심어 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL”은 RFC 2119에서 설명한 대로 해석해야 한다. 그러나 가독성을 위해, 이 명세에서는 이러한 단어들이 모두 대문자로 나타나지는 않는다.

이 명세의 모든 텍스트는 명시적으로 비규범적이라고 표시된 절, 예제 및 참고를 제외하고 규범적이다. [RFC2119]

이 명세의 예제는 “예를 들어”라는 말로 도입되거나, 다음과 같이 class="example"을 사용하여 규범적 텍스트와 분리된다:

이것은 정보성 예제의 예이다.

정보성 참고는 “참고”라는 단어로 시작하며, 다음과 같이 class="note"를 사용하여 규범적 텍스트와 분리된다:

참고, 이것은 정보성 참고이다.

권고문은 특별한 주의를 환기하도록 스타일이 적용된 규범적 절이며, 다음과 같이 <strong class="advisement">를 사용하여 다른 규범적 텍스트와 분리된다: UA는 접근 가능한 대체 수단을 제공해야 한다.

적합성 클래스

이 명세에 대한 적합성은 세 가지 적합성 클래스에 대해 정의된다:

스타일 시트
CSS 스타일 시트.
렌더러
스타일 시트의 의미를 해석하고 그것을 사용하는 문서를 렌더링하는 UA.
저작 도구
스타일 시트를 작성하는 UA.

스타일 시트가 이 명세에 적합하려면, 이 모듈에서 정의한 구문을 사용하는 모든 문장이 일반 CSS 문법과 이 모듈에서 정의한 각 기능의 개별 문법에 따라 유효해야 한다.

렌더러가 이 명세에 적합하려면, 적절한 명세에서 정의한 대로 스타일 시트를 해석하는 것에 더하여, 이 명세에서 정의한 모든 기능을 올바르게 파싱하고 그에 따라 문서를 렌더링함으로써 지원해야 한다. 그러나 장치의 제한으로 인해 UA가 문서를 올바르게 렌더링하지 못하는 것은 UA를 부적합하게 만들지 않는다. (예를 들어, UA는 흑백 모니터에서 색상을 렌더링할 필요가 없다.)

저작 도구가 이 명세에 적합하려면, 일반 CSS 문법과 이 모듈의 각 기능의 개별 문법에 따라 구문적으로 올바른 스타일 시트를 작성하고, 이 모듈에서 설명한 스타일 시트의 다른 모든 적합성 요구사항을 충족해야 한다.

부분 구현

작성자가 fallback 값을 할당하기 위해 순방향 호환 파싱 규칙을 활용할 수 있도록, CSS 렌더러는 사용할 수 있는 수준의 지원이 없는 at-rule, 속성, 속성 값, 키워드 및 기타 구문 구조를 무효로 처리하고(그리고 적절하게 무시) 해야 한다. 특히, 사용자 에이전트는 하나의 다중 값 속성 선언 안에서 지원되지 않는 구성 값을 선택적으로 무시하고 지원되는 값을 존중해서는 안 된다: 어떤 값이든 무효로 간주되면(지원되지 않는 값은 그렇게 되어야 하므로), CSS는 전체 선언을 무시할 것을 요구한다.

불안정한 기능 및 독점 기능의 구현

미래의 안정적인 CSS 기능과 충돌하지 않도록, CSSWG는 CSS의 불안정한 기능 및 독점 확장 구현에 대해 모범 사례를 따를 것을 권장한다.

비실험적 구현

명세가 Candidate Recommendation 단계에 도달하면, 비실험적 구현이 가능하며, 구현자는 명세에 따라 올바르게 구현되었음을 입증할 수 있는 모든 CR 수준 기능의 접두사 없는 구현을 배포해야 한다.

CSS의 구현 간 상호운용성을 확립하고 유지하기 위해, CSS 작업 그룹은 비실험적 CSS 렌더러가 CSS 기능의 접두사 없는 구현을 배포하기 전에 W3C에 구현 보고서(필요한 경우, 해당 구현 보고서에 사용된 테스트케이스)를 제출할 것을 요청한다. W3C에 제출된 테스트케이스는 CSS 작업 그룹의 검토와 수정을 받는다.

테스트케이스와 구현 보고서 제출에 대한 추가 정보는 CSS 작업 그룹 웹사이트 https://www.w3.org/Style/CSS/Test/에서 확인할 수 있다. 질문은 public-css-testsuite@w3.org 메일링 리스트로 보내야 한다.

색인

이 명세에서 정의하는 용어

참조에 의해 정의되는 용어

참고문헌

규범적 참고문헌

[CSS-BACKGROUNDS-3]
CSS Backgrounds and Borders Module Level 3 URL: https://www.w3.org/TR/css3-background/
[CSS-BREAK-3]
Rossen Atanassov; Elika Etemad. CSS 단편화 모듈 레벨 3. URL: https://www.w3.org/TR/css-break-3/
[CSS-CASCADE-4]
Elika Etemad; Tab Atkins Jr.. CSS 종속 및 상속 레벨 4. URL: https://www.w3.org/TR/css-cascade-4/
[CSS-COLOR-3]
CSS Color Module Level 3 URL: https://www.w3.org/TR/css3-color/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley. CSS 색상 모듈 레벨 4. URL: https://www.w3.org/TR/css-color-4/
[CSS-DISPLAY-3]
Elika Etemad. CSS Display Module Level 3. URL: https://www.w3.org/TR/css-display-3/
[CSS-IMAGES-3]
CSS Image Values and Replaced Content Module Level 3 URL: https://www.w3.org/TR/css3-images/
[CSS-IMAGES-4]
CSS Image Values and Replaced Content Module Level 4 URL: https://www.w3.org/TR/css4-images/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS 구문 모듈 레벨 3. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TEXT-DECOR-3]
Elika Etemad; Koji Ishii. CSS 텍스트 장식 모듈 레벨 3. URL: https://www.w3.org/TR/css-text-decor-3/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 값 및 단위 모듈 레벨 3. URL: https://www.w3.org/TR/css-values-3/
[CSS3-COLOR]
Tantek Çelik; Chris Lilley; David Baron. CSS 색상 모듈 레벨 3. 2011년 6월 7일. REC. URL: https://www.w3.org/TR/css3-color
[CSS3-IMAGES]
Elika Etemad; Tab Atkins Jr.. CSS 이미지 값 및 대체 콘텐츠 모듈 레벨 3. 2012년 4월 17일. CR. URL: https://www.w3.org/TR/css3-images/
[RFC2119]
S. Bradner. RFC에서 요구사항 수준을 나타내기 위해 사용하는 핵심어. 1997년 3월. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
[SVG2]
Nikos Andronikos; et al. Scalable Vector Graphics (SVG) 2. URL: https://www.w3.org/TR/SVG2/

정보성 참고문헌

[CSS3BG]
Bert Bos; Elika Etemad; Brad Kemper. CSS 배경 및 테두리 모듈 레벨 3. URL: https://www.w3.org/TR/css3-background/

속성 색인

이름 초기값 적용 대상 상속 백분율 미디어 애니메이션 가능 정규 순서 계산값
fill-rule nonzero | evenodd nonzero SVG 도형 해당 없음 시각 아니오 문법 기준 지정된 대로
fill-break bounding-box | slice | clone bounding-box 모든 요소 예? 해당 없음 시각 아니오 문법 기준 지정된 대로
fill-color <color> currentcolor 인라인 박스 및 SVG 도형 해당 없음 시각 색처럼 문법 기준 계산된 색
fill-image <paint># none 인라인 박스 및 SVG 도형 해당 없음 시각 이미지의 반복 가능한 목록처럼 문법 기준 지정된 대로, URL은 절대 URL로 변환
fill-origin match-parent | fill-box | stroke-box | content-box | padding-box | border-box match-parent 모든 요소 아니오 해당 없음 시각 아니오 문법 기준 지정된 대로
fill-position <position># 0% 0% 인라인 박스 및 SVG 도형 해당 없음 시각 길이, 백분율 또는 calc의 단순 목록으로 이루어진 반복 가능한 목록처럼 문법 기준 목록이며, 각 항목은 왼쪽 위 원점으로부터의 오프셋 쌍(수평 및 수직)으로 구성되고 각각은 절대 길이와 백분율의 조합으로 주어진다
fill-size <bg-size># auto 인라인 박스 및 SVG 도형 해당 없음 시각 길이, 백분율 또는 calc의 단순 목록으로 이루어진 반복 가능한 목록처럼 문법 기준 지정된 대로, 단 길이는 절대값으로 변환되고 생략된 auto 키워드는 채워짐
fill-repeat <repeat-style># repeat 인라인 박스 및 SVG 도형 해당 없음 시각 아니오 문법 기준 목록이며, 각 항목은 차원마다 하나씩 두 개의 키워드로 구성됨
fill 수정이 적용된 <background> 개별 속성 참고 개별 속성 참고 개별 속성 참고 해당 없음 시각 개별 속성 참고 문법 기준 개별 속성 참고
fill-opacity <‘opacity’> 1 인라인 박스 및 SVG 도형 해당 없음 시각 숫자처럼 문법 기준 지정된 값을 <number>로 변환하고, 범위 [0,1]로 제한한 값
stroke-width <length-percentage># 1px 인라인 박스 및 SVG 도형 스케일된 뷰포트 크기 기준 시각 <length-percentage>처럼 문법 기준 절대 길이 또는 백분율
stroke-align center | inset | outset center 인라인 박스 및 SVG 도형 해당 없음 시각 아니오 문법 기준 지정된 대로
stroke-linecap butt | round | square butt 인라인 박스 및 SVG 도형 해당 없음 시각 아니오 문법 기준 지정된 대로
stroke-linejoin [ crop | arcs | miter ] || [ bevel | round | stupid ] miter 인라인 박스 및 SVG 도형 해당 없음 시각 아니오 문법 기준 지정된 대로
stroke-miterlimit <number> 4 인라인 박스 및 SVG 도형 해당 없음 시각 아니오 문법 기준 숫자
stroke-break bounding-box | slice | clone bounding-box 모든 요소 ? 해당 없음 시각 아니오 문법 기준 지정된 대로
stroke-dasharray none | <length-percentage>+# none 인라인 박스 및 SVG 도형 스케일된 뷰포트 크기 기준 시각 길이, 백분율 또는 calc의 반복 목록처럼 문법 기준 지정된 대로
stroke-dashoffset <length-percentage> 0 인라인 박스 및 SVG 도형 스케일된 뷰포트 크기 기준 시각 정수의 반복 목록처럼 문법 기준 지정된 대로
stroke-dash-corner none | <length> none 인라인 박스 및 SVG 도형 해당 없음 시각 <length>이면 예 문법 기준 지정된 값, 길이는 절대값으로 변환
stroke-dash-justify none | [ stretch | compress ] || [ dashes || gaps ] none 인라인 박스 및 SVG 도형 해당 없음 시각 아니오 문법 기준 지정된 값, 길이는 절대값으로 변환
stroke-color <color># transparent 인라인 박스 및 SVG 도형 해당 없음 시각 색처럼 문법 기준 계산된 색
stroke-image <paint># none 인라인 박스 및 SVG 도형 해당 없음 시각 이미지의 반복 가능한 목록처럼 문법 기준 지정된 대로, URL은 절대 URL로 변환
stroke-origin match-parent | fill-box | stroke-box | content-box | padding-box | border-box match-parent 모든 요소 아니오 해당 없음 시각 아니오 문법 기준 지정된 대로
stroke-position <position># 0% 0% 인라인 박스 및 SVG 도형 해당 없음 시각 길이, 백분율 또는 calc의 단순 목록으로 이루어진 반복 가능한 목록처럼 문법 기준 목록이며, 각 항목은 왼쪽 위 원점으로부터의 오프셋 쌍(수평 및 수직)으로 구성되고 각각은 절대 길이와 백분율의 조합으로 주어진다
stroke-size <bg-size># auto 인라인 박스 및 SVG 도형 해당 없음 시각 길이, 백분율 또는 calc의 단순 목록으로 이루어진 반복 가능한 목록처럼 문법 기준 지정된 대로, 단 길이는 절대값으로 변환되고 생략된 auto 키워드는 채워짐
stroke-repeat <repeat-style># repeat 인라인 박스 및 SVG 도형 해당 없음 시각 아니오 문법 기준 목록이며, 각 항목은 차원마다 하나씩 두 개의 키워드로 구성됨
stroke 수정이 적용된 <background> 개별 속성 참고 개별 속성 참고 개별 속성 참고 해당 없음 시각 개별 속성 참고 문법 기준 개별 속성 참고
stroke-opacity <‘opacity’> 1 인라인 박스 및 SVG 도형 해당 없음 시각 숫자처럼 문법 기준 지정된 값을 <number>로 변환하고, 범위 [0,1]로 제한한 값

이슈 색인

SVG2의 페인트 지정을 삽입할 것.
텍스트 장식을 처리할 것. 이슈다른 이슈를 참고.
w3c/csswg-drafts/383[css-images][css-masking][paint] url() 처리의 모호함
context-fillcontext-stroke는 명세에 통합될 필요가 있지만, <paint> 값이 아니라, 각각의 개별 strokefill 하위 속성의 키워드로 속해야 한다. 더 많은 WG 논의와, 이를 위해 비교적 상당한 편집을 하기 전에 이것이 유지될 SVG2 기능이라는 확인이 필요하다.
CSS Images 4 §3.4.1 Paint Sources는 SVG 페인트 서버 좌표 공간을 처리하는 방법을 정의한다. 여기서 복사할 것인가, 참조할 것인가, 아니면 다른 방식인가?
box-decoration-break, fill-break, 그리고 stroke-break의 단축 속성인 box-break 속성을 추가할 것인가?
이것도 레이어화해야 하는가?
fill-colorstroke-color처럼 레이어화되어야 하며, 그래야 두 속성 집합의 일관성이 최대가 된다.
SVG 페인트 서버는 *Units 속성 안에 자체 originator 정보를 가지고 다니지만, SVGWG가 CSS originator에 주의를 기울이게 하는 새 값을 추가할 수도 있다. 또는 여기에서 auto 초기값을 추가하여, 페인트 서버를 참조하는 경우에는 페인트 서버의 정보에 따르고, 그렇지 않으면 match-parent가 되게 할 수 있다.
이 단축 속성을 통해 설정할 때 fill-origin의 기본값은 무엇이어야 하는가? content-box인가 fill-box인가? fill-box는 Zapfino처럼 화려하거나 넘치는 글꼴에 더 잘 작동하지만, content-box보다 계산 비용이 훨씬 크다.
SVG에는 특수한 색 fallback 구문이 있다—이미지 뒤에 오는 색은 이미지가 실패한 경우에만 그려진다. 이는 background와 맞추려는 우리의 의도와 충돌한다. 왜냐하면 fill: url(#foo) red;는 red로 채운 다음 #foo를 그리는 것이 *아니기* 때문이다. 절충안: fill-color는 fallback 색이지만, none유효하지 않은 이미지 모두 fallback을 트리거한다. 따라서 fill: url(#foo) red;는 #foo가 없을 때만 red를 그리며(SVG처럼), 하지만 fill: url(#foo), red (마지막 레이어의 none red와 동등함)는 red와 #foo를 둘 다 그린다(background처럼).
paint-order가 SVG가 아닌 텍스트에도 적용되어야 하는가?
stroke-color는 반드시 transparent로 앞쪽을 채워야 한다. 그렇지 않으면 이미지 로드에 실패했을 때 여러 이미지 레이어가 무작위로 단색으로 fallback될 것이다. 일반적으로 스트로크와 채우기의 앞쪽을 초기값으로 채우게 할 것인가, 아니면 나머지 속성들이 배경처럼 목록을 반복해야 하는가?
현재 우리는 SVGWG 결의에 따라 스트로크 페인트 속성과 stroke-width를 레이어화하고 있다. 다른 기하 속성도 레이어화해야 하는가? 그것들은 비슷한 사용 사례를 가지지만, 다소 더 틈새적이다. API의 일관성은 중요하다. 구현/테스트 노력을 들일 가치가 있는가? 어려운 사례: stroke-dasharray, 왜냐하면 "commas anywhere lol" 구문을 가지기 때문이다.
stroke-linejoin이 무시되는가? 내부 모서리에는 여전히 필요하다.
텍스트는 쉽고, 단순한 닫힌 비자기교차 경로도 쉽지만, 다른 범주도 존재하며 좋은 정의가 필요하다.

이것은 열린 경로 선분에 어떻게 적용되는가? 한 제안은 열린 경로에서 outsetleft의 별칭으로, insetright의 별칭으로 삼는 것이다. 끝 캡은 어떻게 처리되는가?

  1. stroke-align center 값을 가진 스트로크.

  2. 채우기 영역.

  3. 명세에 따른(?) stroke-align inset 값의 스트로크(스트로크는 채우기 영역 안쪽에만 그려짐).

  4. stroke-align outset 값의 스트로크(채우기 영역을 차단하여 구현됨).

  5. stroke-align inset 값의 스트로크, 대안 해석.

  6. 명세에 따른(?) stroke-align outset 값의 스트로크.

  7. 대안 left 값을 가진 stroke-align 스트로크; 분홍색은 둥근 line-cap을 표시한다.

이것은 루프가 있는 경로에 어떻게 적용되는가? 아래 그림에서 빨간 원 안의 영역은 (그림처럼) 스트로크된 부분인가? 채우기 규칙이 nonzero라면 내부 모서리가 스트로크되는가? 그렇다면 어떻게 되는가? (아래에는 스트로크 없이 표시됨.)

  • 위쪽 행: 일반 스트로크. 왼쪽 스트로크. 오른쪽 스트로크.

  • 가운데 행: 채우기 규칙 nonzero, 스트로크 없음. 바깥쪽 스트로크. 안쪽 스트로크.

  • 아래쪽 행: 채우기 규칙 evenodd, 스트로크 없음. 바깥쪽 스트로크. 안쪽 스트로크.

대시는 어떻게 처리되는가? 원래 경로를 기준으로 하는가?

  1. 일반 대시 패턴.

  2. 대시 패턴 또는 원래 경로를 기준으로 한 대시 패턴. 대시 부분 안쪽에서 온 밝은 회색 영역에 유의하라 (단순히 클리핑 경로를 사용하는 것만으로는 올바른 결과가 나오지 않는다).

  3. 오프셋 경로의 중심을 기준으로 한 대시 패턴. 밝은 회색은 inset 경로의 중심을 기준으로 한 대시 패턴을 나타낸다.

곡선 윤곽선의 대시 끝에 직사각형을 추가하면 보기 좋지 않다. 윤곽선을 따라 stroke-width/2만큼 대시를 확장하기만 해야 한다.
fallback을 그냥 제거할 수 있는가? 이것은 stupid 값이며, SVG1에 miterlimit에서 클리핑하는 동작이 없었기 때문에만 유용하다. 문제는 사람들이 현재 대부분 *우연히* bevel 동작을 제대로 얻고 있는 것인지, 그리고 자신의 join이 miterlimit까지 확장되고 초과 모서리만 잘리는 것에 만족할 것인지, 아니면 현재 지정된 불연속 동작을 실제로 원했는지이다. 임계점은 29도와 30도 사이에 있다.
각도를 추가해야 하는가? miterlimit 숫자는 물리적 정당성이 있지만, 실험 없이는 이해하기 어렵다.
SVG는 쉼표 구분을 허용한다. 하위 호환성을 위해 CSS에서도 이를 허용해야 하는가? (제발 아니라고 해 달라.)
대시 길이를 스트로크의 폭에 상대적으로 지정하는 방법이 필요하다. (예를 들어 정사각형 대시를 만들기 위해.)
대시 길이를 경로의 길이에 상대적으로 지정하는 방법이 필요하다. (예를 들어 스크립트 없이 "self-drawing SVG" 효과를 만들기 위해.)
열린 도형의 첫 번째와 마지막 꼭짓점의 모서리 대시는 다른 것들의 절반 길이여야 하는가? 작성자가 이를 제어할 수 있어야 하는가?
모서리 대시 사이의 어떤 대시 패턴도 그것들과 맞닿지 않도록 padding을 지정하는 방법이 있어야 하는가?
모서리는 대시 패턴에서 첫 번째 대시의 역할을 맡아야 하므로, 각 선분의 "내부"는 간격으로 시작하고 끝나야 한다. 각 선분에서 패턴의 첫 번째 대시를 자동으로 건너뛸 것인가?
첫 번째 대시의 길이를 모서리로 사용하는 키워드.
모서리 대시가 겹치게 될 때 어떻게 되는지를 정의해야 한다.
이 속성이 활성화될 때 정렬을 자동으로 트리거해야 하는가? 그렇지 않으면 기본적으로 어리석어 보이는 결과가 생긴다.
기본값은 아마 간격만 조정하는 것이어야 한다.
너무 길 때 선분을 가운데 정렬해야 하는가?
스트로크가 대시로 끝날지 간격으로 끝날지를 제어할 수 있게 하고 싶은가? 닫힌 경로의 경우 끝에 간격이 있는 것이 좋을 가능성이 높고, 열린 경로의 경우 끝에 대시가 있는 것이 더 나을 가능성이 높다. 이에 대한 제어를 생략하고, 경로가 닫혔는지에 따라 자동으로 처리할 수도 있을까?
SVG 페인트 서버는 *Units 속성 안에 자체 originator 정보를 가지고 다니지만, SVGWG가 CSS originator에 주의를 기울이게 하는 새 값을 추가할 수도 있다. 또는 여기에서 auto 초기값을 추가하여, 페인트 서버를 참조하는 경우에는 페인트 서버의 정보에 따르고, 그렇지 않으면 match-parent가 되게 할 수 있다.
이는 아래의 스트로크 모양 계산 요구사항과 중복되어야 한다. 이 절에서는 요구사항을 규범적으로가 아니라 설명적으로 표현해야 한다.
이 절은 아직 stroke-dash-cornerstroke-dash-justify를 처리하지 않는다.
이들은 반드시 at-risk가 되어야 하며, 다음 레벨로 미뤄질 가능성도 있다.