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自动显示最后更新时间
Mar 15 Javascript
javascript+ajax实现产品页面加载信息
Jul 09 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
Oct 14 Javascript
微信小程序 Storage API实例详解
Oct 02 Javascript
javascript对浅拷贝和深拷贝的详解
Oct 14 Javascript
vue-cli3.0 特性解读
Apr 22 Javascript
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
Dec 05 jQuery
JavaScript基于面向对象实现的无缝滚动轮播示例
Jan 17 Javascript
node事件循环和process模块实例分析
Feb 14 Javascript
Vue使用预渲染代替SSR的方法
Jul 02 Javascript
如何通过JS实现日历简单算法
Oct 14 Javascript
小程序实现列表倒计时功能
Jan 29 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 stripslashes和addslashes的区别
2014/02/03 PHP
php将12小时制转换成24小时制的方法
2015/03/31 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
JQuery中$(document)是什么意思有什么作用
2014/07/21 Javascript
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
2015/08/10 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
微信小程序 教程之wxapp视图容器 scroll-view
2016/10/19 Javascript
Vue插件写、用详解(附demo)
2017/03/20 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
jquery+css实现简单的图片轮播效果
2017/08/07 jQuery
Vue 去除路径中的#号
2018/04/19 Javascript
解决layui 复选框等内置控件不显示的问题
2018/08/14 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
浅谈Vue.set实际上是什么
2019/10/17 Javascript
解决vue项目运行npm run serve报错的问题
2020/10/26 Javascript
HTML元素拖拽功能实现的完整实例
2020/12/04 Javascript
python基础教程之lambda表达式使用方法
2014/02/12 Python
Python实现线程池代码分享
2015/06/21 Python
python 默认参数问题的陷阱
2016/02/29 Python
Python实现树的先序、中序、后序排序算法示例
2017/06/23 Python
python的exec、eval使用分析
2017/12/11 Python
python实现集中式的病毒扫描功能详解
2019/07/09 Python
Python爬虫学习之翻译小程序
2019/07/30 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
介绍一下linux的文件权限
2014/07/20 面试题
线程问题:wait()方法是定义在哪个类里面
2015/07/07 面试题
药品质量检测应届生求职信
2013/11/14 职场文书
小学生表扬稿范文
2015/05/05 职场文书
钢琴师观后感
2015/06/12 职场文书