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 相关文章推荐
xmlHTTP实例
Oct 24 Javascript
jQuery实现类似滑动门切换效果的层切换
Sep 23 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
Feb 21 Javascript
jQuery toggleClass应用实例(附效果图)
Apr 06 Javascript
AngularJS 模块详解及简单实例
Jul 28 Javascript
通过构造函数实例化对象的方法
Jun 28 Javascript
浅谈jquery fullpage 插件增加头部和版权的方法
Mar 20 jQuery
Vue中保存数据到磁盘文件的方法
Sep 06 Javascript
解决angularJS中input标签的ng-change事件无效问题
Sep 13 Javascript
微信小程序前端promise封装代码实例
Aug 24 Javascript
uni-app如何实现增量更新功能
Jan 03 Javascript
利用javaScript处理常用事件详解
Apr 14 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
做个自己站内搜索引擎
2006/10/09 PHP
用PHP读取超大文件的实例代码
2012/04/01 PHP
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
2014/06/12 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
同步异步动态引入js文件的几种方法总结
2016/09/23 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
Angular.JS通过指令操作DOM的方法
2017/05/10 Javascript
理解Angular的providers给Http添加默认headers
2017/07/04 Javascript
基于JQuery的Ajax方法使用详解
2017/08/16 jQuery
微信小程序实现之手势锁功能实例代码
2018/07/19 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
JavaScript解析JSON数据示例
2019/07/16 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
在Python中marshal对象序列化的相关知识
2015/07/01 Python
Python脚本暴力破解栅栏密码
2015/10/19 Python
python虚拟环境virtualenv的使用教程
2017/10/20 Python
python如何去除字符串中不想要的字符
2020/07/05 Python
使用pandas的box_plot去除异常值
2019/12/10 Python
浅谈如何使用python抓取网页中的动态数据实现
2020/08/17 Python
python实现马丁策略的实例详解
2021/01/15 Python
美国中西部家用医疗设备商店:Med Mart(轮椅、踏板车、升降机等)
2019/04/26 全球购物
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
世界排名第一的运动鞋市场:Flight Club
2020/01/03 全球购物
如何判断计算机可能已经中马
2013/03/22 面试题
平面设计师工作职责范文
2013/12/03 职场文书
学校春季防火方案
2014/06/08 职场文书
入党转正介绍人意见
2015/06/03 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书