DHTML 中的绝对定位


下面的东西显示了在复杂的情况下,
怎样最好地在一个Element的旁边显示某个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>
&nbsp;</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>
&nbsp;</td></tr>
</table>

<script language='jscript'>
//get the position of a element ( by the scroll offset )
function LostinetWebGetScrollPostion(e)
{
 var b=e.document.body;
 if(e==b)return {left:0,top:0};
 with(e.getBoundingClientRect())
 {
  return {left:b.scrollLeft+left,top:b.scrollTop+top};
 }
}
//get the position of a element ( by the client offset )
function 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};
 }
}
//get absolute or relative parent
function LostinetWebGetStandParent(e)
{
 for(var p=e.parentElement;p!=null;p=p.parentElement)
 {
  var sp=p.currentStyle.position;
  if(sp=='absolute'||sp=='relative')
   return p;
 }
 return e.document.body;
}
//calc the position of floate that relative to e
function LostinetWebCalcPosition(floate,e)
{
 var epos=LostinetWebGetScrollPostion(e);
 var spos=LostinetWebGetScrollPostion(LostinetWebGetStandParent(floate));
 var s=LostinetWebGetStandParent(floate);
 return {left:epos.left-spos.left-s.clientLeft,top:epos.top-spos.top-s.clientTop};
}
//get the best position to put the floate
function LostinetWebAdjustMirror(floate,e,pos)
{
 //c:Client,f:floate,e:e,p:floate's 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};
 
 //left<-->right
 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.left=empos.left*2-fmpos.left;
 
 //top<-->bottom
 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';
});
function 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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值