J'ai fait un nouveau sélecteur personnalisé: pseudo pour jQuery pour tester si un élément a l'une des propriétés css suivantes:
- débordement: [défilement | auto]
- overflow-x: [défilement | auto]
- débordement-y: [défilement | auto]
Je voulais trouver le parent déroulant le plus proche d'un autre élément, j'ai donc également écrit un autre petit plugin jQuery pour trouver le parent le plus proche avec débordement.
Cette solution ne fonctionne probablement pas le mieux, mais elle semble fonctionner. Je l'ai utilisé conjointement avec le plugin $ .scrollTo. Parfois, j'ai besoin de savoir si un élément se trouve dans un autre conteneur déroulant. Dans ce cas, je veux faire défiler l'élément déroulant parent par rapport à la fenêtre.
J'aurais probablement dû emballer cela dans un seul plugin et ajouter le sélecteur psuedo en tant que partie du plugin, ainsi qu'exposer une méthode `` la plus proche '' pour trouver le conteneur déroulant (parent) le plus proche.
Anywho .... le voici.
Plugin jQuery $ .isScrollable:
$.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') pseudo sélecteur jQuery:
$.expr[":"].scrollable = function(a) {
var elem = $(a);
return elem.isScrollable();
};
$ .scrollableparent () Plugin jQuery:
$.fn.scrollableparent = function(){
return $(this).closest(':scrollable') || $(window); //default to $('html') instead?
};
La mise en œuvre est assez simple
//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();
MISE À JOUR: J'ai trouvé que Robert Koritnik avait déjà proposé un pseudo-sélecteur beaucoup plus puissant: un pseudo sélecteur défilable qui identifiera les axes de défilement et la hauteur des conteneurs défilables, dans le cadre de son plugin jQuery $ .scrollintoview (). plugin scrollintoview
Voici son pseudo sélecteur de fantaisie (accessoires):
$.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