[React] ๋ฆฌ์กํธ์์ SVG ์ฌ์ฉ๋ฒ
๐ก 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)`์ํ๋ ์คํ์ผ ์ ์ธ`;
๋ ํผ๋ฐ์ค
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Git] ๋ณ๊ฒฝํ ์ํ ์์ ์ ์ฅ ํ ๋ธ๋์น ์ด๋ ๋ฐฉ๋ฒ โ Git Stash (0) | 2024.04.25 |
---|---|
[JS] console.log ์ฝ์ ๋ก๊ทธ ๋ ์ ์ฌ์ฉํ๊ธฐ (0) | 2024.04.25 |
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด ์ค๋ณต ์์ ์ ๊ฑฐ ๋ฐฉ๋ฒ ๋ชจ์ (0) | 2024.04.25 |
[HTML/CSS] CSS ํ์ ์ ๋๋ฉ์ด์ ๋ง๋ค๊ธฐ (0) | 2024.04.25 |
[HTML/CSS] ์์ดํฐ ์ฌํ๋ฆฌ์์ ์ ๋ ฅ์ฐฝ ์๋ํ๋ ๋ฐฉ์ง (0) | 2024.04.25 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[Git] ๋ณ๊ฒฝํ ์ํ ์์ ์ ์ฅ ํ ๋ธ๋์น ์ด๋ ๋ฐฉ๋ฒ — Git Stash
[Git] ๋ณ๊ฒฝํ ์ํ ์์ ์ ์ฅ ํ ๋ธ๋์น ์ด๋ ๋ฐฉ๋ฒ — Git Stash
2024.04.25 -
[JS] console.log ์ฝ์ ๋ก๊ทธ ๋ ์ ์ฌ์ฉํ๊ธฐ
[JS] console.log ์ฝ์ ๋ก๊ทธ ๋ ์ ์ฌ์ฉํ๊ธฐ
2024.04.25 -
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด ์ค๋ณต ์์ ์ ๊ฑฐ ๋ฐฉ๋ฒ ๋ชจ์
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด ์ค๋ณต ์์ ์ ๊ฑฐ ๋ฐฉ๋ฒ ๋ชจ์
2024.04.25 -
[HTML/CSS] CSS ํ์ ์ ๋๋ฉ์ด์ ๋ง๋ค๊ธฐ
[HTML/CSS] CSS ํ์ ์ ๋๋ฉ์ด์ ๋ง๋ค๊ธฐ
2024.04.25