眾所周之,React目前是前端領(lǐng)域最為流行的JavaScript框架之一,很多Web開(kāi)發(fā)都是基于React進(jìn)行Web開(kāi)發(fā)。愛(ài)掏網(wǎng) - it200.com但據(jù) WebAIM Million統(tǒng)計(jì)分析可得知“使用React框架開(kāi)發(fā)的Web應(yīng)用或Web頁(yè)面就可訪問(wèn)性方面而言,其錯(cuò)誤要比一般的主頁(yè)多出5.7%”。愛(ài)掏網(wǎng) - it200.com而且在社區(qū)中普遍認(rèn)為,基于React開(kāi)發(fā)的Web應(yīng)用對(duì)于Web可訪問(wèn)性本來(lái)就差,而且開(kāi)發(fā)者無(wú)法很好的基于React框架開(kāi)發(fā)出具有可訪問(wèn)性的Web應(yīng)用。愛(ài)掏網(wǎng) - it200.com事實(shí)上這是一種錯(cuò)誤的認(rèn)知,基于React能不能開(kāi)發(fā)出具有可訪問(wèn)性的Web應(yīng)用和React本身并沒(méi)有太多的關(guān)系,因?yàn)殚_(kāi)發(fā)一個(gè)具有可訪問(wèn)性的Web應(yīng)用更多的是和HTML和WAI-ARIA有著緊密的關(guān)聯(lián)。愛(ài)掏網(wǎng) - it200.com換句說(shuō),基于React開(kāi)發(fā)具有可訪問(wèn)性的Web應(yīng)用,應(yīng)該注意些什么,以及如何更好的開(kāi)發(fā)更具可訪問(wèn)性的Web應(yīng)用。愛(ài)掏網(wǎng) - it200.com這是今天要和大家一起聊的話題。愛(ài)掏網(wǎng) - it200.com
“為什么說(shuō)基于React框架開(kāi)發(fā)的Web應(yīng)用或頁(yè)面更不具可訪問(wèn)性呢?” 這除了源于錯(cuò)誤的認(rèn)知之外,還有一定的客觀因素存在的。愛(ài)掏網(wǎng) - it200.com其中一個(gè)原因就是基于React框架開(kāi)發(fā)Web應(yīng)用時(shí)會(huì)(或者可能會(huì))使用組件庫(kù)。愛(ài)掏網(wǎng) - it200.com如果使用的組件庫(kù)自身就不具有Web可訪問(wèn)性的話,就會(huì)造成React開(kāi)發(fā)的應(yīng)用不具Web可訪問(wèn)性。愛(ài)掏網(wǎng) - it200.com換句話說(shuō),使用其他組件(特別是第三方組件)進(jìn)行開(kāi)發(fā),要改善Web可訪問(wèn)性而言是件痛苦的事情,而且成本也是極高的。愛(ài)掏網(wǎng) - it200.com因?yàn)樵谶@個(gè)場(chǎng)景之下,要徹底優(yōu)化Web可訪問(wèn)性就需要去修改組件。愛(ài)掏網(wǎng) - it200.com
另外,那就是基于React框架開(kāi)發(fā)者自身就存在一定的問(wèn)題。愛(ài)掏網(wǎng) - it200.com比如 @BrittanyIRL 在2024年React Conf大會(huì)上分享的話題中提到的:
簡(jiǎn)單地說(shuō),很多開(kāi)發(fā)者,特別是基于React這樣的JavaScript框架開(kāi)發(fā)者而言,已經(jīng)習(xí)慣了只使用 另外一個(gè)原因正如 @estellevw 在Twitter上的吐槽: 用一句話來(lái)概括的話,就是: 如果要僅基于 有關(guān)于WAI-ARIA更詳細(xì)的介紹可以閱讀《A11Y 101:WAI-ARIA初探》一文,或者閱讀下面相關(guān)教程: 如果你曾經(jīng)接觸過(guò)Web可訪問(wèn)性相關(guān)的知識(shí)的話,你應(yīng)該知道。愛(ài)掏網(wǎng) - it200.com針對(duì)于Web開(kāi)發(fā)而言,構(gòu)建可訪問(wèn)性的Web應(yīng)用可以根據(jù)相關(guān)的規(guī)范(即 網(wǎng)絡(luò)內(nèi)容無(wú)障礙指南,也就是大家所說(shuō)的WCAG指南)來(lái)做開(kāi)發(fā)。愛(ài)掏網(wǎng) - it200.com另外和WCAG相關(guān)的規(guī)范還有: React框架還沒(méi)有出現(xiàn)之前(或者說(shuō)不基于任何JavaScript框架開(kāi)發(fā)Web應(yīng)用),都是基于HTML來(lái)進(jìn)行開(kāi)發(fā)。愛(ài)掏網(wǎng) - it200.comHTML是構(gòu)建Web應(yīng)用最基本的部分之一,但對(duì)于可訪問(wèn)的Web應(yīng)用而言,在原有的DOM基礎(chǔ)上會(huì)有另一個(gè)解析樹(shù),即 AOM樹(shù)(可訪問(wèn)性樹(shù))。愛(ài)掏網(wǎng) - it200.com粗略地說(shuō),AOM是DOM樹(shù)的一個(gè)子集。愛(ài)掏網(wǎng) - it200.com我們可以用下圖來(lái)描述AOM和DOM之間的關(guān)系: 對(duì)于用戶界面和輔助技術(shù),也可以用AOM和DOM來(lái)描述它們之間的關(guān)系: 但是,基于React框架開(kāi)發(fā)的Web應(yīng)用和我們平時(shí)使用HTML開(kāi)發(fā)的Web應(yīng)用還是有很大區(qū)別的。愛(ài)掏網(wǎng) - it200.com在React中,它通過(guò)構(gòu)建一個(gè)“虛擬DOM”來(lái)替代DOM,執(zhí)行DOM更新的替代方法(直接更新DOM的開(kāi)銷可能相當(dāng)大)。愛(ài)掏網(wǎng) - it200.com對(duì)于每個(gè)DOM對(duì)象,虛擬DOM中將有一個(gè)對(duì)應(yīng)的對(duì)象。愛(ài)掏網(wǎng) - it200.com 因此,雖然虛擬DOM本質(zhì)上只是DOM的克隆,但它沒(méi)有修改用戶所看到的內(nèi)容的能力。愛(ài)掏網(wǎng) - it200.com這實(shí)際上使整個(gè)過(guò)程更快,因?yàn)榭梢浴芭幚怼睂?duì)虛擬DOM的更改,并且可以在事件循環(huán)結(jié)束時(shí)進(jìn)行差異(diff)操作 當(dāng)你渲染一個(gè)JSX元素時(shí),每個(gè)虛擬DOM節(jié)點(diǎn)將被更新,然后在更新之前的虛擬DOM和更新之后的現(xiàn)在的虛擬DOM之間執(zhí)行一個(gè)“差異操作”,并能夠理解哪些對(duì)象被更改了。愛(ài)掏網(wǎng) - it200.com 虛擬DOM是一個(gè)非常重要也是非常復(fù)雜的概念,如果你想了解有關(guān)于虛擬DOM更多的知識(shí),可以閱讀: 先拋開(kāi)虛擬DOM不聊,根據(jù)AOM和DOM之間的關(guān)系,我們可以把虛擬DOM結(jié)合進(jìn)來(lái),那么用下圖來(lái)描述: 換句話說(shuō),即使你對(duì)虛擬DOM不太了解也不過(guò)于太擔(dān)心,因?yàn)榛赗eact構(gòu)建可訪問(wèn)的Web應(yīng)用和以往構(gòu)建可訪問(wèn)的Web應(yīng)用相同,采用的也是相同的規(guī)范,只不過(guò)在寫(xiě)模板(Template)時(shí)有所差異。愛(ài)掏網(wǎng) - it200.com即JSX語(yǔ)法編寫(xiě)模板。愛(ài)掏網(wǎng) - it200.com如果你不熟悉它,建議你花點(diǎn)時(shí)間閱讀以下資源: 有了這些基礎(chǔ),我們就來(lái)開(kāi)始看看如何在React環(huán)境下構(gòu)建更具可訪問(wèn)性的Web應(yīng)用。愛(ài)掏網(wǎng) - it200.com 熟悉JSX或了解React開(kāi)發(fā)的同學(xué)都知道,在React中編寫(xiě)HTML時(shí)要記住的一件事是,HTML屬性需要用 JSX是JavaScript中的一種擴(kuò)展語(yǔ)法,而JavaScript中還有一些特定HTML屬性名匹配的保留字。愛(ài)掏網(wǎng) - it200.com這些不能以你期望的方式來(lái)書(shū)寫(xiě)。愛(ài)掏網(wǎng) - it200.com比如 語(yǔ)義化的HTML指的是具有語(yǔ)義的HTML標(biāo)簽,它使用針對(duì)其目的而全名的元素。愛(ài)掏網(wǎng) - it200.com語(yǔ)義化的HTML也是構(gòu)建可訪問(wèn)Web應(yīng)用的基礎(chǔ),利用多種HTML元素來(lái)強(qiáng)化你的Web應(yīng)用中的信息通常可以使用你直接構(gòu)建更具可訪問(wèn)性的Web應(yīng)用。愛(ài)掏網(wǎng) - it200.com但正如前面 @BrittanyIRL提到的,如今天很多使用React(或類似于React框架,比如Vue)的開(kāi)發(fā)者過(guò)度的依賴于 正因?yàn)椋褂妙愃芌eact框架開(kāi)發(fā)的Web應(yīng)用可能只能看到 這也讓React背上了不可構(gòu)建可訪問(wèn)性Web應(yīng)用的鍋。愛(ài)掏網(wǎng) - it200.com換句話說(shuō),我們使用React框架來(lái)開(kāi)發(fā)Web應(yīng)該,不應(yīng)該只使用這兩個(gè)無(wú)語(yǔ)義的HTML標(biāo)簽,我們更應(yīng)該在寫(xiě)模板(JSX模板)時(shí)考慮有語(yǔ)義的HTML。愛(ài)掏網(wǎng) - it200.com這樣做有幾個(gè)原因:
或
來(lái)構(gòu)建自己的模板(Template)。愛(ài)掏網(wǎng) - it200.com也就是說(shuō),不基于語(yǔ)義化的HTML進(jìn)行Web開(kāi)發(fā),要讓W(xué)eb應(yīng)用更具可訪問(wèn)性,難度是極大的,即使優(yōu)化起來(lái)成本也很高。愛(ài)掏網(wǎng) - it200.com
div
或span
進(jìn)行開(kāi)發(fā),要開(kāi)發(fā)具有Web可訪問(wèn)性的Web應(yīng)用或Web頁(yè)面就需要強(qiáng)度的依賴于WAI-ARIA相關(guān)的技術(shù)。愛(ài)掏網(wǎng) - it200.com
useState
和useEffect
的基本使用children
的使用map()
函數(shù)的使用npm
的使用有基本的了解HTML屬性和保留字
camelCase
(駝峰)編寫(xiě)。愛(ài)掏網(wǎng) - it200.com例如,tabindex
需要寫(xiě)成tabIndex
。愛(ài)掏網(wǎng) - it200.com這個(gè)規(guī)則的例外是,任何data-*
或aria-*
(aria-*
是ARIA中的屬性集,比如aria-label
,aria-hidden
等)屬性仍然按照以往的寫(xiě)法,不需要換成駝峰寫(xiě)法。愛(ài)掏網(wǎng) - it200.comfor
就是JavaScript中的一個(gè)保留字,在JavaScript中它用于循環(huán)遍歷,而在React中元素時(shí),可以使用
for
屬性與相應(yīng)的表單控件綁定在一起,那么這個(gè)時(shí)候,在JSX中就需要把for
換成htmlFor
屬性。愛(ài)掏網(wǎng) - it200.com另外,class
也是JavaScript中的保留字,它在HTML中是用來(lái)給元素聲明類名,那么在React中它就得換成className
。愛(ài)掏網(wǎng) - it200.com除此之外,可能還有更多屬性需要關(guān)注,但到目前為止,我發(fā)現(xiàn)JavaScript中保留字和HTML屬性之間只有這些沖突。愛(ài)掏網(wǎng) - it200.com
語(yǔ)義化的HTML
和
這種無(wú)語(yǔ)義化的HTML標(biāo)簽,甚至很多開(kāi)發(fā)者都不知道如何在開(kāi)發(fā)中使用有語(yǔ)義化的標(biāo)簽。愛(ài)掏網(wǎng) - it200.com
和
標(biāo)簽,也讓眾多開(kāi)發(fā)者造成一種誤解:
相關(guān)內(nèi)容
發(fā)表評(píng)論
更多
網(wǎng)友評(píng)論 (0 條評(píng)論)
暫無(wú)評(píng)論