如何获取scrollLeft的最大值?

问题描述 投票:0回答:8

好吧,我正在使用 jQuery,目前正在获取滚动条的最大值:

var $body = $('body');
$body.scrollLeft(99999); // will give me the max value since I've overshot
var max_value = $body.scrollLeft(); // returns 300
$('body').scrollLeft(0);

当我尝试这个时:

$body[0].scrollWidth
我只得到内容的实际宽度 - 1580

我想一定有更好的方法我忘记了。

编辑 为了澄清一下,我还尝试了

$(window).width()
$(document).width()
,分别给了我 1280 和 1580。

javascript width scrollbar
8个回答
161
投票

您可以使用以下方法计算

element.scrollLeft
的最大值:

var maxScrollLeft = element.scrollWidth - element.clientWidth;

请注意,可能存在一些我不知道的浏览器特定的怪癖。


11
投票

首先,有一个在 mozilla 中实现的原生属性,并且只有 mozilla

scrollLeftMax
(也是
scrollTopMax
)。看这里:https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollLeftMax

这里我写了一个 polyfill,它将使得该属性可用于 IE8+,以及 所有其他浏览器。只需将其添加到 js 文件或代码的顶部即可。

这里是polyfill代码:

(function(elmProto){
    if ('scrollTopMax' in elmProto) {
        return;
    }
    Object.defineProperties(elmProto, {
        'scrollTopMax': {
            get: function scrollTopMax() {
              return this.scrollHeight - this.clientHeight;
            }
        },
        'scrollLeftMax': {
            get: function scrollLeftMax() {
              return this.scrollWidth - this.clientWidth;
            }
        }
    });
}
)(Element.prototype);

使用示例:

var el = document.getElementById('el1');
var max = el.scrollLeftMax; 

这里的支持取决于

defineProperties()
的支持。这是 IE8+(对于 IE8,该方法仅支持 DOM 元素,这就是我们的 polyfill 使用和方法的情况)。

在此处查看支持的浏览器的完整列表: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#compatNote_1

大部分就足够了。

如果您无法直接添加单独的功能。并且您将获得对 IE6+ 和所有其他浏览器的支持。 (现在取决于运营商支持,恰好是IE6+)

这里是一个例子,我选择在名称末尾添加一个“i”。

scrollLeftMaxi()
scrollTopMaxi()

(function (elmProto) {
    elmProto.scrollTopMaxi = function () {
        return this.scrollTop - this.clientHeight;
    };
    elmProto.scrollLeftMaxi = function () {
        return this.scrollLeft - this.clientWidth;
    };
})(Element.prototype);

使用示例:

 var element = document.getElementById('el');
 var leftMax = element.scrollLeftMaxi();
 var topMax = element.scrollTopMaxi();
 console.log(leftMax);
 console.log(topMax);

上面的代码创建了 Element 原型的属性并分配我们定义的函数。当被称为

scrollLeftMaxi()
时。原型链被遍历,直到到达
Element.prototype
。它将在哪里找到该属性。知道下面的原型链。以及如何检查属性。如果在链中的不同位置有两个同名的属性。意外的行为只是意料之中的。这就是为什么新名称
scrollLeftMaxi
很合适。 (如果我与本机 mozilla 保持相同,则本机将不会被覆盖,并且它们位于链中的两个不同位置,并且本机优先。并且本机不是函数类型。一种属性它后面有一个 getter,就像我们对上面的 polyfill 所做的那样,如果我将其作为函数调用,则会触发错误,表明它不是函数,因此在不更改名称的情况下,mozilla 会遇到这个问题。举个例子)。

如果您愿意,请查看此处 getter 的工作原理: https://www.hongkiat.com/blog/getters-setters-javascript/

这是一个小提琴测试,它表明我们得到了与 mozilla 中的本机属性相同的结果(确保在 mozilla 中进行测试)

(function(elmProto) {
  elmProto.scrollTopMaxi = function() {
    return this.scrollHeight - this.clientHeight;
  };
  elmProto.scrollLeftMaxi = function() {
    return this.scrollWidth - this.clientWidth;
  };
})(Element.prototype);



// here we will test

var container = document.getElementById('container');

// here a comparison between the native of mozilla and this one 

console.log("scrollLeftMaxi = " + container.scrollLeftMaxi());
console.log("scrollLeftMax = " + container.scrollLeftMax);
#container {
  height: 500px;
  width: 700px;
  overflow: auto;
  border: solid 1px blue;
}

#inner {
  height: 2000px;
  width: 1500px;
  background: #928ae6;
}
<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8">
    <title>Document</title>
  </head>

  <body>
    <div id="container">
      <div id="inner"></div>
    </div>

  </body>

</html>

与 jquery 一起使用怎么样:

var max = $('#element')[0].scrollLeftMax; // when using the polyfill
var max =  $('#element')[0].scrollLeftMaxi(); // when using the other alternative more support IE6+

4
投票

AFAIK你必须自己计算最大滚动值,它是父/容器宽度和子/内容宽度之间的差值。

有关如何使用 jQuery 执行此操作的示例:

HTML:

<div id="container">
    <div id="content">
        Very long text or images or whatever you need
    </div>
</div>

CSS:

#container {
    overflow:   scroll;
    width:      200px;
}
#content {
    width:      400px;
}

JS:

var maxScroll = $("#content").width() - $("#container").width();
// maxScroll would be 200 in this example

在您的情况下,window是父/容器,document是子/内容。

这是一个包含此示例的 JSFiddle:http://jsfiddle.net/yP3wW/


2
投票

简单的解决方案是

var maxScrollLeft = $(document).width() - $(window).width();

1
投票

Jquery (>1.9.1):

scrollLeft
的最大值为:

$('#elemID').prop("scrollWidth") - $('#elemID').width();

0
投票

您可以使用

$(document).width()
获取文档的完整宽度,并使用
$(window).width()
获取窗口/视口的宽度。

http://api.jquery.com/width/


-1
投票

我认为你可以使用这样的东西:

this.children().width()*(this.children().length+1)-this.width()-10;

上一行代码将获取其中一个子元素的宽度,并将其乘以子元素的数量,最后您需要减去元素的宽度减去偏移量


-2
投票
var scrollContainer = $('.b-partners .b-partners__inner');
var maxScrollLeft = $(scrollContainer)[0].scrollWidth - $(scrollContainer).width();
console.log(maxScrollLeft);
© www.soinside.com 2019 - 2024. All rights reserved.