核心概念
无障碍
面向屏幕阅读器和键盘的标签、角色、值、操作和焦点。
屏幕阅读器读到什么
视图的 Label 是辅助技术朗读的内容,Hint 说明激活它会发生什么,Role 说明它是什么:core.RoleButton、RoleLink、RoleHeader、RoleImage、RoleCheckbox、RoleSwitch、RoleRadio、RoleTab、RoleTextField、RoleMenu、RoleMenuItem、RoleDialog、RoleAlert、RoleAdjustable、RoleProgressBar、RoleTable 等。没有标签的文本会朗读它的内容。
core.View{
Role: core.RoleButton,
Label: "加入购物车",
Hint: "加入商品并打开购物车",
OnPress: add,
Children: []core.Node{core.Icon{SVG: lucide.ShoppingCart}},
}
AccessibilityValue 给出范围值或文本值:滑块的最小值、最大值和当前值,或“3 件商品”这样的文本。Accessible 把视图变成一个元素,因此卡片的名称和价格会一起朗读,而不是两个停靠点;没有标签时它会朗读子元素的文本。AccessibilityElementsHidden 隐藏装饰,例如箭头或分隔线,ImportantForAccessibility 隐藏整个子树。
core.View{Accessible: true, Label: "苹果,每公斤 12 元", Children: []core.Node{
core.Text{Content: "苹果"},
core.Text{Content: "每公斤 12 元"},
}}
操作
AccessibilityActions 列出屏幕阅读器在元素上提供的操作:标准操作(core.ActionActivate、ActionIncrement、ActionDecrement、ActionEscape、ActionMagicTap)和应用自己的操作,每个都有 Name 和 Label。OnAccessibilityAction 接收名称。
core.View{
Role: core.RoleAdjustable,
Label: "数量",
AccessibilityValue: func() core.AccessibilityValue {
return core.AccessibilityValue{Max: 10, Now: float32(n.Get()), Text: fmt.Sprintf("%d 件", n.Get())}
},
AccessibilityActions: []core.AccessibilityAction{{Name: core.ActionIncrement}, {Name: core.ActionDecrement}},
OnAccessibilityAction: func(name string) {
if name == core.ActionIncrement {
n.Update(func(v int) int { return v + 1 })
} else {
n.Update(func(v int) int { return v - 1 })
}
},
Children: quantityControls,
}
Expanded 说明展开控件或菜单按钮是否打开,Busy 表示内容仍在加载,Checked、Selected 和 Pressed 报告控件状态。控件的部件可以通过 PartStates 借用它的状态,因此指示器会跟随复选框,而不会成为单独的停靠点。
实时变化
LiveRegion 让屏幕阅读器在视图标签和其中文本变化时朗读:core.LiveRegionPolite 等用户空闲,LiveRegionAssertive 打断当前朗读。cx.Announce 朗读一次消息。
core.Text{ContentFunc: func() string { return fmt.Sprintf("购物车里有 %d 件商品", count.Get()) },
LiveRegion: core.LiveRegionPolite}
焦点与键盘
在 macOS、Web 和 Apple TV 上,可按压的视图和文本框一起成为 Tab 停靠点;NoFocus 让一个视图退出,Focusable 让没有按压的视图成为停靠点。Style.Focus 和 Style.FocusWithin 绘制焦点环,OnFocus 和 OnBlur 听到焦点变化,Ref.Focus() 和 Ref.SetAccessibilityFocus() 移动焦点。Return 和空格按下获得焦点的视图,方向键在标签列表、单选组和菜单中移动。
cx.Env().ScreenReader() 说明是否有屏幕阅读器运行,cx.Env().ReduceMotion() 说明用户是否要求减少动态效果,cx.Env().FontScale() 是文本大小,cx.Env().RTL() 是布局方向。除非设置 NoFontScaling,文本会跟随文本大小;从右到左的布局使用逻辑边时会镜像物理边。