මම වැනි HTML අංග X හා Y තත්ත්වය ලබා ගැනීමට ආකාරය දැන ගැනීමට අවශ්ය img
සහ div
බ්රවුසරය ඇති වින්ඩෝව සාපේක්ෂව JavaScript දී.
මම වැනි HTML අංග X හා Y තත්ත්වය ලබා ගැනීමට ආකාරය දැන ගැනීමට අවශ්ය img
සහ div
බ්රවුසරය ඇති වින්ඩෝව සාපේක්ෂව JavaScript දී.
Answers:
නිවැරදි ප්රවේශය භාවිතා කිරීම 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
iOS (iPhone 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
Css භාවිතා කර කේන්ද්රගත කර ඇති මූලද්රව්යය තැන්පත් කළ විට මෙම විසඳුම මා වෙනුවෙන් වැඩ කරයි 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
ලේඛනයට සාපේක්ෂව Y යැයි කියනු ඇත. දෙවන පේළිය offsetLeft
ලේඛනයට සාපේක්ෂව X යැයි කියනු ඇත.
getBoundingClientRect()
javascript ශ්රිතයක් වන අතර එය කවුළුවේ දර්ශනපථයට සාපේක්ෂව මූලද්රව්යයේ පිහිටීම ලබා දෙයි.
බොහෝ බ්රව්සර්වල ඇති HTML අංග වලට පහත දේ ඇත: -
offsetLeft
offsetTop
පිරිසැලසුම ඇති එහි ආසන්නතම මවුපියන්ට සාපේක්ෂව මූලද්රව්යයේ පිහිටීම මේවා නියම කරයි. මෙම දෙමව්පියන්ට බොහෝ විට ඕෆ්සෙට් දෙමාපිය දේපල වෙත පිවිසිය හැකිය.
IE සහ FF3 ඇත
clientLeft
clientTop
මෙම ගුණාංග අඩු පොදු වන අතර, ඔවුන් එහි දෙමව්පියන්ගේ සේවාදායක ප්රදේශය සමඟ මූලද්රව්ය පිහිටීමක් නියම කරයි (පෑඩ් කළ ප්රදේශය සේවාදායකයාගේ ප්රදේශයේ කොටසක් වන නමුත් මායිම සහ ආන්තිකය නොවේ).
පිටුවට ඇතුළත් වන්නේ නම් - අවම වශයෙන්- ඕනෑම “ඩීඅයිවී” එකක් නම්, මීඕව් විසින් ලබා දෙන ශ්රිතය වත්මන් පිටු සීමාවන් ඉක්මවා “වයි” අගය විසි කරයි. නිශ්චිත ස්ථානය සොයා ගැනීම සඳහා, ඔබ ඕෆ්සෙට්පෙරන්ට් සහ මාපිය නෝඩ් යන දෙකම හැසිරවිය යුතුය.
පහත දැක්වෙන කේතය උත්සාහ කරන්න (එය FF2 සඳහා පරීක්ෂා කර ඇත):
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;
මෙහි ප්රති results ල jQuery offset().top
හා සසඳන නිරූපණයක් මෙන්න .left
: http://jsfiddle.net/ThinkingStiff/3G7EZ/
Element.prototype
කිරීම සාමාන්යයෙන් නරක අදහසක් ලෙස සැලකේ . එය කේතය නඩත්තු කිරීම ඇත්තෙන්ම දුෂ්කර ය. එසේම, මෙම කේතය අනුචලනය සඳහා ගණන් නොගනී.
පිටුවට සාපේක්ෂව පිහිටීම කාර්යක්ෂමව ලබා ගැනීම සඳහා සහ පුනරාවර්තන ශ්රිතයක් භාවිතා නොකර: (IE ද ඇතුළත් වේ)
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 () පළමු මූලද්රව්යයේ වත්මන් ඛණ්ඩාංක ලබා ගනී, නැතහොත් සෑම මූලද්රව්යයකම ඛණ්ඩාංක, ලේඛනයට සාපේක්ෂව ගැලපෙන මූලද්රව්ය කට්ටලයක සැකසෙනු ඇත.
මායිම් සඳහා ඉඩ ලබා දෙන ග්රාහක ලෙෆ්ට් එකට එකතු කර, පසුව අනුවාද තුනක් නිර්මාණය කර ඇත.
getAbsoluteOffsetFromBody - ou meouw ට සමාන, මෙය ලේඛනයේ ශරීරයට හෝ html මූලද්රව්යයට සාපේක්ෂව නිරපේක්ෂ පිහිටීම ලබා ගනී (quirks mode මත පදනම්ව)
getAbsoluteOffsetFromGivenElement - දී ඇති මූලද්රව්යයට (සාපේක්ෂ එල්) සාපේක්ෂව නිරපේක්ෂ පිහිටීම ලබා දෙයි. දී ඇති මූලද්රව්යයේ එල් මූලද්රව්යය අඩංගු විය යුතු බව සලකන්න, නැතහොත් මෙය getAbsoluteOffsetFromBody ලෙස ක්රියා කරයි. ඔබට වෙනත් (දන්නා) මූලද්රව්යයක් තුළ මූලද්රව්ය දෙකක් තිබේ නම් (විකල්පයක් ලෙස නෝඩ් ගස දක්වා ඇති නෝඩ් කිහිපයක්) සහ ඒවා එකම ස්ථානයක් බවට පත් කිරීමට අවශ්ය නම් මෙය ප්රයෝජනවත් වේ.
getAbsoluteOffsetFromRelative - පිහිටීම සහිත පළමු මව් මූලද්රව්යයට සාපේක්ෂව නිරපේක්ෂ පිහිටීම ලබා දෙයි: සාපේක්ෂ. මෙය getAbsoluteOffsetFromGivenElement හා සමාන වේ, එකම හේතුව නිසා නමුත් එය යන්නේ පළමු ගැලපෙන මූලද්රව්යය දක්වා පමණි.
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 භාවිතා කරන්නේ නම්, මෙය සරල විසඳුමක් විය හැකිය:
<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
. "උදාහරණ ඛණ්ඩාංක බලන්න" බලන්න? ඔබට වස්තුව සොයාගත හැකිය svg යනු ස්ථාන ඇමතුම getOffsetRect , උත්සාහ කර වස්තු වැඩ මත රඳා පවතී.
මම නිර්මාණය කිරීමට සමත් වූ හොඳම කේතය මෙයයි (jQuery හි ඕෆ්සෙට් () මෙන් නොව අයිෆ්රේම් වලද ක්රියා කරයි). වෙබ්කිට් වල වෙනස් හැසිරීමක් ඇති බව පෙනේ.
මීව්ගේ ප්රකාශය මත පදනම්ව:
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 හි භාවිතා කරන තාක්ෂණයේ සරල කළ අනුවාදයකි 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;
බොහෝ පිළිතුරු වල පතුලේ මෙය නැති වීමට බොහෝ දුරට ඉඩ ඇති නමුත්, මෙහි ඉහළම විසඳුම් මා වෙනුවෙන් ක්රියා නොකරයි.
මට කිව හැකි තාක් දුරට වෙනත් කිසිදු පිළිතුරක් උදව් නොවනු ඇත.
තත්වය :
HTML5 පිටුවක මා සතුව මෙනුවක් තිබී ඇත, එය ශීර්ෂයක් තුළ nav අංගයක් විය (ශීර්ෂකය නොව වෙනත් මූලද්රව්යයක ශීර්ෂකය).
පරිශීලකයෙකු අනුචලනය කළ පසු සංචලනය ඉහළට ඇලී සිටීමට මට අවශ්ය විය, නමුත් මෙයට පෙර ශීර්ෂකය නිරපේක්ෂව ස්ථානගත කර ඇත (එබැවින් මට එය වෙනත් දෙයක් තරමක් උඩින් තැබිය හැකිය).
ඉහත විසඳුම් කිසි විටෙකත් වෙනසක් ඇති කළේ නැත .ඔෆ්සෙට් ටොප් වෙනස් නොවන නිසා මෙය නිරපේක්ෂ ස්ථානගත මූලද්රව්යයකි. මීට අමතරව .scrollTop දේපල හුදෙක් ඉහළම මූලද්රව්යයේ ඉහළින්ම විය ... එනම් 0 යැයි පැවසීම සහ සෑම විටම 0 වනු ඇත.
මෙම දෙක භාවිතා කරමින් මා විසින් සිදු කරන ලද ඕනෑම පරීක්ෂණයක් (සහ getBoundingClientRect ප්රති results ල සමඟ සමාන වේ), සංචාලන තීරුවේ මුදුන කවදා හෝ නැරඹිය හැකි පිටුවේ ඉහළට අනුචලනය වී ඇත්දැයි මට නොකියනු ඇත (නැවතත්, කොන්සෝලයෙහි වාර්තා කර ඇති පරිදි, ඒවා අනුචලනය කිරීමේදී එකම සංඛ්යා වල රැඳී සිටියේය සිදුවිය).
විසඳුමක්
මට විසඳුම උපයෝගී කර ගැනීමයි
window.visualViewport.pageTop
පේජ් ටොප් දේපලෙහි වටිනාකම තිරයේ නැරඹිය හැකි කොටස පිළිබිඹු කරයි, එම නිසා නැරඹිය හැකි ප්රදේශයේ මායිම් වෙත යොමු වන මූලද්රව්යයක් කොතැනදැයි සොයා ගැනීමට මට ඉඩ දෙයි.
අනුචලනය කිරීම සමඟ කටයුතු කරන ඕනෑම වේලාවක අනුචලනය කිරීම අනවශ්යය, අනුචලනය වන මූලද්රව්යයන්ගේ චලනයට ක්රමලේඛව ප්රතිචාර දැක්වීමට මෙම විසඳුම භාවිතා කිරීමට මම බලාපොරොත්තු වෙමි.
එය වෙනත් කෙනෙකුට උපකාරී වේ යැයි සිතමි.
වැදගත් සටහන: මෙය ක්රෝම් සහ ඔපෙරා වල දැනට ක්රියාත්මක වන බව පෙනේ (නියත වශයෙන්ම ෆයර්ෆොක්ස් හි නොවේ (6-2018) ... ෆයර්ෆොක්ස් දෘශ්ය දර්ශන පෝර්ට් සඳහා සහය දක්වන තුරු මෙම ක්රමය භාවිතා නොකිරීමට මම නිර්දේශ කරමි, (ඔවුන් ඉක්මනින් එසේ කරනු ඇතැයි මම බලාපොරොත්තු වෙමි ... අනෙක් ඒවාට වඩා වැඩි හැඟීමක්).
යාවත්කාලීන කිරීම:
මෙම විසඳුම පිළිබඳ සටහනක් පමණි.
"... අනුචලනය වන මූලද්රව්යයන්ගේ චලනයට ක්රමලේඛිකව ප්රතිචාර දක්වන" තත්වයන් සඳහා මා සොයාගත් දේ ඉතා වටිනා බව මම තවමත් සොයාගෙන ඇත. අදාළ වේ. මට තිබූ ගැටලුවට වඩා හොඳ විසඳුම වූයේ සැකසීමට CSS භාවිතා කිරීමයි පිහිටීම : ඇලෙන සුළුයමූලද්රව්යය මත. ඇලෙන සුළු භාවිතයෙන් ඔබට ජාවාස්ක්රිප්ට් භාවිතා නොකර මූලද්රව්යයක් ඉහළින්ම තබා ගත හැකිය (සටහන: මෙය මූලද්රව්යය ස්ථාවර ලෙස වෙනස් කිරීම තරම්
effectively ලදායී ලෙස ක්රියා
නොකරනු ඇති නමුත් බොහෝ භාවිතයන් සඳහා ඇලෙන සුළු ප්රවේශය වඩා උසස් වනු ඇත)
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 පිටුවක් වන අතර පහත ජාවාස්ක්රිප්ට් ජාවා පිටු පන්තියට ආනයනය කෙරේ.
javascript:
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;
JS හි පේළි දෙකක් ලෙස මෙය පහසුය
var elem = document.getEmelentById("id");
alert(elem.getBoundingClientRect());
වමේ සහ ඉහළ කොටස සම්බන්ධයෙන් div හි පිහිටීම ලබා ගන්න
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
(OP jQuery ගැන කිසිවක් නොකියයි ... ඔබේ පිළිතුර jQuery භාවිතා කරන්නේ ඇයිදැයි මට විශ්වාස නැත ...)