文档说明
作者的博文大部分是一张图一段话,日常编辑文章时也没有留意到以下情况,直到:偶然编辑多图文章时,发现浏览器的加载图标一直在转圈圈,很好奇地查看控制台,原来这是在同时加载页面中的所有图片,而自己并没有预览文章内容,嗯,于是乎有了这篇文档。
使用方法
A 涉及文件
admin/editor-js.php
B 改造文件
作用:给编辑器内容中的图片添加延迟加载功能。
打开文件 admin/editor-js.php 搜索找到以下代码:
var images = $('img', preview), count = images.length;
在以上代码的下一行添加以下代码:
var observer = new IntersectionObserver(function(entries, observer) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
var img = entry.target;
var srcValue = img.getAttribute('data-original'); // 获取原始图链接
// 加载完成后获取图片原始尺寸并更新占位符尺寸,避免图片变形
img.onload = function() {
var containerWidth = img.parentElement.clientWidth; // 获取容器宽度
var containerHeight = img.parentElement.clientHeight; // 获取容器高度
var imgWidth = img.naturalWidth; // 获取图片原始宽度
var imgHeight = img.naturalHeight; // 获取图片原始高度
var scaleFactor = Math.min(containerWidth / imgWidth, containerHeight / imgHeight); // 计算图片缩放比例
// 根据比例缩放图片,避免图片变形
img.style.width = (imgWidth * scaleFactor) + 'px';
img.style.height = (imgHeight * scaleFactor) + 'px';
observer.unobserve(img); // 停止观察已经加载的图片
};
img.setAttribute('src', srcValue); // 加载图片
}
});
}, { rootMargin: "200px" }); // 延迟加载时机
images.each(function(index, element) {
var imgElement = element;
var srcValue = imgElement.getAttribute('src'); // 获取未改造 img 结构前的 src 原始图链接
imgElement.setAttribute('data-original', srcValue); // 将 src 值添加到 data-original 中,作为延迟加载前,待替换的原始图链接
imgElement.setAttribute('src', 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='); // 将未改造 img 结构前的 src 替换为单像素占位符
// 设置占位符的初始尺寸,避免单像素占位符同时置于视口中,导致所有图片同时加载
imgElement.style.width = '800px';
imgElement.style.height = '800px';
observer.observe(imgElement); // 观察图片
});
至此,已完成给编辑器内容中的图片添加延迟加载功能,只有在点击「预览」后,处于视口中的图片才会加载显示,避免了打开编辑页时,就同时加载所有图片的情况。
精选留言