接下來兩天我會以我目前較常使用到的設計系統框架做比較,看看主題抽換、格線系統以及組件設計與使用等差別。來感受這幾個框架的優缺,也給未來要選擇使用哪種框架的人參考,看看哪種風格是自己喜歡的。
顏色與主題的抽換,Ant Design 是以 less 來複寫。
基本的色盤
@primary-color: @blue-6;
@info-color: @primary-color;
@success-color: @green-6;
@processing-color: @blue-6;
@error-color: @red-5;
@highlight-color: @red-5;
@warning-color: @gold-6;
@normal-color: #d9d9d9;
@white: #fff;
@black: #000;
色階的部份直接以數字分階
@primary-1: color(~`colorPalette('@{primary-color}', 1) `); // replace tint(@primary-color, 90%)
@primary-2: color(~`colorPalette('@{primary-color}', 2) `); // replace tint(@primary-color, 80%)
@primary-3: color(~`colorPalette('@{primary-color}', 3) `); // unused
@primary-4: color(~`colorPalette('@{primary-color}', 4) `); // unused
...
除了顏色之外,padding等內外距也是透過 less 來 override,官方範例如下:
@btn-padding-horizontal-base: @padding-md - 1px;
@btn-padding-horizontal-lg: @btn-padding-horizontal-base;
@btn-padding-horizontal-sm: @padding-xs - 1px;
...
@border-radius-base: 2px;
...
使用 24 格的格線系統,相較於以往的 12 格線系統可以有更細微的差異。我想之所以要切到這麼細是因為亞洲地區的習慣吧,希望資訊可以盡量在畫面中呈現(塞好塞滿)。
<Row>
<Col span={24}>col</Col>
<Col xs={{ span: 11 }} lg={{ span: 6 }}>RWD Col</Col>
</Row>
可參閱:Ant Design Grid
與大多數的切版一樣基本分成 Header
Content
Footer
Sider
,如果需要再切分區塊,則用 <Layout>
做區隔,以下是基本Layout的範例
<Layout>
<Header>Header</Header>
<Layout>
<Content>Content</Content>
<Sider>Sider</Sider>
</Layout>
<Footer>Footer</Footer>
</Layout>
切分結果如下:
基本的 header 有五個級距,也都可以透過 less 去做覆寫,並用 level 控制字體大小。
<Title>h1. Ant Design</Title>
<Title level={2}>h2. Ant Design</Title>
<Title level={3}>h3. Ant Design</Title>
<Title level={4}>h4. Ant Design</Title>
<Title level={5}>h5. Ant Design</Title>
另外 Ant Design 的文字樣式算是相當豐富,範例如下。
<Space direction="vertical">
<Text>Ant Design (default)</Text>
<Text type="secondary">Ant Design (secondary)</Text>
<Text type="success">Ant Design (success)</Text>
<Text type="warning">Ant Design (warning)</Text>
<Text type="danger">Ant Design (danger)</Text>
<Text disabled>Ant Design (disabled)</Text>
<Text mark>Ant Design (mark)</Text>
<Text code>Ant Design (code)</Text>
<Text keyboard>Ant Design (keyboard)</Text>
<Text underline>Ant Design (underline)</Text>
<Text delete>Ant Design (delete)</Text>
<Text strong>Ant Design (strong)</Text>
<Link href="https://ant.design" target="_blank">
Ant Design (Link)
</Link>
</Space>,
組件的部分,Ant Design 很多都幫使用者處理好了,大部分情況是只要傳入一個物件,就會幫你整個組件長好長滿。雖然很方便,但也意味著行爲跟邏輯被限制,也曾經遇過在組合的過程中插入到一個<Frament />
他就長壞了的情況。
<Input
addonBefore="http://"
addonAfter=".com"
defaultValue="mysite"
/>
基本的設計我覺得滿單純的,也滿接近bootstrap的風格。這點我算喜歡。
Table 的部分我比較不滿意,原因是不能就每個 row 跟 cell 下去處理,讓我還滿不習慣的。如同前面所說,參數的設計上只丟了物件就能產生一個Table,但是為了在 data source 跟 columns 之間做 mapping 又要多指派 dataIndex 這個 key 值,個人覺得有點多餘。
const dataSource = [
{
key: '1',
name: 'Mike',
age: 32,
address: '10 Downing Street',
},
{
key: '2',
name: 'John',
age: 42,
address: '10 Downing Street',
},
];
const columns = [
{
title: 'Name',
dataIndex: 'name',
key: 'name',
},
{
title: 'Age',
dataIndex: 'age',
key: 'age',
},
{
title: 'Address',
dataIndex: 'address',
key: 'address',
},
];
<Table dataSource={dataSource} columns={columns} />;
提示信息的部分我覺得還滿方便的,用方法就可以呼叫提示框
message.info('This is a normal message');
不過各種客製化也要丟一堆物件進去,覺得和 React 堆積木的感覺差滿多的。
message.success({
content: 'This is a prompt message with custom className and style',
className: 'custom-class',
style: {
marginTop: '20vh',
},
});
Ant Design 的組件以及參數相對來說很豐富,如果有很特別的需求,為求方便真的是個不錯的選擇,幾乎你想得到的他都有實作。只是個人比較不喜歡的部分他在使用上沒有像 Material UI 那種堆積木的感覺,少了很多可以調整的地方。
優點:
缺點: