現代圖片性能優化及體驗優化指南 - 圖片資源的容錯及可訪問性處理

来源:https://www.cnblogs.com/coco1s/archive/2023/03/10/17202234.html
-Advertisement-
Play Games

本文是系列第五篇,終章。系列文章: 現代圖片性能優化及體驗優化指南 - 圖片類型及 Picture 標簽的使用 現代圖片性能優化及體驗優化指南 - 響應式圖片方案 現代圖片性能優化及體驗優化指南 - 縮放精細化展示及避免佈局偏移、拉伸 現代圖片性能優化及體驗優化指南 - 懶載入及非同步圖像解碼方案 圖 ...


本文是系列第五篇,終章。系列文章:

  1. 現代圖片性能優化及體驗優化指南 - 圖片類型及 Picture 標簽的使用
  2. 現代圖片性能優化及體驗優化指南 - 響應式圖片方案
  3. 現代圖片性能優化及體驗優化指南 - 縮放精細化展示及避免佈局偏移、拉伸
  4. 現代圖片性能優化及體驗優化指南 - 懶載入及非同步圖像解碼方案

圖片資源,在我們的業務中可謂是占據了非常大頭的一環,尤其是其對帶寬的消耗是十分巨大的。

對圖片的性能優化及體驗優化在今天就顯得尤為重要。本文,就將從各個方面闡述,在各種新特性滿頭飛的今天,我們可以如何儘可能的對我們的圖片資源,進行性能優化及體驗優化。

圖片資源的容錯及可訪問性處理

OK,最後一個章節,我們簡單聊一聊圖片資源的容錯及可訪問性處理。

圖片的可訪問性處理

可訪問性(A11Y),在我們的網站中,屬於非常重要的一環,但是大部分同學都容易忽視它。

在一些重交互、重邏輯的網站中,我們需要考慮用戶的使用習慣、使用場景,從高可訪問性的角度考慮,譬如假設用戶沒有滑鼠,僅僅使用鍵盤,能否順暢的使用我們的網站?

非常重要的一點是,提高可訪問性也能讓普通用戶更容易理解 Web 內容

基於 Usability & Web Accessibility - image

對於圖像信息,我們需要大致遵循如下可訪問性原則:

  • 所有有意義的 img 元素必須有 alt 屬性
  • 提供替代 alt 屬性的其他方式
  • 使用輔助技術隱藏裝飾圖像

第一點非常好理解,所有的有意義的圖片元素都必須要提供 alt 屬性。

第二點比較有意思,在 A11Y 中,其實有一套 WAI-ARIA 標準。WAI-ARIA 是一個為殘疾人士等提供無障礙訪問動態、可交互Web內容的技術規範。

簡單來說,它提供了一些屬性,增強標簽的語義及行為:

  • 可以使用 tabindex 屬性控制元素是否可以聚焦,以及它是否/在何處參與順序鍵盤導航
  • 可以使用 role 屬性,來標識元素的語義及作用,譬如使用 <div id="saveChanges" tabindex="0" role="button">Save</div>來模擬一個按鈕
  • 還有大量的 aria-* 屬性,表示元素的屬性或狀態,幫助我們進一步地識別以及實現元素的語義化,優化無障礙體驗

上述第二點,提供替代 alt 屬性的其他方式 的含義就是使用 WAR-ARIA 規範提供的諸如 aria-labelaria-labelledby 屬性為圖像提供可訪問的名稱。

當存在這些屬性時,輔助技術(屏幕閱讀器)將忽略圖像的 alt 屬性並讀取 ARIA 標簽。

而第三點,使用輔助技術隱藏裝飾圖像,又是什麼意思呢?

上面第一點 所有有意義的 img 元素必須有 alt 屬性,反過來說,頁面上也會存在無意義的裝飾性的圖片,這些圖片內容對輔助技術(屏幕閱讀器)而言,其實是可以忽略的。

對於沒有任何功能或信息內容的裝飾圖像,可以通過多種方式對屏幕閱讀器隱藏:

  • 使用空的 alt 屬性
  • 使用 ARIA 屬性 role="presentation" 標明圖片元素是裝飾可忽略圖片
  • 使用 CSS background 的方式呈現這些圖片

alt 不要與 title 混淆

OK,下麵來講一些有意思的細節內容。

有一個非常基礎的知識,簡單過一下,也就是圖片元素中,alttitle 的差異:

  • 圖片中的 alt 屬性是在圖片不能正常顯示時出現的文本提示。
  • 圖片中的 title 屬性是在滑鼠在移動到元素上的文本提示。

正確使用 alt 屬性

對於使用屏幕閱讀器的用戶而言,圖片是無法正常展示或者被的瀏覽的,基於此,我們需要利用好 alt 屬性,或者是上述的aria-labelaria-labelledby 屬性。

那麼,這些屬性內的內容應該填充什麼呢?我們需要基於圖片的功能加以區分:

  • 信息性圖像:以圖形方式表示概念和信息的圖像,通常是圖片、照片和插圖。alt 替代文本應該至少是一個簡短的描述,傳達圖像所呈現的基本信息。

  • 裝飾性圖像:當圖像的唯一目的是為頁面添加視覺裝飾,而不是傳達對理解頁面很重要的信息時,如上述所言,使用空的 alt,譬如 alt=""

  • 功能圖像:用作鏈接或按鈕的圖像的替代文本應該描述鏈接或按鈕的功能,而不是視覺圖像。此類圖像的示例是表示列印功能的印表機圖標或提交表單的按鈕。

  • 文本圖像:可讀文本有時會出現在圖像中。如果圖片不是徽標,請避免圖片中出現文字。但是,如果使用文本圖像,替代文本應包含與圖像中相同的詞。

  • 圖形和圖表等複雜圖像:為了傳達數據或詳細信息,提供與圖像中提供的數據或信息等效的完整文本作為替代文本。

  • 圖像組:如果多張圖像傳達一條信息,則一張圖像的替代文本應傳達整組信息。

  • 圖像映射:包含多個可點擊區域的圖像的替代文本應該為鏈接集提供整體上下文。此外,每個可單獨點擊的區域都應該有替代文本來描述鏈接的目的或目的地。

其實 alt 的學問是非常之多的,如果我們的頁面能做到這一點,那真的算是從根上開始思考,開始優化用戶體驗。

img 元素與 background 元素的取捨

OK,那麼,講到這裡,還有一個有意思的點就很自然的應該被提及。

那就是我們應該什麼時候使用 <img> 元素,什麼時候使用 background 內嵌圖片?

我們可以從性能功能兩個方面進行考慮:

類型 img backgroud-image
圖層位置 前景 背景
預設初始尺寸 不定 固定
是否會產生迴流重繪 不會
圖片載入失敗 可以觸發元素的 onerror 事件,展示 alt 屬性 無法有效設置異常處理場景
使用場景 Logo、產品圖片、廣告圖片 裝飾性無語義內容等

其實性能上並不是核心考慮的點,因為上文我們也講到了在今天可以大規模使用是 loading="lazy" 屬性,圖片可以進行原生支持的懶載入。

我們在考慮選取 <img> 還是 backgroud-image 的時候,更多的還是從圖片功能上進行考慮。一般來說,作為修飾的且無語義的裝飾性圖片選擇使用 background-image,而比較重要的與網頁內容相關的就使用 <img> 標簽。

由於有語義的圖片使用 <img> 展示,它的一個好處在於,當圖片載入失敗的時候,可以觸發元素的 onerror 事件,我們可以有效的利用這一點,對圖片進行異常處理。

圖片的異常處理

當圖片鏈接掛了,載入失敗了,我們比較好的處理方式應該是怎麼樣呢?

處理的方式有很多種。在張鑫旭老師的這篇文章中 -- 圖片載入失敗後CSS樣式處理最佳實踐 有一個不錯的實踐。

核心思路為:

  1. 利用圖片載入失敗,觸發 <img> 元素的 onerror 事件,給載入失敗的 <img> 元素新增一個樣式類
  2. 利用新增的樣式類,配合 <img> 元素的偽元素,在展示預設兜底圖的同時,還能一起展示 <img> 元素的 alt 信息
<img src="test.png" alt="Alt Info" onerror="this.classList.add('error');">
img.error {
    position: relative;
    display: inline-block;
}

img.error::before {
    content: "";
    /** 定位代碼 **/
    background: url(error-default.png);
}

img.error::after {
    content: attr(alt);
    /** 定位代碼 **/
}

我們利用偽元素 before ,載入預設錯誤兜底圖,利用偽元素 after,展示圖片的 alt 信息:

image

OK,到此,完整的對圖片的處理就算完成了,這也比較好的闡述了為什麼,對有語義,有 alt 信息的圖片,我們應該使用 <img> 元素來實現。這是因為,我們可以在錯誤發生的時候,比較好的對圖片進行兜底展示,讓用戶直觀的能夠看到 alt 內容。

完整的 Demo 你可以戳這裡看看:

CodePen Demo -- 圖片處理

當然,上述方案存在兩個小問題:

  1. 對於每一個 <img> 元素,我們都需要寫一段 onerror="this.classList.add('error');" 代碼,有點重覆。因此,這個工作也可以交給 JavaScript 全局性的完成,並且,我們可能需要判斷 alt 的值是否為空,在為空時,使用預設圖片 alt 兜底文案。
  2. 早年間,<img> 等替換元素是沒有偽元素的,後面 Chrome/Firefox 瀏覽器逐漸支持了當,<img> 的 src 拉取失敗時,支持 <img> 元素的偽元素展示,這才有了上述的方案,但是,目前 Safari 仍不支持這個特性,所以,在 Safari 下,我們可能得到如下的結果:
image

效果仍然還是 OK 的,只是沒有了兜底圖的展示,在實際使用過程中,需要知道這一點。

總結一下

本章節,對圖片資源的容錯及可訪問性處理進行了闡述。核心內容在於:

  1. 對於圖像信息,我們需要大致遵循如下可訪問性原則:
    • 所有有意義的 img 元素必須有 alt 屬性
    • 提供替代 alt 屬性的其他方式
    • 使用輔助技術隱藏裝飾圖像
  2. 正確使用 alt 屬性,瞭解不同場景下 alt 應該填充什麼內容
  3. img 元素與 background 元素的取捨
  4. 圖片異常處理的最佳實踐

至此,整個現代圖片性能優化及體驗優化指南到此就圓滿結束,整個系列的文章囊括了非常多的新的規範及特性,需要大家在實踐中根據實際情況靈活選取使用。

同時,我們也應該能看到,前端技術僅僅在這一小個領域,都在不斷的迭代創新。雖然很難,還是需要不斷充實自己跟上新的潮流。共勉。

最後

OK,本文到此結束,希望本文對你有所幫助

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上架基本需求資料 1、蘋果開發者賬號 註冊好的蘋果開發者賬號,個人的就可以了。繳納年費99美刀後登錄到蘋果開發者後臺即刻看到如下內容 簡單描述一下以上內容用於幹啥: 1.app Store Connect:用於蘋果上架,也就是咱們上架到app Store所需要操作的目錄 2.證書、標識符和描述文件: ...
  • 前言 寫作如說話,想說與說明白中間隔著溝壑! 下麵用 Notion AI 作詩來作為本文開頭吧。 想說與說明白(作者:Notion AI) 想說千言萬語,說明白卻難如登天。 言語之間,溝壑重重,思想與表達,有時天壤之別。 有時候,我們沉默不語, 缺乏表達能力,難以抒發內心的情感。 這時候,Notio ...
  • ​ 表格: <table> <tr> <th>表格1</th> </tr> <tr> <td>表格2</td> </tr> </table> 快捷鍵:table>tr*數量>td*數量 屬性名 屬性值 說明 align left、center、right border 1或“” 邊框 cellpad ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 vue3 於 2020 年 09 月 18 日正式發佈,2022 年 2 月 7 日 vue3 成為新的預設版本 距離 vue3 正式發佈已經過去兩年有餘, 成為預設版本也過去大半年了,以前還能說是對新技術、新特性的觀望,而現在面試都直問 ...
  • Web開發工具 從高層次來看,可以將客戶端工具放入以下三大類需要解決的問題中: 安全網路 — 在代碼開發期間有用的工具。 轉換 — 以某種方式轉換代碼的工具,例如將一種中間語言轉換為瀏覽器可以理解的 JavaScript。 開發後階段 — 編寫完代碼後有用的工具,如測試和部署工具。 終端命令 導航計 ...
  • 大數據時代,各行各業對數據採集的需求日益增多,網路爬蟲的運用也更為廣泛,越來越多的人開始學習網路爬蟲這項技術,K哥爬蟲此前已經推出不少爬蟲進階、逆向相關文章,為實現從易到難全方位覆蓋,特設【0基礎學爬蟲】專欄,幫助小白快速入門爬蟲,本期為網頁基本結構介紹。 網頁概述 網頁是互聯網應用的一種形態,是組 ...
  • 前言: Antd + echarts 我想要實現的是點擊表的某一行自動生成對應的折線圖,我在點擊第一行生成5條線,我在點擊第二行的時候,本該生成2條線,結果還是5條線; 最開始我以為設置的 series 沒有初始化,後來打斷點查看數據是兩條,但是生成的線是五條,這個就很離譜 問題原因 官網是這麼說的 ...
  • 裝飾者模式(Decorator Pattern)是一種結構型設計模式,它允許你在不改變對象自身的基礎上,動態地給一個對象添加額外的功能。在前端中,裝飾者模式經常被用於擴展或修改組件的行為或樣式。 JavaScript 中的裝飾者模式可以通過以下幾種方式實現: 1. 通過擴展對象的屬性或方法來實現裝飾 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...