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 相关文章推荐
认识延迟时间为0的setTimeout
May 16 Javascript
jquery移动点击的项目到列表最顶端的方法
Jun 24 Javascript
jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解
Sep 27 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
Jun 23 Javascript
bootstrap中使用google prettify让代码高亮的方法
Oct 21 Javascript
微信小程序 form组件详解
Oct 25 Javascript
Node连接mysql数据库方法介绍
Feb 07 Javascript
bootstrap响应式工具使用详解
Nov 29 Javascript
Vue实现搜索 和新闻列表功能简单范例
Mar 16 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
Jan 25 Javascript
vue-cli 3 全局过滤器的实例代码详解
Jun 03 Javascript
微信小程序bindtap事件与冒泡阻止详解
Aug 08 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正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
2016/03/14 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
用javascript实现给图片加链接
2007/08/15 Javascript
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
2013/12/13 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
jquery输入数字随机抽奖特效的简单实现代码
2016/06/10 Javascript
AngularJS基础 ng-model-options 指令简单示例
2016/08/02 Javascript
VueJS全面解析
2016/11/10 Javascript
深入理解js 中async 函数的含义和用法
2018/05/13 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
vue键盘事件点击事件加native操作
2020/07/27 Javascript
JavaScript编码小技巧分享
2020/09/17 Javascript
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
利用python求积分的实例
2019/07/03 Python
postman传递当前时间戳实例详解
2019/09/14 Python
python分别打包出32位和64位应用程序
2020/02/18 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
python获得命令行输入的参数的两种方式
2020/11/02 Python
Python读写锁实现实现代码解析
2020/11/28 Python
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
药店促销活动策划方案
2014/08/24 职场文书
组工干部对照检查材料
2014/08/25 职场文书
社区重阳节活动总结
2015/03/24 职场文书
2015迎新晚会开场白
2015/07/17 职场文书
初一数学教学反思
2016/02/17 职场文书
导游词之凤凰古城
2019/10/22 职场文书