feat(lightbox): add lightbox.js skeleton with lazy-load
This commit is contained in:
parent
e68b77aac0
commit
fe58d25b54
74
public/js/lightbox.js
Normal file
74
public/js/lightbox.js
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
(function () {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
// 为单个 .blur-img 容器初始化高清图懒加载。
|
||||||
|
// IO 进入视口后把 data-src 写入 src,加载完成加 is-loaded 触发 CSS 淡入。
|
||||||
|
function initLazyLoad(container) {
|
||||||
|
var fullImg = container.querySelector(".blur-img-full");
|
||||||
|
if (!fullImg) return;
|
||||||
|
if (container.getAttribute("data-blur-init")) return;
|
||||||
|
container.setAttribute("data-blur-init", "true");
|
||||||
|
|
||||||
|
var fullSrc = fullImg.getAttribute("data-src");
|
||||||
|
if (!fullSrc) return;
|
||||||
|
|
||||||
|
fullImg.addEventListener("load", function () {
|
||||||
|
this.classList.add("is-loaded");
|
||||||
|
});
|
||||||
|
|
||||||
|
if ("IntersectionObserver" in window) {
|
||||||
|
var io = new IntersectionObserver(
|
||||||
|
function (entries) {
|
||||||
|
entries.forEach(function (entry) {
|
||||||
|
if (entry.isIntersecting) {
|
||||||
|
fullImg.src = fullSrc;
|
||||||
|
io.unobserve(container);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{ rootMargin: "200px" }
|
||||||
|
);
|
||||||
|
io.observe(container);
|
||||||
|
} else {
|
||||||
|
fullImg.src = fullSrc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 收集所有 selectors命中的 .blur-img 节点。
|
||||||
|
// gallery: 正文图(组成图集);singles: 带 data-single 的单张图(如封面)。
|
||||||
|
function collectImages(roots) {
|
||||||
|
var gallery = [];
|
||||||
|
var singles = [];
|
||||||
|
for (var i = 0; i < roots.length; i++) {
|
||||||
|
var nodes = roots[i].querySelectorAll(".blur-img");
|
||||||
|
for (var j = 0; j < nodes.length; j++) {
|
||||||
|
var n = nodes[j];
|
||||||
|
if (n.getAttribute("data-single")) {
|
||||||
|
singles.push(n);
|
||||||
|
} else {
|
||||||
|
gallery.push(n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return { gallery: gallery, singles: singles };
|
||||||
|
}
|
||||||
|
|
||||||
|
window.__initLightbox = function (selectors) {
|
||||||
|
// selectors 可以是字符串、字符串数组
|
||||||
|
var sels = Array.isArray(selectors) ? selectors : [selectors];
|
||||||
|
var roots = [];
|
||||||
|
for (var i = 0; i < sels.length; i++) {
|
||||||
|
var found = document.querySelectorAll(sels[i]);
|
||||||
|
for (var j = 0; j < found.length; j++) roots.push(found[j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 先对所有图片做懒加载(图集与单张都做)
|
||||||
|
var all = collectImages(roots);
|
||||||
|
var everyone = all.gallery.concat(all.singles);
|
||||||
|
for (var k = 0; k < everyone.length; k++) {
|
||||||
|
initLazyLoad(everyone[k]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// click 绑定在 Task 2 完成
|
||||||
|
};
|
||||||
|
})();
|
||||||
Loading…
x
Reference in New Issue
Block a user