织梦图片懒加载代码添加位置

织梦文章页通常包含多张图片,首屏一次性加载全部图片会显著拖慢页面打开速度。图片懒加载通过延迟加载视口外的图片,可有效提升首屏渲染速度。本文详细说明在织梦模板中添加懒加载代码的准确位置与配置方法。

一、懒加载原理与添加位置总览

懒加载的核心是将真实图片地址暂存于 data-src 属性,src 指向占位图,当图片进入视口时再用 JS 将 data-src 赋值给 src。织梦中需要修改的位置有三处:

1. 文章内容模板(核心位置)

文件路径:/templets/default/article_article.htm,这是正文图片渲染的容器。

2. 列表页模板

文件路径:/templets/default/list_article.htm,列表缩略图同样需要懒加载。

3. 全站公共底部模板

文件路径:/templets/default/footer.htm,JS 脚本统一在此引入。

二、文章内容图片懒加载实现

步骤一:修改正文图片输出方式

织梦文章正文通过 {dede:field.body/} 输出,其中图片已包含完整 src。需要用 JS 在页面加载后批量转换:

// 在 article_article.htm 的正文容器后添加
<div class="article-content">{dede:field.body/}</div>

<script>
// 将正文内所有图片转换为懒加载格式
var imgs=document.querySelectorAll('.article-content img');
imgs.forEach(function(img){
  if(img.getAttribute('src') && !img.hasAttribute('data-src')){
    img.setAttribute('data-src', img.getAttribute('src'));
    img.setAttribute('src', '/images/blank.gif'); // 1x1透明占位图
    img.classList.add('lazyload');
  }
});
</script>

步骤二:在 footer.htm 引入懒加载核心脚本

推荐使用轻量级的 IntersectionObserver 方案,无需引入外部库:

// 在 footer.htm 的 </body> 前添加
<script>
function initLazyLoad(){
  if('IntersectionObserver' in window){
    var io=new IntersectionObserver(function(entries){
      entries.forEach(function(entry){
        if(entry.isIntersecting){
          var img=entry.target;
          if(img.dataset.src){
            img.src=img.dataset.src;
            img.removeAttribute('data-src');
            img.classList.remove('lazyload');
          }
          io.unobserve(img);
        }
      });
    }, { rootMargin: '200px 0px' });

    document.querySelectorAll('img.lazyload').forEach(function(img){
      io.observe(img);
    });
  }
}
document.addEventListener('DOMContentLoaded', initLazyLoad);
</script>

步骤三:列表页缩略图懒加载

列表页缩略图直接在模板标签中改写,避免依赖 JS 转换:

// list_article.htm 原始写法
<img src="[field:litpic/]" alt="[field:title/]">

// 改为懒加载写法
<img data-src="[field:litpic/]" 
     src="/images/blank.gif" 
     class="lazyload" 
     alt="[field:title/]">
rootMargin 设为 200px 表示图片距离视口 200px 时即开始加载,用户滚动到图片位置时已完成加载,体验更流畅。值不宜过大,否则失去懒加载意义。

三、占位图与样式配置

1. 生成透明占位图

// 用 PHP 生成 1x1 透明 GIF,保存为 /images/blank.gif
<?php
// base64 内联,无需额外文件
$data=base64_decode('R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7');
file_put_contents('images/blank.gif', $data);
?>

2. 添加加载占位样式

img.lazyload{
  background: #f0f0f0;
  transition: opacity 0.3s;
  opacity: 0;
}
img.lazyload.loaded{ opacity: 1; }

// JS 中加载完成后添加 loaded 类
img.onload=function(){
  this.classList.add('loaded');
};

3. 设置默认宽高防止布局抖动

.article-content img{
  width: 100%;
  height: auto;
  min-height: 200px; /* 占位期间预留高度 */
}

四、原生 loading 属性方案

现代浏览器支持原生 loading="lazy" 属性,无需 JS 即可实现懒加载。可在织梦内容保存时自动添加:

// 在 /dede/article_add.php 和 article_edit.php 中
// 对 body 内容的 img 标签自动添加 loading 属性
$body=preg_replace('/<img(?!.*loading=)/i', 
  '<img loading="lazy"', $body);

五、注意事项

搜索引擎蜘蛛不执行 JS,纯 JS 懒加载可能导致图片不被抓取索引。建议优先使用 loading="lazy" 原生方案,搜索引擎已支持解析该属性。若使用 JS 方案,可在 noscript 标签中提供真实图片作为降级。同时织梦生成静态 HTML 后,懒加载脚本需确保在静态页面中也被正确引用。

图片懒加载是织梦站点性能优化的高性价比手段,首屏图片请求数可减少 60% 以上。配合 CDN 加速和 WebP 格式转换,可进一步压缩图片体积。建议部署后通过 PageSpeed Insights 测试验证效果,根据实测数据调整 rootMargin 参数,找到加载时机与用户体验的最佳平衡点。