代码演示
如何引入
import { Banner } from '@fibrous/semi-ui-react';
基本用法
代码
import { useState } from 'react';
import { Banner, Layout, Button } from '@fibrous/semi-ui-react';
export default function BannerDemo() {
const [visible, setVisible] = useState(false);
const changeVisible = () => {
setVisible(!visible);
};
const { Header, Footer, Content } = Layout;
const commonStyle = {
height: 64,
lineHeight: '64px',
background: 'var(--semi-color-fill-0)',
};
const banner = <Banner onClose={changeVisible} description="Semi D2C 现已支持 Figma DevMode, 安装插件,随时查阅图层对应的前端代码" />;
return (
<>
<Layout className="components-layout-demo banner-basic">
<Header style={commonStyle}>Header</Header>
{visible && banner}
<Content style={{ height: 300, lineHeight: '300px' }}>Content</Content>
<Footer style={commonStyle}>Footer</Footer>
</Layout>
<Button
onClick={changeVisible}
style={{
display: 'block',
width: '120px',
margin: '0 auto',
}}
>
{visible ? 'Hide Banner' : 'Show Banner'}
</Button>
</>
);
}不同类型
支持4种类型:info、warning、danger、success。默认为 info。
代码
import { Banner } from '@fibrous/semi-ui-react';
export default function BannerDemo() {
return (
<>
<Banner type="info" description="Semi D2C 现已支持 Figma DevMode, 安装插件,随时查阅图层对应的前端代码" />
<br />
<Banner type="warning" description="当前使用 Figma UI Kit 为旧版,可能无法支持完整的 Design to code 能力" />
<br />
<Banner type="danger" description="当前使用 API 已过期,请尽快升级" />
<br />
<Banner type="success" description="Semi DSM, Make Semi Design to Any Design" />
</>
);
}非全屏模式
可以设置 fullMode={false} 使用非全屏模式的 banner 样式。通过 bordered 属性可以设置边框。icon={null} 与 closeIcon={null} 分别隐藏图标和关闭按钮。
代码
import { Banner, Typography } from '@fibrous/semi-ui-react';
export default function BannerDemo() {
const { Text } = Typography;
return (
<div style={{ width: 640 }} className="components-banner-demo">
<Banner
fullMode={false}
type="info"
bordered
icon={null}
closeIcon={null}
title={<div style={{ fontWeight: 600, fontSize: '14px', lineHeight: '20px' }}>不知道 AppKey?</div>}
description={
<div>
你可先联系对应的研发同学,确认是否已在 <Text link={{ href: 'https://semi.design/' }}>应用云平台</Text> 申请了应用,并填写对应的信息。
</div>
}
/>
<br />
<Banner
fullMode={false}
type="warning"
bordered
icon={null}
closeIcon={null}
title={<div style={{ fontWeight: 600, fontSize: '14px', lineHeight: '20px' }}>不知道 AppKey?</div>}
description={
<div>
你可先联系对应的研发同学,确认是否已在 <Text link={{ href: 'https://semi.design/' }}>应用云平台</Text> 申请了应用,并填写对应的信息。
</div>
}
/>
<br />
<Banner
fullMode={false}
type="danger"
bordered
icon={null}
closeIcon={null}
title={<div style={{ fontWeight: 600, fontSize: '14px', lineHeight: '20px' }}>不知道 AppKey?</div>}
description={
<div>
你可先联系对应的研发同学,确认是否已在 <Text link={{ href: 'https://semi.design/' }}>应用云平台</Text> 申请了应用,并填写对应的信息。
</div>
}
/>
<br />
<Banner
fullMode={false}
type="success"
bordered
icon={null}
closeIcon={null}
title={<div style={{ fontWeight: 600, fontSize: '14px', lineHeight: '20px' }}>不知道 AppKey?</div>}
description={
<div>
你可先联系对应的研发同学,确认是否已在 <Text link={{ href: 'https://semi.design/' }}>应用云平台</Text> 申请了应用,并填写对应的信息。
</div>
}
/>
</div>
);
}.components-banner-demo {
.semi-banner-info.semi-banner-bordered {
border: 1px solid var(--semi-color-primary-disabled);
}
.semi-banner-warning.semi-banner-bordered {
border: 1px solid var(--semi-color-warning-light-active);
}
.semi-banner-danger.semi-banner-bordered {
border: 1px solid var(--semi-color-danger-light-active);
}
.semi-banner-success.semi-banner-bordered {
border: 1px solid var(--semi-color-success-light-active);
}
}
自定义内容
可以通过 children 自定义其他渲染内容。
代码
import { Banner } from '@fibrous/semi-ui-react';
export default function BannerDemo() {
return (
<div style={{ width: 500, padding: 20, border: '1px solid var(--semi-color-border)' }}>
<Banner fullMode={false} title="Title" type="warning" bordered description="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat">
<div className="semi-modal-footer">
<button className="semi-button semi-button-tertiary semi-button-light" type="button">
No, thanks.
</button>
<button className="semi-button semi-button-warning" type="button">
Sounds great!
</button>
</div>
</Banner>
<br />
</div>
);
}API参考
Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| bordered | 是否展示边框,仅在非全屏模式下有效,默认不展示。 | boolean | - |
| children | 自定义内容,渲染在横幅底部的额外区域。 | React.ReactNode | - |
| className | 根元素的类名。 | string | - |
| closeIcon | 替换关闭按钮内的图标;传 null 时不显示关闭按钮,未设置时显示默认关闭图标。 | React.ReactNode | - |
| description | 描述内容。 | React.ReactNode | - |
| fullMode | 是否为全屏模式;设为 false 时使用非全屏样式。 | boolean | true |
| icon | 替换 type 对应的图标;传 null 时不显示图标,未设置时显示该类型的默认图标。 | React.ReactNode | - |
| onClose | 点击关闭按钮时调用,参数为按钮的原生 click 事件;回调返回后横幅隐藏。 | Type(e: React.MouseEvent) => void | - |
| ref | 根元素(role="alert" 的 div)的引用。 | TypeReact.Ref<HTMLDivElement> | - |
| style | 根元素的样式。 | React.CSSProperties | - |
| title | 标题内容。 | React.ReactNode | - |
| type | 类型,可选 info、success、danger 或 warning。 | Type | "info" |
其他原生属性(如 aria-*、onClick、id)落在根元素 div 上;根元素的 role="alert" 固定,不能被覆盖。
Accessibility
ARIA
- 组件的
role为 'alert' - 关闭按钮的
aria-label来自当前语言包(简体中文为「关闭」,英文为 'Close')
键盘和焦点
- Banner 的关闭按钮可以使用
Tab键聚焦,按钮聚焦后,敲击Enter键或Space键可以关闭 banner
文案规范
- 全屏 Banner
- 尽量保持内容一行展示完全
- 使用正确的标点符号,句子内使用逗号,句子间使用句号
- 非全屏 Banner
- 标题
- 使用精简的语言进行说明
- 标题上尽量避免使用逗号,句号等标点符号,有且只有是疑问句的时候,支持使用问号结尾
- 正文
- 在信息传递完整的前提下,尽可能地将正文压缩至 1 -2 句话
- 对标题进行详尽地描述或者解释,而不是对标题的重复说明
- 使用正确的标点符号,句子内使用逗号,句子间使用句号
- 标题
设计变量
下表是组件内部的 Sass 变量,不能覆写。定制样式请覆写 --semi-* CSS 变量(见 Design Token 页),或写不分层的 CSS 规则。
| Sass 变量 | 值 | 用法 |
|---|---|---|
| $color-banner_info-bg-default | var(--semi-color-info-light-default) | 背景色 - info |
| $color-banner_info-text-default | var(--semi-color-info) | 文本颜色 - info |
| $color-banner_info-border-default | var(--semi-color-info) | 描边颜色 - info |
| $color-banner_warning-bg-default | var(--semi-color-warning-light-default) | 背景色 - 警告 |
| $color-banner_warning-text-default | var(--semi-color-warning) | 文本颜色 - 警告 |
| $color-banner_warning-border-default | var(--semi-color-warning) | 描边颜色 - 警告 |
| $color-banner_success-bg-default | var(--semi-color-success-light-default) | 背景色 - 成功 |
| $color-banner_success-text-default | var(--semi-color-success) | 文本颜色 - 成功 |
| $color-banner_success-border-default | var(--semi-color-success) | 描边颜色 - 成功 |
| $color-banner_danger-bg-default | var(--semi-color-danger-light-default) | 背景色 - 危险 |
| $color-banner_danger-text-default | var(--semi-color-danger) | 文本颜色 - 危险 |
| $color-banner_danger-border-default | var(--semi-color-danger) | 描边颜色 - 危险 |
| $radius-banner | var(--semi-border-radius-small) | 圆角 |
| $spacing-banner_closeBtn-marginLeft | $spacing-base-tight | 关闭按钮左边距 |
| $spacing-banner_extra-marginTop | $spacing-tight | 关闭按钮顶边距 |
| $spacing-banner_icon-marginRight | $spacing-base-tight | 关闭按钮顶边距 |
| $spacing-banner-paddingX | $spacing-base-tight | 整体水平内边距 |
| $spacing-banner-paddingY | $spacing-base-tight | 整体垂直内边距 |
| $spacing-banner_title_description-marginTop | 2px | 标题与描述信息的间距 |
| $height-banner_closeBtn | 24px | 关闭按钮高度 |
| $width-banner_closeBtn | 24px | 关闭按钮宽度 |
| $width-banner-border | 1px | 描边宽度 |