๊ด๋ฆฌ์์ ์ฐธ๊ณ ์ฌํญ: React 15๋ถํฐ ๋ธ๋ผ์ฐ์ ์์ ์ค์ ๋ก ๊ตฌํ๋๋ SVG ์ฌ์์ ํ์ ์งํฉ์ ์๋ฒฝํ๊ฒ ์ง์ํด์ผ ํฉ๋๋ค.
๋๋ฝ๋ ์์ฑ์ ์ฐพ๊ฑฐ๋ ํ๊ทธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ์ง ์๋ ๊ฒฝ์ฐ ์๋์ ์๊ฒฌ์ ์์ฑํด ์ฃผ์ธ์. React.DOM.*
ํฉํ ๋ฆฌ ํจ์๋ ๋ชจ๋ ํ๊ทธ๋ฅผ ์ ๊ณตํ์ง ์์ ์ ์์ง๋ง ๋๋ฝ๋ ํ๊ทธ์ ๋ํด React.createFactory
๋๋ React.createElement()
์ง์ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค. ๋๋ React.createElement()
๋ณํ๋๊ณ ๋ณธ์ง์ ์ผ๋ก ๋ชจ๋ ํ๊ทธ๋ฅผ ์ง์ํ๋ JSX๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ์์
์ ํ๋ ์ฌ๋์ด ์์ต๋๊น? filter
ํ๊ทธ๋ฅผ ๊ตฌํํ๊ณ ์ถ์ต๋๋ค.
preserveAspectRatio
๋ ๋๋ฝ๋ ๊ฒ ๊ฐ์ต๋๋ค: http://jsfiddle.net/jonase/kb3gN/3025/
์ด์ ๋ํ PR์ ์์ฑํด์ผ ํฉ๋๊น, ์๋๋ฉด ๋๋ฝ๋ ๋ชจ๋ ์์ฑ/ํ๊ทธ๋ฅผ ๋จผ์ ์์งํ๊ณ ๋์ค์ ๋จ์ผ ํจ์น๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ ํธํฉ๋๊น?
[ํธ์ง] reservedAspectRatio๊ฐ ์ปค๋ฐ์ ์ถ๊ฐ๋์์ต๋๋ค. https://github.com/facebook/react/commit/0f0328f0930d7fcf0b92cde40b1d6966cd747054
์๋ .
marker* ์์ฑ์ ์์์ ์ธ๊ธํ #1738์ @cassus ๋๋ถ์ ์ถ๊ฐ๋์์ต๋๋ค.
๊ด๋ จ <marker>
SVG ์์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
https://developer.mozilla.org/en-US/docs/Web/SVG/Element/marker
๋๋ ์ด๊ฒ ํ์ํ๋ค๋ ๊ฑธ ์ด์ ์์ผ ๊นจ๋ฌ์๋ค. ์ฌ๊ธฐ์ ๋ํ ์ข์ ๊ฐ์๊ฐ ์์ต๋๋ค. http://tutorials.jenkov.com/svg/marker-element.html
์ด "1์ธ์ด ํ์๋ก ํ๋ ๋๋ก ์ฌ๊ธฐ์ ๊ธฐ์ ์์์ ์์์ ์์ฑ์ ์ถ๊ฐ"ํ๋ ์ ๊ทผ ๋ฐฉ์์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฒ์ ์ง์ํ๊ฑฐ๋ ์์ ์ง์ํ์ง ์์์ผ ํฉ๋๋ค.
๋๋ http://www.w3.org/TR/2003/REC-SVG11-20030114/attindex.html ์ _๊ฑฐ์_ ๋ชจ๋ ๊ฒ(๋ค์์คํ์ด์ค ์์ฑ์ ์ ์ธ)์ ์คํฌ๋ฉํ๊ณ ๋ค์์ ์๊ฐํด ๋์ต๋๋ค. https://github.com/zpao/ ๋ฐ์/๋น๊ต/fuck-svg.
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ถ์๋ ๋น๋์ ~2kb๋ฅผ ์ถ๊ฐํ๊ณ (ํด๋ก์ ์ปดํ์ผ๋ฌ๋ก ์ ๋ถ์์ง์ง๋ง) ์ง๊ธ์ ๊ทธ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๊ณ ์ถ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ณ๋์ SVG ๋น๋๋ฅผ ์ํํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ์ต๋๋ค. ๋๋ ์ ๋์จ์ผ๋ก ๋ณ๋๋ก ๋ฐฐ์กํฉ๋๋ค.
@zpao ๋ง์ต๋๋ค. ์์ ํ SVG ์ง์์ ์ ๋์จ์ด ๋ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ ค๋ฉด ๊ฐ๊ฐ์๊ฐ ๊ฒฝ๊ณ ๋ฅผ ์ค์ ํ์ฌ ์๋ฅผ ๋ค์ด React.DOM.circle์ด React.SVG.circle์ด ๋๋ ๊ฒ์ ์๋ ค์ผ ํฉ๋๋ค.
React.SVG.circle์ ๊ฒฝ์ฐ +1
@zpao
์์ ํ SVG ์ ๋์จ์ ์ข์ ์ ๊ทผ ๋ฐฉ์์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ๋ง์ ํ๋ก์ ํธ์๋ SVG๊ฐ ํ์ํ์ง ์์ผ๋ฏ๋ก ์ฝ๋์ ๋ฌด๊ฒ๋ฅผ ๋์ด์๋ ์ ๋ฉ๋๋ค. ๋ค๋ฅธ ํ๋ก์ ํธ๋ ์ง์์ด ํ์ํ๋ฉฐ ์ ๋ฐ๋ง ์ง์ํ๋ ๊ฒ์ ์ด์น์ ๋ง์ง ์์ต๋๋ค.
+1
์ด๋ฏธ์ง ์ง์ +1
์ด๋ฏธ์ง ์ง์๋ +1
<use>
์ง์์ +1. ์ฐ๋ฆฌ๋ sv ์์ด์ฝ ์ธํธ์ ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์๋์ํค๊ธฐ ์ํด dangerouslySetHTML
๋ฅผ ์๋ํ๊ณ ์์ง๋ง, ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ์๋ํ์ง ์์ต๋๋ค.
strokeDashoffset
๋๋ฝ ๋ค์๊ณผ ๊ฐ์ด ์งํ๋ฅ ํ์์ค์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค. http://codepen.io/JMChristensen/pen/Ablch
strokeDashoffset
๋ํด +1
๋ํ ์งํ๋ฅ ํ์์ค์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค.
<text>
์์
ํ ๋ alignment-baseline
๊ฐ) ๋๋ฝ๋์์ต๋๋ค.
์๋ง๋ ๋๊ตฐ๊ฐ๊ฐ http://www.w3.org/TR/SVG/Overview.html์ ํตํด ํธ๋กค๋งํ์ฌ ๋ชจ๋ ์์ฑ๊ณผ ์์ฑ์ ์ป์ ์์ง๊ฐ ์์ต๋๊น? (์ด ๋ชฉ์ ์ ์ํด ๋ ๋์ URL์ด ์์ ์ ์์ง๋ง ํ์คํ์ง ์์ต๋๋ค...)
๋ ๋ค๋ฅธ ๋์์ ์์ค ์ฝ๋์ ํ ์คํธ์์ ์ด๊ฒ์ ๋ณ๊ฒฝํ ์์น๋ฅผ ์๋ ๊ฒ์ ๋๋ค. ๊ทธ๋์ผ ๋ฐ์ํ ์ปค๋ฐ์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
FWIW, ๋๋ถ๋ถ์ ์์ฑ์ ์ฌ์ ํ โโ์คํ์ผ ์์ฑ์ ์ฌ์ฉํ์ฌ ์ ์ฉํ ์ ์์ต๋๋ค.
<path style={{strokeDashoffset: 100}} />
@syranide ์ ๊ฐ ๊ทธ๋ ๊ฒ ํ์ต๋๋ค(์๋์ผ๋ก ํ๋ ๊ฒ์ ๋ฏธ์น ์ง์ด๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ ์๋ํ๋จ) - https://github.com/zpao/react/compare/fuck-svg. ์ด๋ฏธ ๋ณํฉ๋์ง ์์ ์ด์ ์ ๋ํ ์ด์ ์๊ฒฌ์ ์ฐธ์กฐํ์ญ์์ค.
@ThomasDeutsch ์ด์ SVG ๊ด๋ จ pull ์์ฒญ ๋๋ถ๋ถ์ ์ฐธ์กฐํ์ธ์. ์ฆ, ํ๋์ฉ ์ถ๊ฐํ๋ ๊ฒ๋ณด๋ค ๊ณํ์ ํ์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค(์ด์ ์๊ฒฌ๋ ์๋ดํด ๋๋ฆฌ๊ฒ ์ต๋๋ค).
+1 for textPath - ํ์ฌ ์์ ์ค์ธ ํ๋ก์ ํธ์ ํ์ํ๋ฉฐ ์ง๊ธ์ ๋ถ์พํ ์๋ฃจ์ ์ ํดํนํ๊ณ ์์ต๋๋ค. React SVG ํ๋ฌ๊ทธ์ธ ํฉ ๊ตฌํ์ ๊ธฐ์ฌํ๊ณ ์ถ์ต๋๋ค.
:+1: ์ ์ฒด SVG ์ถ๊ฐ ๊ธฐ๋ฅ์ ๊ฒฝ์ฐ. ์ธ์ ๋ฐฐ์ก๋ ์ง์ ๋ํ ๊ฒฌ์ ์ด ์์ต๋๊น?
์ธ๋ ๊ฐ์ฒด์ ๋ํด +1
์ธ๋ ๊ฐ์ฒด์ ๋ํด +1
svg ์คํ๋ผ์ดํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์์ฑ xlink:href
.
<use>
์ง์ +1
ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด https://www.npmjs.org/package/react-inlinesvg ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์์ฑ: maskUnits ๋ฐ maskContentUnits(# 2056)
๋ง์คํฌ ์์ฑ #2535
patternTransform
ํ
์คํธ ์์ฑ text-anchor
textPath์ ๊ฒฝ์ฐ +1
svg ์์ด์ฝ ์ฒ๋ฆฌ์ ๊ฒฝ์ฐ <use>
์ +1์
๋๋ค.
SVG ์ถ๊ฐ ๊ธฐ๋ฅ์ ๊ฒฝ์ฐ +1์
๋๋ค. ํ์ฌ ํ๋ก์ ํธ์ <clipPath>
๋ง ํ์ํ์ง๋ง ๋ฏธ๋์ ๋ฌด์์ด ํ์ํ ์ง ๋๊ฐ ์๊ฒ ์ต๋๊น? ํฌ๊ด์ ์ธ ์ถ๊ฐ ๊ธฐ๋ฅ์ ๋งค์ฐ ๋์์ด ๋ ๊ฒ์
๋๋ค.
์ถ๊ฐ ๊ธฐ๋ฅ์ ๊ฒฝ์ฐ +1์ ๋๋ค.
์ฐ๋ฆฌ๋ SVG๋ฅผ React์ ํจ๊ป ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํ ๊ณํ์ด๋ฏ๋ก ์ฐ๋ฆฌ์ ๊ฐ์ ํ๋ก์ ํธ๋ฅผ ์ํ ์์ ํ SVG ์ ๋์จ์ ์ข์ ์๊ฐ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก textPath ๋ฐ ๋ณด๋ค ์์ ํ svg ์ง์์ ๋ํด +1์ ๋๋ค.
SVG๊ฐ ์์ ํ ์ง์๋ ๋๊น์ง ์ ์ ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ํ์ํ ์์๋ฅผ ๋ช
์์ ์ผ๋ก ๋ ๋๋งํ๊ณ ์ ์ธํ๊ธฐ ์ํด ํต๊ณผํด์ผ ํ๋ svg ์์ฑ์ React์ ์๋ ค์ฃผ๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด <use>
๋ ๋ค์๊ณผ ๊ฐ์ด ์ก์ธ์คํ ์ ์์ต๋๋ค.
var DOMProperty = require('react/lib/DOMProperty');
// xlink:href is not a standardly-supported svg attribute, but you can tell
// React that it is ok.
DOMProperty.injection.injectDOMPropertyConfig({
isCustomAttribute: function (attributeName) {
return (attributeName === 'xlink:href');
}
});
var SvgButton = React.createClass({
render: function render() {
var use = React.createElement('use', {
'xlink:href': '#' + this.props.icon
});
return (
<button>
<svg>
{ use }
</svg>
<div>{ this.props.label }</div>
</button>
);
});
@jeffkole ์ด ์์ ์ ์ํํ ๋ ์ฃผ์ํ์ญ์์ค. ์์ฑ์ด ๋ณ๊ฒฝ๋๋ฉด React๋ ์ฌ์ ํ setAttribute(setAttributeNS๊ฐ ์๋)๋ฅผ ํธ์ถํ๊ณ ์ ๋ฐ์ดํธ๊ฐ ์ ๋๋ก ์๋ํ์ง ์์ ์ ์์ต๋๋ค.
@spicyj React์์ ๋ค์์คํ์ด์ค ์ง์์ด ๋ณด์ด์ง ์์ต๋๋ค(์ฆ, ์ฝ๋๋ฒ ์ด์ค์์ setAttributeNS
์ ๋ํ ํธ์ถ์ด ์์). ๋ค์์คํ์ด์ค๋ก ์์ฑ์ ์ค์ ํ๋ ์ ์ ํ ๋ฐฉ๋ฒ์ ๋ํ ์ ์์ด ์์ต๋๊น?
๋ค์์คํ์ด์ค ์์ฑ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ํ์ ํ์ง ๋ชปํ๊ณ ํ์ฌ ์ง์ํ์ง ์์ต๋๋ค. ์ฃ์กํฉ๋๋ค.
vector-effect
์ด๋ฉด ์ข์ ๊ฒ์
๋๋ค. ๊ทธ ๋์ ์ฌ์ฉํ ์ ์๋ ๊ณ ์ ๋๋น ์คํธ๋กํฌ๋ฅผ ์ ์งํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ธ๋ ๊ฐ์ฒด์ ๋ํด +1
ํ ์คํธ ๊ธฐ์ค ์์ฑ์ ๋ํ ๋ด PR ์ฐธ์กฐ: #2697
์ค ์ ์ฅ use
ํ๊ทธ๊ฐ ํ์ํฉ๋๋ค :์ค๋ง:
๋๋
<svg dangerouslySetInnerHTML={{ __html: '<use xlink:href="#' + this.props.icon + '"/>' }} />
์ถ์ ํ์ง๋ง ์๋ํฉ๋๋ค.
:+1: ์ด๊ฒ์ ๋ํด
์ ๋์จ์์ ์์ ํ svg ์ง์์ ์ํด +1
:+1:
@zpao @spicyj ReactDOM
๋ฐ SVGDOMPropertyConfig
์์ญ์ด ํจ์น ์์ด ์ด๋ฌํ ๊ฐ๋ณ SVG ์์๋ฅผ React์ ์ถ๊ฐํ๋ ์ง์ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ฃ์กํฉ๋๋ค.
์ด๋ฏธ์ง ๋ฐ foreignObject์ ๋ํด +1
์ธ๋ ๊ฐ์ฒด์ ๋ํด +1
animate
๊ฐ ์๋ํ์ง ์์ผ๋ฉฐ ์ผ๋ถ ์์ฑ์ด ์์ ์ ์์ต๋๋ค. https://developer.mozilla.org/en-US/docs/Web/SVG/Element/animate
์ ๋์จ์์ SVG๋ฅผ ์ง์ํ๋ ์ํ๋ ๋ฌด์์ ๋๊น? ์ค๋ ๋ฐฉ๊ธ ์ด๊ฒ์ ๋ถ๋ช์ณค์ต๋๋ค :-(
cc @xymostech @MichelleTodd
๋ค์์คํ์ด์ค ์์ฑ์ ๊ฒฝ์ฐ +1.
์ ๋์จ์์ ์์ ํ svg ์ง์์ ์ํด +1
SVG ์์ฑ ์ง์์ ์ํด +1000 :-)
์ง์์ ์ํด +1
"fill-rule" ์์ฑ ์ถ๊ฐ ์์ฒญ(์๋ง๋ "fillRule")
SVG ์ ๋์จ๋ ๋ณด๊ณ ์ถ์ต๋๋ค :+1:
React ํต์ฌํ, ์ด์ ๋ํ ๋นํ์ธ๋ ์คํ ๋ฆฌ/ํ ๋ก ์ด ์์ต๋๊น?
ํน๋ณํ ์ด๊ฒ์ ๋ํ ๊ฒ์ ์๋์ง๋ง #3718, #3763์ ๋ชจ๋ SVG ์์ ์ค์ด๋ฉฐ #3067๋ ์ด ์์ฑ ๋ณ๊ฒฝ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
์์ ํ SVG ์ง์์ ์ํด +1. ๊ทธ๋ฐ ์ผ์ด ๋ฐ์ํ๊ธฐ ์ ์ ์ฌ์ฉ์ ์ ์ ํ๊ทธ์ ์์ฑ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. ์๋ฌด๋ ์ ๋ฅผ ๋์ ์ฃผ์๊ฒ ์ต๋๊น?
๋ง์ปค ์์๋ ๋๋ฝ๋์์ต๋๋ค(https://developer.mozilla.org/en/docs/Web/SVG/Element/marker).
@ersagunkuruca ๊ทธ ๋์ https://gist.github.com/akre54/80eaa63762ea499029f0 ์๋
:+1: ๋ง์ปค์ฉ!
SVG์ ๋ํ ๋ชจ๋ ๊ฒ +1.
:+1
animateTransform ์์ฑ์ ๋ํ ์ง์์ ์ด๋ป์ต๋๊น?
<path
d="M120 60c0-31.13-26.86-60-60-60">
<animateTransform
attributeName="transform"
type="rotate"
from="0 60 60"
to="360 60 60"
dur="1.5s"
repeatCount="indefinite" />
</path>
ํ์ฌ๋ ๋ค์์ผ๋ก ๋๋ฉ๋๋ค.
<path d="M120 60c0-31.13-26.86-60-60-60" data-reactid=".0.0.0.1.6.0.0.$0.0.0.2">
<animateTransform type="rotate" data-reactid=".0.0.0.1.6.0.0.$0.0.0.2.0"></animateTransform>
</path>
์ด๋ฏธ์ง์ ๊ฒฝ์ฐ +1
+๋ชจ๋ SVG ์ง์
ํํฐ์ +1
์ฌ์ฉ ์ง์์ +1!
๋ค์์คํ์ด์ค ์์ฑ์ ๊ฒฝ์ฐ +1
use
๋ฐ filter
์์ฑ ์ง์์ ๋ํ +1
<image>
์ง์์ +1. ํด๋ฆฌํ ๊ฒฝ๋ก ์์ ์ด๋ฏธ์ง๊ฐ ์๋ ์ธ๋ผ์ธ SVG๋ฅผ ๋ ๋๋งํ๋ ค๋ฉด React๊ฐ ํ์ํ๋ฉฐ <svg>
ํ๊ทธ์ xmlns:xlink="http://www.w3.org/1999/xlink"
์์ฑ์ ๊ฑธ๋ ค ์์ต๋๋ค.
filter
๋ํด +1
@zpao ์ ์๊ฒฌ์ ๊ณ ๋ คํ ๋ ์ด ๋ฌธ์ ๋ฅผ ์ ๊ฐ์ผ ํฉ๋๊น? ์๋๋ฉด ์ต์ํ ํด๋น ์ ๋ณด๋ก OP๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๊น? ๋๋ ์ ๋ฐ์ดํธ๋ฅผ ์ํด ์ค๋ ๋๋ฅผ ๊ตฌ๋ ํ๊ณ ์์ง๋ง @zpao ์ ์๊ฒฌ์ ๋ฌปํ๊ณ (์์ ์ด ์ด๋ฏธ ์๋ฃ๋์๋ค๋ ์ฌ์ค๊ณผ ํจ๊ป) ์ ์ฒด ์ค๋ ๋๋ฅผ ์ฝ์ง ์์ ์ฌ๋์๊ฒ๋ ๋ค์ ํผ๋์ค๋ฝ์ต๋๋ค.
@zpao ์ ์๊ฒฌ์ ํ์ฌ ๋ฐ์์ ๋ด์ฅ๋์ด ์์ง ์์ ์ด์ ์ ๋ํ ๊ฒฐ์ ์ ์ค๋ช
ํ์ง๋ง ์ ๋์จ์ด ์กด์ฌํ์ง ์๋ ์ด์ ์ ๋ํ ๋ ๋์ ์ค๋ช
์ด ์์ต๋๊น?
์ด๊ฒ์ ์ฌ์ ํ โโํ๊ตฌ ํ ์์๋ ๊ฒ์
๋๊น?
๋ง์ปค์ ๊ฒฝ์ฐ +1: refx, refy, orient
ํ ์คํธ ์์ฑ์ ๊ฒฝ์ฐ +1: ํ์ , ์ง๋ฐฐ์ ๊ธฐ์ค์
+1 ์ ๋์จ
+1 ์ ๋์จ
์ค์ ๋ก React๋ core 'react'์ dom 'react-dom'์ผ๋ก ๋ถ๋ฆฌ๋๋ ๊ณผ์ ์ ์๋๋ฐ, ๋๋์ด 'react-svg'๊ฐ ๋ค์ด๊ฐ ๊ณณ์ด ์๋๊น ์ถ์ต๋๋ค.
ํํฐ์ ๊ฒฝ์ฐ +1์ ๋๋ค.
vector-effect
์์ฑ์ ์
๋ ฅํ์ธ์.
SVG ํ๊ทธ/์์ฑ์ด ํ์ํ ๋ ์์ฒญํ๋ ์ฌ๋๋ค์ React์์ ๋งค์ฐ ์ด์
ํ ๋ชจ๋ธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ด์ง์์ ์๋ํ๋ SVG๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํด dangerouslySetInnerHTML
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ ๊ฒ์ ์ด๋ฆฌ์์ ์ผ์
๋๋ค. ์ฆ, ๋ค์์ ๋๋ฝ๋ ํญ๋ชฉ ์ค ์ผ๋ถ์
๋๋ค.
_ํ๊ทธ:_
feMorphology
feOffset
feColorMatrix
feMerge
feMergeNode
_์์ฑ:_
filterUnits
stdDeviation
values
in
operator
๊ทธ๋ฆฌ๊ณ ์๋ง๋ ๋ ๋ฒ์ฃผ ๋ชจ๋์์ ํจ์ฌ ๋ ๋ง์ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ๋ค์ ๋ด๊ฐ ์์ ํ๊ณ ์๋ ํน์ SVG ์ฝ๋์ ์ผ๋ถ์ผ ๋ฟ์ ๋๋ค.
vector-effect
๋ํด +1
stdDeviation
๋ํด +1
๋ณ๋์ ์์ ํ React.SVG์ ๊ฒฝ์ฐ +1์ ๋๋ค. ๋๋ ์ง๊ธ๊น์ง React์์ SVG๋ก ์์ ํ๋ ๊ฒ์ ์ข์ํ์ง๋ง ์ง์์ด ๋ถ์์ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ค ์ค๋ณต์กํ ์์ฉ ํ๋ก๊ทธ๋จ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@spicyj ๋ ๊ณ์ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๋ณ๋์ ๊ตฌ์ฑ์ ์ ๊ฑฐํ ๊ณํ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ณง ์๋ฃ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๋์ ๊ฝ ์ก์์ฃผ์ธ์.
animateTransform์ ๊ฒฝ์ฐ +1
์ง๋ฐฐ ๊ธฐ์ค์ ์ ๊ฒฝ์ฐ +1(#3199.)
@zpao๊ฐ ๋งํ๋ฏ์ด ๋ชจ๋ ์์ฑ์ ์ฌ์ฉํ ์ ์๋๋ก ์ด ๋ฌธ์ ๋ฅผ ๊ณง ์์ ํ๊ฒ ์ต๋๋ค.
๊ทธ๋๊น์ง ์ด ๋ฌธ์ ๋ฅผ ์ ๊ธ๋๋ค.
์ด๊ฒ์ https://github.com/facebook/react/pull/5714 ์์ ์์ ๋์์ต๋๋ค
focusable
๋ฐ vector-effect
)์ ์๋์ผ๋ก ์ถ๊ฐํ์ต๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ด v15์ ์ ์ฉ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.ํฅ๋ฏธ๋กญ๊ฒ๋ _tag_ ํ์ดํธ๋ฆฌ์คํธ๊ฐ ๋ ์ด์ ๊ด๋ จ์ฑ์ด ์๋์ง ํ์คํ์ง ์์ต๋๋ค. ์ง๊ธ๊น์ง <marker>
, <textPath>
, <feGaussianBlur>
๋ฐ ์ด ํธ์ ์ฐ๊ฒฐ๋ PR์์ ์์ฒญ๋ ๊ธฐํ ํ๊ทธ๋ฅผ ๋ง์คํฐ์ ๋ฌธ์ ์์ด ์ฌ์ฉํ ์ ์์์ต๋๋ค. fbjs
์ฌ์ ํ SVG ํ๊ทธ ํ์ดํธ๋ฆฌ์คํธ๋ฅผ ์ ์งํ๊ณ ์๊ณ ํ๊ทธ๊ฐ ๋๋ฝ๋ ์ด์ ๋ฅผ ์ค๋ช
ํ ๋งํผ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์์ง ๋ชปํฉ๋๋ค. ๊ทธ๋์ @zpao ๋๋ @spicyj ๊ฐ ์ด๋ฅผ ๋ช
ํํ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. #6243์ ๋ณด์ํ๊ธฐ ์ํด ๋๋ฝ๋ ํ๊ทธ๋ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
์์ฑ ํ์ดํธ๋ฆฌ์คํธ๊ฐ ์ฌ์ ํ ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ฅผ ํ๊ณ ์์ง๋ง ์ฌ์์ ์๊ณ ๋ธ๋ผ์ฐ์ ์ ์ํด ๊ตฌํ๋๋ ๋๋ถ๋ถ์ ์์ฑ์ด ์ง์๋๋ฏ๋ก ์ด์ ์์ฒญ์ด ํจ์ฌ ์ค์ด๋ค๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ต์ข v15์์ ์ฌ์ ํ ์ง์๋์ง ์๋ ๊ฒ์ด ์์ผ๋ฉด ์ฌ๊ธฐ์์ ์๋ ค์ฃผ์ญ์์ค.
์ด ์ฐธ๊ณ ์ฌํญ์ ๋ชจ๋ SVG ์์ฑ์ ํต๊ณผํ๋ v15 RC1์๋ ์ ์ฉ๋์ง ์์ต๋๋ค.
xlink:href
์์ฑ์ ๋ํด ์๋นํ ๋ง์ ํผ๋์ด ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ํ์ฌ ์ง์ _is_ ํ์ง๋ง ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์์ฑํด์ผ ํฉ๋๋ค.
<use xlinkHref="#shape" x="50" y="50" />
React๋ 0.14.x์์๋ ์ด๋ฅผ xlink:href
๋ก ์ฌ๋ฐ๋ฅด๊ฒ ๋ณํํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ด ๋ฐ์ด์ฌ๋ฆฐ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ด ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ feFuncR
, ํนํ ์์ฑ( slope
, intercept
๋ฑ)๊ณผ ๊ฐ์ ์ผ๋ถ ํํฐ ์์๋ฅผ ์ธ์ํ๊ธฐ ์ํด React๊ฐ ํ์ํ์ต๋๋ค. 15.0-rc2์์๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ง๋ง 0.14.x์ ๊ฒฝ์ฐ react
/ react-dom
๋ฅผ ๋จผ์ ๊ฐ์ ธ์ค๊ธฐ ์ ์ react/lib/SVGDOMPropertyConfig
๋ด๋ณด๋ธ ์ฌ์ ์ ์ด๋ฌํ ์์ฑ์ ์ถ๊ฐํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ๊ทธ ์์ฒด. ์:
// Needed to set correct xmlns on <svg> and to preserve attributes on feFunc*.
// Required for 0.14.x. May become unnecessary with 15.x
var SVGDOMPropertyConfig = require("react/lib/SVGDOMPropertyConfig");
var DOMProperty = require("react/lib/DOMProperty");
var MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE;
SVGDOMPropertyConfig.Properties.in = MUST_USE_ATTRIBUTE;
SVGDOMPropertyConfig.Properties.intercept = MUST_USE_ATTRIBUTE;
SVGDOMPropertyConfig.Properties.slope = MUST_USE_ATTRIBUTE;
SVGDOMPropertyConfig.Properties.xmlns = MUST_USE_ATTRIBUTE;
var React = require("react");
var render = require("react-dom").render;
์ด๊ฒ์ ๋ถ๋ช
ํ ํดํน์ด์ง๋ง dangerouslySetInnerHTML
์ด๊ฒ์ด ์๋ํ๋ ๋์ ๊ณต์์ ์ผ๋ก ๋ ธ์ถ๋ API๊ฐ ์๋๋ฉฐ ๋ถ ๋๋ ํจ์น ๋ฆด๋ฆฌ์ค์์ ์ค๋จ๋ ์ ์์ต๋๋ค. ๋น์ ์ ๊ทธ๊ฒ์ ์ฌ์ฉํ ์ ์์ง๋ง ์์ ์ ์ฑ ์์ ๋๋ค. ์ฌ์ ํ ๋๋ฝ๋ ๊ฒ์ด ์์ผ๋ฉด ์ถ๊ฐํ ์ ์๋๋ก ์ ํฌ์ ํ๋ ฅํ์ญ์์ค. 15 RC2์ ๋ฌธ์ ๊ฐ ์๋ค๋ ์์์ ๋ค์ผ๋ ๊ธฐ์ฉ๋๋ค.
๋ค, ์ ๋์ ์ผ๋ก. ๋๋ 15๊ฐ RC ์ํ์์ ๋์ฌ ๋๊น์ง๋ง ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
v15.0 ์ (๊ฑฐ์) ์์ ํ SVG ์ง์์ xmlns
๋ฐ xmlnsXlink
์ ๊ฐ์ ์ผ๋ถ ๋ค์์คํ์ด์ค ์์ฑ์ ๋ ๋๋งํ ๋ ์ ์ฉํ ์ ์์ผ๋ฉฐ ํ์ํ ๋ ๊ด์ฐฎ์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์์ svg
.
.svg
์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ค๋ฉด ํด๋น ์์ฑ์ด ํ์ํฉ๋๋ค.
ReactDOMServer.renderToStaticMarkup(<MyCustomSVG />)
๋ฐ๋ผ์ ์์ ์ฝ๋๋ฅผ ์ํํ๋ฉด ์๋ํ์ง ์์ต๋๋ค.
์๋ง๋ ๋ค์๊ณผ ๊ฐ์ ์ฌ์ค๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
...
document.createElement
์ฌ์ฉ ๋๋ถ์ ๋ ์ด์ SVG ํ๊ทธ ๋ชฉ๋ก์ ์ ์งํ ํ์๊ฐ ์์ผ๋ฏ๋ก ์ด์ ์ ์ง์๋์ง ์์๋ SVG ํ๊ทธ๋ React 15์์ ์ ๋๋ก ์๋ํฉ๋๋ค.
document.createElementNS
์๋๋๋ค.
document.createElementNS๊ฐ ์๋๋๋ค.
๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๋๋ฌด ๋จ์ํ์ง๋ง <svg>
ํ๊ทธ ์๋์ ์์ ๋ createElementNS
๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด ๋ฌธ์ ๋ฅผ ์ฌํํ๋ JSFiddle๊ณผ ํจ๊ป ๋ฌธ์ ๋ฅผ ์ค๋ช
ํ๋ ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ ์ถํ ์ ์์ต๋๊น? ๊ฐ์ฌ ํด์!
@gaearon ๊ฐ์ฌํฉ๋๋ค. ReactDOM
ํตํด ๋ธ๋ผ์ฐ์ ์์ svg
๋ฅผ ๋ ๋๋งํ ๋ ๋ฐ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ง๋ ์ด ๋ฌธ์ ๋ ReactDOMServer
์ ๊ด๋ จ์ด ์์ ๊ฒ์
๋๋ค.
๋ค์์ ๋ ๋๋ง๋ SVG
์ xmlNS
๋ฐ xmlnsXlink
์์ฑ์ด ๋๋ฝ๋ renderToStaticMarkup()
ํตํด ์์ฑ๋ ์ฝ๋๋ฅผ ํ์ ํ๋ ํ ์
๋๋ค.
์ด ๊ฒฝ์ฐ ๋ณ๋๋ก ์ด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ ์ ์์ต๋๋ค.
์, xmlns
๋ฐ xmlns:Xlink
์ด(๊ฐ) ์์ต๋๋ค. https://github.com/facebook/react/pull/6471 ์ ์ถ๊ฐ ์์
์ด ์งํ ์ค์
๋๋ค.
์ง์๋๋ ํ๊ทธ ๋ชฉ๋ก์ ์ฌ์ ํ <animate>
๋ฐ <animateTransform>
๊ฐ ํ์๋์ง ์์ต๋๋ค. ์ง์ํ์ง ์๊ธฐ๋ก ํ ์ด์ ๊ฐ ์์ต๋๊น?
@์คํ
์ด์ ๋ชจ๋ ํ๊ทธ๊ฐ ์ง์๋ฉ๋๋ค. ๋ชฉ๋ก ์ React.DOM.*
ํฉํ ๋ฆฌ ํจ์๋ก ์ง์๋๋ ํ๊ทธ๋ง ์๋ ค์ค๋๋ค.
๋ค์ SVG ์์๋ React.DOM.*์์ ์ง์
(๊ฐ์กฐ ๋ด)
JSX๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ด์ ๋ํด ์ ํ ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค. JSX๋ React.DOM.*
ํฉํ ๋ฆฌ์ ์์กดํ์ง ์๊ธฐ ๋๋ฌธ์ <animate>
๋ฐ <animateTransform>
ํ๋ฉด ๋ฉ๋๋ค.
JSX๋ฅผ ์ฌ์ฉํ์ง ์๋๋ผ๋ ์ ์๋ํ๋ React.createElement('animate', ...)
๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์์ฒด ํฉํ ๋ฆฌ ํจ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค: var animate = React.createFactory('animate")
.
xmlns
๋ํ ์ง์ ์ถ๊ฐ๋ฅผ ์ํด +1 .... ๊ทธ ๋์ ๋๊ตฐ๊ฐ๊ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ด์ฌ์ด ์๋ค๋ฉด(IE9-11์ ์ง์ํ ์ ์์ด์ผ ํ์ต๋๋ค) ์ด๊ฒ์ด ์ ๊ฐ ์๊ฐํด๋ธ ๊ฒ์
๋๋ค.
// explicitly build the SVG to be rendered here so we don't lose the NS
const stringifiedSvg = `<svg xmlns="http://www.w3.org/2000/svg" class="svgClass">
<use xlink:href="#linkToSymbolId"></use>
<svg/>`
return <div dangerouslySetInnerHTML={{__html: stringifiedSvg}}/>
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
xlink:href
์์ฑ์ ๋ํด ์๋นํ ๋ง์ ํผ๋์ด ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ํ์ฌ ์ง์ _is_ ํ์ง๋ง ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์์ฑํด์ผ ํฉ๋๋ค.React๋ 0.14.x์์๋ ์ด๋ฅผ
xlink:href
๋ก ์ฌ๋ฐ๋ฅด๊ฒ ๋ณํํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ด ๋ฐ์ด์ฌ๋ฆฐ ์ ์ฐธ์กฐํ์ญ์์ค.