好吧,我正在使用 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。
您可以使用以下方法计算
element.scrollLeft
的最大值:
var maxScrollLeft = element.scrollWidth - element.clientWidth;
请注意,可能存在一些我不知道的浏览器特定的怪癖。
首先,有一个在 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+
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/
简单的解决方案是
var maxScrollLeft = $(document).width() - $(window).width();
Jquery (>1.9.1):
scrollLeft
的最大值为:
$('#elemID').prop("scrollWidth") - $('#elemID').width();
我认为你可以使用这样的东西:
this.children().width()*(this.children().length+1)-this.width()-10;
上一行代码将获取其中一个子元素的宽度,并将其乘以子元素的数量,最后您需要减去元素的宽度减去偏移量
var scrollContainer = $('.b-partners .b-partners__inner');
var maxScrollLeft = $(scrollContainer)[0].scrollWidth - $(scrollContainer).width();
console.log(maxScrollLeft);