मैं ब्राउज़र के व्यूपोर्ट के सापेक्ष एक तत्व की स्थिति प्राप्त करना चाहता हूं (वह व्यूपोर्ट जिसमें पृष्ठ प्रदर्शित होता है, न कि पूरा पृष्ठ)। यह जावास्क्रिप्ट में कैसे किया जा सकता है?
बहुत धन्यवाद
मैं ब्राउज़र के व्यूपोर्ट के सापेक्ष एक तत्व की स्थिति प्राप्त करना चाहता हूं (वह व्यूपोर्ट जिसमें पृष्ठ प्रदर्शित होता है, न कि पूरा पृष्ठ)। यह जावास्क्रिप्ट में कैसे किया जा सकता है?
बहुत धन्यवाद
जवाबों:
मौजूदा उत्तर अब पुराने हो चुके हैं। देशी getBoundingClientRect()पद्धति अब लगभग काफी समय से है, और यह वही करता है जो सवाल पूछता है। प्लस यह सभी ब्राउज़रों में समर्थित है (IE 5 सहित, ऐसा लगता है!)
से MDN पेज :
लौटाया गया मान एक TextRectangle ऑब्जेक्ट है, जिसमें बॉर्डर-बॉक्स का वर्णन करने वाले केवल-बाएँ, शीर्ष, दाएं और नीचे गुण होते हैं, पिक्सेल में, व्यूपोर्ट के शीर्ष-बाएँ के सापेक्ष शीर्ष-बाएँ के साथ ।
आप इसे इस तरह उपयोग करते हैं:
var viewportOffset = el.getBoundingClientRect();
// these are relative to the viewport, i.e. the window
var top = viewportOffset.top;
var left = viewportOffset.left;
getBoundingClientRect().topमेरे IE11 में नहीं है यह 0. लौटाता है। क्या आपके पास कोई समाधान है।
मेरे मामले में, बस स्क्रॉलिंग के बारे में सुरक्षित होने के लिए, मैंने window.scroll को समीकरण में जोड़ा:
var element = document.getElementById('myElement');
var topPos = element.getBoundingClientRect().top + window.scrollY;
var leftPos = element.getBoundingClientRect().left + window.scrollX;
यह मुझे दस्तावेज़ पर तत्व की वास्तविक सापेक्ष स्थिति प्राप्त करने की अनुमति देता है, भले ही इसे स्क्रॉल किया गया हो।
getBoundingClientRect().topमेरे आईई 11 में नहीं है यह 0. लौटाता है। क्या आपके पास कोई समाधान है।
window.scrollY || window.pageYOffsetसमर्थन में सुधार हो सकता है
संपादित करें: पृष्ठ स्क्रॉलिंग के लिए कुछ कोड जोड़ें।
function findPos(id) {
var node = document.getElementById(id);
var curtop = 0;
var curtopscroll = 0;
if (node.offsetParent) {
do {
curtop += node.offsetTop;
curtopscroll += node.offsetParent ? node.offsetParent.scrollTop : 0;
} while (node = node.offsetParent);
alert(curtop - curtopscroll);
}
}
आईडी तर्क उस तत्व की आईडी है जिसकी ऑफसेट आप चाहते हैं। एक quirksmode पोस्ट से अनुकूलित ।
var element = document.querySelector('selector');
var bodyRect = document.body.getBoundingClientRect(),
elemRect = element.getBoundingClientRect(),
offset = elemRect.top - bodyRect.top;
तुम कोशिश कर सकते हो:
node.offsetTop - window.scrollY
यह ओपेरा पर परिभाषित व्यूपोर्ट मेटा टैग के साथ काम करता है।
offsetTopतो निकटतम तैनात तत्व के सापेक्ष है। जो कि, पृष्ठ संरचना के आधार पर, मूल तत्व हो सकता है या नहीं भी हो सकता है।
jQuery यह काफी सुरुचिपूर्ण ढंग से लागू करता है। यदि आप jQuery के स्रोत को देखते हैं offset, तो आप पाएंगे कि यह मूल रूप से कैसे लागू किया गया है:
var rect = elem.getBoundingClientRect();
var win = elem.ownerDocument.defaultView;
return {
top: rect.top + win.pageYOffset,
left: rect.left + win.pageXOffset
};
इस पृष्ठ पर फ़ंक्शन ब्राउज़र दृश्य पोर्ट के सापेक्ष पारित तत्व के शीर्ष, बाएं, ऊंचाई और चौड़ाई के निर्देशांक के साथ एक आयत लौटाएगा।
localToGlobal: function( _el ) {
var target = _el,
target_width = target.offsetWidth,
target_height = target.offsetHeight,
target_left = target.offsetLeft,
target_top = target.offsetTop,
gleft = 0,
gtop = 0,
rect = {};
var moonwalk = function( _parent ) {
if (!!_parent) {
gleft += _parent.offsetLeft;
gtop += _parent.offsetTop;
moonwalk( _parent.offsetParent );
} else {
return rect = {
top: target.offsetTop + gtop,
left: target.offsetLeft + gleft,
bottom: (target.offsetTop + gtop) + target_height,
right: (target.offsetLeft + gleft) + target_width
};
}
};
moonwalk( target.offsetParent );
return rect;
}
function inViewport(element) {
let bounds = element.getBoundingClientRect();
let viewWidth = document.documentElement.clientWidth;
let viewHeight = document.documentElement.clientHeight;
if (bounds['left'] < 0) return false;
if (bounds['top'] < 0) return false;
if (bounds['right'] > viewWidth) return false;
if (bounds['bottom'] > viewHeight) return false;
return true;
}
सारे सवालों के जवाब देने के लिए धन्यवाद। ऐसा लगता है कि प्रोटोटाइप में पहले से ही एक फ़ंक्शन है जो ऐसा करता है (पृष्ठ (फ़ंक्शन))। फ़ंक्शन के स्रोत कोड को देखकर, मैंने पाया कि यह पहले पृष्ठ (यानी दस्तावेज़ शीर्ष) के सापेक्ष तत्व ऑफसेट स्थिति की गणना करता है, फिर स्क्रॉलटॉप को उससे घटाता है। अधिक विवरण के लिए प्रोटोटाइप का स्रोत कोड देखें।
मैं btn1वेब पेज में मौजूद आईडी की एक तत्व मान रहा हूं , और यह भी कि jQuery शामिल है। इसने Chrome, FireFox, IE> = 9 और Edge के सभी आधुनिक ब्राउज़रों में काम किया है। jQuery का उपयोग केवल दस्तावेज़ के सापेक्ष स्थिति निर्धारित करने के लिए किया जा रहा है।
var screenRelativeTop = $("#btn1").offset().top - (window.scrollY ||
window.pageYOffset || document.body.scrollTop);
var screenRelativeLeft = $("#btn1").offset().left - (window.scrollX ||
window.pageXOffset || document.body.scrollLeft);
कभी-कभी getBoundingClientRect()ऑब्जेक्ट का गुण मान IE के लिए 0 दिखाता है। उस स्थिति में आपको सेट करना होगाdisplay = 'block' तत्व के करना होगा। ऑफसेट प्राप्त करने के लिए आप सभी ब्राउज़र के लिए नीचे दिए गए कोड का उपयोग कर सकते हैं।
JQuery कार्यक्षमता बढ़ाएँ:
(function($) {
jQuery.fn.weOffset = function () {
var de = document.documentElement;
$(this).css("display", "block");
var box = $(this).get(0).getBoundingClientRect();
var top = box.top + window.pageYOffset - de.clientTop;
var left = box.left + window.pageXOffset - de.clientLeft;
return { top: top, left: left };
};
}(jQuery));
उपयोग :
var elementOffset = $("#" + elementId).weOffset();