WCAG 2.5.4 · A Seviyesi
Hareket ile Çalıştırma
Cihazı sallamak, eğmek veya döndürmekle yapılan işlemlerin ekrandaki bir denetimle de yapılabilmesini ve bu hareket tepkisinin kapatılabilmesini ister.
Kısaca
Telefonu sallayarak bir işlemi geri almak, eğerek bir listeyi kaydırmak ya da çevirerek bir değeri değiştirmek pratik görünebilir. Ancak cihazı tekerlekli sandalyeye sabitlenmiş biçimde kullanan veya cihazı tutamayan biri bu işlevlere hiç ulaşamaz. Hareket, istemeden de tetiklenebilir: yürürken, araçta ya da titreyen bir elle.
Bu kriter iki şey ister: cihaz hareketiyle yapılan her işlemin ekrandaki bir denetimle de yapılabilmesi ve kullanıcının hareket tepkisini kapatabilmesi.
Neleri kapsar?
- Cihaz hareketi: Sallama, eğme, döndürme gibi ivmeölçer ve jiroskopla algılanan hareketler.
- Kullanıcı hareketi: Kamera önünde el sallamak gibi cihazın algıladığı vücut hareketleri.
- Alternatif: Aynı işlemin ekrandaki bir düğme veya denetimle yapılabilmesi.
- Kapatma: Yanlışlıkla tetiklenmeyi önlemek için hareket tepkisinin devre dışı bırakılabilmesi.
- İstisnalar: Hareketin erişilebilirlik amaçlı bir arayüzle kullanıldığı durumlar ve hareketin işlevin özü olduğu uygulamalar (adımsayar, pusula, seviye ölçer gibi).
- Kapsam dışı notlar: Ekran yönünün tek bir yönle sınırlanmaması AA düzeyindeki ayrı bir kriterin konusudur ve A Seviyesi listesinde yer almaz.
Kimleri etkiler?
Cihazını tekerlekli sandalyeye veya bir tutucuya sabitlemiş kişiler cihazı hareket ettiremez. Motor engeli olan veya cihazı tutmakta zorlanan kullanıcılar sallama ve eğme hareketlerini yapamayabilir. Titreme veya spastisite yaşayan kişiler ise işlevleri istemeden tetikleyebilir. Bu kriter, hareket gerektiren bir özelliği herkes için isteğe bağlı hâle getirir.
Kontrol listesinde
Bu kriter, Bakanlığın A Seviyesi Kontrol Listesi'nde 101–103 numaralı soruları kapsar. Yönlendirme soruları sayfada ilgili içerik olup olmadığını belirler; yoksa liste sizi sonraki soruya geçirir. Aşağıdaki açıklamalar sorulardan alıntı değil, özetidir. Soruların tam metni için resmî listeye bakın.
| Soru | Türü | Ne kontrol eder? |
|---|---|---|
| 101 | Yönlendirme | Cihazı sallamak, döndürmek, eğmek veya yönünü değiştirmekle yapılan bir işlem olup olmadığını sorar. Erişilebilirlik amaçlı hareketler, bilinçli el hareketlerine dayalı temel işlevler ve sensörün işlevin özü olduğu durumlar istisnadır. |
| 102 | ★ Zorunlu | Bu işlemlerin hareket gerektirmeden, ekrandaki bir denetim veya eşdeğer bir yöntemle de yapılabilip yapılamadığını kontrol eder. |
| 103 | ★ Zorunlu | Hareketle tetiklenen işlevlerin kullanıcı tarafından kapatılabilip kapatılamadığını kontrol eder. |
Resmî kontrol listesini indirin (PDF), yeni sekmede açılır
Web için kod örnekleri
1. Sallayarak geri alma
Web sayfaları da devicemotion olayıyla cihaz hareketini algılayabilir. Bu kullanılıyorsa ekranda bir "Geri al" düğmesi ve hareketi kapatma seçeneği de sunulmalıdır.
window.addEventListener("devicemotion", (e) => {
const ivme = e.accelerationIncludingGravity;
if (Math.abs(ivme.x) > 25) {
sonIslemiGeriAl();
}
});<button type="button" id="geri-al">Geri al</button>
<input type="checkbox" id="sallama-ayari">
<label for="sallama-ayari">Sallayarak geri almayı etkinleştir</label>
<script>
document.getElementById("geri-al")
.addEventListener("click", sonIslemiGeriAl);
const ayar = document.getElementById("sallama-ayari");
window.addEventListener("devicemotion", (e) => {
if (!ayar.checked) return; // varsayılan olarak kapalı
const ivme = e.accelerationIncludingGravity;
if (ivme && Math.abs(ivme.x) > 25) sonIslemiGeriAl();
});
</script>2. Eğerek kaydırma
Cihazı eğerek bir galeride ilerleme gibi özellikler, düğmelerle de kontrol edilebilmelidir.
<section aria-label="Tarihi yapılar galerisi">
<button type="button" id="onceki">Önceki yapı</button>
<div id="galeri">…</div>
<button type="button" id="sonraki">Sonraki yapı</button>
<input type="checkbox" id="egme-ayari">
<label for="egme-ayari">Cihazı eğerek gezinmeyi kullan</label>
</section>
<script>
let sonGecis = 0;
window.addEventListener("deviceorientation", (e) => {
if (!document.getElementById("egme-ayari").checked) return;
const simdi = Date.now();
if (simdi - sonGecis < 1000 || e.gamma === null) return;
if (e.gamma > 30) { sonrakiYapi(); sonGecis = simdi; }
if (e.gamma < -30) { oncekiYapi(); sonGecis = simdi; }
});
</script>3. Hareket izni istemeyi kullanıcıya bırakmak
Bazı tarayıcılar (iOS Safari gibi) hareket verisi için kullanıcı izni ister. İzin isteğini sayfa açılırken değil, kullanıcı özelliği etkinleştirdiğinde yapın.
document.getElementById("sallama-ayari").addEventListener("change", async (e) => {
if (e.target.checked &&
typeof DeviceMotionEvent?.requestPermission === "function") {
const izin = await DeviceMotionEvent.requestPermission();
if (izin !== "granted") e.target.checked = false;
}
});4. İstisna örneği: pusula
Kıble yönünü gösteren bir pusula veya bir adımsayar, sensör verisi olmadan işlevini yerine getiremez; bu tür kullanımlar istisna kapsamındadır. Yine de sonucun metin olarak da sunulması önerilir.
<p id="yon-bilgisi" aria-live="polite">Yön: Güneydoğu, 152°</p>Mobil için kod örnekleri
iOS (SwiftUI)
Aşağıdaki örnek CoreMotion ile sallamayı algılar; hareket varsayılan olarak kapalıdır ve ekranda "Geri al" düğmesi her zaman bulunur. iOS'un kendi "Geri almak için salla" özelliği Ayarlar'dan kapatılabilir; ancak uygulamanın kendi hareket özellikleri için ayrı bir ayar sunması gerekir.
import SwiftUI
import CoreMotion
struct TaslakEkrani: View {
@AppStorage("sallamaEtkin") private var sallamaEtkin = false
@State private var hareket = CMMotionManager()
let geriAl: () -> Void
var body: some View {
Form {
Button("Geri al", action: geriAl)
Toggle("Sallayarak geri al", isOn: $sallamaEtkin)
}
.onChange(of: sallamaEtkin) { _, etkin in
etkin ? baslat() : hareket.stopAccelerometerUpdates()
}
.onAppear { if sallamaEtkin { baslat() } }
.onDisappear { hareket.stopAccelerometerUpdates() }
}
private func baslat() {
guard hareket.isAccelerometerAvailable else { return }
hareket.accelerometerUpdateInterval = 0.1
hareket.startAccelerometerUpdates(to: .main) { veri, _ in
guard let a = veri?.acceleration else { return }
if abs(a.x) + abs(a.y) + abs(a.z) > 3.5 { geriAl() }
}
}
}Android (Jetpack Compose)
import android.content.Context
import android.hardware.*
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import kotlin.math.abs
@Composable
fun TaslakEkrani(geriAl: () -> Unit) {
val context = LocalContext.current
var sallamaEtkin by remember { mutableStateOf(false) } // varsayılan kapalı
DisposableEffect(sallamaEtkin) {
val yonetici = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
val dinleyici = object : SensorEventListener {
override fun onSensorChanged(olay: SensorEvent) {
val (x, y, z) = olay.values
if (abs(x) + abs(y) + abs(z) > 35f) geriAl()
}
override fun onAccuracyChanged(s: Sensor?, d: Int) {}
}
if (sallamaEtkin) {
yonetici.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)?.let {
yonetici.registerListener(dinleyici, it, SensorManager.SENSOR_DELAY_UI)
}
}
onDispose { yonetici.unregisterListener(dinleyici) }
}
Column {
Button(onClick = geriAl) { Text("Geri al") }
Row(verticalAlignment = Alignment.CenterVertically) {
Text("Sallayarak geri al", Modifier.weight(1f))
Switch(checked = sallamaEtkin, onCheckedChange = { sallamaEtkin = it })
}
}
}Her iki örnekte de eşik değerleri yalnızca gösterim amaçlıdır; gerçek uygulamada yanlış tetiklenmeyi azaltmak için art arda birkaç ölçüm ve bekleme süresi kullanılmalıdır.
Nasıl test edilir?
- Hareketle çalışan özellikleri belirleyin: Uygulama belgelerini inceleyin ve geliştiricilere sallama, eğme veya döndürme ile çalışan özellik olup olmadığını sorun.
- Cihazı sabitleyin: Cihazı masaya koyup hareket ettirmeden tüm işlemleri ekrandaki denetimlerle yapmaya çalışın.
- Kapatma ayarını doğrulayın: Hareket tepkisini kapatın ve cihazı sallayın, eğin; işlem tetiklenmemeli.
- Otomatik araçların sınırı: Otomatik araçlar sensör tabanlı etkileşimleri tespit edemez. Kod incelemesinde
devicemotion,deviceorientation, CoreMotion veSensorManagerkullanımlarını aramak yardımcı olur; değerlendirme elle yapılmalıdır.
Sık yapılan hatalar
- Yalnızca sallayarak geri bildirim gönderme: "Sorun bildirmek için telefonu sallayın" özelliğinin ekranda karşılığının olmaması.
- Kapatılamayan hareket özelliği: Yürürken veya araçta yanlışlıkla tetiklenen işlemler.
- Hareketi varsayılan olarak açık tutmak: Kapatma ayarı olsa bile ayarın bulunması zor olabilir; isteğe bağlı özellikler varsayılan olarak kapalı tutulabilir.
- İstisnayı geniş yorumlamak: Eğlenceli bir etkileşim olarak eklenen hareketler istisna kapsamında değildir.
Kaynaklar
- Understanding SC 2.5.4: Motion Actuation (W3C), İngilizce, yeni sekmede açılır
- Erişilebilirlik blogu — Uygulamadan örnekler ve güncel yazılar.
- Erişilebilirlik kütüphanesi — Cihaz hareketi, sensör, alternatif denetim ve diğer terimler.
Sitenizde bu kriter nasıl görünüyor?
Ücretsiz tarama, bu kriterdeki sorunları ve diğerlerini Bakanlığın A Seviyesi Kontrol Listesi esas alınarak listeler.
Sıradaki kriterler
Hata Tanımlaması
Veri girişinde bir hata otomatik olarak algılandığında hatanın metinle bildirilmesini, nedeninin açıkça anlatılmasını ve hangi alanla ilgili olduğunun belirtilmesini ister.
Kriteri inceleİşaretçi Hareketleri
Çok parmaklı veya belirli bir yol çizmeyi gerektiren hareketlerle yapılan her işlemin, tek bir dokunuş ya da tıklamayla da yapılabilmesini ister.
Kriteri inceleİşaretçi İptali
Tek işaretçiyle yapılan işlemlerin yanlışlıkla tetiklenmemesi için işlemin parmak veya fare bırakıldığında gerçekleşmesini ya da iptal edilebilmesini, geri alınabilmesini ister.
Kriteri incele