DHTML_javascript 팁의 절대 위치 지정
May 16, 2016 pm 07:23 PM
dhtml
다음은
복잡한 상황에서 요소 옆에 DIV를 가장 잘 표시하는 방법을 보여줍니다.
물론 버튼이 창의 왼쪽/위/오른쪽/아래에 가까이 오도록 창을 스크롤하면서 메뉴의 팝업 위치를 관찰할 수도 있습니다.
모든 코드:
코드 복사 코드는 다음과 같습니다.
<table border=1 cellpadding=8 cellspacing=0>
<tr><td>table1</td><td>table1</td></tr>
<tr><td>table1</td><td>
<div id=div1 style='position:absolute;background-color:wheat;padding:4px;'>
div1 start
<div id=div1button style='border:outset 2px;background-color:threedface;color:red;font-weight:bold;cursor:hand;padding:4px;'>
ClickMe
</div>
div1 end
</div>
</td></tr>
</table>
<div style='height:100px'>-</div>
<table border=1 cellpadding=8 cellspacing=0>
<tr><td>table2</td><td>table2</td></tr>
<tr><td>table2</td><td>
<div id=div2 style='position:relative;left:24px;background-color:wheat;'>
div2 start
<div id=div2menu style='display:none;position:absolute;background-color:lightgrey;height:200px;width:120px;border:outset 1px;padding:4px'>
div2menu<br>
div2menu<br>
div2menu<br>
div2menu<br>
div2menu<br>
</div>
div2 end
</div>
</td></tr>
</테이블>
<script 언어='jscript'>
//요소의 위치 가져오기(스크롤 오프셋을 통해)
if(e==b)return {왼쪽:0,위:0};
with(e.getBoundingClientRect())
{
return {left:b.scrollLeft left,top:b.scrollTop top};
}
}
//요소의 위치 가져오기(클라이언트 오프셋으로)
함수 LostinetWebGetClientPosition(e)
{
var b=e.document.body;
if(e==b)return {left:-b.scrollLeft,top:-b.scrollTop};
with(e.getBoundingClientRect())
{
return {left:left-b.clientLeft,top:top-b.clientTop};
}
}
//절대 또는 상대 상위 가져오기
함수 LostinetWebGetStandParent(e)
{
for(var p=e.parentElement;p!=null;p=p .parentElement)
{
var sp=p.currentStyle.position;
if(sp=='absolute'||sp=='relative')
return p;
}
e.document.body를 반환합니다.
}
//calc e에 상대적인 floate의 위치
함수 LostinetWebCalcPosition(floate,e)
{
var epos=LostinetWebGetScrollPostion(e);
var spos=LostinetWebGetScrollPostion(LostinetWebGetStandParent(floate));
var s=LostinetWebGetStandParent(floate);
반환 {left:epos.left-spos.left-s.clientLeft,top:epos.top-spos.top-s.clientTop};
}
//floate를 배치할 수 있는 가장 좋은 위치를 얻습니다.
함수 LostinetWebAdjustMirror(floate,e,pos)
{
//c:Client,f:floate,e:e, p:floate의 StandParent,m:Mirror
var cw=e.document.body.clientWidth;
var ch=e.document.body.clientHeight;
var fw=floate.offsetWidth;
var fh=floate.offsetHeight;
var ew=e.offsetWidth;
var eh=e.offsetHeight;
var ecpos=LostinetWebGetClientPosition(e);
var empos={left:ecpos.left ew/2,top:ecpos.top eh/2};
var pcpos=LostinetWebGetClientPosition(LostinetWebGetStandParent(floate));
var fcpos=LostinetWebGetClientPosition(floate);
var fmpos={left:pcpos.left pos.left fw/2,top:pcpos.top pos.top fh/2};
//왼쪽<-->오른쪽
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)) )
fmpos. 왼쪽=empos.left*2-fmpos.left;
//topbottom
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)) )
fmpos. top=empos.top*2-fmpos.top;
pos.left=fmpos.left-pcpos.left-fw/2;
pos.top=fmpos.top-pcpos.top-fh/2;
}
document.attachEvent('onclick',function f()
{
if(div1button.contains(event.srcElement))return;
if(div2menu.contains(event. srcElement))return;
div2menu.runtimeStyle.display='none';
});
기능 div1button.onclick()
{
div2menu.runtimeStyle.display='block';
var pos=LostinetWebCalcPosition(div2menu,div1button);
pos.top =div1button.offsetHeight;
LostinetWebAdjustMirror(div2menu,div1button,pos);
div2menu.runtimeStyle.left=pos.left;
div2menu.runtimeStyle.top=pos.top;
}
</script>
<tr><td>table1</td><td>table1</td></tr>
<tr><td>table1</td><td>
<div id=div1 style='position:absolute;background-color:wheat;padding:4px;'>
div1 start
<div id=div1button style='border:outset 2px;background-color:threedface;color:red;font-weight:bold;cursor:hand;padding:4px;'>
ClickMe
</div>
div1 end
</div>
</td></tr>
</table>
<div style='height:100px'>-</div>
<table border=1 cellpadding=8 cellspacing=0>
<tr><td>table2</td><td>table2</td></tr>
<tr><td>table2</td><td>
<div id=div2 style='position:relative;left:24px;background-color:wheat;'>
div2 start
<div id=div2menu style='display:none;position:absolute;background-color:lightgrey;height:200px;width:120px;border:outset 1px;padding:4px'>
div2menu<br>
div2menu<br>
div2menu<br>
div2menu<br>
div2menu<br>
</div>
div2 end
</div>
</td></tr>
</테이블>
<script 언어='jscript'>
//요소의 위치 가져오기(스크롤 오프셋을 통해)
if(e==b)return {왼쪽:0,위:0};
with(e.getBoundingClientRect())
{
return {left:b.scrollLeft left,top:b.scrollTop top};
}
}
//요소의 위치 가져오기(클라이언트 오프셋으로)
함수 LostinetWebGetClientPosition(e)
{
var b=e.document.body;
if(e==b)return {left:-b.scrollLeft,top:-b.scrollTop};
with(e.getBoundingClientRect())
{
return {left:left-b.clientLeft,top:top-b.clientTop};
}
}
//절대 또는 상대 상위 가져오기
함수 LostinetWebGetStandParent(e)
{
for(var p=e.parentElement;p!=null;p=p .parentElement)
{
var sp=p.currentStyle.position;
if(sp=='absolute'||sp=='relative')
return p;
}
e.document.body를 반환합니다.
}
//calc e에 상대적인 floate의 위치
함수 LostinetWebCalcPosition(floate,e)
{
var epos=LostinetWebGetScrollPostion(e);
var spos=LostinetWebGetScrollPostion(LostinetWebGetStandParent(floate));
var s=LostinetWebGetStandParent(floate);
반환 {left:epos.left-spos.left-s.clientLeft,top:epos.top-spos.top-s.clientTop};
}
//floate를 배치할 수 있는 가장 좋은 위치를 얻습니다.
함수 LostinetWebAdjustMirror(floate,e,pos)
{
//c:Client,f:floate,e:e, p:floate의 StandParent,m:Mirror
var cw=e.document.body.clientWidth;
var ch=e.document.body.clientHeight;
var fw=floate.offsetWidth;
var fh=floate.offsetHeight;
var ew=e.offsetWidth;
var eh=e.offsetHeight;
var ecpos=LostinetWebGetClientPosition(e);
var empos={left:ecpos.left ew/2,top:ecpos.top eh/2};
var pcpos=LostinetWebGetClientPosition(LostinetWebGetStandParent(floate));
var fcpos=LostinetWebGetClientPosition(floate);
var fmpos={left:pcpos.left pos.left fw/2,top:pcpos.top pos.top fh/2};
//왼쪽<-->오른쪽
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)) )
fmpos. 왼쪽=empos.left*2-fmpos.left;
//topbottom
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)) )
fmpos. top=empos.top*2-fmpos.top;
pos.left=fmpos.left-pcpos.left-fw/2;
pos.top=fmpos.top-pcpos.top-fh/2;
}
document.attachEvent('onclick',function f()
{
if(div1button.contains(event.srcElement))return;
if(div2menu.contains(event. srcElement))return;
div2menu.runtimeStyle.display='none';
});
기능 div1button.onclick()
{
div2menu.runtimeStyle.display='block';
var pos=LostinetWebCalcPosition(div2menu,div1button);
pos.top =div1button.offsetHeight;
LostinetWebAdjustMirror(div2menu,div1button,pos);
div2menu.runtimeStyle.left=pos.left;
div2menu.runtimeStyle.top=pos.top;
}
</script>
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

인기 기사
Repo : 팀원을 부활시키는 방법
3 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
스플릿 소설을이기는 데 얼마나 걸립니까?
3 몇 주 전
By DDD
헬로 키티 아일랜드 어드벤처 : 거대한 씨앗을 얻는 방법
3 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌

인기 기사
Repo : 팀원을 부활시키는 방법
3 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
스플릿 소설을이기는 데 얼마나 걸립니까?
3 몇 주 전
By DDD
헬로 키티 아일랜드 어드벤처 : 거대한 씨앗을 얻는 방법
3 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 기사 태그

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제
Gmail 이메일의 로그인 입구는 어디에 있나요?
7287
9


자바 튜토리얼
1622
14


Cakephp 튜토리얼
1342
46


라라벨 튜토리얼
1259
25


PHP 튜토리얼
1206
29

