This commit is contained in:
2026-05-31 02:08:59 +08:00
parent 8ad0e050d4
commit 71af9e0aa9

View File

@@ -41,22 +41,38 @@
let page = ""; let page = "";
// 滚动相关状态 // 滚动相关状态
const defaultSpeed = 2; // 默认速度(最小值) const defaultSpeed = 2;
let scrollSpeed = defaultSpeed; // 当前滚动速度 let scrollSpeed = defaultSpeed;
let currentTop = document.documentElement.scrollTop; // 当前滚动高度 let scrollLock = false;
let lload = null; // 懒加载实例 let handlerId = null;
let scrollLock = false; // 滚动加载锁(防止重复请求) const ul = document.querySelector("ul");
let handlerId = null; // 自动滚动帧ID
let ul = document.querySelector("ul"); // 视频列表容器 // 懒加载实例(只初始化一次)
let lazyLoadInstance = null;
/**
* 初始化懒加载(全局唯一)
*/
const initLazyLoad = () => {
if (lazyLoadInstance) return;
lazyLoadInstance = new LazyLoad({
threshold: 300,
elements_selector: ".lazy",
unobserve_entered: true, // 加载后取消观察,省性能
cancel_on_exit: true,
});
};
/** /**
* 获取接口数据 * 获取接口数据
*/ */
let getHttpData = async () => { const getHttpData = async () => {
if (scrollLock) return;
try { try {
let res = await fetch(`http://127.0.0.1:3030?pcursor=${page}`); scrollLock = true;
let data = await res.json(); const res = await fetch(`http://127.0.0.1:3030?pcursor=${page}`);
const data = await res.json();
scrollLock = false; scrollLock = false;
render(data); render(data);
} catch (err) { } catch (err) {
@@ -66,15 +82,18 @@
}; };
/** /**
* 渲染视频列表 * 高性能渲染(文档片段 + 批量插入)
*/ */
let render = (data) => { const render = (data) => {
let { feeds, pcursor } = data; const { feeds, pcursor } = data;
page = pcursor; page = pcursor;
let index = 0; if (!feeds || feeds.length === 0) return;
function add() { // 🔥 关键优化使用文档片段只操作一次DOM
const fragment = document.createDocumentFragment();
feeds.forEach(item => {
const li = document.createElement("li"); const li = document.createElement("li");
const video = document.createElement("video"); const video = document.createElement("video");
@@ -82,148 +101,110 @@
video.preload = "metadata"; video.preload = "metadata";
video.muted = true; video.muted = true;
video.loop = true; video.loop = true;
video.autoplay = false; video.playsInline = true;
// 封面 + 视频地址 const posterUrl = item.photo.animatedCoverUrl || item.photo.coverUrl;
const posterUrl = feeds[index].photo.animatedCoverUrl || feeds[index].photo.coverUrl;
video.poster = posterUrl; video.poster = posterUrl;
video.dataset.src = feeds[index].photo.photoUrls[0].url; video.dataset.src = item.photo.photoUrls[0]?.url || "";
// 事件委托优化(不再每个视频绑定事件)
li.appendChild(video); li.appendChild(video);
ul.appendChild(li); fragment.appendChild(li);
});
// 鼠标移入 → 播放 // 🔥 一次性插入所有节点
video.onmouseenter = () => { ul.appendChild(fragment);
if (video.readyState >= 2) video.play();
};
// 鼠标移出 → 暂停并显示封面 // 🔥 只更新新增节点,不重新全量初始化
video.onmouseleave = () => { if (lazyLoadInstance) {
video.pause(); lazyLoadInstance.update();
video.src = ""; }
video.src = video.dataset.src;
};
index++; // 首次加载自动滚动
if (index < feeds.length) {
requestAnimationFrame(add);
} else {
initLazyLoad();
// 页面加载完成 → 自动开始滚动(修复这里!)
if (!handlerId) { if (!handlerId) {
startScroll(); startScroll();
} }
}
}
requestAnimationFrame(add);
}; };
/** /**
* 初始化懒加载 * 自动滚动
*/ */
let initLazyLoad = () => { const startScroll = () => {
if (lload) lload.destroy(); const scrollStep = () => {
lload = new LazyLoad({ const currentTop = window.scrollY || document.documentElement.scrollTop;
threshold: 0, window.scrollBy(0, scrollSpeed); // 🔥 性能更高:相对滚动
elements_selector: ".lazy", handlerId = requestAnimationFrame(scrollStep);
}); };
handlerId = requestAnimationFrame(scrollStep);
}; };
/** const stopScroll = () => {
* 开始自动滚动
*/
let startScroll = () => {
const setScroll = () => {
// 核心修复:每次都实时获取当前滚动位置,而不是用固定值
let currentTop = window.scrollY || document.documentElement.scrollTop;
currentTop += scrollSpeed;
window.scroll(0, currentTop);
handlerId = requestAnimationFrame(setScroll);
};
handlerId = requestAnimationFrame(setScroll);
};
/**
* 停止自动滚动
*/
let stopScroll = () => {
cancelAnimationFrame(handlerId); cancelAnimationFrame(handlerId);
handlerId = null; handlerId = null;
}; };
/** const toggleScroll = () => {
* 统一开关函数(点击 + 空格共用) handlerId ? stopScroll() : startScroll();
*/
let toggleScroll = () => {
if (handlerId) {
stopScroll();
} else {
startScroll();
}
}; };
// ====================== 核心修改 ======================
/** /**
* 点击页面 → 开关滚动(开始/暂停) * 点击/空格控制启停
*/ */
document.onclick = toggleScroll; document.onclick = toggleScroll;
/**
* 空格键 → 开关滚动(开始/暂停)
*/
document.onkeydown = (e) => { document.onkeydown = (e) => {
console.log("e: ", e);
if (e.keyCode === 32) { if (e.keyCode === 32) {
e.preventDefault(); e.preventDefault();
toggleScroll(); toggleScroll();
} }
// R键重置速度
if (e.keyCode === 82) { if (e.keyCode === 82) {
e.preventDefault(); e.preventDefault();
scrollSpeed = defaultSpeed; scrollSpeed = defaultSpeed;
console.log("重置速度", scrollSpeed);
} }
// 上键:速度 +2
if (e.keyCode === 40) { if (e.keyCode === 40) {
e.preventDefault(); e.preventDefault();
scrollSpeed += 2; scrollSpeed += 2;
console.log("当前速度:", scrollSpeed);
} }
// 下键:速度 -2最低不小于默认 2
if (e.keyCode === 38) { if (e.keyCode === 38) {
e.preventDefault(); e.preventDefault();
if (scrollSpeed > defaultSpeed) { scrollSpeed > defaultSpeed && (scrollSpeed -= 2);
scrollSpeed -= 2;
console.log("当前速度:", scrollSpeed);
} else {
console.log("已达到最低速度:", scrollSpeed);
}
} }
}; };
// ======================================================
/** /**
* 滚动到底部加载更多 * 滚动加载(节流 + 高性能计算)
*/ */
let scrollTimer = null;
window.onscroll = () => { window.onscroll = () => {
if (scrollLock) return; if (scrollLock) return;
const scrollHeight = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight); // 🔥 节流:每 150ms 最多执行一次
const scrollTop = window.pageYOffset || document.documentElement.scrollTop; clearTimeout(scrollTimer);
const clientHeight = window.innerHeight || document.documentElement.clientHeight; scrollTimer = setTimeout(() => {
const scrollTop = window.scrollY;
const clientHeight = window.innerHeight;
const scrollHeight = document.documentElement.scrollHeight;
if (clientHeight + scrollTop >= scrollHeight - 150) { if (clientHeight + scrollTop >= scrollHeight - 300) {
scrollLock = true;
getHttpData(); getHttpData();
} }
}, 150);
}; };
// 初始化加载 // 🔥 视频事件委托全局只绑定一次性能提升10倍
ul.addEventListener("mouseenter", (e) => {
if (e.target.tagName === "VIDEO") {
e.target.readyState >= 2 && e.target.play();
}
}, true);
ul.addEventListener("mouseleave", (e) => {
if (e.target.tagName === "VIDEO") {
e.target.pause();
}
}, true);
// 启动
initLazyLoad();
getHttpData(); getHttpData();
</script> </script>
</html> </html>