更新されました。以下を参照してください...
このための純粋な JavaScript ソリューションを検索しているときに、ここに立ち寄りました...しかし、誰かが私の jquery バージョンを気に入ってくれることを願っています。
わずかに異なる動作をする 2 つの関数を次に示しますが、パフォーマンスの違いは最小限です。私はそれを測定しませんでしたが、jsperf "each vs filter"でのこのテストによると、.each()
バージョンはわずかに高速です。
それにもかかわらず、私はこの.filter()
バージョンがとても短くてわかりやすいので気に入っています。
$.fn.isfixed = function(){
var el = $(this);
var all = el.add(el.parents());
return all.filter(function(){
return $(this).css("position") === "fixed";
}).length > 0;
};
$.fn.isfixed = function(){
var el = $(this);
var all = el.add(el.parents());
var ret = false;
all.each(function(){
if ($(this).css("position") === "fixed") {
ret = true;
return false;
}
});
return ret;
};
使用方法は$('path > to > your > element').isfixed()
返品true
またはfalse
アップデート
そして、これが純粋なJavaScriptバージョンです。(固定/絶対/相対)を検出することel.style.position
は機能せず、理由はわかりませんが、機能することが判明しましたwindow.getComputedStyle(el)...
。
var isfixed = function(elm) {
var el;
if (typeof elm === 'object') el = elm[0] || elm;
else if (typeof elm === 'string') el = document.querySelector(elm);
while (typeof el === 'object' && el.nodeName.toLowerCase() !== 'body') {
if (window.getComputedStyle(el).getPropertyValue('position').toLowerCase() === 'fixed') return true;
el = el.parentElement;
}
return false;
};
次の 3 種類の要素パラメータを受け入れます:
JavaScript オブジェクトとして:
var obj = document.querySelector('div#myID > span');
または
var obj = document.getElementById('span#someID');
jquery オブジェクトとして:
var obj = $('div#myID > span');
またはセレクタのみとして:
var obj = 'div#myID > span';
使用法は単純isfixed(obj);
で、ブール値true
またはfalse
そして、これが最終的に混合ソリューションです(jqueryプラグインとしての純粋なjavascript)
$.fn.isfixed = function(){
var el = this[0];
while (typeof el === 'object' && el.nodeName.toLowerCase() !== 'body') {
if (window.getComputedStyle(el).getPropertyValue('position').toLowerCase() === 'fixed') return true;
el = el.parentElement;
}
return false;
};
使用法:$('div#myID > span').isfixed()
上記の例のように。
気に入っていただけると幸いです。