高对比度(High Contrast) — 操作系统的无障碍模式,可增加界面元素的色彩对比度以改善可辨识度。在iOS中,Increase Contrast功能位于Settings > Accessibility > Display & Text Size,允许分别增强文本、按钮和边框的对比度。在Android中,类似的高对比度文本(High Contrast Text)模式可在设置 > 无障碍 > 高对比度文本中找到。根据世界卫生组织的数据,至少有22亿人患有视力障碍,对他们而言高对比度至关重要。
要点
高对比度(High Contrast) 是一种显示模式,操作系统或应用程序通过增加前景(文本、图标)和背景之间的颜色差异来工作。根据WCAG AA标准,普通文本的最低对比度为4.5:1,大文本(从18pt或14pt粗体开始)为3:1。高对比度模式可将对比度提高到7:1或更高,实现最大的可辨识度。
与简单的背景变暗或文本变亮不同,高对比度全方位运作:将界面的颜色方案替换为一组有限的高对比度颜色,在元素周围添加轮廓,并消除半透明效果。该模式适用于视力下降、畏光和某些形式的色盲人士。
三种类型的高对比度:系统级(在操作系统中启用并影响所有应用程序)、应用级(单个应用程序内的内置模式)和网页级(CSS媒体功能prefers-contrast)。系统级高对比度最为强大,因为它可以覆盖那些没有自带无障碍支持的应用程序中的颜色。
高对比度的主要用户 — 白内障患者(晶状体混浊降低对比敏感度)、黄斑变性(中央视力丧失)、青光眼和糖尿病视网膜病变患者。在强光下工作时也需要此模式 — 高对比度可补偿屏幕上的眩光。根据WebAIM(2025)的数据,86%的网页文本对比度低于WCAG AA标准 — 用户端的高对比度部分弥补了这一缺陷。
在iOS中,Increase Contrast功能位于Settings > Accessibility > Display & Text Size,包含三个独立开关:Increase Contrast(总体增强)、Darken Colors(暗化明亮颜色)和Reduce Transparency(降低透明度)。Increase Contrast是影响文本、按钮和系统元素边框的主要开关。
从技术上讲,iOS通过tintColor和UIVisualEffectView层实现Increase Contrast。激活后,系统会提高深色调的alpha值并降低浅色调的alpha值,将所有UI元素的对比度提高2-3个点。Reduce Transparency将半透明背景(磨砂玻璃效果)替换为不透明背景,从而进一步提高模糊背景上文本的可读性。
开发人员可以通过UIAccessibility检查Increase Contrast的状态并调整颜色。例如,如果对比度已提高,则可以使用更饱和的强调色,如果没有 — 通过默认调色板确保4.5:1的基本对比度。UIAccessibility.isReduceTransparencyEnabled在活动模式下禁用模糊效果也很有用。
import UIKit
class ContrastManager {
// 检查Increase Contrast状态
static var isIncreaseContrastEnabled: Bool {
return UIAccessibility.isDarkerSystemColorsEnabled
}
// 检查Reduce Transparency
static var isReduceTransparencyEnabled: Bool {
return UIAccessibility.isReduceTransparencyEnabled
}
// 调整颜色以适应高对比度模式
static func adjustedAccentColor() -> UIColor {
guard isIncreaseContrastEnabled else {
return .systemBlue
}
// 高对比度活动时更饱和的蓝色
return UIColor(red: 0.0, green: 0.35, blue: 0.9, alpha: 1.0)
}
// 考虑Reduce Transparency的背景颜色
static func backgroundColor() -> UIColor {
if isReduceTransparencyEnabled {
return .systemBackground // 不透明背景
}
return UIColor.systemBackground.withAlphaComponent(0.85)
}
// 订阅更改
static func observeChanges(observer: Any, selector: Selector) {
NotificationCenter.default.addObserver(
observer,
selector: selector,
name: UIAccessibility.darkerSystemColorsStatusDidChangeNotification,
object: nil
)
NotificationCenter.default.addObserver(
observer,
selector: selector,
name: UIAccessibility.reduceTransparencyStatusDidChangeNotification,
object: nil
)
}
}
// 使用示例:UINavigationBar
func applyContrastToNavigationBar(_ navBar: UINavigationBar) {
if ContrastManager.isIncreaseContrastEnabled {
navBar.isTranslucent = false
navBar.barTintColor = ContrastManager.backgroundColor()
navBar.titleTextAttributes = [
.foregroundColor: UIColor.label,
.font: UIFont.boldSystemFont(ofSize: 18)
]
}
}ContrastManager类通过isDarkerSystemColorsEnabled提供对Increase Contrast状态的访问,在活动模式下调整强调色,禁用导航栏的半透明效果,并订阅有关对比度变化的系统通知。当UIAccessibility状态发生变化时,UIKit会自动重绘元素。
iOS提供动态UIColor颜色(systemBackground、label、secondaryLabel),这些颜色会自动适应Increase Contrast模式。启用Increase Contrast后,系统颜色会改变其值:label变得更暗(或在深色主题中更亮),background失去半透明效果。建议开发人员对所有UI元素使用动态颜色,以避免与系统对比度冲突。
在Android中,高对比度文本功能的工作方式与iOS不同。Android不是逐步提高对比度,而是应用反向配色方案:深色背景和更粗的白色文本。该模式在AMOLED显示屏上尤其有效,因为黑色可提供最大对比度。该设置位于设置 > 无障碍 > 可见性增强中。
Android高对比度文本使用两种机制:通过主题覆盖(theme overlay)重写颜色调色板和应用ColorMatrix来增加位图图像的对比度。系统分析应用程序的当前主题(亮色/暗色),并应用具有最大对比度的叠加层:白色前景(#FFFFFF)在黑色背景(#000000)上。半透明元素获得不透明底座。
要检查Android中高对比度文本的状态,需要使用AccessibilityManager和ContentResolver。API允许确定模式是否处于活动状态并相应地调整UI。Jetpack Compose支持通过CompositionLocalProvider和LocalContrast进行适配。
import android.accessibilityservice.AccessibilityService
import android.content.Context
import android.provider.Settings
import android.view.accessibility.AccessibilityManager
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
class HighContrastHelper {
// 通过AccessibilityManager检查
fun isHighContrastTextEnabled(context: Context): Boolean {
val am = context.getSystemService(
Context.ACCESSIBILITY_SERVICE
) as AccessibilityManager
return am.isEnabled && am.getEnabledAccessibilityServiceList(
AccessibilityService.FEEDBACK_ALL_MASK
).any { it.resolveInfo.serviceInfo.packageName ==
"com.android.server.accessibility" }
}
// 通过全局设置检查
fun isHighContrastFromSettings(context: Context): Boolean {
return try {
Settings.System.getInt(
context.contentResolver,
"high_text_contrast_enabled"
) == 1
} catch (e: Settings.SettingNotFoundException) {
false
}
}
// Jetpack Compose — 考虑对比度的颜色
@Composable
fun contrastAwareColors(): Pair<Color, Color> {
val context = androidx.compose.ui.platform.LocalContext.current
return if (isHighContrastTextEnabled(context)) {
Color.White to Color.Black
} else {
Color.Black to Color.White
}
}
}
// View系统:动态颜色选择器
class ContrastTextView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null
) : AppCompatTextView(context, attrs) {
private val helper = HighContrastHelper()
override fun onAttachedToWindow() {
super.onAttachedToWindow()
if (helper.isHighContrastTextEnabled(context)) {
setTextColor(Color.WHITE)
setBackgroundColor(Color.BLACK)
setTypeface(getTypeface(), Typeface.BOLD)
}
}
}HighContrastHelper类通过AccessibilityManager和系统设置检查高对比度的活动状态,在Jetpack Compose中调整颜色,并为View系统提供自定义的ContrastTextView。与iOS不同,Android中没有直接的高对比度更改通知 — 必须使用Settings.System上的ContentObserver进行动态更新。
Material Design 3(Material You)通过Dynamic Color包含对高对比度的内置支持。在系统模式激活时,Material 3会自动选择最大的色调调色板:background = Neutral0、onBackground = Neutral100、primary = Primary100。开发人员只需使用MD3组件 — 系统将负责对比度的适配。
WCAG对比度 — 两种颜色之间的数学亮度比,用于评估文本的无障碍性。该标准定义了两个阈值:普通文本为4.5:1(AA级),大文本(从18px/14px粗体)为3:1。AAA级要求普通文本为7:1,大文本为4.5:1。高对比度模式理想情况下应提供7:1或更高的对比度。
对比度的计算公式为:(L1 + 0.05) / (L2 + 0.05),其中L1是较亮颜色的相对亮度,L2是较暗颜色的相对亮度。相对亮度根据sRGB通道加权计算:0.2126R + 0.7152G + 0.0722B。对于无障碍开发人员来说,使用工具就足够了:WebAIM Contrast Checker、Color Contrast Analyser或Xcode中的Accessibility Inspector。
| 级别 | 普通文本 | 大文本(18px/14px粗体) | UI组件 |
|---|---|---|---|
| AA | 4.5:1 | 3:1 | 3:1 |
| AAA | 7:1 | 4.5:1 | — |
| iOS高对比度 | ~7:1 | ~5.5:1 | 4.5:1 |
| Android高对比度 | ~10:1 | ~10:1 | 7:1 |
要在Web应用程序中自动检查对比度,可以使用JavaScript。在高对比度模式激活时,建议突出显示不符合AA标准的元素。下面是一个用JavaScript计算相对亮度和对比度的示例。
// 根据WCAG 2.2计算对比度
class ContrastChecker {
// 将sRGB转换为线性空间
linearize(channel) {
const s = channel / 255
return s <= 0.04045
? s / 12.92
: Math.pow((s + 0.055) / 1.055, 2.4)
}
// 相对亮度(relative luminance)
relativeLuminance(r, g, b) {
const R = this.linearize(r)
const G = this.linearize(g)
const B = this.linearize(b)
return 0.2126 * R + 0.7152 * G + 0.0722 * B
}
// 两种颜色之间的对比度
getContrastRatio(hex1, hex2) {
const rgb1 = this.hexToRgb(hex1)
const rgb2 = this.hexToRgb(hex2)
const L1 = this.relativeLuminance(rgb1.r, rgb1.g, rgb1.b)
const L2 = this.relativeLuminance(rgb2.r, rgb2.g, rgb2.b)
const lighter = Math.max(L1, L2)
const darker = Math.min(L1, L2)
return (lighter + 0.05) / (darker + 0.05)
}
hexToRgb(hex) {
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16),
} : null
}
// 检查AA级别(4.5:1)
passesAA(hex1, hex2) {
return this.getContrastRatio(hex1, hex2) >= 4.5
}
// 检查AAA级别(7:1)
passesAAA(hex1, hex2) {
return this.getContrastRatio(hex1, hex2) >= 7.0
}
}
// 使用
const checker = new ContrastChecker()
console.log(checker.getContrastRatio("#333333", "#FFFFFF"))
// → 13.2:1 (AAA)
console.log(checker.passesAA("#999999", "#FFFFFF"))
// → false (2.8:1)JavaScript中的ContrastChecker类实现了根据WCAG 2.2的完整对比度计算:将sRGB转换为线性空间、使用Rec.709权重计算相对亮度以及与AA/AAA阈值进行比较。该工具在开发支持高对比度的Web应用程序时,对于颜色方案的自动审核非常有用。
要在完成的应用程序中检查对比度,请使用Accessibility Scanner(Android)、Xcode Accessibility Inspector(iOS)或axe DevTools(Web)。这些工具会自动找到对比度低于WCAG AA的元素并突出显示它们。审核期间应启用高对比度模式 — 这将显示系统的对比度增强是否足以达到7:1。
CSS媒体功能prefers-contrast允许网页根据用户的系统对比度设置调整样式。该功能接受以下值:no-preference(默认)、more(用户启用了高对比度)、less(用户偏好低对比度)和custom(精确设置)。自2022年以来得到所有现代浏览器的支持。
prefers-contrast: more — 给Web开发人员的信号:提高文本对比度、将半透明背景替换为不透明背景、增强交互元素的边框以及移除低对比度的背景图像。iOS Safari和Android Chrome在启用系统高对比度模式(Increase Contrast / 高对比度文本)时会传递more值。
在prefers-contrast: more时,网页应最小化颜色数量,并优先使用带有强调色的黑白调色板。下面是一个CSS适配示例,包括颜色替换、禁用半透明和增加边框。
/* 基本样式(no-preference) */
.card {
background: rgba(255, 255, 255, 0.9);
border: 1px solid rgba(0, 0, 0, 0.1);
color: #333;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.button {
background: #0066CC;
color: #FFFFFF;
border: none;
padding: 12px 24px;
}
/* 高对比度:more */
@media (prefers-contrast: more) {
.card {
background: #FFFFFF;
border: 2px solid #000000;
color: #000000;
box-shadow: none;
}
.button {
background: #004499;
outline: 2px solid #000000;
outline-offset: 2px;
}
.muted-text {
color: #000000; // 原来是#666 — 现在是黑色
}
.overlay {
background: rgba(0, 0, 0, 0.8); // 原来是0.4 — 已增强
}
}
/* 低对比度:less */
@media (prefers-contrast: less) {
.card {
border: 1px solid rgba(0, 0, 0, 0.05);
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.04);
}
}在CSS示例中,当prefers-contrast: more时,卡片获得不透明白色背景、2px黑色边框、文本变为黑色(#000代替#333),按钮 — 深蓝色带黑色轮廓以便可见。当prefers-contrast: less(罕见情况 — 用户偏好柔和颜色)时,对比度则降低。
为了实现完全的无障碍适配,prefers-contrast与prefers-color-scheme(浅色/深色主题)结合使用。在prefers-color-scheme: dark和prefers-contrast: more时,颜色应为黑色背景上的白色,带有明亮的强调色。在浅色主题下 — 白色背景上的黑色。这些媒体功能的组合提供了4种组合,需要进行测试以实现完全的无障碍覆盖。
常见问题
高对比度(High Contrast) — 一种无障碍模式,可为视力障碍人士增加界面元素的色彩对比度。在iOS中,该设置称为Increase Contrast(设置 > 辅助功能 > 显示与文字大小),在Android中称为高对比度文本(设置 > 无障碍)。该模式将颜色替换为高对比度颜色,消除半透明效果并增强边框。
要在iOS中检查高对比度,请使用UIAccessibility.isDarkerSystemColorsEnabled(布尔值)。要跟踪更改,请订阅UIAccessibility.darkerSystemColorsStatusDidChangeNotification。UIKit在模式激活时动态更改颜色 — 使用系统UIColor颜色(systemBackground、label、secondaryLabel)进行自动适配。
Android高对比度文本应用反向配色方案 — 更粗的白色文本在黑色背景上。该模式使用主题覆盖(theme overlay)和ColorMatrix来增加对比度。Material Design 3在高对比度激活时自动调整颜色 — 开发人员只需使用MD3组件和Android 12+的Dynamic Color即可。
WCAG定义了对比度:AA级要求普通文本为4.5:1,大文本(从18px或14px粗体)为3:1。AAA级 — 普通文本为7:1,大文本为4.5:1。计算使用公式(L1 + 0.05) / (L2 + 0.05),利用sRGB通道的相对亮度及Rec.709权重。
CSS媒体功能prefers-contrast: more允许网页在系统高对比度时增加对比度:将rgba背景替换为不透明背景、将边框增强到2px、使文本在白色背景上变为黑色、并禁用box-shadow。与prefers-color-scheme结合可完全适应深色主题+高对比度。自2022年以来得到所有现代浏览器的支持。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。