【问题标题】:JS - get percentage of an element in ViewportJS - 获取视口中元素的百分比
【发布时间】:2013-12-11 23:02:27
【问题描述】:

我想获取一个元素(div)在视口中的百分比。

  • 当元素进入视口时,我希望值为 0。
  • 当元素和元素的高度离开视口时,我希望值为 100。

这是我想做的 5 个视口http://imgur.com/2ZPpps5

我试过了:

$(window).bind('scroll',function(){
var  viewportHeight = $(window).height(),
elementOffsetTop = $('#element').offset().top,
elementHeight = $('#element').height();

var numerator = 200 * (window.pageYOffset-elementOffsetTop+viewportHeight);
var denominator = (elementOffset+elementHeight+viewportHeight);
console.log(numerator/denominator);
});

此代码有效。 (我不明白为什么我必须乘以 2)。

但是当我调整页面大小时,此代码不起作用(值在 0 到 85 之间...)

想法?

【问题讨论】:

    标签: javascript jquery scroll viewport offset


    【解决方案1】:

    更新:这似乎仍然有一点流量,所以这里有一个不使用 jQuery 的更新解决方案。

    http://jsfiddle.net/nate/nmvka95j/20/

    const element = document.getElementById("element");
    const visible = document.getElementById("visible");
    
    const logPercentageSeen = () => {
      console.log(percentageSeen());
      visible.textContent = `${percentageSeen()} %`;
    };
    
    window.addEventListener("scroll", logPercentageSeen);
    
    const percentageSeen = () => {
      // Get the relevant measurements and positions
      const viewportHeight = window.innerHeight;
      const scrollTop = window.scrollY;
      const elementOffsetTop = element.offsetTop;
      const elementHeight = element.offsetHeight;
    
      // Calculate percentage of the element that's been seen
      const distance = scrollTop + viewportHeight - elementOffsetTop;
      const percentage = Math.round(
        distance / ((viewportHeight + elementHeight) / 100)
      );
    
      // Restrict the range to between 0 and 100
      return Math.min(100, Math.max(0, percentage));
    };
    
    // Log the initial value to the top before any scrolling has happened
    logPercentageSeen();
    

    这是旧的解决方案,在 ES6 之前,使用我们亲爱的老朋友 jQuery。

    http://jsfiddle.net/nate/4N3Pj/1/

    var $element = $('#element');
    var $win = $(window);
    var $vis = $('#visible');
    
    $win.on('scroll', function () {
        console.log(percentageSeen());
        $vis.text(percentageSeen() + '%');
    });
    
    function percentageSeen () {
        var viewportHeight = $(window).height(),
            scrollTop = $win.scrollTop(),
            elementOffsetTop = $element.offset().top,
            elementHeight = $element.height();
    
    
        if (elementOffsetTop > (scrollTop + viewportHeight)) {
            return 0;
        } else if ((elementOffsetTop + elementHeight) < scrollTop) {
            return 100;
        } else {
            var distance = (scrollTop + viewportHeight) - elementOffsetTop;
            var percentage = distance / ((viewportHeight + elementHeight) / 100);
            percentage = Math.round(percentage);
            return percentage;
        }
    }
    
    $win.trigger('scroll');
    

    【讨论】:

    • 很有用。我的目标是在向下滚动时获得百分比: - 当元素进入视口时 - 当它完全超出视口(包括 div 的高度)但你的脚本将帮助我做到这一点
    • 反转它非常简单。我已经更新了我的示例:它现在是否满足您的需求?
    • 我很抱歉我的英语不好,但你误解了我的目标。这是我想要的五个视口。 imgur.com/2ZPpps5 如果元素可见,pourcentage 不能为 100%,谢谢
    • 确实!感谢您提供的图形 - 这有助于使您想要的内容更清晰。我已经第二次更新了我的示例。这符合你的要求吗?
    • 这仅考虑垂直百分比 - 如果您使 jsfiddle 窗口变窄并减小看到的宽度,则百分比不再准确。不过这个算法还是有用的!
    【解决方案2】:

    我的版本略有不同。当元素高于屏幕高度本身时,它将在视口中解释为 100%。

    例如,如果屏幕高度为 1000 像素,元素高度为 2000 像素并且完全滚动到视图中,则该函数将返回 100% 而不是正常的 50%。

    享受吧。

    var percentWithinViewport = function (element) {
    
        var elementTop = element.offset().top;
        var scrollTop = $(window).scrollTop();
        var spaceTop = elementTop - scrollTop;
        var elementHeight = element.height();
        var screenHeight = $(window).height();
        var scrollBottom = scrollTop + screenHeight;
        var bottomElement = elementTop + element.height();
        var spaceBottom = bottomElement - scrollBottom;
        var heightInScreen = elementHeight - spaceBottom;
        var percentage;
    
        if (spaceTop < 0) {
            heightInScreen -= spaceTop * -1;
        }
    
        if (spaceBottom < 0) {
            heightInScreen -= spaceBottom * -1;
        }
    
        percentage = heightInScreen / screenHeight * 100;
        percentage = percentage < 0 ? 0 : percentage;
    
        element.attr('data-percent-viewport', percentage);
    
        return percentage;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      相关资源
      最近更新 更多