html 在codepen中,交集观察器的行为与浏览器窗口不同

guicsvcw  于 2022-12-02  发布在  其他
关注(0)|答案(4)|浏览(134)

如果我在单独的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]); 
}
dgsult0t

dgsult0t1#

这可能是rootMargin的问题,而您使用的是iframe
https://w3c.github.io/IntersectionObserver/#dom-intersectionobserver-rootmargin
https://github.com/w3c/IntersectionObserver/issues/372

bttbmeg0

bttbmeg02#

这是因为targeted元素。当srcollbar可以到达目标元素(js-sticky-sharebar-target)时,就会触发事件。当内容容器宽度较小时,滚轮无法到达目标元素。因此,它不会显示在浏览器或小屏幕上。我已经更改了目标元素,并将其放在顶部。现在它可以按预期工作了。

更改的HTML:

<div class="container new-js-sticky-sharebar-target">

已更改的JS:

this.contentTarget = document.getElementsByClassName('new-js-sticky-sharebar-target');

请参阅Demo

j7dteeu8

j7dteeu83#

IntersectionObserver规范已经扩展到允许将Document作为参数传递给root。因此,如果您将iframe的Document作为root的参数传递,它将触发一个特殊情况,将iframe的窗口视为视口,因此它将按预期工作。在像codepen这样的东西中,你可能无法控制这一点,但除此之外,它会解决你的问题。
请参阅https://github.com/w3c/IntersectionObserver/issues/372

9jyewag0

9jyewag04#

我在使用CodePen中的Intersection Observer时遇到过很多次同样的问题。就像其他人说的那样,这是因为CodePen在iframe中呈现您的工作,而rootMargin并不像您期望的那样工作。
我已经尝试了几乎每一个解决方案,已经描述了在其他线程和这是唯一一个我已经得到了工作:https://codepen.io/nickcil/pen/MWbqOaJ
解决方案是将HTML封装在一个全宽和全高元素中,并将其设置为position: fixedoverflow: auto。然后将该元素设置为观察者的rootrootMargin现在将在笔中正常工作。

相关问题