아이콘
아이콘 (Icon)
시맨틱하고 일관된 SVG 아이콘 세트를 제공하는 컴포넌트예요. 버튼, 메뉴, 피드백 요소 등에 아이콘을 넣어 의미를 전달할 수 있어요.
출처: 문서
본문
사용 방법 (How to use)
아이콘을 사용하기 전에 먼저 @ant-design/icons 패키지를 설치해야 해요.
# npm
npm install @ant-design/[email protected] --save
# yarn
yarn add @ant-design/[email protected]
# pnpm
pnpm install @ant-design/[email protected] --save
# bun
bun add @ant-design/[email protected]
:::info{title=Tips}
@ant-design/[email protected]는 [email protected]와 함께 사용해야 해요. 자세한 내용은 #53275를 참고해요.
:::
아이콘 목록 (List of icons)
아이콘 목록은 공식 문서의 검색 기능을 통해 찾아볼 수 있어요. (IconSearch)
예시 (Examples)
기본 (Basic)
@ant-design/icons에서 아이콘을 가져와요. 테마가 다른 아이콘의 컴포넌트 이름은 아이콘 이름 뒤에 테마 이름이 붙어요. spin 속성을 지정하면 회전하는 애니메이션을 보여 줘요.
import React from 'react';
import {
HomeOutlined,
LoadingOutlined,
SettingFilled,
SmileOutlined,
SyncOutlined,
} from '@ant-design/icons';
import { Space } from 'antd';
const App: React.FC = () => (
<Space>
<HomeOutlined />
<SettingFilled />
<SmileOutlined />
<SyncOutlined spin />
<SmileOutlined rotate={180} />
<LoadingOutlined />
</Space>
);
export default App;
투톤 아이콘과 컬러 아이콘 (Two-tone icon and colorful icon)
twoToneColor 속성을 특정 기본 색으로 지정하면 투톤 아이콘의 색을 바꿀 수 있어요.
import React from 'react';
import { CheckCircleTwoTone, HeartTwoTone, SmileTwoTone } from '@ant-design/icons';
import { Space } from 'antd';
const App: React.FC = () => (
<Space>
<SmileTwoTone />
<HeartTwoTone twoToneColor="#eb2f96" />
<CheckCircleTwoTone twoToneColor="#52c41a" />
</Space>
);
export default App;
커스텀 아이콘 (Custom Icon)
<Icon component={...} />을 사용해 재사용 가능한 React 컴포넌트를 만들어요. component 속성은 svg 요소로 렌더링되는 React 컴포넌트를 받아요.
import React from 'react';
import Icon, { HomeOutlined } from '@ant-design/icons';
import { Space } from 'antd';
import type { GetProps } from 'antd';
type CustomIconComponentProps = GetProps<typeof Icon>;
const HeartSvg: React.FC = () => (
<svg width="1em" height="1em" fill="currentColor" viewBox="0 0 1024 1024">
<title>heart icon</title>
<path d="M923 283.6c-13.4-31.1-32.6-58.9-56.9-82.8-24.3-23.8-52.5-42.4-84-55.5-32.5-13.5-66.9-20.3-102.4-20.3-49.3 0-97.4 13.5-139.2 39-10 6.1-19.5 12.8-28.5 20.1-9-7.3-18.5-14-28.5-20.1-41.8-25.5-89.9-39-139.2-39-35.5 0-69.9 6.8-102.4 20.3-31.4 13-59.7 31.7-84 55.5-24.4 23.9-43.5 51.7-56.9 82.8-13.9 32.3-21 66.6-21 101.9 0 33.3 6.8 68 20.3 103.3 11.3 29.5 27.5 60.1 48.2 91 32.8 48.9 77.9 99.9 133.9 151.6 92.8 85.7 184.7 144.9 188.6 147.3l23.7 15.2c10.5 6.7 24 6.7 34.5 0l23.7-15.2c3.9-2.5 95.7-61.6 188.6-147.3 56-51.7 101.1-102.7 133.9-151.6 20.7-30.9 37-61.5 48.2-91 13.5-35.3 20.3-70 20.3-103.3 0.1-35.3-7-69.6-20.9-101.9z" />
</svg>
);
const PandaSvg: React.FC = () => (
<svg viewBox="0 0 1024 1024" width="1em" height="1em" fill="currentColor">
<title>Panda icon</title>
<path
d="M99.096 315.634s-82.58-64.032-82.58-132.13c0-66.064 33.032-165.162 148.646-148.646 83.37 11.91 99.096 165.162 99.096 165.162l-165.162 115.614zM924.906 315.634s82.58-64.032 82.58-132.13c0-66.064-33.032-165.162-148.646-148.646-83.37 11.91-99.096 165.162-99.096 165.162l165.162 115.614z"
fill="#6B676E"
/>
<path
d="M1024 561.548c0 264.526-229.23 429.42-512.002 429.42S0 826.076 0 561.548 283.96 66.064 512.002 66.064 1024 297.022 1024 561.548z"
fill="#FFEBD2"
/>
<path
d="M330.324 842.126c0 82.096 81.34 148.646 181.678 148.646s181.678-66.55 181.678-148.646H330.324z"
fill="#E9D7C3"
/>
<path
d="M644.13 611.098C594.582 528.516 561.55 512 512.002 512c-49.548 0-82.58 16.516-132.13 99.096-42.488 70.814-78.73 211.264-49.548 247.742 66.064 82.58 165.162 33.032 181.678 33.032 16.516 0 115.614 49.548 181.678-33.032 29.18-36.476-7.064-176.93-49.55-247.74z"
fill="#FFFFFF"
/>
<path
d="M611.098 495.484c0-45.608 36.974-82.58 82.58-82.58 49.548 0 198.194 99.098 198.194 165.162s-79.934 144.904-148.646 99.096c-49.548-33.032-132.128-148.646-132.128-181.678zM412.904 495.484c0-45.608-36.974-82.58-82.58-82.58-49.548 0-198.194 99.098-198.194 165.162s79.934 144.904 148.646 99.096c49.548-33.032 132.128-148.646 132.128-181.678z"
fill="#6B676E"
/>
<path
d="M512.002 726.622c-30.06 0-115.614 5.668-115.614 33.032 0 49.638 105.484 85.24 115.614 82.58 10.128 2.66 115.614-32.944 115.614-82.58-0.002-27.366-85.556-33.032-115.614-33.032z"
fill="#464655"
/>
<path
d="M330.324 495.484m-33.032 0a33.032 33.032 0 1 0 66.064 0 33.032 33.032 0 1 0-66.064 0Z"
fill="#464655"
/>
<path
d="M693.678 495.484m-33.032 0a33.032 33.032 0 1 0 66.064 0 33.032 33.032 0 1 0-66.064 0Z"
fill="#464655"
/>
</svg>
);
const HeartIcon: React.FC<Partial<CustomIconComponentProps>> = (props) => (
<Icon component={HeartSvg} {...props} />
);
const PandaIcon: React.FC<Partial<CustomIconComponentProps>> = (props) => (
<Icon component={PandaSvg} {...props} />
);
const App: React.FC = () => (
<Space>
<HeartIcon style={{ color: 'hotpink' }} />
<PandaIcon style={{ fontSize: '32px' }} />
<Icon component={HomeOutlined} />
<HomeOutlined />
</Space>
);
export default App;
iconfont.cn 사용하기 (Use iconfont.cn)
iconfont.cn을 사용한다면 프로젝트에서 아이콘을 우아하게 사용할 수 있어요.
import React from 'react';
import { createFromIconfontCN } from '@ant-design/icons';
import { Space } from 'antd';
const IconFont = createFromIconfontCN({
scriptUrl: '//at.alicdn.com/t/font_8d5l8fzk5b87iudi.js',
});
const App: React.FC = () => (
<Space>
<IconFont type="icon-tuichu" />
<IconFont type="icon-facebook" style={{ color: '#1877F2' }} />
<IconFont type="icon-twitter" />
</Space>
);
export default App;
iconfont.cn의 여러 리소스 (Multiple resources from iconfont.cn)
@ant-design/[email protected]부터 scriptUrl을 배열로 사용할 수 있어요. 여러 iconfont.cn 리소스의 아이콘을 하나의 <Icon />에서 관리할 수 있어요. 리소스에 중복된 이름의 아이콘이 있으면 배열 순서에 따라 덮어써져요.
import React from 'react';
import { createFromIconfontCN } from '@ant-design/icons';
import { Space } from 'antd';
const IconFont = createFromIconfontCN({
scriptUrl: [
'//at.alicdn.com/t/font_1788044_0dwu4guekcwr.js', // icon-javascript, icon-java, icon-shoppingcart (overridden)
'//at.alicdn.com/t/font_1788592_a5xf2bdic3u.js', // icon-shoppingcart, icon-python
],
});
const App: React.FC = () => (
<Space>
<IconFont type="icon-javascript" />
<IconFont type="icon-java" />
<IconFont type="icon-shoppingcart" />
<IconFont type="icon-python" />
</Space>
);
export default App;
API
공통 아이콘 (Common Icon)
| 속성 (Property) | 설명 (Description) | 타입 (Type) | 기본값 (Default) | 버전 (Version) | 글로벌 설정 |
|---|---|---|---|---|---|
| className | 아이콘의 className | string | - | × | |
| rotate | n도만큼 회전해요. (IE9에서는 동작하지 않아요.) | number | - | × | |
| spin | 아이콘을 애니메이션으로 회전시켜요. | boolean | false | × | |
| style | 아이콘의 스타일 속성, 예: fontSize, color |
CSSProperties | - | × | |
| twoToneColor | 투톤 아이콘에서만 지원해요. 기본 색 또는 기본·보조 색을 지정해요. | string | [string, string] | - | × |
아이콘에는 세 가지 테마가 있으며, 컴포넌트 이름은 아이콘 이름 뒤에 테마 이름이 붙어요.
import { StarOutlined, StarFilled, StarTwoTone } from '@ant-design/icons';
<StarOutlined />
<StarFilled />
<StarTwoTone twoToneColor="#eb2f96" />
커스텀 아이콘 (Custom Icon)
| 속성 (Property) | 설명 (Description) | 타입 (Type) | 기본값 (Default) | 버전 (Version) | 글로벌 설정 |
|---|---|---|---|---|---|
| component | 루트 노드에 사용되는 컴포넌트 | ComponentType<CustomIconComponentProps> | - | × | |
| rotate | 회전 각도 (IE9에서는 동작하지 않아요.) | number | - | × | |
| spin | 아이콘을 애니메이션으로 회전시켜요. | boolean | false | × | |
| style | 아이콘의 스타일 속성, 예: fontSize, color |
CSSProperties | - | × |
SVG 아이콘에 대해 (About SVG icons)
버전 3.9.0에서 폰트 아이콘을 대체하는 SVG 아이콘을 도입했어요. 여기에는 다음과 같은 장점이 있어요.
- CDN에 호스팅된 폰트 아이콘 파일에 의존하지 않고 아이콘을 완전히 오프라인으로 사용할 수 있어요. (다운로드 중에 빈 사각형이 보이지 않고, 아이콘 폰트 파일을 로컬에 배포할 필요도 없어요!)
- 저해상도 화면에서 훨씬 더 정확하게 표시돼요.
- 아이콘 색을 선택할 수 있어요.
- 컴포넌트에 더 많은 props를 제공해 스타일을 덮어쓰지 않고도 내장 아이콘을 바꿀 수 있어요.
SVG 아이콘에 대한 더 많은 논의는 #10353에서 확인할 수 있어요.
⚠️ 3.9.0에서 모든 SVG 아이콘을 가져오면서 번들 크기가 커졌어요. 그래서 개발자가 필요할 때 아이콘을 가져올 수 있는 새로운 API를 제공할 예정이며, 업데이트는 #12011에서 추적할 수 있어요.
기다리는 동안 커뮤니티의 webpack plugin을 사용해 아이콘 파일을 분할할 수 있어요.
theme, component, twoToneColor 속성은 3.9.0에서 추가됐어요. 가장 좋은 방법은 모든 <Icon /> 컴포넌트에 theme 속성을 전달하는 거예요.
import { MessageOutlined } from '@ant-design/icons';
<MessageOutlined style={{ fontSize: '16px', color: '#08c' }} />;
모든 아이콘은 <svg>로 렌더링돼요. 아이콘의 크기와 색을 위해 style과 className을 여전히 설정할 수 있어요.
<Icon type="message" style={{ fontSize: '16px', color: '#08c' }} theme="outlined" />
투톤 색 설정 (Set TwoTone Color)
투톤 아이콘을 사용할 때 정적 메서드 getTwoToneColor()와 setTwoToneColor(colorString)로 기본 색을 지정할 수 있어요.
import { getTwoToneColor, setTwoToneColor } from '@ant-design/icons';
setTwoToneColor('#eb2f96');
getTwoToneColor(); // #eb2f96
커스텀 폰트 아이콘 (Custom Font Icon)
개발자가 iconfont.cn에 배포한 자신만의 아이콘을 편리하게 사용할 수 있도록 createFromIconfontCN 함수를 추가했어요.
이 메서드는 iconfont.cn을 위해 특별히 만들어졌어요.
import React from 'react';
import { createFromIconfontCN } from '@ant-design/icons';
import ReactDOM from 'react-dom/client';
const MyIcon = createFromIconfontCN({
scriptUrl: '//at.alicdn.com/t/font_8d5l8fzk5b87iudi.js', // generate in iconfont.cn
});
ReactDOM.createRoot(mountNode).render(<MyIcon type="icon-example" />);
본질적으로 SVG sprite를 사용하는 컴포넌트를 만들어요.
다음 옵션을 사용할 수 있어요.
| 속성 (Property) | 설명 (Description) | 타입 (Type) | 기본값 (Default) | 버전 (Version) | 글로벌 설정 |
|---|---|---|---|---|---|
| extraCommonProps | 컴포넌트에 추가 속성을 정의해요. | { [key: string]: any } | {} | × | |
| scriptUrl | iconfont.cn 프로젝트가 생성한 URL예요. @ant-design/[email protected]부터 string[]을 지원해요. |
string | string[] | - | × |
scriptUrl 속성은 SVG sprite 심볼을 가져오도록 설정해야 해요.
scriptUrl을 생성하는 방법은 iconfont.cn 문서를 참고해요.
커스텀 SVG 아이콘 (Custom SVG Icon)
webpack과 @svgr/webpack을 사용해 SVG 아이콘을 React 컴포넌트로 가져올 수 있어요. @svgr/webpack의 options 참고.
// webpack.config.js
module.exports = {
// ... other config
test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
use: [
{
loader: 'babel-loader',
},
{
loader: '@svgr/webpack',
options: {
babel: false,
icon: true,
},
},
],
};
vite와 vite-plugin-svgr을 사용해 SVG 아이콘을 React 컴포넌트로 가져올 수도 있어요.
// vite.config.js
export default defineConfig(() => ({
// ... other config
plugins: [svgr({ svgrOptions: { icon: true } })],
}));
import React from 'react';
import Icon from '@ant-design/icons';
import MessageSvg from 'path/to/message.svg'; // path to your '*.svg' file.
// import MessageSvg from 'path/to/message.svg?react'; // use vite path to your '*.svg?react' file.
import ReactDOM from 'react-dom/client';
// in create-react-app:
// import { ReactComponent as MessageSvg } from 'path/to/message.svg';
ReactDOM.createRoot(mountNode).render(<Icon component={MessageSvg} />);
컴포넌트에 대해 다음 속성을 사용할 수 있어요.
| 속성 (Property) | 설명 (Description) | 타입 (Type) | 기본값 (Readonly) | 버전 (Version) | 글로벌 설정 |
|---|---|---|---|---|---|
| className | svg 요소의 계산된 class name |
string | - | × | |
| fill | svg 요소를 그리는 데 사용하는 색을 정의해요. |
string | currentColor |
× | |
| height | svg 요소의 높이 |
string | number | 1em |
× | |
| style | svg 요소의 계산된 스타일 |
CSSProperties | - | × | |
| width | svg 요소의 너비 |
string | number | 1em |
× |
디자인 토큰 (Design Token)
Icon의 컴포넌트 토큰 테이블은 공식 문서에서 확인할 수 있어요. (ComponentTokenTable)
FAQ
가끔 아이콘 스타일이 전역 스타일 오류를 일으키는 이유는 무엇인가요? {#faq-icon-bad-style}
관련 이슈: #54391
layer를 활성화하면 아이콘 스타일의 우선순위가 @layer antd보다 낮아져 모든 컴포넌트가 비정상적으로 스타일링될 수 있어요.
이 문제는 다음 두 단계로 해결할 수 있어요.
@ant-design/[email protected]를[email protected]와 함께 사용해요.message,Modal,notification의 정적 메서드 사용을 멈추고, hooks 버전이나App에서 제공하는 인스턴스를 사용해요.
정적 메서드를 꼭 사용해야 한다면, App 바로 아래에 아이콘 컴포넌트를 하나 배치하면 정적 메서드로 인한 스타일 영향을 피할 수 있어요.
<StyleProvider layer>
<ConfigProvider>
<App>
+ {/* any icon */}
+ <RightOutlined />
{/* your pages */}
</App>
</ConfigProvider>
</StyleProvider>