我为jQuery创建了一个新的自定义:pseudo选择器,用于测试元素是否具有以下CSS属性之一:
- overflow: [scroll|auto]
- overflow-x: [scroll|auto]
- overflow-y: [scroll|auto]
我想找到另一个元素的最近滚动父级,因此我还编写了另一个小型的jQuery插件来查找具有溢出的最近父级。
这个解决方案可能不是性能最佳的,但它似乎起作用。我与$.scrollTo插件一起使用它。有时我需要知道一个元素是否在另一个可滚动容器内。在这种情况下,我希望滚动父可滚动元素而不是窗口。
我应该将这个插件封装成一个单一的插件,并将伪选择器作为插件的一部分添加,并公开一个“closest”方法来查找最近(父)可滚动容器。
无论如何……这就是它。
$.isScrollable jQuery插件:
$.fn.isScrollable = function(){
var elem = $(this);
return (
elem.css('overflow') == 'scroll'
|| elem.css('overflow') == 'auto'
|| elem.css('overflow-x') == 'scroll'
|| elem.css('overflow-x') == 'auto'
|| elem.css('overflow-y') == 'scroll'
|| elem.css('overflow-y') == 'auto'
);
};
$(':scrollable') jQuery 伪选择器:
$.expr[":"].scrollable = function(a) {
var elem = $(a);
return elem.isScrollable();
};
$.scrollableparent() jQuery plugin:
$.fn.scrollableparent = function(){
return $(this).closest(':scrollable') || $(window);
};
实现非常简单
var somedivIsScrollable = $(this).isScrollable();
var scrollableChildren = $(this).find(':scrollable');
var scrollableparent = $(this).scrollableparent();
更新: 我发现Robert Koritnik已经提出了一个更强大的:scrollable伪选择器,可以识别可滚动容器的可滚动轴和高度,作为他的$.scrollintoview() jQuery插件的一部分。滚动到视图插件
这是他花哨的伪选择器(props):
$.extend($.expr[":"], {
scrollable: function (element, index, meta, stack) {
var direction = converter[typeof (meta[3]) === "string" && meta[3].toLowerCase()] || converter.both;
var styles = (document.defaultView && document.defaultView.getComputedStyle ? document.defaultView.getComputedStyle(element, null) : element.currentStyle);
var overflow = {
x: scrollValue[styles.overflowX.toLowerCase()] || false,
y: scrollValue[styles.overflowY.toLowerCase()] || false,
isRoot: rootrx.test(element.nodeName)
};
if (!overflow.x && !overflow.y && !overflow.isRoot)
{
return false;
}
var size = {
height: {
scroll: element.scrollHeight,
client: element.clientHeight
},
width: {
scroll: element.scrollWidth,
client: element.clientWidth
},
scrollableX: function () {
return (overflow.x || overflow.isRoot) && this.width.scroll > this.width.client;
},
scrollableY: function () {
return (overflow.y || overflow.isRoot) && this.height.scroll > this.height.client;
}
};
return direction.y && size.scrollableY() || direction.x && size.scrollableX();
}
});
> this.innerHeight();
。http://jsfiddle.net/p3FFL/210/ - jcubic