JavaScript 脚本与全局背景图
什么是 JavaScript?
JavaScript(简称 JS)是一种编程语言,用来让网页”动”起来。在博客中,JS 可以:
- 动态修改页面内容
- 响应用户操作(点击、滚动等)
- 加载外部资源(图片、数据等)
本博客的背景图系统
设计目标
- 首页文章列表:每篇文章显示不同的封面图
- 上一篇/下一篇:显示随机背景图
- 相关推荐:显示随机背景图
- 文章页顶部:显示随机背景图
文件结构
1 2 3 4 5 6 7 8
| source/ ├── img/ │ └── covers/ # 43 张封面图 │ ├── 1.webp │ ├── 2.webp │ └── ... └── js/ └── randomBg.js # 背景图控制脚本
|
JavaScript 基础语法
变量
1 2 3 4 5 6 7
| var name = "Henry"; var count = 43; var isReady = true;
const MAX_COUNT = 43;
|
函数
1 2 3 4 5 6 7
| function greet(name) { return "Hello, " + name; }
greet("Henry");
|
数组
1 2 3 4 5 6 7 8 9 10
| var fruits = ["apple", "banana", "orange"];
fruits[0];
fruits.forEach(function(fruit) { console.log(fruit); });
|
条件判断
1 2 3 4 5 6 7
| var age = 18;
if (age >= 18) { console.log("成年"); } else { console.log("未成年"); }
|
randomBg.js 脚本详解
完整代码
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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| (function() { 'use strict';
var COVER_COUNT = 43; var LOCAL_PATH = '/img/covers/'; var EXT = '.webp';
function hash(str) { var h = 0; for (var i = 0; i < str.length; i++) { h = ((h << 5) - h + str.charCodeAt(i)) | 0; } return Math.abs(h); }
function getIdx(seed) { return (hash(seed) % COVER_COUNT) + 1; }
function replaceCoverImages() { var posts = document.querySelectorAll('.recent-post-item'); posts.forEach(function(post) { var link = post.querySelector('a[href]'); if (!link) return; var idx = getIdx(link.href); var imgUrl = LOCAL_PATH + idx + EXT; var img = post.querySelector('img'); if (img) { img.src = imgUrl; } }); }
function replacePaginationBg() { var items = document.querySelectorAll('.pagination-related, .relatedPosts .relatedPost'); items.forEach(function(item, index) { var link = item.querySelector('a[href]'); var seed = 'default_' + index; if (link) { var match = link.href.match(/\/posts\/([^\/]+)/); if (match) { seed = match[1]; } } var imgUrl = LOCAL_PATH + getIdx(seed) + EXT; item.style.backgroundImage = 'url("' + imgUrl + '")'; item.style.backgroundSize = 'cover'; item.style.backgroundPosition = 'center'; }); }
function replaceTopImg() { var header = document.querySelector('#page-header'); if (!header) return; var imgUrl = LOCAL_PATH + getIdx(window.location.pathname) + EXT; header.style.backgroundImage = 'url("' + imgUrl + '")'; }
function runAll() { replaceCoverImages(); replacePaginationBg(); replaceTopImg(); }
if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', runAll); } else { runAll(); }
window.addEventListener('load', setTimeout(runAll, 100));
document.addEventListener('pjax:complete', setTimeout(runAll, 100)); })();
|
代码逐行解释
1. 立即执行函数
1 2 3 4
| (function() { 'use strict'; })();
|
(function() { ... })():定义并立即执行一个函数'use strict':启用严格模式,避免一些常见错误- 这种写法可以避免污染全局变量
2. 哈希函数
1 2 3 4 5 6 7
| function hash(str) { var h = 0; for (var i = 0; i < str.length; i++) { h = ((h << 5) - h + str.charCodeAt(i)) | 0; } return Math.abs(h); }
|
作用:将字符串转换为唯一的数字
举例:
hash("abc") 可能返回 12345hash("def") 可能返回 67890- 相同的输入总是返回相同的输出
为什么需要:确保每篇文章根据其链接/标题生成固定的图片索引
3. 获取图片索引
1 2 3
| function getIdx(seed) { return (hash(seed) % COVER_COUNT) + 1; }
|
hash(seed):将种子转换为数字% COVER_COUNT:取余数,确保在 0-42 之间+ 1:调整为 1-43
4. DOM 查询
1
| document.querySelectorAll('.recent-post-item')
|
document:整个网页文档querySelectorAll():查找所有匹配的元素.recent-post-item:CSS 类选择器
常用查询方法:
| 方法 | 说明 |
|---|
querySelector('.class') | 查找第一个匹配的元素 |
querySelectorAll('.class') | 查找所有匹配的元素 |
getElementById('id') | 通过 ID 查找元素 |
5. 修改元素属性
img.src:图片元素的 src 属性- 设置新值后,浏览器会加载新图片
6. 修改元素样式
1 2
| item.style.backgroundImage = 'url("' + imgUrl + '")'; item.style.backgroundSize = 'cover';
|
element.style.属性名:修改元素的行内样式backgroundImage:背景图片backgroundSize: cover:背景图覆盖整个元素
脚本注入配置
在 _config.butterfly.yml 中添加:
1 2 3 4 5
| inject: head: - <link rel="stylesheet" href="/css/custom.css"> bottom: - <script src="/js/randomBg.js"></script>
|
说明:
head:在 </head> 标签前插入(用于 CSS)bottom:在 </body> 标签前插入(用于 JS)
调试技巧
1. 查看控制台日志
在浏览器中按 F12 → Console 面板,可以看到脚本输出的日志。
2. 手动执行函数
在控制台中输入:
1 2 3
| replaceCoverImages(); replacePaginationBg(); replaceTopImg();
|
可以手动触发图片替换。
3. 检查元素
右键点击元素 → 检查,查看:
img 标签的 src 属性是否正确- 元素的
background-image 样式
4. 清除缓存
修改 JS 后需要清除浏览器缓存:
Ctrl + Shift + R(Windows/Linux)Cmd + Shift + R(Mac)
常见问题
问题1:图片不显示
可能原因:
排查方法:
- 在控制台检查
img.src 的值 - 在浏览器中直接访问图片 URL
问题2:所有文章显示相同图片
可能原因:
解决方法:确保种子值(seed)能区分不同文章
问题3:图片闪烁
可能原因:
解决方法:
- 使用本地图片(加载更快)
- 在 CSS 中设置占位背景色
参考资源