다음은 복잡한 상황에서 요소 옆에 DIV를 가장 잘 표시하는 방법을 보여줍니다. 물론 버튼이 창의 왼쪽/위/오른쪽/아래에 가까이 오도록 창을 스크롤하면서 메뉴의 팝업 위치를 관찰할 수도 있습니다. 모든 코드: 코드 복사 코드는 다음과 같습니다. table1table1 table1 div1 start ClickMe div1 end - table2table2 table2 div2 start div2menu div2menu div2menu div2menu div2menu div2 end 테이블> <br>//요소의 위치 가져오기(스크롤 오프셋을 통해) <br> if(e==b)return {왼쪽:0,위:0}; <br> with(e.getBoundingClientRect()) <br> { <br> return {left:b.scrollLeft left,top:b.scrollTop top}; <br> } <br>} <br>//요소의 위치 가져오기(클라이언트 오프셋으로) <br>함수 LostinetWebGetClientPosition(e) <br>{ <br> var b=e.document.body; <br> if(e==b)return {left:-b.scrollLeft,top:-b.scrollTop}; <br> with(e.getBoundingClientRect()) <br> { <br> return {left:left-b.clientLeft,top:top-b.clientTop}; <br> } <br>} <br>//절대 또는 상대 상위 가져오기 <br>함수 LostinetWebGetStandParent(e) <br>{ <br> for(var p=e.parentElement;p!=null;p=p .parentElement) <br> { <br> var sp=p.currentStyle.position; <br> if(sp=='absolute'||sp=='relative') <br> return p; <br> } <br> e.document.body를 반환합니다. <br>} <br>//calc e에 상대적인 floate의 위치 <br>함수 LostinetWebCalcPosition(floate,e) <br>{ <br> var epos=LostinetWebGetScrollPostion(e); <br> var spos=LostinetWebGetScrollPostion(LostinetWebGetStandParent(floate)); <br> var s=LostinetWebGetStandParent(floate); <br> 반환 {left:epos.left-spos.left-s.clientLeft,top:epos.top-spos.top-s.clientTop}; <br>} <br>//floate를 배치할 수 있는 가장 좋은 위치를 얻습니다. <br>함수 LostinetWebAdjustMirror(floate,e,pos) <br>{ <br> //c:Client,f:floate,e:e, p:floate의 StandParent,m:Mirror <br> var cw=e.document.body.clientWidth; <br> var ch=e.document.body.clientHeight; <br> var fw=floate.offsetWidth; <br> var fh=floate.offsetHeight; <br> var ew=e.offsetWidth; <br> var eh=e.offsetHeight; <br> var ecpos=LostinetWebGetClientPosition(e); <br> var empos={left:ecpos.left ew/2,top:ecpos.top eh/2}; <br> var pcpos=LostinetWebGetClientPosition(LostinetWebGetStandParent(floate)); <br> var fcpos=LostinetWebGetClientPosition(floate); <br> var fmpos={left:pcpos.left pos.left fw/2,top:pcpos.top pos.top fh/2}; <br> //왼쪽<-->오른쪽 <br> if( (fmpos.left<empos.left) ? ((fmpos.left-fw/2<0)&&((empos.left*2-fmpos. left) fw/2<=cw)) : ((fmpos.left fw/2>cw)&&((empos.left*2-fmpos.left)-fw/2>=0)) ) <br> fmpos. 왼쪽=empos.left*2-fmpos.left; <br> //topbottom <br> if( (fmpos.top<empos.top) ? ((fmpos.top-fh/2<0)&&((empos.top*2-fmpos. top) fh/2<=ch)) : ((fmpos.top fh/2>ch)&&((empos.top*2-fmpos.top)-fh/2>=0)) ) <br> fmpos. top=empos.top*2-fmpos.top; <br> pos.left=fmpos.left-pcpos.left-fw/2; <br> pos.top=fmpos.top-pcpos.top-fh/2; <br>} <br>document.attachEvent('onclick',function f() <br>{ <br> if(div1button.contains(event.srcElement))return; <br> if(div2menu.contains(event. srcElement))return; <br> div2menu.runtimeStyle.display='none'; <br>}); <br>기능 div1button.onclick() <br>{ <br> div2menu.runtimeStyle.display='block'; <br> var pos=LostinetWebCalcPosition(div2menu,div1button); <br> pos.top =div1button.offsetHeight; <br> LostinetWebAdjustMirror(div2menu,div1button,pos); <br> div2menu.runtimeStyle.left=pos.left; <br> div2menu.runtimeStyle.top=pos.top; <br>} <br>