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以上に高め、最大の読みやすさを保証します。
単に背景を暗くしたりテキストを明るくしたりするのとは異なり、High Contrastは包括的に機能します:インターフェースのカラーパレットを限られた高コントラスト色のセットに置き換え、要素の周りに輪郭を追加し、透明度を削除します。このモードは、視力低下、羞明、特定の色覚異常のある人向けに設計されています。
ハイコントラストには3つのタイプがあります:システムレベル(OSで有効になり、すべてのアプリケーションに影響)、アプリ内(特定のアプリケーション内の組み込みモード)、Webモード(CSSメディア機能prefers-contrast)です。システムレベルのハイコントラストは最も強力で、独自のアクセシビリティサポートがないアプリケーションでも色を上書きします。
ハイコントラストの主なユーザーは、白内障(コントラスト感度を低下させる水晶体の混濁)、加齢黄斑変性症(中心視力の喪失)、緑内障、糖尿病性網膜症のある人々です。このモードは明るい日光の下での作業時にも必要です — 高コントラストが画面のぎらつきを補正します。WebAIM(2025)によると、86%のWebページでテキストのコントラストがWCAG AAを下回っています — ユーザー側のハイコントラストがこの欠陥を部分的に修正します。
iOSでは、Increase Contrast機能はSettings > Accessibility > Display & Text Sizeにあり、3つの独立したスイッチがあります:Increase Contrast(全体的な強化)、Darken Colors(明るい色を暗くする)、Reduce Transparency(透明度を減らす)です。Increase Contrastがメインスイッチで、システム要素のテキスト、ボタン、境界線に影響します。
技術的には、iOSはtintColorとUIVisualEffectViewレイヤーを通じてIncrease Contrastを実装しています。有効化されると、システムは暗い色調のアルファ値を増加させ、明るい色調では減少させ、すべての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状態へのアクセスを提供し、モードがアクティブなときにアクセントカラーを適応させ、ナビゲーションバーの透明度を無効にし、コントラスト変更に関するシステム通知を購読します。UIKitはUIAccessibilityステータスが変更されると自動的に要素を再描画します。
iOSは、Increase Contrastモードに自動的に適応する動的UIColor色(systemBackground、label、secondaryLabel)を提供します。Increase Contrastが有効化されると、システム色は値を変更します:labelは暗くなり(またはダークモードでは明るくなり)、背景は透明度を失います。開発者は、システムのコントラストとの競合を避けるために、すべてのUI要素に動的色を使用することを推奨されます。
Androidでは、High Contrast Text機能はiOSとは異なる動作をします。コントラスト比を滑らかに増加させる代わりに、Androidは反転カラースキームを適用します:暗い背景と太字を強化した白いテキストです。このモードは、黒が最大のコントラストを提供するAMOLEDディスプレイで特に効果的です。設定は設定 > アクセシビリティ > 視認性の向上にあります。
Android High Contrast Textは2つのメカニズムを使用します:テーマオーバーレイによるカラーパレットの上書きと、ビットマップ画像のコントラストを高めるためのColorMatrixの適用です。システムは現在のアプリケーションテーマ(ライト/ダーク)を分析し、最大コントラストのオーバーレイを適用します:黒の背景(#000000)に白の前景(#FFFFFF)。半透明の要素は不透明な背景を受け取ります。
AndroidでHigh Contrast Textの状態を確認するには、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とシステム設定を通じてHigh Contrastがアクティブかどうかを確認し、Jetpack Composeで色を適応させ、Viewシステム用のカスタムContrastTextViewを提供します。Androidでは、iOSとは異なり、High Contrast変更の直接的な通知はありません — 動的更新にはSettings.SystemのContentObserverが必要です。
Material Design 3(Material You)には、Dynamic Colorを通じた組み込みのハイコントラストサポートが含まれています。システムモードがアクティブな場合、Material 3は自動的に最大のトーンパレットを選択します:background = Neutral0、onBackground = Neutral100、primary = Primary100。開発者はMD3コンポーネントを使用するだけでよく、システムが自動的にコントラスト適応を処理します。
WCAGコントラスト比は、2つの色間の輝度の数学的比率であり、テキストのアクセシビリティを評価するために使用されます。標準は2つのしきい値を定義しています:通常のテキスト用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 | — |
| High Contrast iOS | ~7:1 | ~5.5:1 | 4.5:1 |
| High Contrast 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)
}
// 相対輝度
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
}
// 2色間のコントラスト比
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により、Webページはユーザーのシステムコントラスト設定に基づいてスタイルを適応させることができます。この機能は値を受け付けます:no-preference(デフォルト)、more(ユーザーがハイコントラストを有効化)、less(ユーザーが低コントラストを好む)、custom(微調整)。2022年以降、すべてのモダンブラウザでサポートされています。
prefers-contrast: more — Web開発者へのシグナル:テキストのコントラスト比を高め、半透明の背景を不透明に置き換え、インタラクティブ要素の境界線を強化し、低コントラストの背景画像を削除します。iOS SafariとAndroid Chromeは、システムのハイコントラストモード(Increase Contrast / High Contrast Text)が有効になるとmore値を渡します。
prefers-contrast: moreがアクティブな場合、Webページは色の数を最小限に抑え、アクセントカラーを伴う白黒パレットを優先する必要があります。以下は、色の置き換え、透明度の削除、境界線の強化を行った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の黒い境界線を取得し、テキストは黒(#333の代わりに#000)になり、ボタンは視認性のために黒い輪郭のある濃い青色になります。prefers-contrast: less(まれなケース — ユーザーがソフトな色を好む)の下では、代わりにコントラストが低下します。
完全なアクセシビリティ適応のために、prefers-contrastはprefers-color-scheme(ライト/ダークテーマ)と組み合わされます。prefers-color-scheme: darkとprefers-contrast: moreの両方がアクティブな場合、色は明るいアクセントを持つ黒地に白であるべきです。ライトモードでは — 白地に黒です。これらのメディア機能の組み合わせにより、完全なアクセシビリティカバレッジのためにテストする必要がある4つの組み合わせが得られます。
よくある質問
High Contrast — 視覚障害のある人のためにインターフェース要素の色のコントラストを高めるアクセシビリティモードです。iOSでは、設定はIncrease Contrast(Settings > Accessibility > Display & Text Size)と呼ばれ、AndroidではHigh Contrast Text(設定 > アクセシビリティ)です。このモードは色を高コントラスト色に置き換え、透明度を削除し、境界線を強化します。
iOSでハイコントラストを確認するには、UIAccessibility.isDarkerSystemColorsEnabled(Bool)を使用します。変更を追跡するには、UIAccessibility.darkerSystemColorsStatusDidChangeNotificationを購読します。UIKitはモードが有効化されると動的に色を変更します — 自動適応のためにシステムUIColor色(systemBackground、label、secondaryLabel)を使用してください。
Android High Contrast Textは反転カラースキームを適用します — 太字を強化した黒の背景に白いテキストです。このモードはコントラストを高めるためにテーマオーバーレイとColorMatrixを使用します。Material Design 3はハイコントラストがアクティブなときに自動的に色を適応させます — 開発者はAndroid 12+のMD3コンポーネントとDynamic Colorを使用するだけで済みます。
WCAGはコントラスト比を定義しています:AAレベルでは通常のテキストに4.5:1、大きなテキスト(18pxまたは14px太字から)に3:1が必要です。AAAレベル — 通常のテキストに7:1、大きなテキストに4.5:1。計算は、Rec.709重みを持つsRGBチャンネルの相対輝度を使用して式(L1 + 0.05) / (L2 + 0.05)で行われます。
CSSメディア機能prefers-contrast: moreにより、Webページはシステムのハイコントラストがアクティブなときにコントラストを高めることができます:rgba背景を不透明に置き換え、境界線を2pxに強化し、テキストを白地に黒にし、box-shadowを無効にします。ダークテーマ+ハイコントラストでの完全な適応のためにprefers-color-schemeと組み合わせます。2022年以降、すべてのモダンブラウザでサポートされています。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。