모션 경로 모듈 레벨 1

W3C 워킹 드래프트,

이 문서에 대한 추가 정보
이 버전:
https://www.w3.org/TR/2024/WD-motion-1-20241105/
최신 공개 버전:
https://www.w3.org/TR/motion-1/
에디터스 드래프트:
https://drafts.fxtf.org/motion-1/
히스토리:
https://www.w3.org/standards/history/motion-1/
테스트 슈트:
https://github.com/web-platform-tests/wpt/tree/master/css/motion
https://wpt.fyi/results/css/motion/
피드백:
GitHub
명세 내 인라인
에디터:
(Adobe Inc.)
(Igalia)
Tab Atkins-Bittner (Google)
이전 에디터:
(Google)
(당시 Google)
이슈 추적:
GitHub 이슈
이 명세에 제안하기:
GitHub 에디터

요약

모션 경로는 작성자가 임의의 그래픽 오브젝트를 배치하고 지정한 경로를 따라 애니메이션할 수 있도록 합니다.

이 문서의 상태

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

워킹 드래프트로 발행되었다고 해서 W3C 및 회원들의 승인이나 지지를 의미하는 것은 아닙니다. 이 문서는 초안이며 언제든지 업데이트, 교체 또는 폐기될 수 있습니다. 진행 중인 작업이 아닌 다른 용도로 이 문서를 인용하는 것은 부적절합니다.

GitHub 이슈를 통해 이 명세에 대한 논의를 권장합니다. 이슈를 제출할 때 제목에 “motion”이라는 단어를 포함해 주세요, 가능한 한 다음과 같이 작성해 주세요: “[motion] …코멘트 요약…”. 모든 이슈와 코멘트는 아카이브로 저장되며, 히스토리 아카이브도 있습니다.

이 문서는 CSS 워킹 그룹권고 트랙을 사용하여 워킹 드래프트로 발행한 것입니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C는 그룹 산출물과 관련하여 제출된 특허 공개 목록을 유지합니다; 해당 페이지에는 특허 공개 방법도 안내되어 있습니다. 어떤 개인이 필수 청구항이 포함된 특허를 실제로 알고 있다고 믿는 경우, 반드시 W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

이 문서는 2023년 11월 3일 W3C 프로세스 문서의 적용을 받습니다.

1. 소개

이 섹션은 규범적이지 않습니다.

transform 속성과 관련 속성들은 box가 임의로 재배치(그리고 회전, 크기조절 등)될 수 있도록 허용하며, 원래 배치된 위치를 기준으로 다른 요소의 레이아웃을 방해하지 않습니다. 이러한 위치들은 CSS로 애니메이션하거나 트랜지션할 수 있지만, 상대적으로 단순한 방식(즉, 박스를 시작 위치에서 끝 위치까지 직선으로 이동)만 가능합니다.

이 명세는 offset 축약형과 관련된 여러 개별 속성을 도입합니다. 이 속성들은 offset transform을 정의합니다: 즉, 요소의 특정 지점(offset-anchor)을 경로상의 offset position과 맞추는 변환(offset-pathoffset-distance)이며, 필요에 따라 경로 방향에 맞춰 회전(offset-rotate)시킬 수도 있습니다.

이를 통해 극좌표(ray() 함수)를 이용한 배치 등 다양한 새로운 변환 방식이 가능해집니다. 기존의 translate() 함수에서 사용하는 직교 좌표 대신, 요소를 정의된 경로를 따라 애니메이션할 수 있어 복잡하고 아름다운 2D 공간 전환을 쉽게 구현할 수 있습니다.

예를 들어, 아래 그림은 곡선 경로(점선 표시)를 보여주며, 비행기 그래픽이 경로상의 여러 지점에 배치되어 있습니다. 비행기는 각 위치에서 경로의 방향을 바라봅니다.
Example Path

비행기가 offset-distance0%, 50%, 100%에서 각각 표시되어 있습니다.

1.1. 모듈 상호작용

이 명세는 요소에 적용할 수 있는 추가적인 변환 타입들을 정의합니다 ([css-transforms-1] 참조).

CSS Transforms 2 § 6 현재 변환 행렬에 설명된 대로, 이 문서에서 정의된 변환은 개별 변환 속성 (translate/rotate/scale, [css-transforms-2]에서 정의) 이후, transform 속성 ([css-transforms-1]에서 정의) 전에 계층화됩니다.

1.2.

이 명세는 CSS 속성 정의 관례를 따릅니다 ([CSS21]). <basic-shape> 타입은 CSS Shapes Module Level 1 [CSS-SHAPES]에서 정의됩니다. <coord-box> 타입은 CSS Box Model Module Level 3 [CSS-BOX-3]에서 정의됩니다. 여기에 정의되지 않은 값 타입들은 CSS Values and Units Module Level 3 [CSS3VAL]에서 정의됩니다.

각 속성 정의에 나열된 값 외에도, 본 명세에서 정의된 모든 속성은 initialinherit 같은 CSS 전역 키워드를 값으로 허용합니다 ([CSS3VAL]). 가독성을 위해 명시적으로 반복하지 않았습니다.

2. 모션 경로

2.1. 경로 정의: offset-path 속성

이름: offset-path
값: none | <offset-path> || <coord-box>
초기값: none
적용 대상: 변환 가능한 요소(transformable elements)
상속 여부: no
백분율: n/a
계산된 값: 명시된 대로(as specified)
정식 순서: 문법에 따름(per grammar)
애니메이션 타입: 계산된 값 기준(by computed value)
미디어: visual

offset path란 박스가 배치되는 기하학적 경로를 명시합니다.

<offset-path> = <ray()> | <url> | <basic-shape>

값의 의미는 다음과 같습니다:

none

요소는 offset transform을 갖지 않습니다.

<offset-path> || <coord-box>

요소는 offset transform을 가지며, 이는 offset path에 의해 정의됩니다. offset transform 계산에 대한 자세한 내용은 § 2.7 오프셋 변환 계산을 참조하세요.

transform을 가진 경우와 동일한 효과가 적용됩니다 (예: stacking context 생성 등). 자세한 내용은 CSS Transforms 1 § 3 변환 렌더링 모델을 참조하세요.

<offset-path>가 생략되면, 기본값은 inset(0 round X)이며, X는 이 요소의 border-radius 값입니다. 이때 containing block을 설정하는 요소 기준입니다. <coord-box>가 생략되면, 기본값은 border-box입니다.

각 구성 요소의 해석에 대한 자세한 내용은 아래의 특정 값을 참고하세요.

<ray()>

offset pathorigin에서 특정 각도로 뻗는 선입니다. 자세한 내용은 § 2.1.1 ray() 함수를 참조하세요.

<coord-box>는 ray의 reference box를 제공합니다.

<url>

SVG shape element에 대한 URL 참조입니다. offset path는 참조된 요소의 equivalent path가 됩니다. [SVG2]

만약 URL이 shape element를 참조하지 않거나(다른 요소, 비SVG 문서, 미해결 등), 대신 path("m 0 0") (<basic-shape>)처럼 동작합니다.

<coord-box>shape element의 뷰포트 및 사용자 좌표계를 정의합니다. 원점(0,0)은 좌상단이며, 단위는 1px입니다.

<basic-shape>

offset pathequivalent path입니다. <basic-shape> 함수의.

모든 <basic-shape> 타입에서, at <position> 인자를 허용하지만 생략된 경우, 요소가 offset starting positionoffset-position으로 정의하면 해당 인자에 지정된 offset starting position을 사용합니다. 그렇지 않으면 각 함수에서 지정된 기본값을 따릅니다.

<coord-box><basic-shape>의 참조 박스(reference box)를 제공합니다.

<coord-box>

<offset-path>가 크기를 맞출 박스를 정의합니다.

CSS 맥락에서는, 참조하는 박스가 이 요소의 containing block을 설정하는 요소에서 가져옵니다.

SVG 맥락에서는, 모든 값이 view-box로 동작합니다.

테스트

2.1.1. ray() 함수

ray() 함수는 offset path를 특정 각도에서 한 점에서 시작하는 직선으로 정의합니다:

ray() = ray( <angle> && <ray-size>? && contain? && [at <position>]? )

<ray-size> = closest-side | closest-corner | farthest-side | farthest-corner | sides

인자들은 다음과 같습니다:

<angle>

offset pathoffset starting position에서 시작해 지정된 <angle> 방향으로 진행하는 하나의 선분입니다. (길이는 다른 인자에 의해 결정됩니다.) gradient 함수와 같이, <angle> 값은 bearing 각도로 해석되며, 0deg는 위쪽을 가리키고, 양의 각도는 시계 방향 회전입니다.

<ray-size>

offset path의 길이(즉, offset-distance: 0%offset-distance: 100% 사이 거리)를 containing box에 대해 지정합니다.

<ray-size>가 지정되지 않은 경우 기본값은 closest-side입니다.

참고: sides의 경우, 거리는 지정된 <angle>에 따라 달라집니다; 다른 값들은 <angle>에 관계없이 거리가 일정합니다.

각 키워드는 다음과 같습니다:

closest-side

ray의 시작점에서 containing block의 가장 가까운 변까지의 거리.

closest-corner

ray의 시작점에서 containing block의 가장 가까운 꼭짓점까지의 거리.

farthest-side

ray의 시작점에서 containing block의 가장 먼 변까지의 거리.

farthest-corner

ray의 시작점에서 containing block의 가장 먼 꼭짓점까지의 거리.

sides

ray의 시작점에서 offset pathcontaining block 경계와 만나는 지점까지의 거리.

ray의 시작점이 containing block 경계 위이거나, 경계 밖에 있다면, 거리는 0입니다.

참고: closest-sideclosest-corner에서 ray의 시작점이 가장자리/꼭짓점 위에 있으면 그 변/꼭짓점이 가장 가까운 것입니다. (즉, 거리는 0입니다.)

참고: closest-sidefarthest-side에서, ray의 시작점이 containing block 밖에 있다면, containing block의 변이 무한대로 확장된 것으로 간주합니다.

contain

offset path의 길이가 감소되어, 요소가 containing block 내에 offset-distance: 100% 위치에서도 유지될 수 있게 합니다.

구체적으로, 경로의 길이는 요소의 border box의 너비 또는 높이 중 더 큰 값의 절반만큼 줄이며, 최소값은 0입니다.

이 동작은 특정 상황(요소의 너비와 높이가 같거나 거의 같고, border-radius로 완전히 둥글거나 모서리가 시각적으로 중요하지 않음, ray()에서 closest-side 포지셔닝 사용, offset-anchorcenter로 설정됨)에 최적화되어 있습니다.

이러한 조건(예: 둥근 시계 테두리에 요소를 배치하는 경우)에서는, offset-distance: 100%에서 각 요소가 시계 테두리 안쪽에 딱 맞게 배치될 수 있습니다.

다른 조건에서는 유사하게 동작하지만 최적 결과가 아닐 수 있습니다.

at <position>

ray의 origin을 지정합니다. 즉, ray의 선이 시작되는 위치(0% 위치). <position>을 사용해 box의 containing block 내에서 0x0 오브젝트 영역의 위치를 정합니다.

생략 시, 요소의 offset starting position(offset-position으로 지정됨)을 사용합니다.

요소에 offset starting position이 없는 경우, at center로 동작합니다.

참고: ray()는 현재 offset path로만 사용할 수 있습니다. 추후 다른 용도로 확장될 경우, offset-position 사용은 offset path일 때만 제한되며, 다른 <basic-shape> 함수와 유사하게 동작합니다.

테스트

이 예시들은 모두 다시 작성해야 합니다.

몇 가지 예시입니다. 첫 번째 예시는 박스의 일부가 offset path 밖에 위치함을 보여줍니다.
<style>
    body {
        transform-style: preserve-3d;
        width: 200px;
        height: 200px;
    }
    .box {
        width: 50px;
        height: 50px;
        offset-position: 50% 50%;
        offset-distance: 100%;
        offset-rotate: 0deg;
    }
    #redBox {
        background-color: red;
        offset-path: ray(45deg closest-side);
    }
    #blueBox {
        background-color: blue;
        offset-path: ray(180deg closest-side);
    }
</style>
<body>
    <div class="box" id="redBox"></div>
    <div class="box" id="blueBox"></div>
</body>
contain 없이 박스를 배치한 이미지
offset-pathcontain이 없음

두 번째 예시에서는, 각 박스의 containoffset-path 값에 지정하여 오버플로우를 방지합니다.

<style>
    body {
        transform-style: preserve-3d;
        width: 200px;
        height: 200px;
    }
    .box {
        width: 50px;
        height: 50px;
        offset-position: 50% 50%;
        offset-distance: 100%;
        offset-rotate: 0deg;
    }
    #redBox {
        background-color: red;
        offset-path: ray(45deg closest-side contain);
    }
    #blueBox {
        background-color: blue;
        offset-path: ray(180deg closest-side contain);
    }
</style>
<body>
    <div class="box" id="redBox"></div>
    <div class="box" id="blueBox"></div>
</body>
contain과 함께 박스를 배치한 이미지
offset-pathcontain 적용

세 번째 예시에서는 경로 크기를 늘려 박스가 포함될 수 있도록 했습니다. used offset distance가 음수입니다.

<style>
    body {
        transform-style: preserve-3d;
        width: 250px;
        height: 250px;
    }
    .box {
        width: 60%;
        height: 10%;

        offset-position: 20% 20%;
        offset-distance: 0%;
        offset-rotate: 0deg;
        offset-anchor: 200% -300%;
    }
    #blueBox {
        background-color: blue;
        offset-path: ray(-90deg closest-side contain);
    }
</style>
<body>
    <div class="box" id="blueBox"></div>
</body>
경로 크기를 늘린 이미지
경로 크기를 늘린 offset-path

네 번째 예시에서는 초기 위치가 containing block 밖에 있습니다.

<style>
    #container {
        transform-style: preserve-3d;
        width: 200px;
        height: 200px;
    }
    .box {
        width: 20%;
        height: 20%;
        offset-position: 140% 70%;
        offset-distance: 100%;
    }
    #redBox {
        background-color: red;
        offset-path: ray(-90deg sides);
    }
    #blueBox {
        background-color: blue;
        offset-path: ray(180deg closest-side);
    }
</style>
<div id="container">
    <div class="box" id="redBox"></div>
    <div class="box" id="blueBox"></div>
</div>
초기 위치가 containing block 밖에 있는 이미지
초기 위치가 containing block 밖에 있음

2.1.2. <basic-shape> 배치 예시

이 예시는 암시적 중심 위치의 원을 사용합니다.
<style>
    body {
        width: 323px;
        height: 131px;
        margin: 0px;
        border: 2px solid black;
        padding: 8px;
        transform-style: preserve-3d;
    }
    .item {
        width:  90px;
        height: 40px;
        background-color: violet;
    }
    #middle {
        offset-position: auto;
        offset-path: circle(60%) margin-box;
        offset-distance: 25%;
        offset-anchor: left top;
    }
</style>
<body>
    <div class="item"></div>
    <div class="item" id="middle"></div>
    <div class="item"></div>
</body>
일반 흐름이 원의 중심을 결정하는 이미지
원의 중심은 일반 흐름(normal flow)에 의해 결정됩니다.

2.1.3. <coord-box> 배치 예시

이 예시는 <coord-box> offset pathborder-radius와 결합되어 동작하는 방식을 보여줍니다.
<style>
    body {
        width: 500px;
        height: 300px;
        border-radius: 80px;
        border: dashed aqua;
        margin: 0;
    }
    #blueBox {
        width: 40px;
        height: 20px;
        background-color: blue;
        offset-path: margin-box;
    }
</style>
<body>
    <div id="blueBox"></div>
</body>
border-radius가 적용된 geometry-box 예시 이미지
초기 위치는 상단 수평선의 왼쪽 끝입니다.

2.2. 경로상의 위치: offset-distance 속성

이름: offset-distance
값: <length-percentage>
초기값: 0
적용 대상: 변환 가능한 요소(transformable elements)
상속 여부: no
백분율: offset path 길이에 상대적
계산된 값: 계산된 <length-percentage>
정식 순서: 문법에 따름(per grammar)
애니메이션 타입: 계산된 값 기준(by computed value)
미디어: visual

offset path를 따라 offset position이 어디에 있는지 지정합니다.

<length-percentage>

offset position은 지정된 거리만큼 요소의 offset path를 따라 위치한 지점입니다. 경로상의 거리 계산 방법은 § 2.2.1 경로를 따라 계산된 거리 산출을 참고하세요.

백분율은 offset path의 전체 길이에 상대적입니다.

테스트

참고: offset-distance를 애니메이션 하면, 요소가 복잡한 경로를 쉽게 따라갈 수 있습니다.

요소에 offset path가 없으면, 이 속성은 아무런 효과가 없습니다.

2.2.1. 경로를 따라 계산된 거리 산출

offset path를 따라 거리를 처리하는 방식은 offset path의 종류에 따라 다릅니다:

주어진 offset pathoffset distanceused offset distance를 결정하려면:

  1. total lengthoffset path의 모든 하위 경로를 포함한 전체 길이로 한다.

  2. offset distance를 px로 변환하며, 100%는 total length로 변환한다.

  3. offset path가 무한(ray)인 경우:

    used offset distanceoffset distance와 동일하게 한다.

    그 외에 offset path가 contain이 있는 <angle> 경로인 경우:

    used offset distanceoffset distance(박스가 경로 안에 완전히 포함되도록 clamp 함)로 한다.

    offset path가 다른 닫히지 않은 구간(unclosed interval)인 경우:

    used offset distanceoffset distance를 0과 경로의 total length 사이로 clamp한 값으로 한다.

    그 외 offset path가 닫힌 루프(closed loop)인 경우:

    used offset distanceoffset distance를 경로의 total length로 나눈 나머지(modulo)로 한다. total length가 0이면, used offset distance도 0이다.

    참고: “Modulo”는 항상 음수가 아닌 결과가 나오도록 하는 전통적 수학적 정의를 사용합니다.

이 예시는 닫히지 않은 구간에 박스를 배치한 모습입니다.
<style>
    .item {
        width: 100px;
        height: 40px;
        offset-position: 0% 0%;
        offset-path: path('m 0 0 h 200 v 150');
    }
    #box1 {
        background-color: red;
        offset-distance: -280%;
    }
    #box2 {
        background-color: green;
        offset-distance: 190%;
    }
</style>
<body>
    <div class="item" id="box1"></div>
    <div class="item" id="box2"></div>
</body>
닫히지 않은 구간에 박스 배치 예시 이미지
닫히지 않은 구간에 박스를 배치한 예시
이 예시는 닫힌 구간에 박스를 배치한 모습입니다.
<style>
    .item {
        width: 100px;
        height: 40px;
        offset-position: 0% 0%;
        offset-path: path('m 0 0 h 200 v 150 z');
    }
    #box1 {
        background-color: red;
        offset-distance: -280%;
    }
    #box2 {
        background-color: green;
        offset-distance: 190%;
    }
</style>
<body>
    <div class="item" id="box1"></div>
    <div class="item" id="box2"></div>
</body>
닫힌 구간에 박스 배치 예시 이미지
닫힌 구간에 박스를 배치한 예시
이 예시는 offset-path, offset-distance를 사용해 극좌표계에서 박스를 정렬하는 방법을 보여줍니다.
<style>
    body {
        transform-style: preserve-3d;
        width: 300px;
        height: 300px;
        border: dashed gray;
        border-radius: 50%;
    }
    .circleBox {
        position: absolute;
        left: 50%;
        top: 50%;
        width: 40px;
        height: 40px;
        background-color: red;
        border-radius: 50%;
    }
    #circle1 {
        offset-path: ray(0deg farthest-side);
        offset-distance: 50%;
    }
    #circle2 {
        offset-path: ray(90deg farthest-side);
        offset-distance: 20%;
    }
    #circle3 {
        offset-path: ray(225deg farthest-side);
        offset-distance: 100%;
    }
</style>
<body>
    <div class="circleBox" id="circle1"></div>
    <div class="circleBox" id="circle2"></div>
    <div class="circleBox" id="circle3"></div>
</body>
극좌표계에 위치한 세 박스 이미지
극좌표계로 박스 위치 지정 예시

2.3. 경로의 시작점: offset-position 속성

이름: offset-position
값: normal | auto | <position>
초기값: normal
적용 대상: 변환 가능한 요소(transformable elements)
상속 여부: no
백분율: containing block의 크기 기준
계산된 값: normal 또는 auto 키워드, 또는 계산된 <position>
정식 순서: 문법에 따름
애니메이션 타입: 계산된 값 기준
미디어: visual

<offset-path> 함수에서 자체 시작 위치를 지정하지 않을 경우 사용하는 offset starting position을 지정합니다.

값 정의는 다음과 같습니다:

normal

요소는 offset starting position이 없습니다.

auto

offset starting position은 박스의 왼쪽 위 모서리(top-left corner)입니다.

참고: 이것은 요소의 자기 박스의 왼쪽 위 모서리이며, containing block의 것이 아닙니다! top left 지정과는 완전히 다릅니다. 예를 들어, path()가 요소의 위치 기준으로 시작할 수 있게 하는 용도입니다.

<position>

offset starting position<position>을 사용해 박스의 containing block 내에서 0x0 오브젝트 영역의 위치를 정한 결과입니다.

테스트
이 예시는 offset-position을 사용하여 박스를 배치하는 방법을 보여줍니다.
<style>
    #wrap {
        position: relative;
        width: 300px;
        height: 300px;
        border: 1px solid black;
    }

    #box {
        width: 100px;
        height: 100px;
        background-color: green;
        position: absolute;
        top: 100px;
        left: 80px;
        offset-position: auto;
        offset-anchor: center;
        offset-path: ray(45deg);
    }
</style>
<body>
    <div id="wrap">
        <div id="box"></div>
    </div>
</body>
offset-position: auto의 이미지
autooffset-position에 지정된 예시
이 예시는 transform 속성과 개별 변환 속성(rotate)의 상호작용을 보여줍니다. 모션 경로 변환은 (left, top)에서 offset-position으로 이동하는 수직 변환입니다.
<style>
    #wrap {
        transform-style: preserve-3d;
        width: 400px;
        height: 350px;
    }
    .item {
        position: absolute;
        left: 200px;
        top: 0px;
        offset-position: 200px 100px; /* 0px,100px로 이동됨 */
        offset-anchor: left top;
        transform-origin: left top;
        width: 130px;
        height: 80px;
        border-top-right-radius: 23px;
    }
    #box1 {
        background-color: tomato;
        offset-position: auto;
    }
    #box2 {
        background-color: green;
    }
    #box3 {
        background-color: navy;
        rotate: 90deg; /* 모션 경로 변환 전에 적용됨 */
    }
    #box4 {
        background-color: gold;
        transform: rotate(90deg); /* 모션 경로 변환 후 적용됨 */
    }
</style>
<body>
    <div id="wrap">
        <div class="item" id="box1"></div>
        <div class="item" id="box2"></div>
        <div class="item" id="box3"></div>
        <div class="item" id="box4"></div>
    </div>
</body>
모션 경로와 다른 변환이 상호작용하는 예시
모션 경로와 다른 변환이 상호작용하는 예시
이 예시는 position static을 사용하므로 offset-position이 일반 흐름(normal flow) 위치에서 변환을 생성합니다. 이 변환을 scale로 증폭하면, 일반 흐름이 offset-position을 중심으로 180도 회전하고 박스들이 서로 멀리 퍼집니다.
<style>
    #wrap {
        transform-style: preserve-3d;
        width: 500px;
        height: 250px;
        line-height: 0px;
    }
    span {
        position: static;
        display: inline-block;
        width: 100px;
        height: 50px;
        border-top-right-radius: 23px;
        scale: 2.5 2.5; /* 모션 경로 변환 전에 적용됨 */
        offset-position: center;
        transform: scale(0.4); /* 모션 경로 변환 후 적용됨 */
    }
    #box1 {
        background-color: tomato;
    }
    #box2 {
        background-color: green;
    }
    #box3 {
        background-color: navy;
    }
    #box4 {
        background-color: gold;
    }
</style>
<body>
    <div id="wrap">
        <div>
            <span id="box1"></span><span id="box2"></span>
        </div>
        <div>
            <span id="box3"></span><span id="box4"></span>
        </div>
    </div>
</body>
모션 경로와 scale이 상호작용하는 예시
모션 경로와 scale이 상호작용하는 예시
이 예시에서 각 offset-position 값은 offset-path<geometry-box>이므로 무시되지만, 다른 offset 속성들이 결합되어 offset-position 'right bottom'과 동일한 효과를 냅니다.
<style>
    #wrap {
        transform-style: preserve-3d;
        width: 540px;
        height: 420px;
    }
    .item {
        position: absolute;
        width: 90px;
        height: 70px;
        border-top-right-radius: 23px;
        scale: 0.8 0.8; /* 모션 경로 변환 전에 적용됨 */
        offset-path: padding-box;
        offset-distance: 50%;
        offset-rotate: 0deg;
        offset-anchor: right bottom;
        transform: scale(1.25); /* 모션 경로 변환 후 적용됨 */
    }
    #box1 {
        background-color: tomato;
        position: static;
        offset-position: auto; /* 무시됨 */
    }
    #box2 {
        background-color: green;
        right: 0px;
        top: 0px;
        offset-position: 23% 45%; /* 무시됨 */
    }
    #box3 {
        background-color: navy;
        left: 0px;
        bottom: 0px;
        offset-position: 34% 56px; /* 무시됨 */
    }
    #box4 {
        background-color: gold;
        right: 0px;
        bottom: 0px;
        offset-position: 45px 67px; /* 무시됨 */
    }
</style>
<body>
    <div id="wrap">
        <div class="item" id="box1"></div>
        <div class="item" id="box2"></div>
        <div class="item" id="box3"></div>
        <div class="item" id="box4"></div>
    </div>
</body>
offset-position이 무시되는 예시
offset-position이 무시되는 예시

2.4. 요소의 앵커 포인트: offset-anchor 속성

이름: offset-anchor
값: auto | <position>
초기값: auto
적용 대상: 변환 가능한 요소(transformable elements)
상속 여부: no
백분율: 요소의 reference box의 너비와 높이에 상대적
계산된 값: auto 키워드 또는 계산된 <position>
정식 순서: 문법에 따름
애니메이션 타입: 계산된 값 기준
미디어: visual

요소의 offset anchor point—​offset positionoffset path를 따라 정렬되는 지점—​을 정의합니다.

값의 의미는 다음과 같습니다:

auto

anchor pointtransform-origin이 지정한 지점과 동일합니다.

구체적으로, computed valuetransform-origin은 요소의 <position>으로 resolve되며, 요소의 reference box를 기준으로 합니다.

<position>

anchor point<position>을 요소의 reference box 기준으로 resolve한 결과입니다.

테스트

어떤 박스에 대해 resolve할지에 대한 논의는 Issue 503에서 진행 중입니다.

아래는 박스의 anchor point를 설정하는 방법을 설명합니다.
#plane {
    offset-anchor: center;
}

도형 중앙의 빨간 점은 도형의 anchor point를 나타냅니다.

모양의 앵커 포인트가 있는 도형
비행기 도형 중앙의 빨간 점이 도형의 anchor point를 나타냅니다.
이 예시는 서로 다른 anchor point를 가진 4개의 박스 정렬을 보여줍니다.
<style>
    body {
        transform-style: preserve-3d;
        width: 300px;
        height: 300px;
        border: 2px solid gray;
        border-radius: 50%;
    }
    .box {
        width: 50px;
        height: 50px;
        background-color: orange;
        offset-position: 50% 50%;
        offset-distance: 100%;
        offset-rotate: 0deg;
    }
    #item1 {
        offset-path: ray(45deg closest-side);
        offset-anchor: right top;
    }
    #item2 {
        offset-path: ray(135deg closest-side);
        offset-anchor: right bottom;
    }
    #item3 {
        offset-path: ray(225deg closest-side);
        offset-anchor: left bottom;
    }
    #item4 {
        offset-path: ray(315deg closest-side);
        offset-anchor: left top;
    }
</style>
<body>
    <div class="box" id="item1"></div>
    <div class="box" id="item2"></div>
    <div class="box" id="item3"></div>
    <div class="box" id="item4"></div>
</body>
offset-anchor 예시
offset-anchor 예시
이 예시는 박스들이 offset-position에 중앙 정렬되는 모습을 보여줍니다.
<style>
    body {
        width: 500px;
        height: 500px;
    }
    .box {
        background-color: mediumpurple;
        offset-path: none;
        offset-anchor: center;
    }
    #item1 {
        offset-position: 90% 20%;
        width: 60%;
        height: 20%;
    }
    #item2 {
        offset-position: 100% 100%;
        width: 30%;
        height: 10%;
    }
    #item3 {
        offset-position: 50% 100%;
        width: 20%;
        height: 60%;
    }
    #item4 {
        offset-position: 0% 100%;
        width: 30%;
        height: 90%;
    }
</style>
<body>
    <div class="box" id="item1"></div>
    <div class="box" id="item2"></div>
    <div class="box" id="item3"></div>
    <div class="box" id="item4"></div>
</body>
'offset-anchor: center' 예시
'offset-anchor: center' 예시
이 예시는 offset-anchor가 offset-position에 대해 어떻게 계산되는지 보여줍니다.
<style>
    body {
        width: 500px;
        height: 500px;
    }
    .box {
        background-color: mediumpurple;
        offset-path: none;
        offset-anchor: auto;
    }
    #item1 {
        offset-position: 90% 20%;
        width: 60%;
        height: 20%;
    }
    #item2 {
        offset-position: 100% 100%;
        width: 30%;
        height: 10%;
    }
    #item3 {
        offset-position: 50% 100%;
        width: 20%;
        height: 60%;
    }
    #item4 {
        offset-position: 0% 100%;
        width: 30%;
        height: 90%;
    }
</style>
<body>
    <div class="box" id="item1"></div>
    <div class="box" id="item2"></div>
    <div class="box" id="item3"></div>
    <div class="box" id="item4"></div>
</body>
'offset-anchor: auto' 예시
'offset-anchor: auto' 예시

2.5. 경로에 맞춰 회전: offset-rotate 속성

이름: offset-rotate
값: [ auto | reverse ] || <angle>
초기값: auto
적용 대상: 변환 가능한 요소(transformable elements)
상속 여부: no
백분율: n/a
계산된 값: auto가 앞에 붙을 수 있는 계산된 <angle>
정식 순서: 문법에 따름
애니메이션 타입: 계산된 값 기준
미디어: visual

offset transform의 회전 컴포넌트를 정의하며, offset pathoffset position에서의 방향을 기반으로 할 수 있습니다. 값의 의미는 다음과 같습니다:

auto <angle>?

offset transform에 회전 컴포넌트가 포함되며, offset pathoffset position에서의 방향과 양의 X축(즉, 오른쪽으로 향하는 선) 방향의 차이만큼 회전합니다. 계산 방법은 SVG의 경로 방향(direction of a path)을 참고하세요.

만약 <angle>이 함께 지정되면, 그 각도가 회전 컴포넌트에 추가됩니다.

참고: 즉, offset path가 오른쪽으로 움직이면 auto는 회전을 추가하지 않습니다. 오른쪽 직선에서 벗어날수록, 회전도 그만큼 적용됩니다. auto<angle>를 조합하면 "시작" 회전을 조정할 수 있습니다.

reverse <angle>?

auto와 동일하지만, 추가로 180deg를 더해 회전합니다.

<angle>

단독으로 지정하면, offset transform에 지정한 각도만큼 회전 컴포넌트를 추가합니다. (즉, offset-rotate: 45deg;transform: rotate(45deg)와 유사하지만, offset transform의 일부로 처리됩니다.)

테스트
아래 예시들은 비행기 모양을 사용합니다. 도형 중앙의 빨간 점은 도형의 앵커 포인트를 나타냅니다. offset 속성이 설정되지 않으면 도형은 경로를 따라 이동하거나 회전하지 않습니다.
offset 없는 경로
경로의 시작점에 있는 검은색 비행기, offset 속성 없음.

도형의 앵커 포인트가 경로상의 여러 위치에 놓이고 offset-rotate0deg이면, 도형은 회전하지 않습니다.

회전 없는 경로
회전 변환 없이 파란 점선 경로의 여러 위치에 놓인 검은색 비행기.

offset-rotate 속성을 auto로 설정하고, 도형의 앵커 포인트를 경로상의 여러 위치에 놓으면, 도형은 현재 위치의 접선에 따라 회전하며 해당 위치에서 경로 방향을 바라봅니다.

auto 회전 경로
경로 방향에 맞춰 회전한 검은색 비행기가 파란 점선 경로의 여러 위치에 놓임.

이 예시에서는 offset-rotate 속성이 reverse로 설정되어 있습니다. 비행기는 경로의 각 위치에서 경로의 반대 방향을 바라봅니다.

reverse auto 회전 경로
경로의 반대 방향으로 회전한 검은색 비행기가 파란 점선 경로의 여러 위치에 놓임.

마지막 예시에서는 offset-rotate 속성이 -45deg로 설정되어 있습니다. 도형은 반시계 방향으로 45도 한 번 회전하며, 경로의 각 위치에서 동일한 회전을 유지합니다.

고정 회전 경로
고정된 각도만큼 회전한 검은색 비행기가 파란 점선 경로의 여러 위치에 놓임.
이 예시는 auto 또는 reverse<angle>과 결합된 경우 어떻게 동작하는지 보여줍니다. <angle>의 계산된 값이 auto 또는 reverse의 계산된 값에 더해집니다.
<style>
    body {
        width: 300px;
        height: 300px;
        margin: 0px;
        border: solid gray;
        border-radius: 50%;
    }
    .circle {
        offset-position: 150px 150px;
        offset-distance: 86%;
        width: 42px;
        height: 42px;
        background-color: mediumpurple;
        border-radius: 50%;
        display: flex;
        align-items: center;
        justify-content: center;
    }
    #item1 {
        offset-path: ray(0deg closest-side);
        offset-rotate: auto 90deg;
    }
    #item2 {
        offset-path: ray(45deg closest-side);
        offset-rotate: auto 90deg;
    }
    #item3 {
        offset-path: ray(135deg closest-side);
        offset-rotate: auto -90deg;
    }
    #item4 {
        offset-path: ray(180deg closest-side);
        offset-rotate: auto -90deg;
    }
    #item5 {
        offset-path: ray(225deg closest-side);
        offset-rotate: reverse 90deg;
    }
    #item6 {
        offset-path: ray(-45deg closest-side);
        offset-rotate: reverse -90deg;
    }
</style>
<body>
    <div class="circle" id="item1">1</div>
    <div class="circle" id="item2">2</div>
    <div class="circle" id="item3">3</div>
    <div class="circle" id="item4">4</div>
    <div class="circle" id="item5">5</div>
    <div class="circle" id="item6">6</div>
</body>
offset-rotate 예시 이미지
박스들은 auto 값과 고정된 각도만큼 회전합니다.

2.6. offset 축약형

이름: offset
값: [ <'offset-position'>? [ <'offset-path'> [ <'offset-distance'> || <'offset-rotate'> ]? ]? ]! [ / <'offset-anchor'> ]?
초기값: 개별 속성 참조
적용 대상: 변환 가능한 요소(transformable elements)
상속 여부: 개별 속성 참조
백분율: 개별 속성 참조
계산된 값: 개별 속성 참조
애니메이션 타입: 개별 속성 참조
정식 순서: 문법에 따름
테스트

이 속성은 offset-position, offset-path, offset-distance, offset-rotate, offset-anchor를 한 번에 설정하는 축약형 속성입니다. 생략된 값은 각 속성의 초기값으로 설정됩니다.

2.7. 오프셋 변환 계산

offset transform은 2D 변환으로, 이동(translation) 후 회전(rotation) 순서로 적용됩니다:

3. <basic-shape>의 등가 경로

<basic-shape>의 정의는 [css-shapes]에서 각 함수가 도형—​윤곽, 내부, 외부가 있는 2차원 도형을 생성한다고 정의합니다.

이 명세에서는 <basic-shape>경로(path)—​시작점, 끝점, 방향이 있는 선으로 사용하며, 해당 도형의 윤곽을 따라 그려집니다. 경로를 구성하는 자세한 내용은 SVG에서 정의합니다. [SVG2]

모든 <basic-shape> 값에 대한 등가 경로(equivalent path)는 다음과 같습니다:

<path()>
<shape()>

경로는 정의된 path입니다. [SVG11]

<circle()>
<ellipse()>

경로는 원/타원의 윤곽선입니다. 시작점은 원/타원의 가장 오른쪽 점이며, 네 개의 원호(각각 1/4씩, 시계 방향, 마지막은 segment-completing close path 연산)로 이루어집니다.

rect()
inset()
xywh()

경로는 (둥근 모서리가 있을 수 있는) 사각형의 윤곽선입니다. 네 개 또는 여덟 개의 세그먼트(둥근 모서리 여부에 따라 다름)로 이루어지며, 마지막은 segment-completing close path 연산입니다. 시작점은 상단 직선의 왼쪽 끝(둥근 모서리 바로 오른쪽)이고, 시계 방향으로 이어집니다.

<polygon()>

경로는 다각형의 윤곽선으로, 각 좌표쌍을 직선으로 연결하여 이루어지며, 마지막 점은 첫 번째 점과 연결되고, segment-completing close path 연산으로 종료합니다.

이 모든 경로에서, 경로상의 임의의 지점에서의 방향(direction)은 SVG에서 정의합니다. SVG 2 § 9.4 경로 방향성(Path directionality) 참고.

참고: 이 모든 경로는 유사한 SVG shape element에 대해 정의된 "equivalent paths"와 일치하도록 의도되었습니다.

참고: 이 목록은 <basic-shape> 함수 전체와 동기화되어야 합니다. 누락된 것이 있다면, 이는 명세 버그입니다. 향후 Shapes 명세로 이동할 수 있지만, 현재로서는 이 명세만이 해당 정보를 사용하는 유일한 명세이므로 여기에 유지됩니다.

4. 프라이버시 고려사항

이 명세는 새로운 프라이버시 고려사항을 도입하지 않습니다.

5. 보안 고려사항

이 명세는 새로운 보안 고려사항을 도입하지 않습니다.

변경 사항

이 섹션은 규범적이지 않습니다.

2018년 12월 18일 작업 초안 이후의 변경 사항

2015년 4월 9일 최초 공개 작업 초안 이후 변경 사항

감사의 말

fantasai, Hyojin Song, 그리고 CSS WG 멤버 여러분 리뷰, 의견, 교정에 감사드립니다.

적합성(Conformance)

문서 관례(Document conventions)

적합성 요구사항은 설명적 주장과 RFC 2119 용어의 조합으로 표현됩니다. 규범적 부분에서 사용되는 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” 키워드는 RFC 2119에 설명된 대로 해석해야 합니다. 하지만 가독성을 위해, 이 단어들은 이 명세서에서 모두 대문자로 표기되지 않습니다.

이 명세의 모든 텍스트는 명시적으로 비규범적, 예시, 참고로 표시된 섹션을 제외하고 규범적입니다. [RFC2119]

이 명세서의 예시는 “예를 들어(for example)”라는 단어로 소개되거나, 다음과 같이 class="example"로 규범적 텍스트와 분리되어 나타납니다:

이것은 정보성 예시의 한 예입니다.

정보성 참고(Informative note)는 “참고(Note)”라는 단어로 시작하며, 다음과 같이 class="note"로 규범적 텍스트와 분리되어 나타납니다:

참고: 이것은 정보성 참고입니다.

권고 사항(Advisement)은 특별한 주의를 촉구하는 규범적 섹션으로, <strong class="advisement">로 다른 규범적 텍스트와 구분되어 나타납니다. 예시: UA는 접근 가능한 대안을 제공해야 합니다.

테스트

이 명세서의 내용과 관련된 테스트는 이런 “테스트(Tests)” 블록에서 문서화될 수 있습니다. 이러한 블록은 모두 비규범적입니다.


적합성 클래스(Conformance classes)

이 명세서에 대한 적합성은 세 가지 적합성 클래스로 정의됩니다:

스타일 시트(style sheet)
CSS 스타일 시트.
렌더러(renderer)
UA로, 스타일 시트의 의미론을 해석하고 이를 사용하는 문서를 렌더링하는 에이전트.
저작 도구(authoring tool)
UA로, 스타일 시트를 작성하는 도구.

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

렌더러가 이 명세에 적합하려면, 스타일 시트를 적합한 명세에 따라 해석하는 것 외에도, 이 명세에서 정의한 모든 기능을 올바르게 파싱하고 해당 문서를 렌더링해야 합니다. 단, 장치의 한계로 인해 UA가 문서를 올바르게 렌더링하지 못하는 경우라도 UA가 비적합한 것은 아닙니다. (예: UA가 단색 모니터에서 색상을 렌더링할 필요는 없음.)

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

부분 구현(Partial implementations)

작성자가 미래 호환 구문 분석 규칙을 활용하여 폴백 값(fallback value)을 지정할 수 있도록, CSS 렌더러는 반드시 사용할 수 없는 모든 at-rule, 속성, 속성 값, 키워드, 기타 구문 요소를 무효(잘못된 값으로 처리)로 간주하고 적절하게 무시해야 합니다. 특히, 사용자 에이전트는 절대로 지원되지 않는 구성 요소 값을 선택적으로 무시하고, 다중 값 속성 선언에서 지원되는 값만 적용해서는 안 됩니다: 어떤 값이라도 무효로 간주되면(지원되지 않는 값은 반드시 무효임), CSS에서는 전체 선언을 무시해야 합니다.

불안정 및 독점 기능 구현(Implementations of Unstable and Proprietary Features)

향후 안정적인 CSS 기능과 충돌을 피하기 위해, CSSWG는 최선의 구현 방법을 따라 불안정 기능 및 독점 확장 기능을 구현할 것을 권장합니다.

비실험적 구현(Non-experimental implementations)

명세가 후보 권고(Candidate Recommendation) 단계에 도달하면, 비실험적 구현이 가능하며, 구현자는 명세에 따라 올바르게 구현됨을 입증할 수 있는 CR 단계 기능에 대해 접두사 없는(unprefixed) 구현을 공개해야 합니다.

CSS의 상호 운용성을 확보하고 유지하기 위해, CSS 워킹 그룹은 비실험적 CSS 렌더러가 CSS 기능의 접두사 없는 구현을 공개하기 전에 W3C에 구현 보고서(및 필요 시 해당 구현 보고서에 사용된 테스트케이스)를 제출할 것을 요청합니다. W3C에 제출된 테스트케이스는 CSS 워킹 그룹의 검토 및 수정 대상입니다.

테스트케이스 및 구현 보고서 제출에 관한 추가 정보는 CSS 워킹 그룹 웹사이트 https://www.w3.org/Style/CSS/Test/에서 확인할 수 있습니다. 문의는 public-css-testsuite@w3.org 메일링 리스트로 보내주십시오.

색인(Index)

이 명세에서 정의된 용어

참조로 정의된 용어

참고문헌(References)

규범적 참고문헌(Normative References)

[CSS-BACKGROUNDS-3]
Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2024년 3월 11일. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BOX-3]
Elika Etemad. CSS Box Model Module Level 3. 2024년 4월 11일. REC. URL: https://www.w3.org/TR/css-box-3/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 2024년 8월 4일. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022년 1월 13일. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-CONTAIN-2]
Tab Atkins Jr.; Florian Rivoal; Vladimir Levin. CSS Containment Module Level 2. 2022년 9월 17일. WD. URL: https://www.w3.org/TR/css-contain-2/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 3. 2023년 3월 30일. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-IMAGES-4]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 4. 2023년 2월 17일. WD. URL: https://www.w3.org/TR/css-images-4/
[CSS-SHAPES]
Rossen Atanassov; Alan Stearns. CSS Shapes Module Level 1. 2022년 11월 15일. CR. URL: https://www.w3.org/TR/css-shapes-1/
[CSS-SHAPES-2]
CSS Shapes Module Level 2. Editor's Draft. URL: https://drafts.csswg.org/css-shapes-2/
[CSS-TRANSFORMS-1]
Simon Fraser; et al. CSS Transforms Module Level 1. 2019년 2월 14일. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSS-TRANSFORMS-2]
Tab Atkins Jr.; et al. CSS Transforms Module Level 2. 2021년 11월 9일. WD. URL: https://www.w3.org/TR/css-transforms-2/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2024년 3월 12일. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-VALUES-5]
Tab Atkins Jr.; Elika Etemad; Miriam Suzanne. CSS Values and Units Module Level 5. 2024년 9월 17일. WD. URL: https://www.w3.org/TR/css-values-5/
[CSS21]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011년 6월 7일. REC. URL: https://www.w3.org/TR/CSS21/
[CSS3VAL]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2024년 3월 22일. CR. URL: https://www.w3.org/TR/css-values-3/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SVG11]
Erik Dahlström; et al. Scalable Vector Graphics (SVG) 1.1 (Second Edition). 2011년 8월 16일. REC. URL: https://www.w3.org/TR/SVG11/
[SVG2]
Amelia Bellamy-Royds; et al. Scalable Vector Graphics (SVG) 2. 2018년 10월 4일. CR. URL: https://www.w3.org/TR/SVG2/

정보성 참고문헌(Informative References)

[CSS-MASKING-1]
Dirk Schulze; Brian Birtles; Tab Atkins Jr.. CSS Masking Module Level 1. 2021년 8월 5일. CR. URL: https://www.w3.org/TR/css-masking-1/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS Positioned Layout Module Level 3. 2024년 8월 10일. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-ROUND-DISPLAY-1]
Jihye Hong. CSS Round Display Level 1. 2016년 12월 22일. WD. URL: https://www.w3.org/TR/css-round-display-1/
[MOTION-1]
Dirk Schulze; et al. Motion Path Module Level 1. 2018년 12월 18일. WD. URL: https://www.w3.org/TR/motion-1/

속성 색인

이름 초기값 적용 대상 상속 백분율 애니메이션 타입 정식 순서 계산된 값 미디어
offset [ <'offset-position'>? [ <'offset-path'> [ <'offset-distance'> || <'offset-rotate'> ]? ]? ]! [ / <'offset-anchor'> ]? 개별 속성 참조 변환 가능한 요소 개별 속성 참조 개별 속성 참조 개별 속성 참조 문법에 따름 개별 속성 참조
offset-anchor auto | <position> auto 변환 가능한 요소 no 요소의 reference box 너비와 높이에 상대적 계산된 값 기준 문법에 따름 auto 키워드 또는 계산된 <position> visual
offset-distance <length-percentage> 0 변환 가능한 요소 no offset path 길이에 상대적 계산된 값 기준 문법에 따름 계산된 <length-percentage> 값 visual
offset-path none | <offset-path> || <coord-box> none 변환 가능한 요소 no 해당 없음 계산된 값 기준 문법에 따름 지정된 값(as specified) visual
offset-position normal | auto | <position> normal 변환 가능한 요소 no containing block의 크기 기준 계산된 값 기준 문법에 따름 normal 또는 auto 키워드, 또는 계산된 <position> visual
offset-rotate [ auto | reverse ] || <angle> auto 변환 가능한 요소 no 해당 없음 계산된 값 기준 문법에 따름 auto가 앞에 붙을 수 있는 계산된 <angle> 값 visual

이슈 색인

모든 예시를 다시 작성해야 합니다.
어느 박스에 대해 resolve할지에 대한 논의는 Issue 503에서 진행 중입니다.