Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
文介紹在Web前端中為讀屏提供補充信息的一種小技巧,并簡單分析了此技巧的應用場景和注意事項,適當使用本技巧可以在網(wǎng)頁瀏覽中有效提升讀屏的操作體驗。
在WordPress主題的css中,有一條這樣的class定義:
.screen-reader-text { clip: rect(1px, 1px, 1px, 1px); height: 1px; overflow: hidden; position: absolute !important; width: 1px; word-wrap: normal !important; /Many screen reader and browser combinations announce broken words as they would appear visually. */}
那么這個screen-reader-text可以用來做什么呢?從名稱上,我們很容易看出,它是針對讀屏的文本樣式定義。具體表現(xiàn)如何,讓我們來做下面一個實驗:
<p>你愛吃的<span class="screen-reader-text">水果</span>都在這里</p>
通過上面的實驗,我們發(fā)現(xiàn)我們在P標簽中設置的“你愛吃的水果都在這里”中的“水果”二字,視覺上不可見了。讓我們在使用讀屏閱讀上面的文字試試看。沒錯,當你使用讀屏閱讀的時候,讀屏卻完整的讀出了P標簽中的內(nèi)容“你愛吃的水果都在這里了”。
現(xiàn)在我們清楚了,screen-reader-text樣式,用以隱藏那些視覺不需要展現(xiàn)兒對讀屏有價值的內(nèi)容。
我們在來看一個實際可被應用的例子:
<div class="news-list"> <div class="news-list-area"> <h2><a href="javascript:void(0);">軍事</a></h2> <ul> <a href="javascript:void(0);">新聞標題1</a> <a href="javascript:void(0);">新聞標題2</a> ... </ul> <a class="more" href="javascript:void(0);">更多</a> </div> <div class="news-list-area"> <h2><a href="javascript:void(0);">科技</a></h2> <ul> <a href="javascript:void(0);">新聞標題1</a> <a href="javascript:void(0);">新聞標題2</a> ... </ul> <a class="more" href="javascript:void(0);">更多</a> </div></div></div>
我們使用讀屏Tab鍵,遍歷上面的內(nèi)容,可以發(fā)現(xiàn),讀屏是按照代碼書寫的元素的線性順序進行導航的,也就是說,先讀分類標題,在讀新聞標題,最后是“更多”鏈接。這里存在一個問題,當我們按鍵盤Tab鍵導航到“更多”鏈接,讀屏只會讀出“更多 鏈接”,對于不熟悉這個頁面布局的讀屏用戶,可能會難以判斷這個“更多”是哪一個分類的“更多”。
讓我們用screen-reader-text來解決這個問題。修改“更多”鏈接的代碼為:
<a href="javascript:void(0);">更多<span class="screen-reader-text">軍事新聞</span></a>...<a href="javascript:void(0);">更多<span class="screen-reader-text">科技新聞</span></a>
這樣,當我們使用讀屏,Tab鍵定位到“更多”鏈接的時候,就能讀出“更多 軍事新聞”、“更多 科技新聞”,可以清楚區(qū)分“更多”鏈接到底屬于哪一個分類了。
到這里,已經(jīng)很清楚了,screen-reader-text樣式,可以使應用了此樣式的內(nèi)容視覺不可見,讀屏卻能朗讀,是一種為一些元素添加補充內(nèi)容信息的方法。
與此相同的,還可以使用WAI-ARIA中的aria-label等屬性,但aria-label屬性在不同讀屏上表現(xiàn)略有差異,比如下面的代碼,在NVDA和爭渡讀屏上就有不同:
<a aria-label="更多軍事新聞" href="javascript:void(0);">更多</a>
NVDA朗讀:鏈接 更多軍事新聞
爭渡工藝版朗讀:更多 更多軍事新聞
NVDA朗讀采用aria-label值替代原有的鏈接文本,爭渡工藝版則是鏈接文本+aria-label值。
這主要是不同讀屏對于WAI-ARIA支持程度和處理策略的不同所導致的,使用screen-reader-text卻能解決這種差異問題,使用此樣式,讀屏朗讀基本上體驗是一致的了。但需要注意,WAI-ARIA屬于標準,具有更廣泛的普適性,所以我們還是仍然推薦首先考慮使用WAI-ARIA標準,緊在使用WAI-ARIA無法滿足需求的情況下,才使用screen-reader-text技巧來實現(xiàn)。
最后,我們再來談談使用screen-reader-text樣式的注意事項。
這里,我總結(jié)了兩點:
補充信息明確、簡潔
應用screen-reader-text的信息應該足夠的明確、簡潔,冗余的內(nèi)容將會耗費讀屏朗讀的時間,影響操作效率。
緊在需要的時候使用
合理使用screen-reader-text樣式,因為應用它的元素是不可見的,這對使用讀屏的用戶和視覺瀏覽的用戶在交流網(wǎng)頁呈現(xiàn)內(nèi)容的時候,可能存在一定的困擾,雙方接收到的信息是不完全相同的。另一方面,增加朗讀的內(nèi)容,會使得讀屏用戶聽渠道更多的內(nèi)容,影響操作效率。我們可以僅在提供的內(nèi)容信息無法滿足讀屏用戶理解的情況下,提供應用了screen-reader-text的補充內(nèi)容,用以清晰的傳達預期傳遞的信息。
以上就是我們隊screen-reader-text的介紹,希望可以對您有所啟發(fā)。如果您有什么好的想法,也歡迎與我們交流!
劉彪
劉彪信息無障礙專家
信息無障礙研究會
語義化是指根據(jù)內(nèi)容的結(jié)構(gòu)化(內(nèi)容語義化),選擇合適的標簽(代 碼語義化)。通俗來講就是用正確的標簽做正確的事情。
語義化的優(yōu)點如下:
對機器友好,帶有語義的文字表現(xiàn)力豐富,更適合搜索引擎的爬蟲爬 取有效信息,有利于 SEO。除此之外,語義類還支持讀屏軟件,根據(jù) 文章可以自動生成目錄;
對開發(fā)者友好,使用語義類標簽增強了可讀性,結(jié)構(gòu)更加清晰,開發(fā) 者能清晰地看出網(wǎng)頁的結(jié)構(gòu),便于團隊的開發(fā)與維護。
常見的語義化標簽:
DOCTYPE 是 HTML5 中一種標準通用標記語言的文檔類型聲明,它的目 的是告訴瀏覽器(解析器)應該以什么樣(html 或 xhtml)的文檔類 行定義來解析文檔,不同的渲染模式會影響瀏覽器對 CSS 代碼甚?JavaScript 腳本的解析。它必須聲明在 HTML?檔的第??。
瀏覽器渲染頁面的兩種模式(可通過 document.compatMode 獲取,比 如,語雀官網(wǎng)的文檔類型是 CSS1Compat):
CSS1Compat:標準模式(Strick mode),默認模式,瀏覽器使用 W3C 的標準解析渲染頁面。在標準模式中,瀏覽器以其支持的最高標準呈 現(xiàn)頁面。
BackCompat:怪異模式(混雜模式)(Quick mode),瀏覽器使用自己的 怪異模式解析渲染頁面。在怪異模式中,頁面以一種比較寬松的向后 兼容的方式顯示。
如果沒有 defer 或 async 屬性,瀏覽器會立即加載并執(zhí)行相應的腳本。它不會等待后續(xù)加載的文檔元素,讀取到就會開始加載和執(zhí)行,這樣 就阻塞了后續(xù)文檔的加載。
下圖可以直觀地看出三者之間的區(qū)別:
其中藍色代表 js 腳本網(wǎng)絡加載時間,紅色代表 js 腳本執(zhí)行時間,綠 色代表 html 解析。
defer 和 async 屬性都是去異步加載外部的 JS 腳本文件,它們都不 會阻塞頁面的解析,其區(qū)別如下:
執(zhí)行順序:多個帶 async 屬性的標簽,不能保證加載的順序;多個帶 defer 屬性的標簽,按照加載順序執(zhí)行;
腳本是否并行執(zhí)行:async 屬性,表示后續(xù)文檔的加載和執(zhí)行與 js 腳本的加載和執(zhí)行是并行進行的,即異步執(zhí)行;defer 屬性,加載后 續(xù)文檔的過程和 js 腳本的加載(此時僅加載不執(zhí)行)是并行進行的(異步),js 腳本需要等到文檔所有元素解析完成之后才執(zhí)行,DOMContentLoaded 事件觸發(fā)執(zhí)行之前。
行內(nèi)元素有:a b span img input select strong;
塊級元素有:div ul ol li dl dt dd h1 h2 h3 h4 h5 h6 p;
空元素,即沒有內(nèi)容的 HTML 元素。空元素是在開始標簽中關閉的,也就是空元素沒有閉合標簽:
常見的有:<br>、<hr>、<img>、<input>、<link>、<meta>;
鮮見的有:<area>、<base>、<col>、<colgroup>、<command>、<embed>、<keygen>、<param>、<source>、<track>、<wbr>。
在線的情況下,瀏覽器發(fā)現(xiàn) html 頭部有 manifest 屬性,它會請求 manifest 文件,如果是第一次訪問頁面 ,那么瀏覽器就會根據(jù) manifest 文件的內(nèi)容下載相應的資源并且進行離線存儲。如果已經(jīng) 訪問過頁面并且資源已經(jīng)進行離線存儲了,那么瀏覽器就會使用離線 的資源加載頁面,然后瀏覽器會對比新的 manifest 文件與舊的 manifest 文件,如果文件沒有發(fā)生改變,就不做任何操作,如果文 件改變了,就會重新下載文件中的資源并進行離線存儲。
離線的情況下,瀏覽器會直接使用離線存儲的資源。
(1)SVG:
SVG 可縮放矢量圖形(Scalable Vector Graphics)是基于可擴展標 記語言 XML 描述的 2D 圖形的語言,SVG 基于 XML 就意味著 SVG DOM 中的每個元素都是可用的,可以為某個元素附加 Javascript 事件處 理器。在 SVG 中,每個被繪制的圖形均被視為對象。如果 SVG 對象 的屬性發(fā)生變化,那么瀏覽器能夠自動重現(xiàn)圖形。
其特點如下:
不依賴分辨率
支持事件處理器
最適合帶有大型渲染區(qū)域的應用程序(比如谷歌地圖)
復雜度高會減慢渲染速度(任何過度使用 DOM 的應用都不快)不適合游戲應用
(2)Canvas:
Canvas 是畫布,通過 Javascript 來繪制 2D 圖形,是逐像素進行渲 染的。其位置發(fā)生改變,就會重新進行繪制。
其特點如下:
依賴分辨率
不支持事件處理器
弱的文本渲染能力
能夠以 .png 或 .jpg 格式保存結(jié)果圖像
最適合圖像密集型的游戲,其中的許多對象會被頻繁重繪
注:矢量圖,也稱為面向?qū)ο蟮膱D像或繪圖圖像,在數(shù)學上定義為一 系列由線連接的點。矢量文件中的圖形元素稱為對象。每個對象都是
一個自成一體的實體,它具有顏色、形狀、輪廓、大小和屏幕位置等 屬性。
dragstart:事件主體是被拖放元素,在開始拖放被拖放元素時觸發(fā)。
darg:事件主體是被拖放元素,在正在拖放被拖放元素時觸發(fā)。dragenter:事件主體是目標元素,在被拖放元素進入某元素時觸發(fā)。dragover:事件主體是目標元素,在被拖放在某元素內(nèi)移動時觸發(fā)。dragleave:事件主體是目標元素,在被拖放元素移出目標元素是觸 發(fā)。
drop:事件主體是目標元素,在目標元素完全接受被拖放元素時觸發(fā)。
dragend:事件主體是被拖放元素,在整個拖放操作結(jié)束時觸發(fā)。
文主要內(nèi)容
html 的常見元素主要分為兩類:head 區(qū)域的元素、body 區(qū)域的元素。下面來分別介紹。
head 區(qū)域的 html 元素,不會在頁面上留下直接的內(nèi)容。
base元素的介紹:
<base href="/">
base 標簽用于指定基礎的路徑。指定之后,所有的 a 鏈接都是以這個路徑為基準。
body 區(qū)域的 html 元素,會直接出現(xiàn)在頁面上。
div 是最常見的元素,大多數(shù)場景下,都可以用div(實在不行就多包幾層div)。可見,div 是比較通用的元素,這也決定了 div 的的語義并不是很明確。
常見標簽的重要屬性:
我們平時在寫論文或者其他文檔的時候,一般會先列出大綱,然后再寫具體的內(nèi)容。
同樣,html 網(wǎng)頁也可以看成是一種文檔,也有屬于它的大綱。
一個常見的html文檔,它的結(jié)構(gòu)可以是:
<section>
<h1>一級標題</h1>
<section>
<h2>二級標題</h2>
<p>段落內(nèi)容</p>
</section>
<section>
<h2>二級標題</h2>
<p>段落內(nèi)容</p>
</section>
<aside>
<p>廣告內(nèi)容</p>
</aside>
</section>
<footer>
<p>某某公司出品</p>
</footer>
我們可以通過 http://h5o.github.io/ 這個工具查看一個網(wǎng)頁的大綱。
使用方法:
(1)將網(wǎng)址 http://h5o.github.io/ 保存到書簽欄
(2)去目標網(wǎng)頁,點擊書簽欄的網(wǎng)址,即可查看該網(wǎng)頁的大綱。
這個工具非常好用,既可以查看網(wǎng)頁的大綱,也可以查看 markdown 在線文檔的結(jié)構(gòu)。
按照樣式分類:
按照內(nèi)容分類:
注意:在 HTML5 中 a > div 是合法的, div > a > div是不合法的 ;但是在 html 4.0.1 中, a > div 仍然是不合法的。
比如下拉框這種比較復雜的元素,是自帶默認樣式的。如果沒有這個默認樣式,則該元素在頁面上不會有任何表現(xiàn),則必然增加一些工作量。
同時,默認樣式也會帶來一些問題:比如,有些默認樣式我們是不需要的;有些默認樣式甚至無法去掉。
如果我們不需要默認的樣式,這里就需要引入一個概念:CSS Reset。
方案一:
CSS Tools: Reset CSS
方案二:
雅虎的 CSS Reset
我們可以直接通過 CDN 的方式引入:
<link rel="stylesheet" type="text/css" href=">
方式三:(比較有爭議)
*{
margin: 0;
padding: 0;
}
上面何種寫法,比較簡潔,但也有爭議。有爭議的地方在于,可能會導致 css 選擇器的性能問題。
上面的幾種 css reset 的解決思路是:將所有的默認樣式清零。
但是,Normalize.css 的思路是:既然瀏覽器提供了這些默認樣式,那它就是有意義的。既然不同瀏覽器的默認樣式不一致,那么,Normalize.css就將這些默認樣式設置為一致。
共同點:二者都是表示斜體。
區(qū)別:
自閉和的元素中不能再嵌入別的元素。且 HTML5 中要求加斜杠。
所以,如果我們是通過 Ajax 提交表單數(shù)據(jù),也建議加上 form。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。