图片加载时使用 SVG 作为图片 placehold

简评:使用 SVG 作为占位符不但可以减少数据大小还可以达到不错的显示效果。

不同类型的图片 placehold

对于图片占位符,通常我们会使用以下几种处理方式。

  • 保持图像为空:这样可以保证内容不会出现跳动。
  • 默认占位符:比如说用户想要查看个人资料显示头像内容,如果请求失败或者没有上传过图片,那么通常会使用默认占位符(这种占位符一般会使用 SVG 资源)。
  • 纯色:从图像中获取颜色,并作为背景颜色。图片在过度是时候回显得比较平滑(pinterest 就是使用这种方式)。
  • 模糊的图像:这种方式会获取原图的缩略图并对其进行渲染,等图片加载完成再过度到原图。

以上是我们比较常见的处理图片 placehold 的方法。还有另外一种方式是使用 SVG。

基于 SVG 的 placehold

SVG 是矢量图像的理想选择,但是大部分情况是需要显示位图,我们需要考虑的是如何将位图转换成矢量图,下面提供几种转换方案。

  1. 使用矢量绘制原图的轮廓,具体代码可以参考demo
  1. 将原图转换为色块图,具体代码可以参考demo
  1. Primitive

这里推荐Primitive这个库,这个库可以将位图生成矢量图,我们来看看效果。

上图分别使用不同数量的形状来绘制原图。使用矢量图作为 placehold 有一个很好的优点是小,例如上图 10 个图形的矢量图仅仅只占了 1030 个字节,当通过 SVGO 来传输时,代码还能减少到 640 个字节。

<svg xmlns =“http://www.w3.org/2000/svg”width =“1024”height =“1024”> 
<path fill =“#817c70”d =“M0 0h1024v1024H0z”/> <g fill- opacity =“。502”> 
<path fill =“#03020f”d =“M178 994l580 92L402-62”/> 
<path fill =“#f2e2ba”d =“M638 894L614 6l472 440”/> 
<path fill =“# fff8be“d =”M-62 854h300L138-62“/> 
<路径填充=”#76c2d9“d =”M410-62L154 530-62 38“/> 
<路径填充=”#62b4cf“d =”M1086-2L498- 305148 508“/> 
<path fill =”#010412“d =”M430-2l196 52-76 356“/> 
<path fill =”#eb7d3f“d =”M598 594l488-32-308 520“/> 
<path fill =“#080a18”d =“M198 418l32 304 116-448”/> 
<path fill =“#3f201d”d =“M1086 1062l-344-52 248-148”/> 
<path fill =“#ebd29f”d = “M630 658l-60-372 516 320”/> 
</ g> </ svg>

要达到满意的效我们就必须使用更多的图形来绘制它,如果用 100 个图形来绘制位图,生成的 SVG 大概有 8kB(SVGO 大概 5KB)。随着图形数量的增加,大小也会随之增加。

  1. SQIP

这是一种折中处理方式,我们可以理解为 Primitive 和高斯模糊的简单叠加,这种方式我可以使用少量的图形块就能达到我们满意的效果。

上图输出的 SVG 大小为 900 字节。

<svg xmlns =“ http://www.w3.org/2000/svg ”viewBox =“0 0 2000 2000”> 
<filter id =“b”> <feGaussianBlur stdDeviation =“12”/> </ filter> 
<路径填充=“#817c70”d =“M0 0h2000v2000H0z”/> 
<g filter =“ url(#b)“transform =”translate(4 4)scale(7.8125)“fill-opacity =”。5“> 
<ellipse fill =”#000210“rx =”1“ry =”1“transform =”matrix(50.41098 -3.7951 11.14787 148.07886 107 194.6)“/> 
<ellipse fill =”#eee3bb“rx =”1“ry =”1“transform =”matrix(-56.38179 17.684 -24.48514 -78.06584 205 110.1)“/> 
<ellipse fill =”#fff4bd “rx =”1“ry =”1“transform =”matrix(35.40604 -5.49219 14.85017 95.73337 16.4 123.6)“/> 
<ellipse fill =”#79c7db“cx =”21“cy =”39“rx =”65“ ry =“65”/> 
<ellipse fill =“#0c1320”cx =“117”cy =“38”rx =“34”ry =“47”/> 
<ellipse fill =“#5cb0cd”rx =“1” ry =“1”transform =“矩阵(-39.46201 77.24476 -54.56092 -27.87353 219.2 7.9)“/> 
<path fill =”#e57339“d =”M271 159l-123-16 43 128z“/> 
<ellipse fill =”#47332f“cx =”214“ cy =“237”rx =“242”ry =“19”/> 
</ g> </ svg>
  1. 剪影

Mikael Ainalem分享了一个codepen,使用双色轮廓作为 placehold,结果效果非常好:

上面这种 SVG 是通过手绘得到的,不过我们也可以使用自动化工具自动生成。

  1. node-potrace(js)可以将原图转换成矢量图。
  1. Craft 3 CMS也添加了对剪影的支持 ——Potracio(php)。

  2. image-trace-loader可以追踪图片资源,然后导入生成的 img/svg+xml URL

英文原文:How to use SVG as a Placeholder, and Other Image Loading Techniques

旧文推荐:
怎么做 Web API 版本控制?
用 WebGL 探索动画和交互技术(一个学习案例)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容