Saya membuat kustom baru: pemilih semu untuk jQuery untuk menguji apakah suatu item memiliki salah satu properti css berikut:
- overflow: [gulir | otomatis]
- overflow-x: [gulir | otomatis]
- overflow-y: [gulir | otomatis]
Saya ingin menemukan orangtua terdekat yang dapat digulir dari elemen lain jadi saya juga menulis plugin jQuery kecil lain untuk menemukan orangtua terdekat dengan overflow.
Solusi ini mungkin tidak melakukan yang terbaik, tetapi tampaknya berhasil. Saya menggunakannya bersamaan dengan plugin $ .scrollTo. Terkadang saya perlu tahu apakah suatu elemen ada di dalam wadah yang dapat digulir. Dalam hal ini saya ingin menggulir elemen digulir induk vs jendela.
Saya mungkin harus membungkus ini dalam satu plugin dan menambahkan pemilih psuedo sebagai bagian dari plugin, serta memaparkan metode 'terdekat' untuk menemukan wadah digulir terdekat (induk).
Siapa pun .... ini dia.
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') jQuery selektor semu:
$.expr[":"].scrollable = function(a) {
var elem = $(a);
return elem.isScrollable();
};
Plugin jQuery $ .scrollableparent ():
$.fn.scrollableparent = function(){
return $(this).closest(':scrollable') || $(window); //default to $('html') instead?
};
Implementasinya cukup sederhana
//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();
UPDATE: Saya menemukan bahwa Robert Koritnik sudah datang dengan yang lebih kuat: pemilih pseudo yang dapat digulir yang akan mengidentifikasi kapak yang dapat digulir dan ketinggian wadah yang dapat digulir, sebagai bagian dari plugin jQuery $ .scrollintoview () nya. plugin scrollintoview
Inilah pemilih (alat peraga) mewahnya:
$.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