আমি যেমন এক্স এবং HTML উপাদানের ওয়াই অবস্থান পেতে কিভাবে জানতে চাই img
এবং div
ব্রাউজার উইন্ডোতে জাভাস্ক্রিপ্ট আপেক্ষিক।
আমি যেমন এক্স এবং HTML উপাদানের ওয়াই অবস্থান পেতে কিভাবে জানতে চাই img
এবং div
ব্রাউজার উইন্ডোতে জাভাস্ক্রিপ্ট আপেক্ষিক।
উত্তর:
সঠিক পদ্ধতির ব্যবহার হল element.getBoundingClientRect()
:
var rect = element.getBoundingClientRect();
console.log(rect.top, rect.right, rect.bottom, rect.left);
ইন্টারনেট এক্সপ্লোরার থেকে যতদিন না পর্যন্ত আপনি সম্ভবত যেমন যত্নশীল এই সমর্থন করে এবং এটি পরিশেষে মধ্যে নির্দিষ্ট করা হয় CSSOM দেখেছে । অন্যান্য সমস্ত ব্রাউজারগুলি এটি দীর্ঘকাল আগে গ্রহণ করেছিল ।
কিছু ব্রাউজার উচ্চতা এবং প্রস্থের বৈশিষ্ট্যও ফেরত দেয়, যদিও এটি মানক নয়। আপনি যদি পুরানো ব্রাউজারের সামঞ্জস্যতা সম্পর্কে উদ্বিগ্ন হন তবে একটি অনুকূলিত অবনমিত প্রয়োগের জন্য এই উত্তরের সংশোধনগুলি পরীক্ষা করে দেখুন।
প্রদত্ত মানগুলি element.getBoundingClientRect()
ভিউপোর্টের সাথে সম্পর্কিত। অন্য উপাদানের তুলনায় আপনার যদি এটির প্রয়োজন হয় তবে কেবল একটি আয়তক্ষেত্রটি অন্য থেকে বিয়োগ করুন:
var bodyRect = document.body.getBoundingClientRect(),
elemRect = element.getBoundingClientRect(),
offset = elemRect.top - bodyRect.top;
alert('Element is ' + offset + ' vertical pixels from <body>');
<body>
যদিও মার্জিনটি সরিয়ে দেয় ।
element.getBoundingClientRect().top
position: fixed
আইওএস (আইফোন 8) এর কোনও উপাদানের ক্ষেত্রে সঠিক শীর্ষের অফসেটটি ফিরে আসে না যদি এতে কোনও ফোকাসযুক্ত ইনপুট উপাদান থাকে এবং ভার্চুয়াল কীবোর্ডটি স্লাইড হয়ে যায়। উদাহরণস্বরূপ, যদি উইন্ডোটির শীর্ষ থেকে আসল অফসেট 200px হয় তবে এটি 420px হিসাবে রিপোর্ট করবে, যেখানে 220px ভার্চুয়াল কীবোর্ডের উচ্চতা। যদি আপনি উপাদানটির সেট করে থাকেন position: absolute
এবং ঠিক স্থির হিসাবে একই অবস্থানে রাখেন তবে আপনি সঠিক 200px পাবেন। আমি এর কোনও সমাধান জানি না।
উপাদানগুলির জন্য সঠিক অফসেটগুলি পেতে গ্রন্থাগারগুলি কয়েকটি দৈর্ঘ্যে যায়।
এখানে একটি সাধারণ ফাংশন যা আমি চেষ্টা করেছি প্রতিটি পরিস্থিতিতে কাজ করে।
function getOffset( el ) {
var _x = 0;
var _y = 0;
while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {
_x += el.offsetLeft - el.scrollLeft;
_y += el.offsetTop - el.scrollTop;
el = el.offsetParent;
}
return { top: _y, left: _x };
}
var x = getOffset( document.getElementById('yourElId') ).left;
এটি আমার পক্ষে কাজ করেছে (সর্বোচ্চ ভোট দেওয়া উত্তর থেকে সংশোধিত):
function getOffset(el) {
const rect = el.getBoundingClientRect();
return {
left: rect.left + window.scrollX,
top: rect.top + window.scrollY
};
}
এটি ব্যবহার করে আমরা কল করতে পারি
getOffset(element).left
অথবা
getOffset(element).top
div
যার উপাদানটি সিএসএস ব্যবহার করে কেন্দ্রস্থলে স্থাপন করা হয় কেবল তখনই এই সমাধানটি আমার পক্ষে কার্যকর হয় top:50%, left:50%; transform:translate(-50%, -50%);
... দুর্দান্ত। @ স্কটবিগস প্রশ্নটির সাথে একমত হোন। যৌক্তিক হ'ল সরলতার সন্ধান করা।
rect
ব্যবহার var
, let
অথবা const
। অন্যথায়, এটি হিসাবে সংজ্ঞায়িত করা হয় window.rect
।
left: rect.left + window.scrollX + (rect.width / 2), top: rect.top + window.scrollY + (rect.height / 2)
একটি মৌলের মধ্যবর্তী অবস্থানটি ফিরিয়ে দেবে
আপনি যদি এটি কেবল জাভাস্ক্রিপ্টে করতে চান তবে এখানে কিছু জন লাইনার ব্যবহার করছেনgetBoundingClientRect()
window.scrollY + document.querySelector('#elementId').getBoundingClientRect().top // Y
window.scrollX + document.querySelector('#elementId').getBoundingClientRect().left // X
প্রথম লাইনটি offsetTop
ডকুমেন্টের তুলনায় ওয়াই বলবে return দ্বিতীয় লাইনটি offsetLeft
ডকুমেন্টের তুলনায় এক্স বলবে return
getBoundingClientRect()
একটি জাভাস্ক্রিপ্ট ফাংশন যা উইন্ডোটির ভিউপোর্টের সাথে সম্পর্কিত উপাদানটির অবস্থান ফেরত দেয়।
বেশিরভাগ ব্রাউজারে এইচটিএমএল উপাদানগুলির মধ্যে রয়েছে: -
offsetLeft
offsetTop
এগুলি বিন্যাসের নিকটতম পিতামাতার সাথে সম্পর্কিত উপাদানের অবস্থান নির্দিষ্ট করে। এই পিতামাতাকে প্রায়শই অফসেট পিতৃ সম্পত্তি হিসাবে অ্যাক্সেস করা যায়।
আইই এবং এফএফ 3 রয়েছে
clientLeft
clientTop
এই বৈশিষ্ট্যগুলি কম সাধারণ, তারা তার পিতামাতার ক্লায়েন্ট ক্ষেত্রের সাথে একটি উপাদান অবস্থান নির্দিষ্ট করে (প্যাডযুক্ত অঞ্চল ক্লায়েন্টের অংশ তবে সীমানা এবং মার্জিন নয়)।
যদি পৃষ্ঠাটি অন্তর্ভুক্ত থাকে - কমপক্ষে - কোনও "ডিআইভি", মেইউউ প্রদত্ত ফাংশনটি "ওয়াই" মানটিকে বর্তমান পৃষ্ঠার সীমা ছাড়িয়ে যায়। সঠিক অবস্থানটি সন্ধান করার জন্য আপনাকে অফসেট প্যারেন্টস এবং প্যারেন্টনোড উভয়ই পরিচালনা করতে হবে।
নীচে দেওয়া কোডটি ব্যবহার করে দেখুন (এটি এফএফ 2 এর জন্য পরীক্ষা করা হয়):
var getAbsPosition = function(el){
var el2 = el;
var curtop = 0;
var curleft = 0;
if (document.getElementById || document.all) {
do {
curleft += el.offsetLeft-el.scrollLeft;
curtop += el.offsetTop-el.scrollTop;
el = el.offsetParent;
el2 = el2.parentNode;
while (el2 != el) {
curleft -= el2.scrollLeft;
curtop -= el2.scrollTop;
el2 = el2.parentNode;
}
} while (el.offsetParent);
} else if (document.layers) {
curtop += el.y;
curleft += el.x;
}
return [curtop, curleft];
};
Element.prototype
যে কোনও উপাদানটির শীর্ষ / বাম পেতে আপনি দুটি বৈশিষ্ট্য যুক্ত করতে পারেন ।
Object.defineProperty( Element.prototype, 'documentOffsetTop', {
get: function () {
return this.offsetTop + ( this.offsetParent ? this.offsetParent.documentOffsetTop : 0 );
}
} );
Object.defineProperty( Element.prototype, 'documentOffsetLeft', {
get: function () {
return this.offsetLeft + ( this.offsetParent ? this.offsetParent.documentOffsetLeft : 0 );
}
} );
এটিকে এভাবে বলা হয়:
var x = document.getElementById( 'myDiv' ).documentOffsetLeft;
এখানে একটি ডেমো jQuery এর মধ্যে ফলাফল তুলনা নেই offset().top
এবং .left
: http://jsfiddle.net/ThinkingStiff/3G7EZ/
Element.prototype
করা সাধারণত একটি খারাপ ধারণা হিসাবে বিবেচিত হয় । এটি কোড বজায় রাখা সত্যিই কঠিন বাড়ে। এছাড়াও, এই কোডটি স্ক্রোলিংয়ের জন্য অ্যাকাউন্ট করে না।
পৃষ্ঠার তুলনায় দক্ষতার সাথে অবস্থান এবং পুনরাবৃত্ত ফাংশনটি ব্যবহার না করে পুনরুদ্ধার করতে: (আইআইও অন্তর্ভুক্ত রয়েছে)
var element = document.getElementById('elementId'); //replace elementId with your element's Id.
var rect = element.getBoundingClientRect();
var elementLeft,elementTop; //x and y
var scrollTop = document.documentElement.scrollTop?
document.documentElement.scrollTop:document.body.scrollTop;
var scrollLeft = document.documentElement.scrollLeft?
document.documentElement.scrollLeft:document.body.scrollLeft;
elementTop = rect.top+scrollTop;
elementLeft = rect.left+scrollLeft;
এটির মতো কীভাবে, উপাদানটির আইডি পাস করে এবং এটি বাম বা উপরে ফিরে আসে, আমরা সেগুলিও একত্রিত করতে পারি:
1) বাম খুঁজে
function findLeft(element) {
var rec = document.getElementById(element).getBoundingClientRect();
return rec.left + window.scrollX;
} //call it like findLeft('#header');
2) শীর্ষ সন্ধান করুন
function findTop(element) {
var rec = document.getElementById(element).getBoundingClientRect();
return rec.top + window.scrollY;
} //call it like findTop('#header');
বা 3) বাম এবং উপরে একসাথে সন্ধান করুন
function findTopLeft(element) {
var rec = document.getElementById(element).getBoundingClientRect();
return {top: rec.top + window.scrollY, left: rec.left + window.scrollX};
} //call it like findTopLeft('#header');
ব্রাউজার-ইন্ডিপেন্ডেন্ট ফ্যাশনে এই জাতীয় তথ্য (এবং আরও অনেক কিছু!) ফেরত দেওয়ার জন্য রয়েছে এমন জাভাস্ক্রিপ্ট ফ্রেমওয়ার্ক ব্যবহার করে আপনার আরও ভাল পরিবেশিত হতে পারে। এখানে কয়েকটি দেওয়া হল:
এই ফ্রেমওয়ার্কগুলির সাহায্যে আপনি এমন কিছু করতে পারেন:
$('id-of-img').top
চিত্রটির y- পিক্সেল স্থানাঙ্ক পেতে।
jQuery .offset () প্রথম উপাদানটির বর্তমান স্থানাঙ্কগুলি পাবে, বা নথির সাথে সম্পর্কিত, প্রতিটি উপাদানগুলির স্থানাঙ্কগুলি মিলবে elements
আমি @ মেউউয়ের উত্তর নিয়েছি, ক্লায়েন্ট লেফটে যুক্ত হয়েছে যা সীমান্তের জন্য অনুমতি দেয় এবং তারপরে তিনটি সংস্করণ তৈরি করেছে:
getAbsolveOffsetFromBody - @ meouw এর অনুরূপ, এটি নথির বডি বা এইচটিএমএল উপাদানটির সাথে সম্পর্কিত (পরস্পর মোডের উপর নির্ভর করে) পরম অবস্থান লাভ করে
getAbsolveOffsetFromGivenElement - প্রদত্ত উপাদানটির (আপেক্ষিকএল) তুলনায় নিখুঁত অবস্থান প্রদান করে। নোট করুন যে প্রদত্ত উপাদানটিতে অবশ্যই এল এলিম থাকতে হবে বা এটি getAbsolveOffsetFromBody এর মতো আচরণ করবে। যদি আপনার কাছে অন্য (জ্ঞাত) উপাদানগুলির মধ্যে দুটি উপাদান থাকে (বিকল্পভাবে নোড ট্রি পর্যন্ত কয়েকটি নোড) থাকে এবং সেগুলি একই অবস্থান তৈরি করতে চান তবে এটি কার্যকর।
getAbsolveOffsetFromRelative - পজিশন সহ প্রথম অভিভাবক উপাদানের তুলনায় নিখুঁত অবস্থান প্রদান করে: আপেক্ষিক। এটি একই কারণে getAbsolveOffsetFromGivenElement এর মতো তবে এটি কেবল প্রথম ম্যাচের উপাদান হিসাবে চলে যাবে।
getAbsoluteOffsetFromBody = function( el )
{ // finds the offset of el from the body or html element
var _x = 0;
var _y = 0;
while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) )
{
_x += el.offsetLeft - el.scrollLeft + el.clientLeft;
_y += el.offsetTop - el.scrollTop + el.clientTop;
el = el.offsetParent;
}
return { top: _y, left: _x };
}
getAbsoluteOffsetFromGivenElement = function( el, relativeEl )
{ // finds the offset of el from relativeEl
var _x = 0;
var _y = 0;
while( el && el != relativeEl && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) )
{
_x += el.offsetLeft - el.scrollLeft + el.clientLeft;
_y += el.offsetTop - el.scrollTop + el.clientTop;
el = el.offsetParent;
}
return { top: _y, left: _x };
}
getAbsoluteOffsetFromRelative = function( el )
{ // finds the offset of el from the first parent with position: relative
var _x = 0;
var _y = 0;
while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) )
{
_x += el.offsetLeft - el.scrollLeft + el.clientLeft;
_y += el.offsetTop - el.scrollTop + el.clientTop;
el = el.offsetParent;
if (el != null)
{
if (getComputedStyle !== 'undefined')
valString = getComputedStyle(el, null).getPropertyValue('position');
else
valString = el.currentStyle['position'];
if (valString === "relative")
el = null;
}
}
return { top: _y, left: _x };
}
আপনার যদি এখনও সমস্যা হয়, বিশেষত স্ক্রোলিং সম্পর্কিত, আপনি http://www.greywyvern.com/?post=331 দেখার চেষ্টা করতে পারেন - আমি getStyle এ প্রশ্নবোধক কোডের কমপক্ষে এক টুকরো লক্ষ্য করেছি যা অনুমান করা উচিত যে ব্রাউজারগুলি আচরণ করবে , কিন্তু বাকিটা মোটেও পরীক্ষা করে দেখিনি।
jQuery ব্যবহার করা হলে, মাত্রাগুলি প্লাগইনটি দুর্দান্ত এবং আপনাকে যা চান ঠিক তা নির্দিষ্ট করতে দেয়।
যেমন
আপেক্ষিক অবস্থান, নিখুঁত অবস্থান, প্যাডিং ছাড়াই নিখুঁত অবস্থান, প্যাডিং সহ ...
এটি চলতে থাকে, কেবল এটির বলে দিন যে আপনি এটির সাথে অনেক কিছু করতে পারেন।
এছাড়াও jQuery ব্যবহারের বোনাস হ'ল এটি হ'ল ফাইলের আকার এবং সহজ ব্যবহার, আপনি এটি পরে আর জাভাস্ক্রিপ্টে ফিরে যেতে পারবেন না।
এটি আমি তৈরি করতে সক্ষম হলাম সেরা কোড (jQuery এর অফসেট () এর বিপরীতে iframes হিসাবে কাজ করে)। দেখে মনে হচ্ছে ওয়েবকিটের কিছুটা আলাদা আচরণ রয়েছে।
মিউউয়ের মন্তব্যের ভিত্তিতে:
function getOffset( el ) {
var _x = 0;
var _y = 0;
while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {
_x += el.offsetLeft - el.scrollLeft;
_y += el.offsetTop - el.scrollTop;
// chrome/safari
if ($.browser.webkit) {
el = el.parentNode;
} else {
// firefox/IE
el = el.offsetParent;
}
}
return { top: _y, left: _x };
}
আপনি যদি jQuery ব্যবহার করেন তবে এটি একটি সহজ সমাধান হতে পারে:
<script>
var el = $("#element");
var position = el.position();
console.log( "left: " + position.left + ", top: " + position.top );
</script>
ছোট এবং ছোট মধ্যে পার্থক্য
function getPosition( el ) {
var x = 0;
var y = 0;
while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {
x += el.offsetLeft - el.scrollLeft;
y += el.offsetTop - el.scrollTop;
el = el.offsetParent;
}
return { top: y, left: x };
}
একটি উদাহরণ স্থানাঙ্ক দেখুন: http://javascript.info/tutorial/coordinates
<svg>
উপাদানগুলির উদাহরণস্বরূপ offsetLeft
, নেই offsetTop
, এবং offsetParent
বৈশিষ্ট্যগুলি।
DIV
বা IMG
না SVG
। "উদাহরণের স্থানাঙ্কগুলি দেখুন"? আপনি জানতে পারেন অবজেক্ট এসভিজি হ'ল পজিশন কল getOffsetRect , চেষ্টা করুন এবং অবজেক্টের কাজের উপর নির্ভরশীল।
আমি যে পরিচ্ছন্ন পদ্ধতির সন্ধান পেয়েছি তা হ'ল jQuery এর ব্যবহৃত কৌশলটির একটি সরলীকৃত সংস্করণ offset
। এটির সাথে শুরু হওয়া অন্যান্য উত্তরগুলির মতো getBoundingClientRect
; এরপরে এটি স্ক্রোল অবস্থানের জন্য অ্যাডজাস্ট করতে window
এবং documentElement
পাশাপাশি মার্জিনের মতো জিনিস body
(প্রায়শই ডিফল্ট) ব্যবহার করে।
var rect = el.getBoundingClientRect();
var docEl = document.documentElement;
var rectTop = rect.top + window.pageYOffset - docEl.clientTop;
var rectLeft = rect.left + window.pageXOffset - docEl.clientLeft;
যদিও এটি এতগুলি উত্তরের নীচে হারিয়ে যাওয়ার সম্ভাবনা রয়েছে, এখানে শীর্ষস্থানীয় সমাধানগুলি আমার পক্ষে কাজ করছে না।
যতদূর আমি বলতে পারলাম অন্য উত্তরগুলির মধ্যে কোনওটিই সহায়তা করবে না।
পরিস্থিতি :
একটি এইচটিএমএল 5 পৃষ্ঠায় আমার একটি মেনু ছিল যা শিরোনামের ভিতরে একটি এনএভি উপাদান ছিল (দ্য শিরোনামটি নয় তবে অন্য একটি উপাদানের শিরোনাম)।
আমি একবার নেভিগেশন শীর্ষে আটকে থাকতে চেয়েছিলাম যখন এটি ব্যবহারকারীর কাছে স্ক্রোল হয়ে যায় তবে এর আগে শিরোনামটি ছিল পরম অবস্থানযুক্ত (যাতে আমি এটি সামান্য কিছু দিয়ে ওভারলে করতে পারি)।
উপরের সমাধানগুলি কখনই পরিবর্তন ঘটাতে পারে নি কারণ। অফসেটটপ পরিবর্তিত হচ্ছিল না কারণ এটি একটি নিখুঁত অবস্থানযুক্ত উপাদান। অতিরিক্তভাবে .scrolTop বৈশিষ্ট্যটি ছিল শীর্ষ সর্বাধিক উপাদানগুলির শীর্ষস্থানীয় ... এটি 0 এবং সর্বদা 0 হবে to
এই দুটি (এবং getBoundingClientRect ফলাফলের সাথে একই) ব্যবহার করে আমি যে পরীক্ষা করেছি তা আমাকে বলবে না যে নেভিগেশন বারের শীর্ষটি কখনই দেখা পাতার শীর্ষে স্ক্রোল করে (আবার কনসোলে উল্লিখিত হিসাবে, তারা কেবল একই স্ক্রল করার সময় একই সংখ্যা থেকে গেছে) ঘটেছে)।
সমাধান
আমার জন্য সমাধানটি ব্যবহার করছিল
window.visualViewport.pageTop
পৃষ্ঠার শীর্ষস্থানীয় বৈশিষ্ট্যের মান পর্দার দৃশ্যমান বিভাগকে প্রতিফলিত করে, অতএব আমাকে ট্র্যাক করার অনুমতি দেয় যেখানে দেখা যায় এমন অঞ্চলগুলির সীমানার সাথে সম্পর্কিত কোনও উপাদান রয়েছে।
সম্ভবত অযৌক্তিকভাবে বলা বাহুল্য, যে কোনও সময় আমি স্ক্রোলিংয়ের সাথে মোকাবিলা করছি আমি আশা করি এই সমাধানটি স্ক্রোল হওয়া উপাদানগুলির গতিবেগের অগ্রগতিতে সাড়া দেওয়ার জন্য ব্যবহার করব।
আশা করি এটি অন্য কাউকে সাহায্য করবে।
গুরুত্বপূর্ণ দ্রষ্টব্য: এটি বর্তমানে ক্রোম এবং অপেরাতে কাজ করছে এবং স্পষ্টভাবে ফায়ারফক্সে (6-2018) কাজ করছে না বলে মনে হচ্ছে ... যতক্ষণ না ফায়ারফক্স ভিজ্যুয়ালভিউপোর্ট সমর্থন করে আমি এই পদ্ধতিটি ব্যবহার না করার প্রস্তাব দিই, (এবং আমি আশা করি তারা শীঘ্রই এটি করবে ... এটি অনেক কিছু করে বাকী তুলনায় আরও জ্ঞান)।
আপডেট:
এই সমাধান সম্পর্কিত একটি নোট।
যদিও আমি এখনও আবিষ্কার করেছি যা আমি সেই পরিস্থিতিতে খুব মূল্যবান বলে আবিষ্কার করেছি যে "... প্রোগ্রামগুলিতে স্ক্রোলড থাকা উপাদানগুলির গতিবেগে প্রোগ্রামিয়ালি সাড়া দেয়।" প্রযোজ্য। আমার যে সমস্যাটি ছিল তার আরও ভাল সমাধান হ'ল সিএসএস ব্যবহার করে অবস্থান নির্ধারণ করা : স্টিকিউপাদান উপর। স্টিকি ব্যবহার করে জাভাস্ক্রিপ্ট ব্যবহার না করে আপনি শীর্ষে থাকতে পারেন (দ্রষ্টব্য: এমন সময় রয়েছে যা উপাদানটিকে স্থির করে দেওয়ার মতো কার্যকরভাবে কাজ করবে না তবে বেশিরভাগ ব্যবহারের জন্য স্টিকি পদ্ধতির সম্ভাবনা আরও উন্নত হবে)
UPDATE01:
সুতরাং আমি বুঝতে পেরেছি ভিন্ন পৃষ্ঠার জন্য আমার একটি প্রয়োজনীয়তা ছিল যেখানে আমার একটি হালকা জটিল স্ক্রোলিং সেটআপ (প্যারালাক্স প্লাস উপাদানগুলি যা একটি বার্তার অংশ হিসাবে গত স্ক্রোল করে) কোনও উপাদানটির অবস্থান সনাক্ত করতে পারে। আমি সেই দৃশ্যে উপলব্ধি করেছিলাম যে কখন কোনও কাজ করতে হবে তা নির্ধারণ করতে নীচে আমি যে মূল্য ব্যবহার করেছি:
let bodyElement = document.getElementsByTagName('body')[0];
let elementToTrack = bodyElement.querySelector('.trackme');
trackedObjPos = elementToTrack.getBoundingClientRect().top;
if(trackedObjPos > 264)
{
bodyElement.style.cssText = '';
}
আশা করি এই উত্তরটি এখন আরও ব্যাপকভাবে কার্যকর হবে।
আমি এটি এটি করেছি তাই এটি পুরানো ব্রাউজারগুলির সাথে ক্রস-সামঞ্জস্যপূর্ণ ছিল।
// For really old browser's or incompatible ones
function getOffsetSum(elem) {
var top = 0,
left = 0,
bottom = 0,
right = 0
var width = elem.offsetWidth;
var height = elem.offsetHeight;
while (elem) {
top += elem.offsetTop;
left += elem.offsetLeft;
elem = elem.offsetParent;
}
right = left + width;
bottom = top + height;
return {
top: top,
left: left,
bottom: bottom,
right: right,
}
}
function getOffsetRect(elem) {
var box = elem.getBoundingClientRect();
var body = document.body;
var docElem = document.documentElement;
var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;
var clientTop = docElem.clientTop;
var clientLeft = docElem.clientLeft;
var top = box.top + scrollTop - clientTop;
var left = box.left + scrollLeft - clientLeft;
var bottom = top + (box.bottom - box.top);
var right = left + (box.right - box.left);
return {
top: Math.round(top),
left: Math.round(left),
bottom: Math.round(bottom),
right: Math.round(right),
}
}
function getOffset(elem) {
if (elem) {
if (elem.getBoundingClientRect) {
return getOffsetRect(elem);
} else { // old browser
return getOffsetSum(elem);
}
} else
return null;
}
এখানে জাভাস্ক্রিপ্টের স্থানাঙ্ক সম্পর্কে আরও জানুন: http://javascript.info/tutorial/coordinates
কোনও উপাদানটির মোট অফসেট পেতে, আপনি সমস্ত অভিভাবক অফসেটগুলি পুনরাবৃত্তভাবে যোগ করতে পারেন:
function getParentOffsets(el): number {
if (el.offsetParent) {
return el.offsetParent.offsetTop + getParentOffset(el.offsetParent);
} else {
return 0;
}
}
এই ইউটিলিটি ফাংশনটির সাথে একটি ডোম উপাদানটির মোট শীর্ষ অফসেটটি হ'ল:
el.offsetTop + getParentOffsets(el);
/**
*
* @param {HTMLElement} el
* @return {{top: number, left: number}}
*/
function getDocumentOffsetPosition(el) {
var position = {
top: el.offsetTop,
left: el.offsetLeft
};
if (el.offsetParent) {
var parentPosition = getDocumentOffsetPosition(el.offsetParent);
position.top += parentPosition.top;
position.left += parentPosition.left;
}
return position;
}
উত্তরের জন্য থিংকিংস্টিফকে ধন্যবাদ , এটি এটির অন্য একটি সংস্করণ।
কোনও টেবিল সারিতে কোন লিঙ্কটি ব্যবহারকারী ক্লিক করে তার উপর নির্ভর করে বুটস্ট্র্যাপ 2 মডেলের অবস্থান নির্ধারণ করতে আমি অ্যান্ডি ই এর সমাধানটি সফলভাবে ব্যবহার করেছি। পৃষ্ঠাটি কোনও টেপস্ট্রি 5 পৃষ্ঠা এবং নীচে জাভাস্ক্রিপ্টটি জাভা পৃষ্ঠা শ্রেণিতে আমদানি করা হয়েছে।
জাভাস্ক্রিপ্ট:
function setLinkPosition(clientId){
var bodyRect = document.body.getBoundingClientRect(),
elemRect = clientId.getBoundingClientRect(),
offset = elemRect.top - bodyRect.top;
offset = offset + 20;
$('#serviceLineModal').css("top", offset);
}
আমার মডেল কোড:
<div id="serviceLineModal" class="modal hide fade add-absolute-position" data-backdrop="static"
tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="top:50%;">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
<h3 id="myModalLabel">Modal header</h3>
</div>
<div class="modal-body">
<t:zone t:id="modalZone" id="modalZone">
<p>You selected service line number: ${serviceLineNumberSelected}</p>
</t:zone>
</div>
<div class="modal-footer">
<button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
<!-- <button class="btn btn-primary">Save changes</button> -->
</div>
লুপের লিঙ্ক:
<t:loop source="servicesToDisplay" value="service" encoder="encoder">
<tr style="border-right: 1px solid black;">
<td style="white-space:nowrap;" class="add-padding-left-and-right no-border">
<a t:type="eventLink" t:event="serviceLineNumberSelected" t:context="service.serviceLineNumber"
t:zone="pageZone" t:clientId="modalLink${service.serviceLineNumber}"
onmouseover="setLinkPosition(this);">
<i class="icon-chevron-down"></i> <!-- ${service.serviceLineNumber} -->
</a>
</td>
এবং পৃষ্ঠা শ্রেণিতে জাভা কোড:
void onServiceLineNumberSelected(String number){
checkForNullSession();
serviceLineNumberSelected = number;
addOpenServiceLineDialogCommand();
ajaxResponseRenderer.addRender(modalZone);
}
protected void addOpenServiceLineDialogCommand() {
ajaxResponseRenderer.addCallback(new JavaScriptCallback() {
@Override
public void run(JavaScriptSupport javascriptSupport) {
javascriptSupport.addScript("$('#serviceLineModal').modal('show');");
}
});
}
আশা করি এটি কাউকে সহায়তা করে, এই পোস্টটি সাহায্য করেছে।
অনেক গবেষণা এবং পরীক্ষার পরে এটি কাজ করে বলে মনে হচ্ছে
function getPosition(e) {
var isNotFirefox = (navigator.userAgent.toLowerCase().indexOf('firefox') == -1);
var x = 0, y = 0;
while (e) {
x += e.offsetLeft - e.scrollLeft + (isNotFirefox ? e.clientLeft : 0);
y += e.offsetTop - e.scrollTop + (isNotFirefox ? e.clientTop : 0);
e = e.offsetParent;
}
return { x: x + window.scrollX, y: y + window.scrollY };
}
ভেবেছিলাম আমি এটিকেও সেখানে ফেলে দেব।
আমি এটি পুরানো ব্রাউজারগুলিতে পরীক্ষা করতে সক্ষম হইনি, তবে এটি শীর্ষ 3 এর সর্বশেষে কাজ করে :) :)
Element.prototype.getOffsetTop = function() {
return ( this.parentElement )? this.offsetTop + this.parentElement.getOffsetTop(): this.offsetTop;
};
Element.prototype.getOffsetLeft = function() {
return ( this.parentElement )? this.offsetLeft + this.parentElement.getOffsetLeft(): this.offsetLeft;
};
Element.prototype.getOffset = function() {
return {'left':this.getOffsetLeft(),'top':this.getOffsetTop()};
};
যেহেতু বিভিন্ন ব্রাউজারগুলি বিভিন্ন উপায়ে সীমানা, প্যাডিং, মার্জিন এবং ইত্যাদি উপস্থাপন করছে। আপনি যথাযথ মাত্রায় যা চান প্রতিটি মূল উপাদানটিতে নির্দিষ্ট উপাদানের শীর্ষ এবং বাম অবস্থানগুলি পুনরুদ্ধার করতে আমি একটি সামান্য ফাংশন লিখেছিলাম:
function getTop(root, offset) {
var rootRect = root.getBoundingClientRect();
var offsetRect = offset.getBoundingClientRect();
return offsetRect.top - rootRect.top;
}
বাম অবস্থান পুনরুদ্ধারের জন্য আপনাকে অবশ্যই ফিরে যেতে হবে:
return offsetRect.left - rootRect.left;
বাম এবং শীর্ষের ক্ষেত্রে ডিভের অবস্থান পান
var elm = $('#div_id'); //get the div
var posY_top = elm.offset().top; //get the position from top
var posX_left = elm.offset().left; //get the position from left
el.offsetTop
এবং el.offsetLeft
(ওপি jQuery সম্পর্কে কিছুই বলে না ... আমি নিশ্চিত নই যে আপনার উত্তরটি কেন jQuery ব্যবহার করে ...)