首先,有一个本地属性仅在 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+和所有其他浏览器的支持。 (现在它将依赖于in运算符支持,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);
以上代码创建了元素原型的属性,并分配我们定义的函数。当调用scrollLeftMaxi()
时,原型链被遍历,直到它到达Element.prototype
,在那里它会找到该属性。要知道以下原型链以及如何检查属性。如果在链中的不同位置具有相同名称的两个属性,则可以预期出现意外行为。这就是为什么新名称scrollLeftMaxi
很合适的原因。 (如果我使用与原生Mozilla相同的名称,那么原生的将不会被覆盖,它们位于链中的两个不同位置,并且原生的优先级更高。原生的类型不是函数类型。像上面的填充一样,具有getter的属性,如果我将其作为函数调用,将触发错误,说明它不是函数。因此,在不更改名称的情况下,我们将在Mozilla上遇到此问题。这是一个示例)。
如果您想了解getter的工作方式,请单击此处。
这是一个fiddle测试,它展示了我们在Mozilla中获得与原生属性相同的结果(请确保在Mozilla中进行测试)。
(function(elmProto) {
elmProto.scrollTopMaxi = function() {
return this.scrollHeight - this.clientHeight;
};
elmProto.scrollLeftMaxi = function() {
return this.scrollWidth - this.clientWidth;
};
})(Element.prototype);
var container = document.getElementById('container');
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+
scrollLeftMax
属性... - vsync$(this).css("width")
将返回宽度,我认为这将是最大滚动宽度。 - Arjun