Ho creato una nuova personalizzazione: pseudo-selettore per jQuery per verificare se un articolo ha una delle seguenti proprietà css:
- overflow: [scroll | auto]
- overflow-x: [scroll | auto]
- overflow-y: [scroll | auto]
Volevo trovare il genitore scorrevole più vicino di un altro elemento, quindi ho anche scritto un altro piccolo plugin jQuery per trovare il genitore più vicino con overflow.
Questa soluzione probabilmente non funziona al meglio, ma sembra funzionare. L'ho usato insieme al plugin $ .scrollTo. A volte ho bisogno di sapere se un elemento si trova all'interno di un altro contenitore scorrevole. In tal caso, voglio scorrere l'elemento scorrevole genitore rispetto alla finestra.
Probabilmente avrei dovuto racchiuderlo in un singolo plug-in e aggiungere il selettore psuedo come parte del plug-in, oltre a esporre un metodo "più vicino" per trovare il contenitore scorrevole più vicino (genitore).
Comunque ... eccolo qui.
$ .is Plugin jQuery scorrevole:
$.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 selettore 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?
};
L'implementazione è piuttosto semplice
//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();
AGGIORNAMENTO: Ho scoperto che Robert Koritnik ha già creato uno pseudo-selettore molto più potente: scorrevole che identificherà gli assi scorrevoli e l'altezza dei contenitori scorrevoli, come parte del suo plugin $ .scrollintoview () jQuery. plugin scrollintoview
Ecco il suo fantastico pseudo-selettore (oggetti di scena):
$.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