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 相关文章推荐
javascript之卸载鼠标事件的代码
May 14 Javascript
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
Sep 15 Javascript
jquery多行滚动/向左或向上滚动/响应鼠标实现思路及代码
Jan 23 Javascript
JS中使用sort结合localeCompare实现中文排序实例
Jul 23 Javascript
AngularJS中的指令全面解析(必看)
May 20 Javascript
微信小程序(应用号)简单实例应用及实例详解
Sep 26 Javascript
详解jQuery uploadify文件上传插件的使用方法
Dec 16 Javascript
BACKBONE.JS 简单入门范例
Oct 17 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
Oct 26 jQuery
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
Nov 07 jQuery
基于Echarts图表在div动态切换时不显示的解决方式
Jul 20 Javascript
避坑之 JavaScript 中的toFixed()和正则表达式
Apr 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
php抓取页面与代码解析 推荐
2010/07/23 PHP
Linux环境下搭建php开发环境的操作步骤
2013/06/17 PHP
PHP实现更新中间关联表数据的两种方法
2014/09/01 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
PHP实现的简单sha1加密功能示例
2017/08/27 PHP
php双层循环(九九乘法表)
2017/10/23 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
js post方式传递提交的实现代码
2010/05/31 Javascript
基于jquery的动态创建表格的插件
2011/04/05 Javascript
使用js+jquery实现无限极联动
2013/05/23 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
Javascript removeChild()删除节点及删除子节点的方法
2015/12/27 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
es6学习笔记之Async函数的使用示例
2017/05/11 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
2017/12/26 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
2019/04/17 Javascript
python实现的系统实用log类实例
2015/06/30 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
python实现多线程端口扫描
2019/08/31 Python
python Zmail模块简介与使用示例
2020/12/19 Python
CSS3实现DIV圆角效果完整代码
2012/10/10 HTML / CSS
一篇文章带你学习CSS3图片边框
2020/11/04 HTML / CSS
详解HTML5中垂直上下居中的解决方案
2017/12/20 HTML / CSS
Html5嵌入钉钉的实现示例
2020/06/04 HTML / CSS
环境科学专业个人求职信
2013/09/26 职场文书
程序员岗位职责
2013/11/11 职场文书
石油大学毕业生自荐信
2014/01/28 职场文书
2014年自愿离婚协议书范本
2014/09/25 职场文书
见习报告怎么写
2014/10/31 职场文书
2014年仓库工作总结
2014/11/20 职场文书
员工试用期转正自我评价
2015/03/10 职场文书
小数乘法教学反思
2016/02/22 职场文书
python井字棋游戏实现人机对战
2022/04/28 Python
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python