mirror of
https://github.com/StepanovPlaton/AboutMe.git
synced 2026-04-04 04:40:51 +04:00
Initial commit
This commit is contained in:
101
src/utils/fancybox.ts
Normal file
101
src/utils/fancybox.ts
Normal file
@@ -0,0 +1,101 @@
|
||||
let fancyboxSelectors: string[] = [];
|
||||
let Fancybox: any;
|
||||
|
||||
// 图片灯箱按需加载
|
||||
export async function initFancybox() {
|
||||
if (typeof document === "undefined") return;
|
||||
// 相册图片选择器 (只绑定不在 a 标签内的图片,避免与链接绑定冲突)
|
||||
const albumImagesSelector = ".custom-md img:not(a *), #post-cover img:not(a *), .moment-images img:not(a *), .photo-gallery img:not(a *)";
|
||||
// 相册链接选择器
|
||||
const albumLinksSelector = ".moment-images a[data-fancybox], .photo-gallery a[data-fancybox]";
|
||||
// 单张图片选择器
|
||||
const singleFancyboxSelector = "[data-fancybox]:not(.moment-images a):not(.photo-gallery a)";
|
||||
// 检查是否有图片需要绑定
|
||||
const hasImages =
|
||||
document.querySelector(albumImagesSelector) ||
|
||||
document.querySelector(albumLinksSelector) ||
|
||||
document.querySelector(singleFancyboxSelector);
|
||||
if (!hasImages) return;
|
||||
// 检查是否已初始化 Fancybox
|
||||
if (!Fancybox) {
|
||||
const mod = await import("@fancyapps/ui");
|
||||
Fancybox = mod.Fancybox;
|
||||
await import("@fancyapps/ui/dist/fancybox/fancybox.css");
|
||||
}
|
||||
if (fancyboxSelectors.length > 0) {
|
||||
return; // 已经初始化,直接返回
|
||||
}
|
||||
// 公共配置
|
||||
const commonConfig = {
|
||||
Thumbs: {
|
||||
autoStart: true,
|
||||
showOnStart: "yes"
|
||||
},
|
||||
Toolbar: {
|
||||
display: {
|
||||
left: ["infobar"],
|
||||
middle: [
|
||||
"zoomIn",
|
||||
"zoomOut",
|
||||
"toggle1to1",
|
||||
"rotateCCW",
|
||||
"rotateCW",
|
||||
"flipX",
|
||||
"flipY",
|
||||
],
|
||||
right: ["slideshow", "thumbs", "close"],
|
||||
},
|
||||
},
|
||||
animated: true,
|
||||
dragToClose: true,
|
||||
keyboard: {
|
||||
Escape: "close",
|
||||
Delete: "close",
|
||||
Backspace: "close",
|
||||
PageUp: "next",
|
||||
PageDown: "prev",
|
||||
ArrowUp: "next",
|
||||
ArrowDown: "prev",
|
||||
ArrowRight: "next",
|
||||
ArrowLeft: "prev",
|
||||
},
|
||||
fitToView: true,
|
||||
preload: 3,
|
||||
infinite: true,
|
||||
Panzoom: {
|
||||
maxScale: 3,
|
||||
minScale: 1
|
||||
},
|
||||
caption: false,
|
||||
};
|
||||
// 绑定相册/文章图片
|
||||
Fancybox.bind(albumImagesSelector, {
|
||||
...commonConfig,
|
||||
groupAll: true,
|
||||
Carousel: {
|
||||
transition: "slide",
|
||||
preload: 2,
|
||||
},
|
||||
});
|
||||
fancyboxSelectors.push(albumImagesSelector);
|
||||
// 绑定相册链接
|
||||
Fancybox.bind(albumLinksSelector, {
|
||||
...commonConfig,
|
||||
source: (el: any) => {
|
||||
return el.getAttribute("data-src") || el.getAttribute("href");
|
||||
},
|
||||
});
|
||||
fancyboxSelectors.push(albumLinksSelector);
|
||||
// 绑定单独的 fancybox 图片
|
||||
Fancybox.bind(singleFancyboxSelector, commonConfig);
|
||||
fancyboxSelectors.push(singleFancyboxSelector);
|
||||
}
|
||||
|
||||
// 清理 Fancybox 实例
|
||||
export function cleanupFancybox() {
|
||||
if (!Fancybox) return; // 如果从未加载过,无需清理
|
||||
fancyboxSelectors.forEach((selector) => {
|
||||
Fancybox.unbind(selector);
|
||||
});
|
||||
fancyboxSelectors = [];
|
||||
}
|
||||
Reference in New Issue
Block a user