FxSVG
Functional SVG Handling Library
API
<svg></svg>
엘리먼트 커링
$$getSVG
<svg></svg>
엘리먼트를 반환합니다.
$$setSVG
내부적으로 사용하는 <svg></svg>
엘리먼트를 설정합니다.
$$els
SVGElement
를 담은 배열을 생성합니다.
$$el
SVGElement
를 생성합니다.
$$createSVGPoint
SVGPoint
객체를 생성합니다.
$$createSVGRect
SVGRect
객체를 생성합니다.
$$createSVGMatrix
SVGMatrix
객체를 생성합니다.
$$createSVGTransform
SVGTransform
객체를 생성합니다.
console.log($$createSVGTransform()());
$$createSVGTransformTranslate
type
이 SVGTransform.SVG_TRANSFORM_TRANSLATE
인 SVGTransform
객체를 생성합니다.
tx
로 x축 방향으로 이동할 값, ty
로 y축 방향으로 이동할 값을 설정합니다.
console.log($$createSVGTransformTranslate()());
console.log($$createSVGTransformTranslate()({ tx: 10 }));
console.log($$createSVGTransformTranslate()({ tx: 10, ty: 20 }));
$$createSVGTransformRotate
type
이 SVGTransform.SVG_TRANSFORM_ROTATE
인 SVGTransform
객체를 생성합니다.
cx
, cy
로 회전할 중심의 좌포를 설정하고 angle
로 회전할 각도(deg
단위)를 설정합니다.
cx
, cy
를 설정하지 않으면 (0, 0)
으로 설정합니다.
console.log($$createSVGTransformRotate()());
console.log($$createSVGTransformRotate()({ angle: 45 }));
console.log($$createSVGTransformRotate()({ cx: 10, cy: 10, angle: 30 }));
$$createSVGTransformScale
type
이 SVGTransform.SVG_TRANSFORM_SCALE
인 SVGTransform
객체를 생성합니다.
sx
로 x축 방향으로 확대할 비율을, sy
로 y축 방향으로 확대할 비율을 설정합니다.
sx
, sy
가 음수일 경우 해당 축을 기준으로 대칭이동합니다.
console.log($$createSVGTransformScale()());
console.log($$createSVGTransformScale()({ sx: 2 }));
console.log($$createSVGTransformScale()({ sx: 2, sy: 4 }));
$$createSVGTransformMatrix
type
이 SVGTransform.SVG_TRANSFORM_MATRIX
인 SVGTransform
객체를 생성합니다.
SVGTransform
에 인자로 받은 SVGMatrix
를 설정합니다.
console.log($$createSVGTransformMatrix()($$createSVGMatrix()()));
console.log(
$$createSVGTransformMatrix()(
$$createSVGMatrix()({ a: 2, b: 3, c: 4, d: 5, e: 6, f: 7 })
)
);
$$isTranslateSVGTransform
해당 SVGTransform
의 type
이 SVGTransform.SVG_TRANSFORM_TRANSLATE
인지 여부를 판단합니다.
console.log($$isTranslateSVGTransform($$createSVGTransformTranslate()()));
console.log($$isTranslateSVGTransform($$createSVGTransformRotate()()));
$$isRotateSVGTransform
해당 SVGTransform
의 type
이 SVGTransform.SVG_TRANSFORM_ROTATE
인지 여부를 판단합니다.
console.log($$isRotateSVGTransform($$createSVGTransformRotate()()));
console.log($$isRotateSVGTransform($$createSVGTransformTranslate()()));
$$isScaleSVGTransform
해당 SVGTransform
의 type
이 SVGTransform.SVG_TRANSFORM_SCALE
인지 여부를 판단합니다.
console.log($$isScaleSVGTransform($$createSVGTransformScale()()));
console.log($$isScaleSVGTransform($$createSVGTransformTranslate()()));
$$getBaseTransformList
입력받은 svg 객체의 transform.baseVal
값을 반환합니다.
SVGGraphicsElement
인터페이스는 transform
속성으로 SVGAnimatedTransformList
객체를 가지고 있고
해당 객체는 baseVal
속성으로 SVGTransformList
객체를 가지고 있습니다.
const $el = $$el()(`
<rect
x="0"
y="0"
width="10"
height="20"
transform="translate(10, 20) rotate(45, 100, 200) scale(2, 3)"
></rect>
`);
console.log($$getBaseTransformList($el));
$$getAnimTransformList
입력받은 svg 객체의 transform.animVal
값을 반환합니다.
SVGGraphicsElement
인터페이스는 transform
속성으로 SVGAnimatedTransformList
객체를 가지고 있고
해당 객체는 animVal
속성으로 SVGTransformList
객체를 가지고 있습니다.
animVal
은 SMIL 애니메이션이 적용된 경우에만 baseVal
과 다릅니다. 특별한 상황이 아닌 한 동일한 값을 가집니다.
하지만 값은 동일해도 다른 래퍼런스를 가리킵니다.
const $el = $$el()(`
<rect
x="0"
y="0"
width="10"
height="20"
transform="translate(10, 20) rotate(45, 100, 200) scale(2, 3)"
></rect>
`);
console.log($$getAnimTransformList($el));
$$getBoxPoints
svg 객체의 영역에 해당하는 SVGPoint
들을 반환합니다. 해당 svg 객체는 DOM 트리의 <svg></svg>
태그에 속해 있어야 합니다.
original
속성은 svg 객체가 transform
하기 전 영역입니다.
transformed
속성은 svg 객체가 transform
한 후 영역입니다.
bounding
속성은 svg 객체가 transform
한 후 영역을 덮는 최소 직사각형 영역입니다.
const $el = $$el()(`
<rect
x="10"
y="20"
width="100"
height="200"
transform="translate(400, 500)"
>
</rect>
`);
$svg.appendChild($el);
console.log($$getBoxPoints()($el));
$$getCenterPoint
svg 객체의 중심에 해당하는 SVGPoint
를 반환합니다. 해당 svg 객체는 DOM 트리의 <svg></svg>
태그에 속해 있어야 합니다.
original
속성은 svg 객체가 transform
하기 전 중심입니다.
transformed
속성은 svg 객체가 transform
한 후 중심입니다.
const $el = $$el()(`
<rect
x="10"
y="20"
width="100"
height="200"
transform="translate(400, 500)"
>
</rect>
`);
$svg.appendChild($el);
console.log($$getCenterPoint()($el));
$$consolidateTransformList
SVGTransformList
객체의 모든 SVGTransform
객체를 하나로 통합하여 SVGTransformList
객체를 새로 초기화합니다.
이 함수는 입력받은 SVGTransformList
를 수정합니다.
const $el = $$el()(`
<rect
x="10"
y="20"
width="100"
height="200"
transform="translate(400, 500) scale(2, 4)"
>
</rect>
`);
console.log($$getBaseTransformList($el));
$$consolidateTransformList($$getBaseTransformList($el));
console.log($$getBaseTransformList($el));
$$initTranslateTransform
svg 엘리먼트에 SVGTransform.SVG_TRANSFORM_TRANSLATE
타입의 SVGTransform
을 추가합니다.
SVGTransform
은 항상 transform.baseVal
에 해당하는 SVGTransformList
의 0
인덱스에 추가됩니다.
SVGTransformList
는 역순으로 적용되기 때문에 추가된 SVGTransform
은 가장 마지막에 적용됩니다.
초기 tx
, ty
값을 설정할 수 있으며 설정하지 않는 경우 모두 0
으로 초기화됩니다.
const $el = $$el()(`
<rect
x="10"
y="20"
width="100"
height="200"
>
</rect>
`);
console.log($$getBaseTransformList($el));
$$initTranslateTransform()($el, { tx: 10, ty: 20 });
console.log($$getBaseTransformList($el));
const $el = $$el()(`
<rect
x="10"
y="20"
width="100"
height="200"
transform="scale(2, 4)"
>
</rect>
`);
console.log($$getBaseTransformList($el));
$$initTranslateTransform()($el, { tx: 10, ty: 20 });
console.log($$getBaseTransformList($el));
$$updateTranslateTransform
SVGTransform.SVG_TRANSFORM_TRANSLATE
타입의 SVGTransform
의 tx
, ty
값을 수정합니다.
기존 tx
, ty
를 입력받은 tx
, ty
로 수정합니다.
수정한 SVGTransform
객체를 반환합니다.
이 함수는 인자로 받은 SVGTransform
객체를 직접 수정합니다.
const t = $$createSVGTransformTranslate()({ tx: 10, ty: 20 });
console.log(t);
$$updateTranslateTransform(t, { tx: 100, ty: 200 });
console.log(t);
$$appendTranslateTransform
SVGTransform.SVG_TRANSFORM_TRANSLATE
타입의 SVGTransform
의 tx
, ty
값을 수정합니다.
기존 tx
, ty
에 입력받은 tx
, ty
를 더한 결과로 수정합니다.
수정한 SVGTransform
객체를 반환합니다.
이 함수는 인자로 받은 SVGTransform
객체를 직접 수정합니다.
const t = $$createSVGTransformTranslate()({ tx: 10, ty: 20 });
console.log(t);
$$appendTranslateTransform(t, { tx: 100, ty: 200 });
console.log(t);
$$mergeTranslateTransform
svg 엘리먼트에 가장 마지막으로 적용된 SVGTransform
이 SVGTransform.SVG_TRANSFORM_TRANSLATE
타입인 경우
해당 SVGTransform
을 svg 엘리먼트의 x
, y
속성 (혹은 그에 준하는 속성) 에 반영합니다.
svg 엘리먼트에 다른 SVGTransform
이 있는 경우 각 SVGTransform
을 업데이트합니다.
cx
, cy
처럼 x
, y
위치를 나타내는 속성명이 다른 경우 x_name
, y_name
으로 해당 속성명을 설정할 수 있습니다.
const $el = $$el()(`
<rect
x="10"
y="20"
width="100"
height="200"
transform="scale(2, 4)"
>
</rect>
`);
console.log($$getBaseTransformList($el));
$$initTranslateTransform()($el, { tx: 500, ty: 600 });
console.log($$getBaseTransformList($el));
$$mergeTranslateTransform()($el);
console.log($$getBaseTransformList($el));
console.log($el);
const $el = $$el()(`
<circle
cx="10"
cy="20"
r="100"
transform="scale(2, 4)"
>
</circle>
`);
console.log($$getBaseTransformList($el));
$$initTranslateTransform()($el, { tx: 500, ty: 600 });
console.log($$getBaseTransformList($el));
$$mergeTranslateTransform()($el, { x_name: "cx", y_name: "cy" });
console.log($$getBaseTransformList($el));
console.log($el);
$$controlTranslateTransform
$$initTranslateTransform
, $$updateTranslateTransform
, $$appendTranslateTransform
, $$mergeTranslateTransform
함수들을
쉽게 사용할 수 있는 controller
를 생성합니다.
update
, append
, end
메소드를 체이닝하여 안전하게 조작할 수 있습니다.
x_name
, y_name
설정을 인자로 전달하지 않는 경우 end
메소드에서 $$mergeTranslateTransform
를 실행하지 않습니다.
const $el = $$el()(
`<circle cx="10" cy="20" r="100" transform="scale(2, 4)"></circle>`
);
const { controller } = $$controlTranslateTransform()($el, {
x_name: "cx",
y_name: "cy",
});
controller.update({ tx: 30, ty: 60 }).append({ tx: 70, ty: 40 }).end();
console.log($el);
$$initRotateTransform
svg 엘리먼트에 총 3개의 SVGTransform
을 순서대로 추가합니다.
SVGTransform.SVG_TRANSFORM_TRANSLATE
타입의 SVGTransform
(index
: 0
)SVGTransform.SVG_TRANSFORM_ROTATE
타입의 SVGTransform
(index
: 1
)SVGTransform.SVG_TRANSFORM_TRANSLATE
타입의 SVGTransform
(index
: 2
)
2번 SVGTransform
객체를 반환합니다.
1번, 3번 SVGTranform
객체는 회전 중심을 설정합니다.
회전 중심 cx
, cy
를 설정할 수 있습니다.
초기 회전 각도 angle
을 설정할 수 있습니다. 단위는 deg
입니다.
설정하지 않는 경우 모두 0
으로 초기화됩니다.
const $el = $$el()(`
<rect
x="10"
y="20"
width="100"
height="200"
>
</rect>
`);
console.log($$getBaseTransformList($el));
$$initRotateTransform()($el, { tx: 10, ty: 20 });
console.log($$getBaseTransformList($el));
const $el = $$el()(`
<rect
x="10"
y="20"
width="100"
height="200"
transform="scale(2, 4)"
>
</rect>
`);
console.log($$getBaseTransformList($el));
$$initTranslateTransform()($el, { tx: 10, ty: 20 });
console.log($$getBaseTransformList($el));
$$updateRotateTransform
SVGTransform.SVG_TRANSFORM_ROTATE
타입의 SVGTransform
의 angle
값을 수정합니다.
기존 angle
을 입력받은 angle
로 수정합니다.
cx
, cy
는 항상 0
으로 고정됩니다.
회전 중심을 설정해야 할 경우 SVGTransform.SVG_TRANSFORM_TRANSLATE
타입의 SVGTransform
을 앞, 뒤로 추가하는 방삭을 사용합니다.
수정한 SVGTransform
객체를 반환합니다.
이 함수는 인자로 받은 SVGTransform
객체를 직접 수정합니다.
const t = $$createSVGTransformRotate()({ angle: 30 });
console.log(t);
$$updateRotateTransform(t, { angle: 60 });
console.log(t);
$$appendRotateTransform
SVGTransform.SVG_TRANSFORM_ROTATE
타입의 SVGTransform
의 angle
값을 수정합니다.
기존 angle
에 입력받은 angle
을 더한 값으로 수정합니다.
cx
, cy
는 항상 0
으로 고정됩니다.
회전 중심을 설정해야 할 경우 SVGTransform.SVG_TRANSFORM_TRANSLATE
타입의 SVGTransform
을 앞, 뒤로 추가하는 방삭을 사용합니다.
수정한 SVGTransform
객체를 반환합니다.
이 함수는 인자로 받은 SVGTransform
객체를 직접 수정합니다.
const t = $$createSVGTransformRotate()({ angle: 45 });
console.log(t);
$$appendRotateTransform(t, { angle: 30 });
console.log(t);
$$mergeRotateTransform
$$initRotateTransform
으로 적용된 3개의 SVGTransform
객체를 하나의 SVGTransform
으로 병합합니다.
한 번 병합한 SVGTransform
을 $$updateRotateTransform
이나 $$appendRotateTransform
으로 변경하는 것은 안전하지 않습니다.
cx
, cy
가 0
이 아닌 경우 회전 변환 중심이 의도치 않게 수정될 수 있습니다.
const $el = $$el()(`
<rect
x="10"
y="20"
width="100"
height="200"
transform="scale(2, 4)"
>
</rect>
`);
console.log($$getBaseTransformList($el));
$$initRotateTransform()($el, { angle: 30, cx: 10, cy: 20 });
console.log($$getBaseTransformList($el));
$$mergeRotateTransform()($el);
console.log($$getBaseTransformList($el));
console.log($el);
$$controlRotateTransform
$$initRotateTransform
, $$updateRotateTransform
, $$appendRotateTransform
, $$mergeRotateTransform
함수들을
쉽게 사용할 수 있는 controller
를 생성합니다.
update
, append
, end
메소드를 체이닝하여 안전하게 조작할 수 있습니다.
const $el = $$el()(
`<rect x="10" y="20" width="100" height="200" transform="scale(2, 4)"></rect>`
);
const { controller } = $$controlTranslateTransform()($el, {
cx: 10,
cy: 20,
});
controller.update({ angle: 30 }).append({ angle: 45 }).end();
console.log($el);