ARIA Etiketleriyle React Calendar Bileşeninizi Erişilebilir Hale Getirme
Erişilebilirlik, modern web geliştirmenin kritik bir yönüdür ve uygulamaların tüm kullanıcılar için kapsayıcı olmasını sağlar. React projelerinde aşağıdaki gibi bileşenlerin kullanılması Takvim kullanıcı arayüzlerini görüntülemek, onları ekran okuyucular için erişilebilir hale getirmeye çalışırken benzersiz zorluklar ortaya çıkarabilir.
Son zamanlarda dinamik olarak eklemem gereken bir proje üzerinde çalıştım bir programdaki bireysel gün öğelerine bileşen. Amaç, kullanıcılara her günün durumuna göre "Seçilen tarih: 1 Ocak 2024" veya "Kullanılamayan tarih: 2 Ocak 2024" gibi anlamlı bilgiler sunmaktı.
İlk başta aşağıdaki gibi standart çözümleri denedim: veya , ancak hemen fark etti ki kütüphane bu tür aksesuarlar için yerleşik desteğe sahip değildi. Bir sonraki içgüdüm DOM post-render'ı kullanarak manipüle etmekti. kullanımRef Ve . İşlevsel olmasına rağmen bu yaklaşım kırılgandı ve sınıf adlarına büyük ölçüde bağımlıydı. 😕
Bu makale, ARIA etiketlerini sisteminize dinamik olarak eklemek için daha sağlam bir çözüm konusunda size yol gösterecektir. günler. İster seçili, ister devre dışı veya kullanılamayan durumlarla ilgileniyor olun, takviminizin erişilebilir ve ekran okuyucu dostu kalmasını sağlayacağız. Hadi dalalım! 🚀
Emretmek | Kullanım Örneği |
---|---|
useRef | const takvimRef = useRef(null); DayPicker bileşeninin DOM'sine doğrudan erişmek ve bunları değiştirmek için değiştirilebilir bir başvuru nesnesi oluşturur. |
querySelectorAll | CalendarRef.current.querySelectorAll(".rdp-day"); Eşleşen tüm öğeleri alır Daha fazla manipülasyon için DayPicker bileşeni içindeki sınıf. |
setAttribute | day.setAttribute("aria-label", ariaLabel); Dinamik olarak ekler veya değiştirir ekran okuyuculara erişilebilirlik sağlayan özellik. |
components | bileşenler={{ Gün: renderDay }} Her günün varsayılan işlemesini değiştirmek için özel bir işlev ekleyerek ARIA etiketinin özelleştirilmesine olanak tanır. |
modifiers | değiştiriciler={{ sınırlı: takvimDates.limited }} Günleri görsel ve işlevsel olarak ayırt etmek için DayPicker içindeki belirli gün durumlarını (ör. sınırlı, kullanılamıyor) tanımlar. |
aria-label | Günlere anlamsal bir açıklama ekleyerek onları ekran okuyucular gibi yardımcı teknolojiler için anlaşılır ve gezinilebilir hale getirir. |
getByLabelText | screen.getByLabelText("Seçilen tarih: 1 Ocak"); Birim testlerinde bu, öğeleri özelliklerine göre sorgular. Erişilebilirlik etiketlerinin doğru şekilde uygulandığından emin olmak için öznitelik. |
useEffect | useEffect(() => {...}, [takvimTarihleri]); DayPicker oluşturulduktan sonra mantığı çalıştırarak takvim durumu değiştiğinde ARIA etiketlerinin dinamik olarak eklenmesini sağlar. |
modifiersStyles | değiştiricilerStyles={{ sınırlı: limitedStyle }} Belirli gün değiştiricilere özel stil uygulayarak durumlarını kullanıcılar için görsel olarak farklı kılar. |
generateAriaLabel | createdAriaLabel(gün, değiştiriciler) Bir günün durumuna göre dinamik olarak bağlama özgü ARIA etiketleri üreten bir yardımcı program işlevi. |
DayPicker için Dinamik ARIA Etiketleri: Ayrıntılı Kılavuz
Bir bina inşa ederken React'te DayPicker kütüphanesini kullanarak ekran okuyucuların erişilebilirliğini sağlamak zor olabilir. Asıl zorluk dinamik olarak eklemede yatmaktadır. "seçili", "devre dışı" veya "kullanılamıyor" gibi durumları iletmek için günlük öğelere aktarırlar. Bunu çözmek için iki yaklaşım kullandık: oluşturma sonrası DOM manipülasyonu ve özel işleme işlevi. Bu çözümlerin nasıl çalıştığını ve erişilebilirliği sağlamak için kullanılan temel bileşenleri ayrıntılı olarak inceleyelim. 🗓️
İlk çözüm şunlara bağlıdır: React’ı kullanarak Ve . 'useRef' ile DayPicker bileşenine referans oluşturarak render edilen DOM düğümlerine erişebiliriz. Bir 'useEffect' kancası içinde, 'querySelectorAll' kullanarak tüm gün öğelerini ('.rdp-day') sorgularız. Her gün için, durumunu belirlemek amacıyla sınıf adlarını kontrol ederiz. Bir gün "rdp-day_selected" sınıfına sahipse "Seçili tarih: 1 Ocak 2024" gibi bir ARIA etiketi ekliyoruz. Bu yöntem, takvim durumu değiştiğinde ARIA etiketlerinin dinamik olarak güncellenmesini sağlar.
İkinci çözüm, bir tanımlayarak daha temiz, daha React dostu bir yaklaşım benimser. . DayPicker'da, gün öğelerinin oluşturulmasını geçersiz kılmak için "bileşenler" desteği aracılığıyla özel bir bileşen kullanırız. Özel işlev, her günü ve durum değiştiricilerini parametre olarak alır. Bir yardımcı işlevi kullanarak, her günün durumuna (örneğin seçili, devre dışı) dayalı olarak ARIA etiketlerini dinamik olarak oluştururuz. Örneğin, "Kullanılamayan tarih: 2 Ocak 2024", devre dışı olarak işaretlenen günlere atanır. Bu yaklaşım DOM manipülasyonunu önler ve çözümün daha sürdürülebilir olmasını sağlar.
Her iki yöntemin de artıları ve eksileri vardır. İşleme sonrası DOM manipülasyonu bize işlenmiş çıktı üzerinde kontrol sağlarken, bu büyük ölçüde kitaplık güncellemeleriyle değişebilecek sınıf adlarına bağlıdır. Öte yandan, "bileşenler" desteğinin kullanılması React'ın bildirimsel paradigmasıyla daha iyi uyum sağlar, kodu daha temiz hale getirir ve hata ayıklamayı kolaylaştırır. Sonuçta bu yaklaşımlar arasındaki seçim proje gereksinimlerinize ve kütüphane kısıtlamalarınıza bağlıdır. Her iki durumda da nihai sonuç, takvimin ekran okuyuculara güvenen kullanıcılar için erişilebilir olmasını sağlayarak herkes için kullanılabilirliği artırır. 🌟
React DayPicker Bileşenine ARIA Etiketlerini Dinamik Olarak Ekleme
React, JavaScript ve Optimize Edilmiş Yöntemleri Kullanan Dinamik ARIA Etiket Yönetimi
// Solution 1: Adding ARIA labels with post-render DOM Manipulation
import React, { useEffect, useRef } from "react";
import { DayPicker } from "react-day-picker";
import "react-day-picker/dist/style.css";
const AccessibleDayPicker = ({ calendarDates, startDate, endDate }) => {
const calendarRef = useRef(null);
useEffect(() => {
if (calendarRef.current) {
const days = calendarRef.current.querySelectorAll(".rdp-day");
days.forEach((day) => {
const date = day.getAttribute("aria-label");
let ariaLabel = date;
if (day.classList.contains("rdp-day_selected")) {
ariaLabel = `Selected date: ${date}`;
} else if (day.classList.contains("rdp-day_disabled")) {
ariaLabel = `${date} is not available for selection.`;
}
day.setAttribute("aria-label", ariaLabel || date);
});
}
}, [calendarDates]);
return (
<div ref={calendarRef}>
<DayPicker
mode="single"
selected={calendarDates.selected}
onDayClick={() => {}}
showOutsideDays
disabled={{ before: startDate, after: endDate }}
modifiers={{
limited: calendarDates.limited,
unavailable: calendarDates.unavailable,
}}
/>
</div>
);
};
export default AccessibleDayPicker;
DayPicker'da ARIA Etiketleri için Özel Sarmalayıcı Uygulama
Fonksiyonel Bileşenleri Kullanarak React Tabanlı ARIA Etiket Özelleştirmesi
// Solution 2: Using a Custom Wrapper to Assign ARIA Labels
import React from "react";
import { DayPicker } from "react-day-picker";
const CustomDayPicker = ({ calendarDates, startDate, endDate }) => {
const generateAriaLabel = (date, modifiers) => {
if (modifiers.selected) return `Selected date: ${date.toDateString()}`;
if (modifiers.disabled) return `${date.toDateString()} is not available.`;
return date.toDateString();
};
const renderDay = (day, modifiers) => (
<div aria-label={generateAriaLabel(day, modifiers)}>
{day.getDate()}
</div>
);
return (
<DayPicker
mode="single"
selected={calendarDates.selected}
disabled={{ before: startDate, after: endDate }}
modifiers={{
limited: calendarDates.limited,
unavailable: calendarDates.unavailable,
}}
components={{ Day: renderDay }}
/>
);
};
export default CustomDayPicker;
ARIA Etiket Atama için Birim Testleri
ARIA Etiket Bütünlüğünü Sağlamak için Jest ve React Test Kitaplığı
// Solution 3: Unit tests to validate ARIA label assignment
import React from "react";
import { render, screen } from "@testing-library/react";
import AccessibleDayPicker from "./AccessibleDayPicker";
import "@testing-library/jest-dom";
describe("AccessibleDayPicker ARIA labels", () => {
test("adds ARIA labels for selected and disabled days", () => {
const calendarDates = {
selected: new Date(2024, 0, 1),
unavailable: [new Date(2024, 0, 2)],
};
render(<AccessibleDayPicker calendarDates={calendarDates} />);
const selectedDay = screen.getByLabelText("Selected date: Monday, January 1, 2024");
expect(selectedDay).toBeInTheDocument();
const unavailableDay = screen.getByLabelText("Monday, January 2, 2024 is not available.");
expect(unavailableDay).toBeInTheDocument();
});
});
React DayPicker'da Ekran Okuyucu Erişilebilirliğini Sağlama
Ekleme Dinamik olarak erişilebilirlik kritik öneme sahiptir ancak React DayPicker'da kapsayıcı bir deneyim yaratmanın daha fazlası vardır. Gözden kaçan bir husus, ve odak yönetimi. Ekran okuyucu kullanıcıları, takvimler gibi etkileşimli bileşenler arasında geçiş yapmak için büyük ölçüde klavye girişlerine güvenir. DayPicker, kutudan çıktığı haliyle temel klavye gezinmesini destekler, ancak bunu ARIA etiketleriyle birlikte özelleştirmek onu daha sezgisel hale getirebilir.
Keşfedilecek başka bir alan da uluslararasılaştırma (i18n) desteğidir. Projeniz farklı bölgelerdeki kullanıcıları hedefliyorsa ARIA etiketlerinin yerelleştirilmiş tarih formatlarını ve dili yansıtması gerekir. Örneğin, Fransız bir kullanıcı "1 Ocak 2024" yerine "1 Ocak 2024" ifadesini duymalıdır. 'React-intl' veya yerel JavaScript 'Intl.DateTimeFormat' gibi kitaplıklar, bu etiketlerin farklı yerel ayarlardaki ekran okuyucular için dinamik olarak biçimlendirilmesine yardımcı olabilir.
Son olarak, bir günün mevcut odağını veya durumunu görsel olarak belirterek erişilebilirliği daha da artırabilirsiniz. Özel birleştirmek aria-current="date"` gibi ARIA nitelikleri hem görsel hem de anlamsal erişilebilirliği sağlar. Örneğin, ekran okuyuculara bağlam sağlarken aynı zamanda bugünün tarihini görsel olarak vurgulayabilirsiniz. Bu düzeyde bir cila, DayPicker'ınızın yalnızca çalışmasını değil aynı zamanda tüm kullanıcılar için kapsayıcı olma konusunda üstün olmasını sağlar. 🎯
- Nedir? DayPicker'da mı kullanıldı?
- ARIA etiketleri, ekran okuyucular için erişilebilir açıklamalar sağlayarak kullanıcıların "Seçili" veya "Devre Dışı" gibi gün durumlarını anlamalarına yardımcı olur.
- Dinamik olarak nasıl eklerim DOM manipülasyonunu kullanmadan mı?
- DayPicker'ı kullanma prop ile günün oluşturulmasını özelleştirebilir ve ARIA etiketlerini doğrudan ekleyebilirsiniz.
- Yerelleştirebilir miyim? uluslararası kullanıcılar için mi?
- Evet, tarihleri kullanarak biçimlendirebilirsiniz. ARIA etiketlerinin yerelleştirilmiş tarih formatlarını yansıtmasını sağlamak için.
- Nasıl geliştirebilirim ARIA etiketlerinin yanında mı?
- DayPicker klavyede gezinmeyi yerel olarak destekler ancak özel eklemeler de yapar hem kullanılabilirliği hem de erişilebilirliği artırır.
- Dinamik eklerken performans maliyeti var mı? ?
- ARIA niteliklerinin React'in durumunu ve özelliklerini kullanarak düzgün bir şekilde uygulanması, minimum performans ek yükü sağlar.
Ekleme DayPicker'a yardımcı teknolojiler için ayrı ayrı gün öğelerinin durumunu tanımlayarak erişilebilirliği artırır. Ekran okuyuculara güvenen kullanıcılar için kusursuz bir deneyim yaratarak "seçili" veya "kullanılamıyor" gibi önemli durumların net olmasını sağlar. ✅
React kancalarını ve özel işleme yaklaşımlarını birleştirerek hem etkili hem de bakımı kolay bir çözüm elde ediyoruz. İster doğrudan DOM manipülasyonu ister bildirimsel destekler yoluyla olsun, odak noktası tüm kullanıcıların erişebileceği kapsayıcı bir takvim arayüzü sunmaya devam ediyor. 🌟
- Resmi olarak detaylandırıyor Bileşen işlevlerini ve değiştiricilerini keşfetmeye yönelik kitaplık belgeleri. Daha fazlasını şu adreste bulabilirsiniz: React-Day-Picker Belgeleri .
- Erişilebilirliğin önemine ve ARIA'nın en iyi uygulamalarına atıfta bulunur. . ARIA niteliklerine ilişkin ayrıntılı rehberlik şu adreste mevcuttur: MDN ARIA Belgeleri .
- Web erişilebilirliğini ve ekran okuyucu uyumluluğunu geliştirmeye yönelik olarak paylaşılan kavramları araştırıyor şu adreste bulunabilir: WebAIM: Web Erişilebilirliği Aklımızda .