DHTML 中的绝对定位


Posted in Javascript onNovember 26, 2006

下面的东西显示了在复杂的情况下,
怎样最好地在一个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>  
 </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>  
</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> 
Javascript 相关文章推荐
为超链接加上disabled后的故事
Dec 10 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
Nov 19 Javascript
JavaScript判断IE版本型号
Jul 27 Javascript
JavaScript编程中的Promise使用大全
Jul 28 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
Aug 17 Javascript
详解angularjs popup-table 弹出框表格指令
Sep 20 Javascript
基于JS实现带动画效果的流程进度条
Jun 01 Javascript
vue 自定义指令自动获取文本框焦点的方法
Aug 25 Javascript
详解如何创建并发布一个 vue 组件
Nov 08 Javascript
Vue源码解析之Template转化为AST的实现方法
Dec 14 Javascript
vue开发环境配置跨域的方法步骤
Jan 16 Javascript
layui 实现表格某一列显示图标
Sep 19 Javascript
js验证表单第二部分
Nov 25 #Javascript
js验证表单大全
Nov 25 #Javascript
禁止刷新,回退的JS
Nov 25 #Javascript
用函数式编程技术编写优美的 JavaScript
Nov 25 #Javascript
通过JAVASCRIPT读取ASP设定的COOKIE
Nov 24 #Javascript
键盘控制事件应用教程大全
Nov 24 #Javascript
Javascript操纵Cookie实现购物车程序
Nov 23 #Javascript
You might like
PHP5/ZendEngine2的改进
2006/10/09 PHP
FCKeditor添加自定义按钮
2008/03/27 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
比较详细的关于javascript中void(0)的具体含义解释
2007/08/02 Javascript
js事件(Event)知识整理
2012/10/11 Javascript
Javascript图像处理思路及实现代码
2012/12/25 Javascript
自动最大化窗口的Javascript代码
2013/05/22 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
2013/11/18 Javascript
JavaScript中instanceof与typeof运算符的用法及区别详细解析
2013/11/19 Javascript
JavaScript定义类的几种方式总结
2014/01/06 Javascript
常见的jQuery选择器汇总
2014/11/24 Javascript
详解JS函数重载
2014/12/04 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
javascript数组定义的几种方法
2017/10/06 Javascript
详解vue移动端项目代码拆分记录
2019/03/15 Javascript
ES2020系列之空值合并运算符 '??'
2020/07/22 Javascript
vue实现图片按比例缩放问题操作
2020/08/11 Javascript
Python通用循环的构造方法实例分析
2018/12/19 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
在vscode中配置python环境过程解析
2019/09/28 Python
python 实现简单的计算器(gui界面)
2020/11/11 Python
在python中对于bool布尔值的取反操作
2020/12/11 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
HTML5 Canvas的事件处理介绍
2015/04/24 HTML / CSS
澳大利亚百货公司:David Jones
2018/02/08 全球购物
师范毕业生自荐信
2013/10/17 职场文书
购房协议书
2014/04/11 职场文书
关于教师节的广播稿
2014/09/10 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
国土资源局开展党的群众路线教育实践活动整改措施
2014/09/26 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
2016婚礼主持词开场白
2015/11/24 职场文书
小学数学教学反思范文
2016/02/16 职场文书
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android
Python加密与解密模块hashlib与hmac
2022/06/05 Python