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 12 Javascript
jQuery1.6 类型判断实现代码
Sep 01 Javascript
优化Node.js Web应用运行速度的10个技巧
Sep 03 Javascript
javascript中的五种基本数据类型
Aug 26 Javascript
jQuery热气球动画半透明背景的后台登录界面代码分享
Aug 28 Javascript
阻止表单提交按钮多次提交的完美解决方法
May 16 Javascript
利用JS实现页面删除并重新排序功能
Dec 09 Javascript
js for循环倒序输出数组元素的实例
Mar 01 Javascript
node中间层实现文件上传功能
Jun 11 Javascript
微信小程序日历组件使用方法详解
Dec 29 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
Sep 25 Javascript
vue 自定义组件的写法与用法详解
Mar 04 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进行微信公众平台开发的示例
2015/08/21 PHP
javascript数组的扩展实现代码集合
2008/06/01 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
2017/02/22 Javascript
bootstrap日期控件问题(双日期、清空等问题解决)
2017/04/19 Javascript
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
python 快速排序代码
2009/11/23 Python
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
python3+PyQt5实现自定义流体混合窗口部件
2018/04/24 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
opencv resize图片为正方形尺寸的实现方法
2019/12/26 Python
python如何实现复制目录到指定目录
2020/02/13 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
Python 删除List元素的三种方法remove、pop、del
2020/11/16 Python
python模拟点击在ios中实现的实例讲解
2020/11/26 Python
pandas针对excel处理的实现
2021/01/15 Python
HTML5 常见面试题之PC端和移动端区别介绍
2018/01/22 HTML / CSS
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
生日宴会主持词
2014/03/20 职场文书
群众路线对照检查材料
2014/09/22 职场文书
2014年保密工作总结
2014/11/22 职场文书
出生公证书
2015/01/23 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
勇敢的心观后感
2015/06/09 职场文书
幼儿园中班班级总结
2015/08/10 职场文书
《语言的突破》读后感3篇
2019/12/12 职场文书
读《人生的智慧》有感:闲暇是人生的精华
2019/12/25 职场文书
python关于集合的知识案例详解
2021/05/30 Python
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL
Golang并发工具Singleflight
2022/05/06 Golang