如果我在单独的HTML,CSS和Javascript文件中编写this codes,并用浏览器打开它,当目标在视口高度的中间观察时,粘性共享条出现,但在codepen中,当目标在视口高度的底部观察时,粘性共享条出现。
{
class StickyShareBar {
constructor(element) {
this.element = element;
this.contentTarget = document.getElementsByClassName('js-sticky-sharebar-target');
this.showClass = 'sticky-sharebar--on-target';
this.threshold = '50%';
this.initShareBar();
}
initShareBar() {
if(this.contentTarget.length < 1) {
this.element.addClass( this.showClass);
return;
}
if(intersectionObserverSupported) {
this.initObserver();
} else {
this.element.addClass(this.showClass);
}
}
initObserver() {
const self = this;
var observer = new IntersectionObserver(
function(entries, observer) {
self.element.classList.toggle( self.showClass, entries[0].isIntersecting);
},
{
rootMargin: "0px 0px -"+this.threshold+" 0px"}
);
observer.observe(this.contentTarget[0]);
}
}
const stickyShareBar = document.getElementsByClassName('js-sticky-sharebar'),
intersectionObserverSupported = ('IntersectionObserver' in window && 'IntersectionObserverEntry' in window && 'intersectionRatio' in window.IntersectionObserverEntry.prototype);
new StickyShareBar(stickyShareBar[0]);
}
4条答案
按热度按时间dgsult0t1#
这可能是
rootMargin
的问题,而您使用的是iframe
https://w3c.github.io/IntersectionObserver/#dom-intersectionobserver-rootmargin
https://github.com/w3c/IntersectionObserver/issues/372
bttbmeg02#
这是因为targeted元素。当srcollbar可以到达目标元素(
js-sticky-sharebar-target
)时,就会触发事件。当内容容器宽度较小时,滚轮无法到达目标元素。因此,它不会显示在浏览器或小屏幕上。我已经更改了目标元素,并将其放在顶部。现在它可以按预期工作了。更改的HTML:
已更改的JS:
请参阅Demo
j7dteeu83#
IntersectionObserver规范已经扩展到允许将
Document
作为参数传递给root
。因此,如果您将iframe的Document
作为root
的参数传递,它将触发一个特殊情况,将iframe的窗口视为视口,因此它将按预期工作。在像codepen这样的东西中,你可能无法控制这一点,但除此之外,它会解决你的问题。请参阅https://github.com/w3c/IntersectionObserver/issues/372
9jyewag04#
我在使用CodePen中的Intersection Observer时遇到过很多次同样的问题。就像其他人说的那样,这是因为CodePen在iframe中呈现您的工作,而rootMargin并不像您期望的那样工作。
我已经尝试了几乎每一个解决方案,已经描述了在其他线程和这是唯一一个我已经得到了工作:https://codepen.io/nickcil/pen/MWbqOaJ
解决方案是将HTML封装在一个全宽和全高元素中,并将其设置为
position: fixed
和overflow: auto
。然后将该元素设置为观察者的root
。rootMargin
现在将在笔中正常工作。