javascript - 为什么我不能得到中心?在 JavaScript 中
问题描述
我使用scrollama.js。
scrollama 是一个插件,允许使用 Intersection Observer 将参考线居中。
我想做的事
现在(默认),我基于 获取中心body
,
我想基于特定元素#cont
(= 内容)获取中心。
我像这样更改了scrollama.js的代码。
当前状态
213 号线
function handleResize() {
// viewH = window.innerHeight;
// pageH = getPageHeight();
viewH = document.getElementById("cont").offsetHeight; // change
pageH = document.getElementById("cont").offsetHeight; // change
offsetMargin = offsetVal * viewH;
if (isReady) {
stepOffsetHeight = stepEl.map(function (el) { return el.offsetHeight; });
stepOffsetTop = stepEl.map(getOffsetTop);
if (isEnabled) { updateIO(); }
}
if (isDebug) { update({ id: id, stepOffsetHeight: stepOffsetHeight, offsetMargin: offsetMargin, offsetVal: offsetVal }); }
}
现在,我可以得到#cont
,但参考线在顶部..(这条虚线是scrollama的调试工具)
我认为如果我更改元素 scrollama.js 获取并像这样更改它,这将成为中心,但是我还有什么需要更改的吗?
可能与获取中心相关的代码
我提取了scrollama中使用 viewH
和使用的所有地方。pageH
function scrollama() {
//【Line 143~】
var viewH = 0;
var pageH = 0;
//【Line 213~】
function handleResize() {
viewH = window.innerHeight;
pageH = getPageHeight();
offsetMargin = offsetVal * viewH;
}
//【Line 471~】
// jump into viewport
function updateViewportAboveIO() {
io.viewportAbove = stepEl.map(function (el, i) {
var marginTop = pageH - stepOffsetTop[i]; // <- here
var marginBottom = offsetMargin - viewH - stepOffsetHeight[i]; // <- here
var rootMargin = marginTop + "px 0px " + marginBottom + "px 0px";
var options = { rootMargin: rootMargin };
// console.log(options);
var obs = new IntersectionObserver(intersectViewportAbove, options);
obs.observe(el);
return obs;
});
}
function updateViewportBelowIO() {
io.viewportBelow = stepEl.map(function (el, i) {
var marginTop = -offsetMargin - stepOffsetHeight[i];
var marginBottom = offsetMargin - viewH + stepOffsetHeight[i] + pageH; // <- here
var rootMargin = marginTop + "px 0px " + marginBottom + "px 0px";
var options = { rootMargin: rootMargin };
// console.log(options);
var obs = new IntersectionObserver(intersectViewportBelow, options);
obs.observe(el);
return obs;
});
}
// look above for intersection
function updateStepAboveIO() {
io.stepAbove = stepEl.map(function (el, i) {
var marginTop = -offsetMargin + stepOffsetHeight[i];
var marginBottom = offsetMargin - viewH; // <- here
var rootMargin = marginTop + "px 0px " + marginBottom + "px 0px";
var options = { rootMargin: rootMargin };
// console.log(options);
var obs = new IntersectionObserver(intersectStepAbove, options);
obs.observe(el);
return obs;
});
}
// look below for intersection
function updateStepBelowIO() {
io.stepAbove = stepEl.map(function (el, i) {
var marginTop = -offsetMargin;
var marginBottom = offsetMargin - viewH + stepOffsetHeight[i]; // <- here
var rootMargin = marginTop + "px 0px " + marginBottom + "px 0px";
var options = { rootMargin: rootMargin };
// console.log(options);
var obs = new IntersectionObserver(intersectStepBelow, options);
obs.observe(el);
return obs;
});
}
// progress progress tracker
function updateStepProgressIO() {
io.stepProgress = stepEl.map(function (el, i) {
var marginTop = stepOffsetHeight[i] - offsetMargin;
var marginBottom = -viewH + offsetMargin; // <- here
var rootMargin = marginTop + "px 0px " + marginBottom + "px 0px";
var threshold = createThreshold(stepOffsetHeight[i]);
var options = { rootMargin: rootMargin, threshold: threshold };
// console.log(options);
var obs = new IntersectionObserver(intersectStepProgress, options);
obs.observe(el);
return obs;
});
}
}
解决方案
推荐阅读
- reactjs - 用 react-image-gallery 反应 jsfiddle
- firebase - Firestore 集合组更新文档
- bazel - 使用没有 `--compilation_mode opt` 标志的 bazel 构建 bazel 如何影响性能?
- windows - 带有 OFFSET 标签的汇编 PUSH 指令
- fortran - 在 Mac Big Sur 上写入标准输出时出现 gfortran 运行时错误
- list - 在 SwiftUI 中实现多个标题
- android - 即使添加了屏幕方向锁定,Android 屏幕方向
- javascript - 如何在 Typescript 中使用类型化变量作为具有相同名称的类型?
- google-apps-script - 如何使用 Google Apps 脚本中的字符串访问枚举值?
- javascript - 如何检查具有特定键值的对象是否存在