d
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user