항목에 다음 CSS 속성 중 하나가 있는지 여부를 테스트하기 위해 jQuery 용 새 사용자 정의 : pseudo 선택기를 만들었습니다.
- 오버플로 : [scroll | auto]
- overflow-x : [스크롤 | 자동]
- 오버플로 -y : [scroll | auto]
다른 요소의 가장 가까운 스크롤 가능한 부모를 찾고 싶었으므로 오버플로가있는 가장 가까운 부모를 찾기 위해 또 다른 작은 jQuery 플러그인을 작성했습니다.
이 솔루션은 아마도 최고의 성능을 발휘하지 못하지만 작동하는 것처럼 보입니다. $ .scrollTo 플러그인과 함께 사용했습니다. 때로는 요소가 다른 스크롤 가능한 컨테이너 안에 있는지 여부를 알아야합니다. 이 경우 부모 스크롤 가능 요소와 창을 스크롤하고 싶습니다.
아마도 이것을 단일 플러그인으로 감싸서 psuedo 선택기를 플러그인의 일부로 추가하고 가장 가까운 (부모) 스크롤 가능한 컨테이너를 찾기 위해 '가장 가까운'방법을 노출해야했습니다.
누구든지 .... 여기 있습니다.
스크롤 가능한 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 플러그인 :
$.fn.scrollableparent = function(){
return $(this).closest(':scrollable') || $(window); //default to $('html') instead?
};
구현은 매우 간단합니다
//does a specific element have overflow scroll?
var somedivIsScrollable = $(this).isScrollable();
//use :scrollable psuedo selector to find a collection of child scrollable elements
var scrollableChildren = $(this).find(':scrollable');
//use $.scrollableparent to find closest scrollable container
var scrollableparent = $(this).scrollableparent();
업데이트 : Robert Koritnik은 이미 $ .scrollintoview () jQuery 플러그인의 일부로 스크롤 가능한 컨테이너의 스크롤 가능한 축과 높이를 식별하는 훨씬 더 강력한 스크롤 가능한 의사 선택기를 찾았습니다. scrollintoview 플러그인
그의 멋진 의사 선택기 (소품)는 다음과 같습니다.
$.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)
};
// check if completely unscrollable (exclude HTML element because it's special)
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
},
// check overflow.x/y because iPad (and possibly other tablets) don't dislay scrollbars
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();
jsfiddle.net/p3FFL/210