javascript - 当 postion:relative 阻止它时,如何相对于身体使用 offsetTop?
问题描述
所以我知道如果没有定位的祖先, .offsetTop 是从元素的顶部开始测量的。
我试图在元素用 JavaScript 显示一半时滑入。
因此,Javascript 代码计算图像距离窗口顶部的距离,如果图像显示一半,则将 CSS 类应用于元素。
但是,由于图像的父元素(页脚)设置为 position:relative,因此 offsetTop 不再起作用。
代码看起来像这样
const slideInAt = (window.scrollY + window.innerHeight) - sliderImage.height / 2;
const imageBottom = sliderImage.offsetTop + sliderImage.height;
const isHalfShown = slideInAt > sliderImage.offsetTop;
const isNotScrolledPast = window.scrollY < imageBottom;
if (isHalfShown && isNotScrolledPast) {
sliderImage.classList.add('active');
} else {
sliderImage.classList.remove('active');
}
这是现实生活中的例子:https ://bluishbanana.github.io/
任何想法如何解决这个问题?
解决方案
这里有两个选项。offsetTop
首先,也是最直接的,因为您提到的确切原因而摆脱了:它适用于相对偏移量,因此在滚动父级时也没有真正的帮助。要获取绝对数字,请使用getBoundingClientRect():
Element.getBoundingClientRect() 方法返回元素的大小及其相对于视口的位置。
这种方法的缺点是它的性能:即使您将此函数作为滚动处理程序去抖动,在每次滚动时运行包装器仍然不是理想的。
另一种方法是使用IntersectionObserver API,它在 2021 年或多或少有足够的浏览器支持:
可用于了解 DOM 元素相对于包含元素或顶级视口的可见性和位置的 API。位置是异步传递的,对于理解元素的可见性和实现 DOM 内容的预加载和延迟加载很有用。
使用这种方法,您不必对处理程序进行去抖动,因此应该提高性能并且还应该修复不那么微妙的错误。
推荐阅读
- javascript - this.method 不是函数,绑定不起作用
- javascript - 如何获取数组并复制到另一个
- python-3.x - 如何通过python中的位置索引从文本文件中查找单词?
- swift - 无法在swift中创建带有经纬度的苹果地图地址链接
- android - 带有重力的edittext中的Android后缀
- c - memcpy 函数定义中缓冲区的重叠是什么意思?
- python - 快捷方式中的目标:文件名、目录名或卷标语法不正确
- php - 如何在 laravel 中明智地制作本地化模块
- inheritance - 将动态内容呈现为继承的 Blazor 布局
- java - 如何使用 Java 在 Spring Boot 中使用枚举创建父子 Json 响应