- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
本文是系列第五篇,终章。系列文章:
图片资源,在我们的业务中可谓是占据了非常大头的一环,尤其是其对带宽的消耗是十分巨大的.
对图片的性能优化及体验优化在今天就显得尤为重要。本文,就将从各个方面阐述,在各种新特性满头飞的今天,我们可以如何尽可能的对我们的图片资源,进行性能优化及体验优化.
OK,最后一个章节,我们简单聊一聊图片资源的容错及可访问性处理.
可访问性(A11Y),在我们的网站中,属于非常重要的一环,但是大部分同学都容易忽视它.
在一些重交互、重逻辑的网站中,我们需要考虑用户的使用习惯、使用场景,从高可访问性的角度考虑,譬如假设用户没有鼠标,仅仅使用键盘,能否顺畅的使用我们的网站?
非常重要的一点是, 提高可访问性也能让普通用户更容易理解 Web 内容 .
基于 Usability & Web Accessibility - image 。
对于图像信息,我们需要大致遵循如下可访问性原则:
第一点非常好理解,所有的有意义的图片元素都必须要提供 alt 属性.
第二点比较有意思,在 A11Y 中,其实有一套 WAI-ARIA 标准 。WAI-ARIA 是一个为残疾人士等提供无障碍访问动态、可交互Web内容的技术规范.
简单来说,它提供了一些属性,增强标签的语义及行为:
<div id="saveChanges" tabindex="0" role="button">Save</div>
来模拟一个按钮 aria-*
属性,表示元素的属性或状态,帮助我们进一步地识别以及实现元素的语义化,优化无障碍体验 上述第二点, 提供替代 alt 属性的其他方式 的含义就是使用 WAR-ARIA 规范提供的诸如 aria-label 和 aria-labelledby 属性为图像提供可访问的名称.
当存在这些属性时,辅助技术(屏幕阅读器)将忽略图像的 alt 属性并读取 ARIA 标签.
而第三点, 使用辅助技术隐藏装饰图像 ,又是什么意思呢?
上面第一点 所有有意义的 img 元素必须有 alt 属性 ,反过来说,页面上也会存在无意义的装饰性的图片,这些图片内容对辅助技术(屏幕阅读器)而言,其实是可以忽略的.
对于没有任何功能或信息内容的装饰图像,可以通过多种方式对屏幕阅读器隐藏:
alt
属性 role="presentation"
标明图片元素是装饰可忽略图片 OK,下面来讲一些有意思的细节内容.
有一个非常基础的知识,简单过一下,也就是图片元素中, alt 与 title 的差异:
alt
属性是在图片不能正常显示时出现的文本提示。 title
属性是在鼠标在移动到元素上的文本提示。 对于使用屏幕阅读器的用户而言,图片是无法正常展示或者被的浏览的,基于此,我们需要利用好 alt 属性,或者是上述的 aria-label 和 aria-labelledby 属性.
那么,这些属性内的内容应该填充什么呢?我们需要基于图片的功能加以区分:
信息性图像 :以图形方式表示概念和信息的图像,通常是图片、照片和插图。 alt 替代文本应该至少是一个简短的描述,传达图像所呈现的基本信息.
装饰性图像 :当图像的唯一目的是为页面添加视觉装饰,而不是传达对理解页面很重要的信息时,如上述所言,使用空的 alt,譬如 alt="" 。
功能图像 :用作 链接或按钮 的图像的替代文本应该描述链接或按钮的功能,而不是视觉图像。此类图像的示例是表示打印功能的打印机图标或提交表单的按钮.
文本图像 :可读文本有时会出现在图像中。如果图片不是徽标,请避免图片中出现文字。但是,如果使用文本图像,替代文本应包含与图像中相同的词.
图形和图表等 复杂图像:为了传达数据或详细信息,提供与图像中提供的数据或信息等效的完整文本作为替代文本.
图像组 :如果多张图像传达一条信息,则一张图像的替代文本应传达整组信息.
图像映射 :包含多个可点击区域的图像的替代文本应该为链接集提供整体上下文。此外,每个可单独点击的区域都应该有替代文本来描述链接的目的或目的地.
其实 alt 的学问是非常之多的,如果我们的页面能做到这一点,那真的算是从根上开始思考,开始优化用户体验.
OK,那么,讲到这里,还有一个有意思的点就很自然的应该被提及.
那就是我们应该什么时候使用 <img> 元素,什么时候使用 background 内嵌图片?
我们可以从 性能 及 功能 两个方面进行考虑:
类型 | img | backgroud-image |
---|---|---|
图层位置 | 前景 | 背景 |
默认初始尺寸 | 不定 | 固定 |
是否会产生回流重绘 | 会 | 不会 |
图片加载失败 | 可以触发元素的 onerror 事件,展示 alt 属性 | 无法有效设置异常处理场景 |
使用场景 | Logo、产品图片、广告图片 | 装饰性无语义内容等 |
其实性能上并不是核心考虑的点,因为上文我们也讲到了在今天可以大规模使用是 loading="lazy" 属性,图片可以进行原生支持的懒加载.
我们在考虑选取 <img> 还是 backgroud-image 的时候,更多的还是从图片功能上进行考虑。一般来说,作为修饰的且无语义的装饰性图片选择使用 background-image ,而比较重要的与网页内容相关的就使用 <img> 标签.
由于有语义的图片使用 <img> 展示,它的一个好处在于,当图片加载失败的时候,可以触发元素的 onerror 事件,我们可以有效的利用这一点,对图片进行异常处理.
当图片链接挂了,加载失败了,我们比较好的处理方式应该是怎么样呢?
处理的方式有很多种。在张鑫旭老师的这篇文章中 -- 图片加载失败后CSS样式处理最佳实践 有一个不错的实践.
核心思路为:
<img>
元素的 onerror
事件,给加载失败的 <img>
元素新增一个样式类 <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 信息:
OK,到此,完整的对图片的处理就算完成了,这也比较好的阐述了为什么,对有语义,有 alt 信息的图片,我们应该使用 <img> 元素来实现。这是因为,我们可以在错误发生的时候,比较好的对图片进行兜底展示,让用户直观的能够看到 alt 内容.
完整的 Demo 你可以戳这里看看:
CodePen Demo -- 图片处理 。
当然,上述方案存在两个小问题:
<img>
元素,我们都需要写一段 onerror="this.classList.add('error');"
代码,有点重复。因此,这个工作也可以交给 JavaScript 全局性的完成,并且,我们可能需要判断 alt
的值是否为空,在为空时,使用默认图片 alt 兜底文案。 <img>
等替换元素是没有伪元素的,后面 Chrome/Firefox 浏览器逐渐支持了当, <img>
的 src 拉取失败时,支持 <img>
元素的伪元素展示,这才有了上述的方案,但是,目前 Safari 仍不支持这个特性,所以,在 Safari 下,我们可能得到如下的结果: 效果仍然还是 OK 的,只是没有了兜底图的展示,在实际使用过程中,需要知道这一点.
本章节,对 图片资源的容错及可访问性处理 进行了阐述。核心内容在于:
至此,整个 现代图片性能优化及体验优化指南 到此就圆满结束,整个系列的文章囊括了非常多的新的规范及特性,需要大家在实践中根据实际情况灵活选取使用.
同时,我们也应该能看到,前端技术仅仅在这一小个领域,都在不断的迭代创新。虽然很难,还是需要不断充实自己跟上新的潮流。共勉.
OK,本文到此结束,希望本文对你有所帮助 😃 。
更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏.
如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知.
想 Get 到最有意思的 CSS 资讯,千万不要错过我的 iCSS 公众号 😄 :
最后此篇关于现代图片性能优化及体验优化指南-图片资源的容错及可访问性处理的文章就讲到这里了,如果你想了解更多关于现代图片性能优化及体验优化指南-图片资源的容错及可访问性处理的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在 Mac OsX 10.11 上使用 Xcode 7.0.1 (7A1001) 我使用 carthage 0.9.2 通过以下购物车文件下载reactivecocoa github“Reactiv
我正在将一个对象从属性“模型”(我从 Laravel 中的 Blade 属性模型中获得)分配给数据属性模型。后来数据属性模型发生变化,因为它绑定(bind)到表单输入字段。但 Prop “模型”也发生
当我更新数组内对象的属性然后作为组件的 Prop 传递时,在 svelte 中触发 react 性的正确方法是什么? let items = [{ id: 1, name: 'first'
我是 DRY principle 的坚定拥护者: Every piece of knowledge must have a single, unambiguous, authoritative rep
我正在实现一个需要以下功能的线程: 及时响应终止请求 推送消息 在等待消息时保持对 SendMessage 请求的响应 我对消息泵的初始实现使用了 GetMessage,如下所示: while not
在我的应用程序中,用户获得了一份已到达她的文档列表,并且可以对每个文档执行操作。 文件是分批提交的,当这种情况发生时,列表会增加。这一切都很好,这是预期的行为,但最好有一个按钮“暂停实时数据”,它会忽
我有一个属性为 的数据对象 displaySubtotal 我可以通过以下方式更新该属性的值: data.displaySubtotal = numPad.valueAsAString(); 我的方法
我需要一个垂直 slider 输入。由于内置的 sliderInput 函数无法做到这一点,因此我选择自己实现。根据this thread可以 (I) 使用 CSS 旋转 sliderInput
我正在从自定义用户权限管理系统迁移到 Alanning:roles v2.0 .我有一个非常基本的结构: 基本用户 用户组,每个用户组都有特定的设置。我将它们存储在一个“组”集合中。 管理群组的用户的
Shiny 中的响应式(Reactive)表达式将更改传播到需要去的地方。我们可以使用 isolate 来抑制一些这种行为。 ,但是我们可以抑制基于我们自己的逻辑表达式传播的更改吗? 我给出的例子是一
是否有(或可能有) react 性 Parsec (或任何其他纯函数式解析器)在 Haskell 中? 简而言之,我想逐个字符地为解析器提供数据,并获得与我提供的足够多的结果一样多的结果。 或者更简单
HTML(JADE) p#result Lorem ipsum is javascript j s lo 1 2 4 this meteor thismeteor. meteor input.sear
我有一个被导入函数更改的对象。 https://svelte.dev/repl/e934087af1dc4a25a1ee52cf3fd3bbea?version=3.12.1 我想知道如何使我的更改反
我有一个YUV 420半平面格式的图像,其中字节以这种方式存储: [Y1 Y2 ... [U1 V1.... Yk Yk+1...] Uk' Uk'+1] 其中Y平面的大小是UV平面的两倍,并
如何使用 ReactiveCocoa 订阅从 NSMutableDictionary 添加和删除的对象?另外,我想在它发生变化时广播通知。我的猜测是可以使用 RACMulticastConnectio
我正在构建一个带有多个选项卡的应用程序,其中一些选项卡涉及过多的计算,而另一些选项卡的计算速度很快。一个允许用户在 react 性或手动更新之间进行选择的复选框,与“刷新”按钮结合使用,将是理想的选择
我知道您可以在获取集合时使用 reactive: false 关闭 react 性。如何在内容可编辑区域内的集合字段中实现相同的效果?示例: Template.documentPage.events(
我想在 z3 中表示一个哈希函数,比如 SHA(x)。在做了一些研究之后,似乎 z3 不能很好地支持注入(inject)性,所以我不能有像这样的约束(虽然我意识到这并不是严格意义上的碰撞,但作为一种启
我正在解决一个问题,我想在仪表板中将数据显示为图表(通过 perak:c3 )和表格(通过 aslagle:reactive-table )。我的问题是数据是从 MongoDB 中的集合中提取的,它的
我的 ViewModel 中有这个函数,它返回一个信号,但内部 block 不起作用,我尝试添加断点,但它没有中断。这是我的代码。 func executeLoginAPI() -> RACSigna
我是一名优秀的程序员,十分优秀!