前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Hugo 图片懒加载和自适应 CSS 图片占位

Hugo 图片懒加载和自适应 CSS 图片占位

作者头像
Shiroka
发布于 2022-05-29 07:56:11
发布于 2022-05-29 07:56:11
2.2K00
代码可运行
举报
文章被收录于专栏:pwpw
运行总次数:0
代码可运行

对于未对中国大陆优化的博客站点而言,图片懒加载几乎是必备的功能,它能够有效提高页面的首屏速度。静态站点的懒加载方案有很多,但都必然会带来布局偏移的问题,影响页面的 CLS 分数

本文将基于浏览器原生懒加载和 Hugo 使用的 Golang html/template 模板引擎,实现图片懒加载和对不同比例自适应的 CSS 图片占位。

懒加载实现

图片懒加载有很多实现方式。很久以前有基于 jQueryLazy Load,如今随着 jQuery 退场几乎不再使用了;后来有基于原生 Intersection Observer API 实现的 vanilla-lazyload,可以基本上符合懒加载的需求。

随着越来越多曾经的第三方 JS 实现的功能被标准化,针对图片和 iframe 的浏览器原生的懒加载出现在了 HTML 标准中。在写下这篇文章的 2022 年中旬,根据 Can I use,Chrome 77+、Edge 79+、Firefox 75+ 和 Safari 15.4+ 均支持了对图片元素的原生懒加载。

作为一个仅对最新大版本提供支持的博客,使用原生懒加载已经不成问题,且原生懒加载的策略由浏览器决定,可以随着版本更新而优化,实现也非常简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<img src="https://example.org/img.jpg" loading="lazy" alt="Lazy Image" />

布局偏移问题

凡是懒加载的图片,必然会出现布局偏移的问题。在图片加载前,图片占据高度为 0,而图片加载后,图片占据高度可能会发生变化,从而导致布局偏移。

布局偏移问题的常规解决方案如下,以全宽图片为例:

  1. img 元素放置在两层 div 容器
  2. 设置外层容器的 position 属性为 relativewidth100%
  3. 设置内层容器的 height0, padding 为图片宽高比
  4. 为最外层容器设置占位背景色
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.fiximg {
  position: relative;
  display: block;
  overflow: hidden;
  background-color: var(--color-wrapper);
  width: 100%;

  &__container {
    display: block;
    width: 100%;
    height: 0;
    margin: 0;
    padding-bottom: '<ASPECT RATIO HERE>';

    img {
      display: block;
      width: 100%;
      margin: 0;
      color: var(--color-primary);
      font-size: inherit;
      text-align: center;
    }
  }
}

但是,对于博客文章而言,插入图片的宽高比是不确定的,因此将固定宽高比的效果非常一般。

Go HTML 模板实现

本站的静态网页生成器 Hugo 使用 Golang 的 html/template 模板引擎实现模板。

本站的图片资源结构是分散式的。对于每篇文章,Hugo 都存在页面资源这一概念,即在每篇文章的 index.md 同目录下的资源文件会被 Hugo 认为是该文章特有的资源。

Hugo 在渲染插入图片时,允许通过 Markdown Render Hooks 的方法对渲染的 HTML 进行自定义,因此主要的实现就在这之中进行。

首先创建 layouts/_default/_markup/render-image.html 文件,获取图片资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{{ $image := .Page.Resources.Match .Destination }}
{{ if ge (len $image) 1 }}
{{ $image = index $image 0 }}
{{ else }}
{{ warnf "Image not found \"%s\"" .Destination }}
{{ end }}

获取图片后,解析图片的宽高,并将宽高乘上 1.0 转换为浮点数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{{ $imageHeight := mul $image.Height 1.0 }}
{{ $imageWidth := mul $image.Width 1.0 }}
{{ if or (lt $imageHeight 1) (lt $imageWidth 1) }}
{{ warnf "Image not valid \"%s\"" .Destination }}
{{ end }}

随后,根据宽高计算图片的宽高比,并生成底部 padding 的内联样式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{{ $ratio := mul (div $imageHeight $imageWidth) 100 }}
{{ $css := printf "padding-bottom: %.4f%%;" $ratio }}

最后,根据图片宽度,为大图设置全宽,小图设置为原始宽度,并输出 HTML 即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{{ $width := "width: 100%;" }}
{{ if le $imageWidth 652 }}
{{ $width = printf "width: %.0fpx;" $imageWidth }}
{{ end }}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- goldmark will insert p tag before & after image div so theres no need to wrap it with p tag -->
<div class="fiximg" style="{{ $width | safeCSS }}">
  <div class="fiximg__container" style="{{ $css | safeCSS }}">
    <img loading="lazy" src="{{ $image.Permalink }}" alt="{{ .Text }}" />
  </div>
</div>

效果预览

以这篇文章上文的图片为例,加载前:

加载完成后:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Web技术】771- 图片懒加载从简单到复杂
图片懒加载是一个很重要的前端性能优化手段。这篇文章将从懒加载的最简单场景开始介绍,逐步增加复杂度,希望能讲清楚常见的图片懒加载场景及在该场景下对应的解决办法,也希望对你有所帮助。
pingan8787
2020/11/11
9280
【Web技术】771- 图片懒加载从简单到复杂
面试官:CSS如何实现固定宽高比?
对于这个问题,你可能还没有过相关需求,或者还没有在面试的时候被问到过,但是歪马相信你终将有需要。
歪马
2020/04/07
8.3K0
面试官:CSS如何实现固定宽高比?
现代图片性能优化及体验优化指南 - 懒加载及异步图像解码方案
图片资源,在我们的业务中可谓是占据了非常大头的一环,尤其是其对带宽的消耗是十分巨大的。
Sb_Coco
2023/03/01
1.1K0
现代图片性能优化及体验优化指南 - 懒加载及异步图像解码方案
分享100 个鲜为人知的 CSS 技巧
金三银四找工作的旺季来了,在过去的一段时间里,我花了很多时间将之前的一些基础知识做了整理,希望这些内容能够帮助你在面试的时候,稍微顺利一些。因此,我将整理好的这 100 个 CSS 知识技巧分享给你,希望你会觉得太对你有用。
前端达人
2024/03/11
6950
分享100 个鲜为人知的 CSS 技巧
图片懒加载(二)
https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/img#attr-loading
阿超
2023/04/01
5590
图片懒加载(二)
web图片响应式自适应结合懒加载的最佳方案
在响应式布局中,通常图片自适应是没法带上宽度和高度的,或者是需要使用JavaScript来计算出它的合适宽高,而且在使用懒加载时,我们会默认给一个占位图片,一个占位图片在各种不同宽高的图片里面,是会严重变形,有没有更好的处理方法呢?
前端开发博客
2020/11/04
1.3K0
web图片响应式自适应结合懒加载的最佳方案
【复习】CSS实现宽高等比自适应容器
在最近开发移动端页面,遇到这么一个情况:当页面宽度 100% 时,高度为宽度一半,并随手机宽度变化依然是一半。
pingan8787
2019/08/15
1.8K0
【CSS】318- CSS实现宽高等比自适应容器
在最近开发移动端页面,遇到这么一个情况:当页面宽度 100% 时,高度为宽度一半,并随手机宽度变化依然是一半。
pingan8787
2019/08/19
1.6K0
打造一款响应式图片画廊:我与 CodeBuddy 的“并肩作战”
回想一下,最初我想做一个响应式的图片画廊:既要呈现瀑布流式的布局,又能点击查看大图、支持键盘翻页;理想状态下还要滚到底自动加载新内容,并可以按类别筛选。这一听就挺有挑战性,于是决定把 CodeBuddy 也拉进来当“第二编码者”,看看它能帮我怎样。
繁依Fanyi
2025/05/11
1330
图片懒加载原理及实现(java懒加载原理)
懒加载是一种对网页性能优化的方式,比如当访问一个页面的时候,优先显示可视区域的图片而不是一次性加载所有图片,当需要显示时,再发送图片请求,避免打开网页时加载过多资源。 当一个网站的加载图片过多时就需要懒加载的协助,页面图片多时,在首次载入时一次性加载会耗费时间长,使用懒加载可以使页面加载速度快、减轻服务器的压力、节省流量。 如下图:
全栈程序员站长
2022/08/01
1.9K0
图片懒加载原理及实现(java懒加载原理)
2024年,你需要了解下这 12 个现代化 CSS 新属性
有时候,提升你的应用程序的CSS只需要一个简单的一行升级或增强!了解这12个属性,开始将它们融入到你的项目中,享受减少技术债务、去除JavaScript,以及为用户体验赢得轻松的胜利。
前端达人
2024/01/31
2.1K0
2024年,你需要了解下这 12 个现代化 CSS 新属性
彻底玩转图片懒加载及底层实现原理
图片懒加载其实已经是一个近乎“烂大街”的词语了,在大大小小的面试中也会被频繁的问到,我在之前的面试中也被问到了图片懒加载的原因、实现方式及底层原理,但由于自己平时很少做“图片”相关的处理,对于“懒加载”也是知之甚少,所以在面试中问答的也不是很好。
前端森林
2021/02/03
1K0
彻底玩转图片懒加载及底层实现原理
懒加载的实现原理
前端工程师在做页面优化的时候,如果页面中是类似图片列表的结构,会考虑使用懒加载(Lazy-Load)技术来优化页面的加载速度,今天就带大家来探究一下懒加载的原理。
挥刀北上
2019/07/19
1.4K0
懒加载的实现原理
css笔记 - 张鑫旭css课程笔记之 margin 篇
relative可定位,但是不改变容器尺寸和占据的空间 margin不同,margin也在盒模型中。 从border开始往里边,是可视尺寸clientWidth部分。 加上margin,是占据尺寸outerWidth margin可以改变元素尺寸,正值宽度变小,负值宽度变大。 margin也可以定位
xing.org1^
2018/09/20
2.7K0
css笔记 - 张鑫旭css课程笔记之 margin 篇
图片渐进式加载优化实践指南
沉浸式趣谈
2024/11/21
1140
图片渐进式加载优化实践指南
现代图片性能优化及体验优化指南 - 缩放精细化展示及避免布局偏移、拉伸
图片资源,在我们的业务中可谓是占据了非常大头的一环,尤其是其对带宽的消耗是十分巨大的。
Sb_Coco
2023/03/01
1.3K0
现代图片性能优化及体验优化指南 - 缩放精细化展示及避免布局偏移、拉伸
18个很有用的 CSS 技巧
shape-outside 是一个允许设置形状的 CSS 属性。它还有助于定义文本流动的区域:
@超人
2023/05/12
7290
18个很有用的 CSS 技巧
iOS_NSTextAttachment图文混排,图片和文字对齐
原因:attachment 默认是 显示在 baseline 上方的,所以需要调整一下 attachment 的 originY。 修改 bounds 赋值如下,就能解决:
mikimo
2022/07/20
1.8K0
iOS_NSTextAttachment图文混排,图片和文字对齐
JavaScript——图片懒加载
github | https://github.com/wangyang0210/bky/tree/picLoadLazy
思索
2024/08/16
1990
JavaScript——图片懒加载
图片布局的最全实现方式都在这了!附源码
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
六小登登
2019/10/25
1.5K0
相关推荐
【Web技术】771- 图片懒加载从简单到复杂
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验