스페이스
스페이스 (Space)
여러 컴포넌트 사이에 일정한 간격을 주고, 세로·가로로 깔끔하게 배치하기 위한 레이아웃 컴포넌트입니다.
출처: 문서
본문
언제 사용하나요 (When To Use)
- 컴포넌트들이 서로 붙어 있지 않도록 하고 통일된 간격을 설정할 때
- 하위 폼 컴포넌트들이 밀착 연결되고 테두리가 접혀 있는 경우에는 Space.Compact를 사용하세요(
[email protected]이후 지원).
Flex 컴포넌트와의 차이점 (Difference with Flex component)
- Space는 인라인 요소들 사이의 간격을 설정하기 위해 사용합니다. 각 자식 요소에 인라인 정렬을 위한 래퍼 요소를 추가합니다. 여러 자식 요소를 행과 열로 등간격 배치하는 데 적합합니다.
- Flex는 블록 레벨 요소의 레이아웃을 설정하기 위해 사용합니다. 래퍼 요소를 추가하지 않습니다. 자식 요소를 세로 또는 가로 방향으로 배치하는 데 적합하며, 더 많은 유연성과 제어를 제공합니다.
예제 (Examples)
기본 사용법 (Basic Usage)
빽빽한 컴포넌트들의 가로 간격을 설정합니다.
import React from 'react';
import { UploadOutlined } from '@ant-design/icons';
import { Button, Popconfirm, Space, Upload } from 'antd';
const App: React.FC = () => (
<Space>
Space
<Button type="primary">Button</Button>
<Upload>
<Button icon={<UploadOutlined />}>Click to Upload</Button>
</Upload>
<Popconfirm title="Are you sure delete this task?" okText="Yes" cancelText="No">
<Button>Confirm</Button>
</Popconfirm>
</Space>
);
export default App;
세로 스페이스 (Vertical Space)
빽빽한 컴포넌트들의 세로 간격을 설정합니다.
import React from 'react';
import { Card, Space } from 'antd';
const App: React.FC = () => (
<Space orientation="vertical" size="medium" style={{ display: 'flex' }}>
<Card title="Card" size="small">
<p>Card content</p>
<p>Card content</p>
</Card>
<Card title="Card" size="small">
<p>Card content</p>
<p>Card content</p>
</Card>
<Card title="Card" size="small">
<p>Card content</p>
<p>Card content</p>
</Card>
</Space>
);
export default App;
스페이스 크기 (Space Size)
size를 사용해 간격을 설정합니다. small, medium, large 세 가지 크기가 미리 정의되어 있고, 직접 커스터마이즈할 수도 있습니다. size를 설정하지 않으면 기본 간격은 small입니다.
import React, { useState } from 'react';
import { Button, Radio, Slider, Space } from 'antd';
import type { ConfigProviderProps } from 'antd';
type SizeType = ConfigProviderProps['componentSize'];
const App: React.FC = () => {
const [size, setSize] = useState<SizeType | [SizeType, SizeType] | 'customize'>('small');
const [customSize, setCustomSize] = React.useState<number>(0);
return (
<>
<Radio.Group value={size} onChange={(e) => setSize(e.target.value)}>
{['small', 'medium', 'large', 'customize'].map((item) => (
<Radio key={item} value={item}>
{item}
</Radio>
))}
</Radio.Group>
<br />
<br />
{size === 'customize' && (
<>
<Slider value={customSize} onChange={setCustomSize} />
<br />
</>
)}
<Space size={size !== 'customize' ? size : customSize}>
<Button type="primary">Primary</Button>
<Button>Default</Button>
<Button type="dashed">Dashed</Button>
<Button type="link">Link</Button>
</Space>
</>
);
};
export default App;
정렬 (Align)
정렬을 설정합니다.
import React from 'react';
import { Button, Flex, Space } from 'antd';
import { createStyles } from 'antd-style';
const useStyles = createStyles((props) => {
const { css, cssVar } = props;
return {
spaceAlignBox: css`
flex: none;
margin: ${cssVar.marginXXS};
padding: ${cssVar.paddingXXS};
border: ${cssVar.lineWidth} ${cssVar.lineType} ${cssVar.blue};
`,
mockBox: css`
display: inline-block;
padding: ${cssVar.paddingXL} ${cssVar.padding};
background-color: rgba(150, 150, 150, 0.2);
`,
};
});
const App: React.FC = () => {
const { styles } = useStyles();
return (
<Flex wrap align="flex-start">
<div className={styles.spaceAlignBox}>
<Space align="center">
center
<Button type="primary">Primary</Button>
<span className={styles.mockBox}>Block</span>
</Space>
</div>
<div className={styles.spaceAlignBox}>
<Space align="start">
start
<Button type="primary">Primary</Button>
<span className={styles.mockBox}>Block</span>
</Space>
</div>
<div className={styles.spaceAlignBox}>
<Space align="end">
end
<Button type="primary">Primary</Button>
<span className={styles.mockBox}>Block</span>
</Space>
</div>
<div className={styles.spaceAlignBox}>
<Space align="baseline">
baseline
<Button type="primary">Primary</Button>
<span className={styles.mockBox}>Block</span>
</Space>
</div>
</Flex>
);
};
export default App;
줄바꿈 (Wrap)
자동으로 줄바꿈합니다.
import React from 'react';
import { Button, Space } from 'antd';
const App: React.FC = () => (
<Space size={[8, 16]} wrap>
{Array.from({ length: 20 }).map((_, index) => (
// eslint-disable-next-line react/no-array-index-key
<Button key={index}>Button</Button>
))}
</Space>
);
export default App;
구분자 (separator)
컴포넌트들 사이의 구분자를 설정합니다.
import React from 'react';
import { Divider, Space, Typography } from 'antd';
const App: React.FC = () => (
<Space separator={<Divider vertical />}>
<Typography.Link>Link</Typography.Link>
<Typography.Link>Link</Typography.Link>
<Typography.Link>Link</Typography.Link>
</Space>
);
export default App;
폼 컴포넌트 컴팩트 모드 (Compact Mode for form component)
폼 컴포넌트의 컴팩트 모드입니다.
import React from 'react';
import { CopyOutlined } from '@ant-design/icons';
import {
AutoComplete,
Button,
Cascader,
ColorPicker,
DatePicker,
Input,
InputNumber,
Select,
Space,
TimePicker,
Tooltip,
TreeSelect,
} from 'antd';
const { TreeNode } = TreeSelect;
const App: React.FC = () => (
<Space orientation="vertical">
<Space.Compact block>
<Input style={{ width: '20%' }} defaultValue="0571" />
<Input style={{ width: '30%' }} defaultValue="26888888" />
</Space.Compact>
<Space.Compact block size="small">
<Input style={{ width: 'calc(100% - 200px)' }} defaultValue="https://ant.design" />
<Button type="primary">Submit</Button>
</Space.Compact>
<Space.Compact block>
<Input style={{ width: 'calc(100% - 200px)' }} defaultValue="https://ant.design" />
<Button type="primary">Submit</Button>
</Space.Compact>
<Space.Compact block>
<Input
style={{ width: 'calc(100% - 200px)' }}
defaultValue="[email protected]:ant-design/ant-design.git"
/>
<Tooltip title="copy git url">
<Button icon={<CopyOutlined />} />
</Tooltip>
</Space.Compact>
<Space.Compact block>
<Select
allowClear
defaultValue="Zhejiang"
options={[
{ label: 'Zhejiang', value: 'Zhejiang' },
{ label: 'Jiangsu', value: 'Jiangsu' },
]}
/>
<Input style={{ width: '50%' }} defaultValue="Xihu District, Hangzhou" />
</Space.Compact>
<Space.Compact block>
<Select
allowClear
mode="multiple"
defaultValue="Zhejiang"
style={{ width: '50%' }}
options={[
{ label: 'Zhejiang', value: 'Zhejiang' },
{ label: 'Jiangsu', value: 'Jiangsu' },
]}
/>
<Input style={{ width: '50%' }} defaultValue="Xihu District, Hangzhou" />
</Space.Compact>
<Space.Compact block>
<Input.Search style={{ width: '30%' }} defaultValue="0571" />
<Input.Search allowClear style={{ width: '50%' }} defaultValue="26888888" />
<Input.Search style={{ width: '20%' }} defaultValue="+1" />
</Space.Compact>
<Space.Compact block>
<Select
defaultValue="Option1"
options={[
{ label: 'Option1', value: 'Option1' },
{ label: 'Option2', value: 'Option2' },
]}
/>
<Input style={{ width: '50%' }} defaultValue="input content" />
<InputNumber defaultValue={12} />
</Space.Compact>
<Space.Compact block>
<Input style={{ width: '50%' }} defaultValue="input content" />
<DatePicker style={{ width: '50%' }} />
</Space.Compact>
<Space.Compact block>
<DatePicker.RangePicker style={{ width: '70%' }} />
<Input style={{ width: '30%' }} defaultValue="input content" />
<Button type="primary">Search</Button>
</Space.Compact>
<Space.Compact block>
<Input style={{ width: '30%' }} defaultValue="input content" />
<DatePicker.RangePicker style={{ width: '70%' }} />
</Space.Compact>
<Space.Compact block>
<Select
defaultValue="Option1-1"
options={[
{ label: 'Option1-1', value: 'Option1-1' },
{ label: 'Option1-2', value: 'Option1-2' },
]}
/>
<Select
defaultValue="Option2-2"
options={[
{ label: 'Option2-1', value: 'Option2-1' },
{ label: 'Option2-2', value: 'Option2-2' },
]}
/>
</Space.Compact>
<Space.Compact block>
<Select
defaultValue="1"
options={[
{ label: 'Between', value: '1' },
{ label: 'Except', value: '2' },
]}
/>
<Input style={{ width: 100, textAlign: 'center' }} placeholder="Minimum" />
<Input
className="site-input-split"
style={{
width: 30,
borderInlineStart: 0,
borderInlineEnd: 0,
pointerEvents: 'none',
}}
placeholder="~"
disabled
/>
<Input
className="site-input-right"
style={{
width: 100,
textAlign: 'center',
}}
placeholder="Maximum"
/>
</Space.Compact>
<Space.Compact block>
<Select
defaultValue="Sign Up"
style={{ width: '30%' }}
options={[
{ label: 'Sign Up', value: 'Sign Up' },
{ label: 'Sign In', value: 'Sign In' },
]}
/>
<AutoComplete
style={{ width: '70%' }}
placeholder="Email"
options={[{ value: 'text 1' }, { value: 'text 2' }]}
/>
</Space.Compact>
<Space.Compact block>
<TimePicker style={{ width: '70%' }} />
<Cascader
style={{ width: '70%' }}
options={[
{
value: 'zhejiang',
label: 'Zhejiang',
children: [
{
value: 'hangzhou',
label: 'Hangzhou',
children: [
{
value: 'xihu',
label: 'West Lake',
},
],
},
],
},
{
value: 'jiangsu',
label: 'Jiangsu',
children: [
{
value: 'nanjing',
label: 'Nanjing',
children: [
{
value: 'zhonghuamen',
label: 'Zhong Hua Men',
},
],
},
],
},
]}
placeholder="Select Address"
/>
</Space.Compact>
<Space.Compact block>
<TimePicker.RangePicker />
<TreeSelect
showSearch
style={{ width: '60%' }}
value="leaf1"
styles={{
popup: {
root: { maxHeight: 400, overflow: 'auto' },
},
}}
placeholder="Please select"
allowClear
treeDefaultExpandAll
onChange={() => {}}
>
<TreeNode value="parent 1" title="parent 1">
<TreeNode value="parent 1-0" title="parent 1-0">
<TreeNode value="leaf1" title="leaf1" />
<TreeNode value="leaf2" title="leaf2" />
</TreeNode>
<TreeNode value="parent 1-1" title="parent 1-1">
<TreeNode value="leaf3" title={<b style={{ color: '#08c' }}>leaf3</b>} />
</TreeNode>
</TreeNode>
</TreeSelect>
<Button type="primary">Submit</Button>
</Space.Compact>
<Space.Compact>
<Input placeholder="input here" />
<Space.Addon>$</Space.Addon>
<InputNumber placeholder="another input" style={{ width: '100%' }} />
<InputNumber placeholder="another input" style={{ width: '100%' }} />
<Space.Addon>$</Space.Addon>
</Space.Compact>
<Space.Compact>
<Input placeholder="input here" />
<ColorPicker />
</Space.Compact>
<Space.Compact>
<Button type="primary">Button</Button>
<Input placeholder="input here" />
<Space.Addon>$</Space.Addon>
</Space.Compact>
</Space>
);
export default App;
버튼 컴팩트 모드 (Button Compact Mode)
Button 컴포넌트 컴팩트 예제입니다.
import React from 'react';
import {
CommentOutlined,
DownloadOutlined,
EllipsisOutlined,
HeartOutlined,
LikeOutlined,
MailOutlined,
MobileOutlined,
ShareAltOutlined,
StarOutlined,
WarningOutlined,
} from '@ant-design/icons';
import { Button, Dropdown, Space, Tooltip } from 'antd';
const App: React.FC = () => (
<div>
<Space.Compact block>
<Tooltip title="Like">
<Button icon={<LikeOutlined />} />
</Tooltip>
<Tooltip title="Comment">
<Button icon={<CommentOutlined />} />
</Tooltip>
<Tooltip title="Star">
<Button icon={<StarOutlined />} />
</Tooltip>
<Tooltip title="Heart">
<Button icon={<HeartOutlined />} />
</Tooltip>
<Tooltip title="Share">
<Button icon={<ShareAltOutlined />} />
</Tooltip>
<Tooltip title="Download">
<Button icon={<DownloadOutlined />} />
</Tooltip>
<Dropdown
placement="bottomRight"
menu={{
items: [
{
key: '1',
label: 'Report',
icon: <WarningOutlined />,
},
{
key: '2',
label: 'Mail',
icon: <MailOutlined />,
},
{
key: '3',
label: 'Mobile',
icon: <MobileOutlined />,
},
],
}}
trigger={['click']}
>
<Button icon={<EllipsisOutlined />} />
</Dropdown>
</Space.Compact>
<br />
<Space.Compact block>
<Button type="primary">Button 1</Button>
<Button type="primary">Button 2</Button>
<Button type="primary">Button 3</Button>
<Button type="primary">Button 4</Button>
<Tooltip title="Tooltip">
<Button type="primary" icon={<DownloadOutlined />} disabled />
</Tooltip>
<Tooltip title="Tooltip">
<Button type="primary" icon={<DownloadOutlined />} />
</Tooltip>
</Space.Compact>
<br />
<Space.Compact block>
<Button>Button 1</Button>
<Button>Button 2</Button>
<Button>Button 3</Button>
<Tooltip title="Tooltip">
<Button icon={<DownloadOutlined />} disabled />
</Tooltip>
<Tooltip title="Tooltip">
<Button icon={<DownloadOutlined />} />
</Tooltip>
<Button type="primary">Button 4</Button>
<Dropdown
placement="bottomRight"
menu={{
items: [
{
key: '1',
label: '1st item',
},
{
key: '2',
label: '2nd item',
},
{
key: '3',
label: '3rd item',
},
],
}}
trigger={['click']}
>
<Button type="primary" icon={<EllipsisOutlined />} />
</Dropdown>
</Space.Compact>
</div>
);
export default App;
세로 컴팩트 모드 (Vertical Compact Mode)
Space.Compact의 세로 모드로, Button만 지원합니다.
import React from 'react';
import { Button, Space } from 'antd';
const App: React.FC = () => (
<Space>
<Space.Compact orientation="vertical">
<Button>Button 1</Button>
<Button>Button 2</Button>
<Button>Button 3</Button>
</Space.Compact>
<Space.Compact orientation="vertical">
<Button type="dashed">Button 1</Button>
<Button type="dashed">Button 2</Button>
<Button type="dashed">Button 3</Button>
</Space.Compact>
<Space.Compact orientation="vertical">
<Button type="primary">Button 1</Button>
<Button type="primary">Button 2</Button>
<Button type="primary">Button 3</Button>
</Space.Compact>
<Space.Compact orientation="vertical">
<Button variant="outlined">Button 1</Button>
<Button variant="outlined">Button 2</Button>
<Button variant="outlined">Button 3</Button>
</Space.Compact>
</Space>
);
export default App;
커스텀 시맨틱 DOM 스타일링 (Custom semantic dom styling)
classNames와 styles에 객체 또는 함수를 넘겨서 Space의 시맨틱 DOM 스타일을 커스터마이즈할 수 있습니다.
import * as React from 'react';
import { Button, Space } from 'antd';
import type { GetProp, SpaceProps } from 'antd';
const classNamesObject: SpaceProps['classNames'] = {
root: 'demo-space-root',
item: 'demo-space-item',
separator: 'demo-space-separator',
};
const classNamesFn: SpaceProps['classNames'] = (
info,
): GetProp<SpaceProps, 'classNames', 'Return'> => {
if (info.props.orientation === 'vertical') {
return {
root: 'demo-space-root--vertical',
};
} else {
return {
root: 'demo-space-root--horizontal',
};
}
};
const stylesObject: SpaceProps['styles'] = {
root: { borderWidth: 2, borderStyle: 'dashed', padding: 8, marginBottom: 10 },
item: { backgroundColor: '#f0f0f0', padding: 4 },
separator: { color: 'red', fontWeight: 'bold' },
};
const stylesFn: SpaceProps['styles'] = (info): GetProp<SpaceProps, 'styles', 'Return'> => {
if (info.props.size === 'large') {
return {
root: {
backgroundColor: '#e6f7ff',
borderColor: '#1890ff',
padding: 8,
},
};
} else {
return {
root: {
backgroundColor: '#fff7e6',
borderColor: '#fa8c16',
},
};
}
};
const App: React.FC = () => {
return (
<div>
<Space styles={stylesObject} classNames={classNamesObject} separator="•">
<Button>Styled Button 1</Button>
<Button>Styled Button 2</Button>
<Button>Styled Button 3</Button>
</Space>
<Space size="large" styles={stylesFn} classNames={classNamesFn}>
<Button>Large Space Button 1</Button>
<Button>Large Space Button 2</Button>
<Button>Large Space Button 3</Button>
</Space>
</div>
);
};
export default App;
API
Common props ref:Common props
Space
| Property | Description | Type | Default | Version | Global Config |
|---|---|---|---|---|---|
| align | Align items | start | end |center |baseline |
- | 4.2.0 | × |
| classNames | Customize class for each semantic structure inside the component. Supports object or function. | Record<SemanticDOM, string> | (info: { props: SpaceProps })=> Record<SemanticDOM, string> | - | 5.6.0 | |
| The space direction | vertical | horizontal |
horizontal |
4.1.0 | × | |
| orientation | The space direction | vertical | horizontal |
horizontal |
× | |
| size | The space size | Size | Size[] | small |
4.1.0 | Array: 4.9.0 | 5.6.0 |
Set split, please use separator instead |
ReactNode | - | 4.7.0 | × | |
| separator | Set separator | ReactNode | - | - | × |
| styles | Customize inline style for each semantic structure inside the component. Supports object or function. | Record<SemanticDOM, CSSProperties> | (info: { props: SpaceProps })=> Record<SemanticDOM, CSSProperties> | - | 5.6.0 | |
| vertical | Orientation, Simultaneously configure with orientation and prioritize orientation |
boolean | false | - | × |
| wrap | Auto wrap line, when horizontal effective |
boolean | false | 4.9.0 | × |
크기 (Size)
'small' | 'middle' | 'large' | number
Space.Compact
하위 폼 컴포넌트가 밀착 연결되고 테두리가 접혀 있을 때 Space.Compact를 사용합니다. 지원하는 컴포넌트는 다음과 같습니다:
- Button
- AutoComplete
- Cascader
- DatePicker
- Input/Input.Search
- InputNumber
- Select
- TimePicker
- TreeSelect
| Property | Description | Type | Default | Version |
|---|---|---|---|---|
| block | Option to fit width to its parent's width | boolean | false | 4.24.0 |
| Set direction of layout | vertical | horizontal |
horizontal |
4.24.0 | |
| orientation | Set direction of layout | vertical | horizontal |
horizontal |
|
| vertical | Orientation, Simultaneously configure with orientation and prioritize orientation |
boolean | false | - |
| size | Set child component size | large | medium | small |
medium |
4.24.0 |
Space.Addon
이 컴포넌트는
[email protected]부터 사용할 수 있습니다.
컴팩트 레이아웃에서 커스텀 셀을 만드는 데 사용합니다.
| Property | Description | Type | Default | Version |
|---|---|---|---|---|
| children | Custom content | ReactNode | - | 5.29.0 |
시맨틱 DOM (Semantic DOM)
https://ant.design/components/space/semantic.md
디자인 토큰 (Design Token)
글로벌 토큰 (Global Token)
| Token Name | Description | Type | Default Value |
|---|---|---|---|
| padding | Control the padding of the element. | number | |
| paddingLG | Control the large padding of the element. | number | |
| paddingXS | Control the extra small padding of the element. | number |