惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
Spread Privacy
Spread Privacy
Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
Blog — PlanetScale
Blog — PlanetScale
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
SecWiki News
SecWiki News
腾讯CDC
P
Privacy International News Feed
Webroot Blog
Webroot Blog
J
Java Code Geeks
爱范儿
爱范儿
A
About on SuperTechFans
S
Secure Thoughts
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
D
DataBreaches.Net
Cloudbric
Cloudbric
Security Archives - TechRepublic
Security Archives - TechRepublic
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Cyber Attacks, Cyber Crime and Cyber Security
P
Proofpoint News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Security Latest
Security Latest
Forbes - Security
Forbes - Security
小众软件
小众软件
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
Cybersecurity and Infrastructure Security Agency CISA
T
Threatpost
量子位
MongoDB | Blog
MongoDB | Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
W
WeLiveSecurity
P
Privacy & Cybersecurity Law Blog
Vercel News
Vercel News
Google Online Security Blog
Google Online Security Blog
云风的 BLOG
云风的 BLOG
GbyAI
GbyAI
S
Security @ Cisco Blogs
T
The Exploit Database - CXSecurity.com
Help Net Security
Help Net Security
V
Visual Studio Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - 聂微东
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
Attack and Defense Labs
Attack and Defense Labs

羽翼博客

一个软件官网的消失,让我第一次感受到远方局势的影响 浏览器书签同步又挂了?自建 linkding 书签管理器(宝塔部署教程) Typecho主题发布:Initial-M 网站备份迁移实战:从手动迁移到问题解决 微软原版系统直链下载工具-ESD 开源下载器 AB Download Manager | 浏览器集成 批量删除公众号的解决办法|鼠标录制器|投屏工具 Windows10电源计划选项仅平衡问题解决 N4500工控机(3)-PVE定时开关与飞牛核显直通
给网站添点“懒”:使用LazySizes实现图片懒加载
羽翼 · 2025-07-31 · via 羽翼博客

⚠️ 本文已超过 180 天未更新,部分内容可能具有时效性,请注意核实最新情况。

前言

作为一个个人网站维护者,说实话是有点惭愧的。小站断断续续的维持了几年,一直有个小毛病没治——图片懒加载。

几年过去,网站从建站初期的“裸奔”状态一路走来,如同为一个毛坯房精装修,我也在这漫长时光里陆陆续续给它添置了安全防护、CDN、缓存加载、增删代码......只为让它更安全、更顺手!(最近挨打了,大部分江苏地段IPV6)

懒加载的方案五花八门,找来找去最后盯上了Github上的一个开源项目LazySizes。为啥是这个?说白了就是图个省心!Github Start目前17.7k,可以一试。

介绍:

lazysizes是一款快速(无卡顿)、SEO友好且自动初始化的懒加载器,适用于图片(包括响应式图片的picture/srcset)、iframe、脚本/小部件等。它通过区分可见元素和近视元素来优先处理资源,从而使得感知性能更加快速。

它也可能成为您集成响应式图片的首选工具。它可以自动计算响应式图片的大小属性,允许您将媒体查询与CSS中的媒体属性共享,有助于将布局(CSS)与内容/结构(HTML)分离,并且使得将响应式图片集成到任何环境中变得非常简单。它还包括一系列可选插件,以进一步扩展其功能。

方法

闲话少叙,以下是教程部分:

此教程针对Typecho网站,原理都一样。简单来说就是引入lazysizes.min.js文件,再向img标签添加一些类。

第一步:Github下载lazysizes.min.js文件并在网站head或者body中引入

<script src="lazysizes.min.js" async=""></script>

或者 | 请“神”进门:最省事当然是用CDN,使用提供的链接==(仅举例两个。有条件者建议本地引入)==
cdnjs | 字节跳动公共库

//Cdnjs链接:
<script src="https://cdnjs.cloudflare.com/ajax/libs/lazysizes/5.3.2/lazysizes.min.js" async=""></script>
//字节跳动公共库:
<script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/lazysizes/5.3.2/lazysizes.min.js" async=""></script>

第二步:修改属性

只要是在 <img alt="" title="" src=""> 中添加 class="lazyload">data-sizes="auto"data-sizes="auto",src修改为data-src即可。

data-sizes="auto"是为了自动检测图片尺寸,这种自动大小功能直接包含在 lazyIzes 中。 如果图像的宽度超过,则自动大小计算将采用图像的宽度(另请参阅选项)。如果它低于阈值,它会向上遍历 DOM 树,直到找到结束的父级并使用此数字。防止页面闪烁,自行体验。

这才是关键。lazysizes 的“暗号”是:看到 class="lazyload"src 属性被换成 data-src 的图片,就知道该“懒”着了。

文章里的图片怎么办? Typecho 默认输出的 <img> 标签是长这样:<img src="图片地址" ...>。我们需要把它变成 <img data-src="图片地址" class="lazyload" data-sizes="auto" src="占位图" ...>

这活儿得在主题的 functions.php 里干。

由于我将网站修改了部分代码,所以贴出更符合Typecho原版的通用方法:

functions.php 代码添加以下内容:

// 为文章内容中的图片添加 lazyload 类、data-src 和 data-sizes="auto"
function addLazyloadToImages($content, $widget, $lastResult) {
    // 确保 $content 是字符串
    if (!is_string($content)) {
        return $content;
    }

    // 在文章页与独立页面应用
    if ($widget instanceof Widget_Archive && $widget->is('single')) {
        // 使用正则表达式为所有 <img> 标签添加 data-src、data-sizes="auto" 和 class="lazyload"
        // 处理已经有 lazyload 类且有 src 属性的 img 标签 (确保 class 中有 lazyload)
        $content = preg_replace('/<img(?=[^>]*src=[\'"]([^\'"]*)[\'"])([^>]*)class=([\'"])([^\'"]*lazyload[^\'"]*)\3([^>]*)>/i', '<img$2data-src="$1" data-sizes="auto" class=$3$4$3$5>', $content);
        // 处理已有 class 但没有 lazyload 类且有 src 属性的 img 标签
        $content = preg_replace('/<img(?=[^>]*src=[\'"]([^\'"]*)[\'"])([^>]*)class=([\'"])([^\'"]*)\3([^>]*)>/i', '<img$2data-src="$1" data-sizes="auto" class=$3$4 lazyload$3$5>', $content);
        // 处理没有 class 属性且有 src 属性的 img 标签
        $content = preg_replace('/<img(?=[^>]*src=[\'"]([^\'"]*)[\'"])([^>]*?)(?<!class=)>/i', '<img$2data-src="$1" data-sizes="auto" class="lazyload">', $content);

        // 移除原始的 src 属性
        $content = preg_replace('/(<img[^>]*?)\s+src=([\'"][^\'"]*[\'"])/i', '$1', $content);
    }

    return $content;
}

// 将函数绑定到 'content' 钩子
Typecho_Plugin::factory('Widget_Abstract_Contents')->contentEx = 'addLazyloadToImages';

若仅在文章页(post)或独立页面(page)有效,修改以下代码:

//原代码
if ($widget instanceof Widget_Archive && $widget->is('single')) {
//修改后代码
if ($widget instanceof Widget_Archive && $widget->is('single') && $widget->type === 'post') {

解释:

$widget->type这个属性存储了当前内容的类型。

  • 对于文章$widget->type 的值是 'post'
  • 对于独立页面$widget->type 的值是 'page'
  • && $widget->type === 'post':这个附加条件确保了只有当内容类型是 'post' 时,懒加载的处理才会执行。

第三步:验证

清下缓存,刷新页面,慢慢往下划,打开浏览器开发者工具的 Network 面板,你会看到,只有进入视口的图片才开始加载,没看到的都“安安静静”地挂着 data-src。心里那点“浪费”的感觉,总算踏实了。

浏览器控制台查看img代码:

<img alt="do.webp" title="do.webp" data-src="https://XXX/1.webp" data-sizes="auto" class="lazyautosizes lazyloaded" sizes="765px" src="https://XXX/1.webp">

当你看到一个元素的类从 class="lazyautosizes" 变为 class="lazyautosizes lazyloaded",这实际上反映了 lazysizes 库的工作机制。当使用 lazysizes 进行图片或其他资源(如iframe)的懒加载时,它会在这些元素被成功加载后自动添加 lazyloaded 类。

后话

至此已完结

具体详解可查看 Github开源 | 演示页面 | 【SEO工具】lazysizes-CSDN博客

有兴趣的不妨现在就动手试试。LazySizes 的确还不错。让加载“懒”一点,等待少一点,何乐而不为?