๋ฐ˜์‘ํ˜•

๐Ÿ’ก SVG๋Š” ์ƒ‰์ƒ, ํฌ๊ธฐ ๋“ฑ์„ ๋™์ ์œผ๋กœ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค

 

๋ฐฉ๋ฒ• 1 — src ์†์„ฑ์— svg ๊ฒฝ๋กœ ์ž…๋ ฅ


<svg
  width="16"
  height="16"
  viewBox="0 0 16 16"
  fill="none"
  xmlns="http://www.w3.org/2000/svg"
>
  <path fillRule="evenodd" clipRule="evenodd" d="..." fill="#484848" />
</svg>;

 

๐Ÿ’ก ํŒŒ์ผ ๊ฒฝ๋กœ ์ง€์ • ์ฐธ๊ณ  ๋‚ด์šฉ

โถ JSX ์—˜๋ฆฌ๋จผํŠธ ์†์„ฑ์˜ ๋ฃจํŠธ ๊ธฐ์ค€์€ `public` ํด๋”

๋งŒ์•ฝ `<img>` ํƒœ๊ทธ์˜ `src` ์†์„ฑ(JSX ํƒœ๊ทธ ์†์„ฑ)์— `src` ํด๋”์— ์žˆ๋Š” ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์ง€์ •ํ•˜๋ ค๋ฉด…

  • ํŒŒ์ผ ์ตœ์ƒ๋‹จ์—์„œ ๋ถˆ๋Ÿฌ์˜จ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ `src` ์†์„ฑ์— ํ• ๋‹นํ•˜๊ฑฐ๋‚˜,
  • `src` ์†์„ฑ ์•ˆ์—์„œ `require()` ์‚ฌ์šฉ ex) `<img src={require('...').default} />`

โท CSS ํŒŒ์ผ ๋ฃจํŠธ ํด๋” ๊ธฐ์ค€์€ `src` ํด๋”

โธ ํŒŒ์ผ ์ตœ์ƒ๋‹จ `import` ๊ตฌ๋ฌธ์—์„  `src` ํด๋”๋งŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ(`public` ํด๋”์— ์žˆ๋Š” ํŒŒ์ผ์€ ๋ถˆ๊ฐ€)

 

<img> ํƒœ๊ทธ src ์†์„ฑ์— svg ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ ์–ด์ค€๋‹ค. ๊ฒฝ๋กœ๋ฅผ ์ ์„ ๋•Œ public ํด๋”์— ์žˆ๋Š” ํŒŒ์ผ์€ public ๊ฒฝ๋กœ๋ช…์„ ์ ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ๊ฐ„ํŽธํ•˜๊ธด ํ•˜์ง€๋งŒ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ์ƒ‰์ƒ์ด๋‚˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

const Component = () => {
  return <img src={"/assets/arrow.svg"} alt="arrow" />;
};

 

๋ฐฉ๋ฒ• 2 — svg ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ


Create-React-App(CRA)์œผ๋กœ ์ƒ์„ฑํ•œ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์˜ ๋นŒ๋“œ ํˆด์€ ๊ธฐ๋ณธ์ ์œผ๋กœ src ๋””๋ ‰ํ† ๋ฆฌ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— src ์ด์™ธ์˜ ํด๋”๋Š” Babel์—์„œ ํŠธ๋žœ์ŠคํŒŒ์ผ ๋˜์ง€ ์•Š๋Š”๋‹ค — ์ฐธ๊ณ ๋งํฌ

 

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

svg ํŒŒ์ผ์„ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•. ์ƒ‰์ƒ์ด๋‚˜ ํฌ๊ธฐ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. public ํด๋”์— ์žˆ๋Š” ํŒŒ์ผ์€ import ๊ตฌ๋ฌธ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ svg ํŒŒ์ผ์€ src ํด๋”๋กœ ์˜ฎ๊ธด ํ›„ importํ•œ๋‹ค.

// svg ํŒŒ์ผ์„ OrderIcon์ด๋ž€ ์ด๋ฆ„์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค์–ด์„œ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
import { ReactComponent as OrderIcon } from "./assets/arrow.svg";

 

svg ํŒŒ์ผ์—์„œ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์€ ์†์„ฑ(props๋กœ ๋ฐ›๊ณ  ์‹ถ์€ ์†์„ฑ)์˜ ๊ฐ’์„ current๋กœ ๋ฐ”๊พผ๋‹ค.

<svg
  width="16"
  height="16"
  viewBox="0 0 16 16"
  fill="none"
  xmlns="http://www.w3.org/2000/svg"
>
  <path fillRule="evenodd" clipRule="evenodd" d="..." fill="current" />
</svg>;

 

๋ถˆ๋Ÿฌ์˜จ svg ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ์–ธํ•˜๊ณ , ์›ํ•˜๋Š” current ๊ฐ’์„ props๋กœ ์ „๋‹ฌํ•œ๋‹ค(์•„๋ž˜์—์„  fill ์†์„ฑ ๋ถ€๋ถ„). ํฌ๊ธฐ๋Š” width height ์†์„ฑ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฐธ๊ณ ๋กœ svg๋Š” ์ด๋ฏธ์ง€ ๋Œ€์ฒด ํ…์ŠคํŠธ์ธ alt ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๋Œ€์‹  title ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด title ์†์„ฑ์— ๋ช…์‹œํ•œ ํ…์ŠคํŠธ๊ฐ€ ํˆดํŒ ํ˜•ํƒœ๋กœ ๋‚˜์˜จ๋‹ค.

// svg ํŒŒ์ผ์„ OrderIcon์ด๋ž€ ์ด๋ฆ„์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค์–ด์„œ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
// './svg/arrow.svg'๋Š” ์ƒ๋Œ€๊ฒฝ๋กœ๋กœ 'src/assets/arrow.svg'๊ณผ ๊ฐ™๋‹ค
import { ReactComponent as ArrowIcon } from "./assets/arrow.svg";

const Component = () => {
  return (
    <Wrapper>
      <ArrowIcon fill="#484848" title="arrow" width="10" height="10" />
    </Wrapper>
  );
};

 

:hover ์Šคํƒ€์ผ ๋ณ€๊ฒฝ

:hover ๊ฐ™์€ ํŠน์ • ์•ก์…˜์— ๋Œ€ํ•ด ๋‹ค๋ฅธ props(์ƒ‰์ƒ ๋“ฑ)๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋“ฑ ์กฐ๊ฑด๋ถ€ ์Šคํƒ€์ผ๋ง์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜๋Š” styled-components์— ์ ์šฉํ•œ ์˜ˆ์‹œ.

const Wrapper = styled.div`
  :hover path {
    fill: #b81f18;
  }
`;

 

์œ„์ฒ˜๋Ÿผ Wrapper ๊ฐ™์€ ๋‹ค๋ฅธ ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—†๊ณ  ๋ถˆ๋Ÿฌ์˜จ svg ์ปดํฌ๋„ŒํŠธ์— ๋ฐ”๋กœ ์กฐ๊ฑด๋ถ€ ์Šคํƒ€์ผ๋ง์„ ์ ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•œ ๋’ค extend ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

const ExtendedArrowIcon = styled(ArrowIcon)`์›ํ•˜๋Š” ์Šคํƒ€์ผ ์„ ์–ธ`;

 

๋ ˆํผ๋Ÿฐ์Šค


React.js - svg ๋‹ค๋ฃจ๊ธฐ   

 


๊ธ€ ์ˆ˜์ •์‚ฌํ•ญ์€ ๋…ธ์…˜ ํŽ˜์ด์ง€์— ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”
๋ฐ˜์‘ํ˜•