Shopify Polaris项目中的替代文本(Alt Text)规范指南
为什么替代文本如此重要?
在数字时代,视觉内容占据了Web体验的绝大部分。然而,对于使用屏幕阅读器(Screen Reader)的视障用户来说,图像、图标和其他视觉元素如果没有适当的文本描述,就变成了无法访问的信息黑洞。
根据WCAG(Web Content Accessibility Guidelines,Web内容可访问性指南)1.1.1准则,所有非文本内容都必须提供文本替代方案。Shopify Polaris作为一套成熟的设计系统,深刻理解这一点,并在其组件体系中建立了完善的替代文本规范。
Polaris中的替代文本实现机制
Image组件:基础图像处理
Polaris的Image组件是处理替代文本的核心组件,它强制要求提供alt属性:
interface ImageProps extends React.HTMLProps<HTMLImageElement> {
alt: string; // 必需的替代文本
source: string;
crossOrigin?: CrossOrigin;
sourceSet?: SourceSet[];
onLoad?(): void;
onError?(): void;
ref?: Ref<HTMLImageElement>;
}
// 使用示例
<Image
source="product-image.jpg"
alt="蓝色运动鞋,侧面有反光条,白色鞋底"
/>
Thumbnail组件:缩略图支持
Thumbnail组件支持两种类型的源:图片URL和SVG图标,并统一处理替代文本:
export interface ThumbnailProps {
size?: Size;
source: string | React.FunctionComponent<React.SVGProps<SVGSVGElement>>;
alt: string; // 必需的替代文本
transparent?: boolean;
}
// 使用字符串源(图片)
<Thumbnail
source="thumbnail.jpg"
alt="产品缩略图:黑色皮革钱包"
size="medium"
/>
// 使用组件源(SVG图标)
<Thumbnail
source={NoteIcon}
alt="文档图标"
size="small"
/>
Icon组件:图标可访问性
对于SVG图标,Polaris使用accessibilityLabel属性来提供替代文本:
export interface IconProps {
source: IconSource;
tone?: Tone;
accessibilityLabel?: string; // 屏幕阅读器文本
}
// 使用示例
<Icon
source={CheckIcon}
accessibilityLabel="已完成"
tone="success"
/>
替代文本编写最佳实践
信息性图像的替代文本
具体编写指南
| 图像类型 | 替代文本示例 | 说明 |
|---|---|---|
| 产品图像 | alt="黑色皮革背包,带有银色扣环和多个隔层" | 描述产品特征和细节 |
| 功能图标 | alt="搜索" 或 accessibilityLabel="搜索" | 描述图标功能而非外观 |
| 装饰图像 | alt="" | 空字符串表示屏幕阅读器跳过 |
| 信息图表 | alt="2024年销售趋势图表:Q1增长15%,Q2增长22%" | 包含关键数据信息 |
| 链接图像 | alt="下载产品手册" | 描述链接目的地而非图像内容 |
常见错误避免
// ❌ 错误示例 - 过于 vague
<Image source="chart.png" alt="图表" />
// ❌ 错误示例 - 冗余信息
<Image source="product.jpg" alt="这是一张产品的图片" />
// ❌ 错误示例 - 缺失alt属性
<Image source="icon.png" />
// ✅ 正确示例 - 具体且简洁
<Image source="sales-chart.png" alt="2024年月度销售趋势:一月$50K,二月$65K" />
// ✅ 正确示例 - 功能描述
<Icon source={SearchIcon} accessibilityLabel="搜索产品" />
Polaris组件中的替代文本集成
Navigation组件中的Logo处理
// Logo的可访问性标签
const logo = {
url: '/',
accessibilityLabel: 'Shopify商家后台首页',
contextualSaveBarSource: 'data:image/svg+xml;base64,...'
};
// 在Navigation中使用
<Navigation
logo={logo}
// 其他属性...
/>
复杂组件中的图像处理
对于包含多个图像的复杂组件,Polaris确保每个图像都有适当的替代文本:
// MediaCard组件示例
<MediaCard
title="产品展示"
primaryAction={{
content: '查看详情',
onAction: () => {},
}}
>
<img
alt="新款智能手机,黑色机身,6.7英寸屏幕"
src="phone.jpg"
/>
</MediaCard>
测试与验证
自动化测试
Polaris项目使用Pa11y等自动化工具进行可访问性测试:
# 运行可访问性测试
npx pa11y http://localhost:3000
# 检查替代文本合规性
npx pa11y --include-warnings http://localhost:3000
手动测试清单
根据Polaris的可访问性测试指南,替代文本需要验证:
- 信息性图像:是否有有意义的alt文本
- 装饰性图像:是否使用
alt="" - 功能图标:是否有适当的accessibilityLabel
- 复杂图像:替代文本是否准确描述内容
- 冗余检查:是否避免"图片 of"等冗余描述
屏幕阅读器测试
Polaris推荐使用以下屏幕阅读器进行测试:
- VoiceOver (macOS/iOS)
- NVDA (Windows)
- TalkBack (Android)
测试时关注:
- 替代文本是否被正确朗读
- 阅读顺序是否自然
- 是否有重复或缺失的描述
开发实践与代码审查
组件开发规范
开发新组件时,必须考虑:
// 在组件Props中明确定义可访问性属性
interface MyComponentProps {
// 图像相关属性
imageSource?: string;
imageAlt?: string; // 必须提供默认值或必需
// 图标相关属性
icon?: React.ComponentType;
iconAccessibilityLabel?: string;
// 其他可访问性属性
ariaLabel?: string;
ariaDescribedBy?: string;
}
// 提供合理的默认值
const MyComponent: React.FC<MyComponentProps> = ({
imageAlt = '', // 默认为空(装饰性)
iconAccessibilityLabel,
// ...其他属性
}) => {
// 组件实现
};
代码审查清单
在代码审查时,检查以下替代文本相关项目:
| 检查项 | 通过标准 | 示例 |
|---|---|---|
所有<img>标签 | 必须有alt属性 | <img alt="描述" src="..."> |
| Icon组件 | 重要图标必须有accessibilityLabel | <Icon accessibilityLabel="设置" /> |
| 功能图像 | alt文本描述功能而非外观 | alt="提交表单"而非alt="绿色按钮" |
| 装饰元素 | 使用alt="" | <img alt="" role="presentation" /> |
| 复杂内容 | 提供详细描述 | alt="销售数据图表:Q1-$100K, Q2-$150K" |
常见场景处理指南
电子商务特定场景
// 产品列表项
<ResourceItem
media={
<Thumbnail
source="product-123.jpg"
alt="蓝色棉质T恤,胸前有品牌logo"
/>
}
/>
// 订单状态图标
<Icon
source={TruckIcon}
accessibilityLabel="已发货"
tone="success"
/>
// 支付方式图标
<Image
source="visa-card.png"
alt="Visa信用卡支付"
/>
表单和相关元素
// 表单中的帮助图标
<InlineStack gap="200">
<Text as="span">订单金额</Text>
<Icon
source={HelpIcon}
accessibilityLabel="订单金额帮助信息"
/>
</InlineStack>
// 错误状态图标
<InlineStack gap="100">
<Icon
source={AlertIcon}
accessibilityLabel="错误:请输入有效邮箱地址"
tone="critical"
/>
<Text tone="critical">请输入有效邮箱地址</Text>
</InlineStack>
总结与最佳实践
核心原则
- 必要性原则:每个非文本内容都必须有文本替代
- 准确性原则:替代文本必须准确描述内容或功能
- 简洁性原则:保持描述简洁,避免冗余
- 上下文原则:考虑图像在上下文中的用途
实施 checklist
- 所有
<img>元素都有alt属性 - 信息性图像提供有意义的描述
- 装饰性图像使用
alt="" - 功能图标使用适当的accessibilityLabel
- 复杂图像(如图表)提供详细描述
- 链接图像描述链接目的地
- 避免使用"图像"、"图标"等冗余词汇
- 定期进行屏幕阅读器测试
持续改进
Polaris团队持续监控WCAG标准的更新,并相应调整替代文本的实现策略。开发者应该:
- 关注WCAG 2.2及未来版本的更新
- 定期审查和更新现有组件的可访问性
- 参与Polaris社区的可访问性讨论
- 分享替代文本编写的最佳实践
通过遵循这些指南,我们可以确保Shopify Polaris构建的应用不仅视觉上精美,而且对所有用户都是可访问的,真正实现"为所有人创造更好的商业体验"的愿景。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



