修改butterfly页面加载动画只等待网站背景图
yaoye Lv5

start

hexo 的 butterfly 主题开启加载动画时会等待整个页面的请求全部加载结束后才关闭

question

但是一些文章中插入了大图片,导致在大图片完成加载前长时间处于加载动画,浏览体验极差

所以想着让加载动画只等待网站背景图加载,完成后直接关闭加载页面

solve

修改\themes\butterfly\layout\includes\loading\fullpage-loading.pug 文件,将原本的监听整个页面请求修改为监听网站背景图

,在背景图加载完后执行 preloader.endLoading() 结束加载动画

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#loading-box
.loading-left-bg
.loading-right-bg
.spinner-box
.configure-border-1
.configure-core
.configure-border-2
.configure-core
.loading-word= _p('loading')

script.
(() => {
const $loadingBox = document.getElementById('loading-box');
const $body = document.body;

const preloader = {
endLoading: () => {
$body.style.overflow = '';
$loadingBox.classList.add('loaded');
},
initLoading: () => {
$body.style.overflow = 'hidden';
$loadingBox.classList.remove('loaded');
}
};

// 初始化加载
preloader.initLoading();

// 确保 DOM 完全加载后运行脚本
document.addEventListener('DOMContentLoaded', () => {
const $webBg = document.getElementById('web_bg');

// 检查是否找到了 #web_bg 元素
if ($webBg) {
// 获取背景图片的 URL
const bgImageUrl = $webBg.style.backgroundImage.replace(/^url\(['"](.+)['"]\)$/, '$1');

// 创建 Image 对象用于手动加载背景图
const img = new Image();
img.src = bgImageUrl;

// 监听背景图片的加载完成事件
img.onload = () => {
preloader.endLoading(); // 图片加载完成,结束加载动画
};

img.onerror = () => {
console.error('Background image failed to load.');
preloader.endLoading(); // 即使图片加载失败,也结束加载动画,避免页面卡住
};
} else {
console.error('Element #web_bg not found.');
preloader.endLoading(); // 如果未找到元素,结束加载动画
}
});

// PJAX 部分(根据你是否启用 PJAX 而决定是否保留)
if (!{theme.pjax && theme.pjax.enable}) {
btf.addGlobalFn('pjaxSend', () => { preloader.initLoading() }, 'preloader_init');
btf.addGlobalFn('pjaxComplete', () => { preloader.endLoading() }, 'preloader_end');
}
})();

原本代码

end

最终效果