获取dom元素那些讨厌的位置封装代码


Posted in Javascript onJune 23, 2010

介绍
解决各个浏览器下 获取dom 元素的 位置
兼容性
ie 6 7 8 firefox 3.6 chrome 4.0 目前只测试了这几个浏览器
作者
Jelle · lu QQ:271412542 Email:idche@qq.com blogs:http://www.cnblogs.com/idche/
源码说明
jquery 源码给我很大帮助,也用到一个叫 布鲁斯 · 李 的同学的源码,当然更多资源来源于网络。
功能说明
// jelle(elem) 对象 elem传递对象ID 或者 dom对象 如果是窗口 传递 window 对象
//.offset() 返回当前对象相对浏览器的绝对位置 ,返回值 = {top:a,left:b};
//.inner() 返回当前对象可见区域 宽度与高度 ,返回值 = {wisth:a,left:b};
//.scroll() 返回当前对象被卷区top 和 left。 ,返回值 = {top:a,left:b};
//.offparent() 返回当前对象距离父节点的位置 top left。 ,返回值 = {top:a,left:b};
//.client() 返回当前对象的可用高度和宽度 ,返回值 = {width:a,height:b};
//.screen() 返回当前屏幕的可用高度和宽度 ,返回值 = {width:a,height:b};
//.mouse(event) 返回当前鼠标的x,y坐标,elem不为空返回相对elem的坐标 ,返回值 = {x:a,y:b};

例子
//例子: 返回一个ID 为 test 的div 的可见区域宽度 //jelle('test').inner().width //这里可以紧接后面直接下 width
基于jquery的源码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>无标题文档</title> 
<style type="text/css"> 
.jelle_box{ margin:10px; border:5px solid #000; padding:10px; overflow:scroll;} 
.o{height:100px;} 
.t{height:100px;} 
.h{height:100px;} 
#jieshao li{ white-space:pre;} 
#jieshao li li{ padding:0; margin:0;} 
</style> 
</head> 
<script type="text/javascript" src="jquery-1.4.2.js"></script> 
<body> 
<dl> 
<dt>介绍</dt> 
<dd>解决各个浏览器下 获取dom 元素的 位置</dd> 
<dd>兼容性</dd> 
<dd>ie 6 7 8 firefox 3.6 chrome 4.0 目前只测试了这几个浏览器 </dd> 
<dt>作者</dt> 
<dd>Jelle · lu QQ:271412542 Email:idche@qq.com blogs:http://www.cnblogs.com/idche/</dd> 
<dt>源码说明</dt> 
<dd>jquery 源码给我很大帮助,也用到一个叫 布鲁斯 · 李 的同学的源码,当然更多资源来源于网络。</dd> 
<dt>功能说明</dt> 
<dd> 
<ul id="jieshao"> 
<li>// jelle(elem) 对象 elem传递对象ID 或者 dom对象 如果是窗口 传递 window 对象</li> 
<li>//.offset() 返回当前对象相对浏览器的绝对位置 ,返回值 = {top:a,left:b};</li> 
<li>//.inner() 返回当前对象可见区域 宽度与高度 ,返回值 = {wisth:a,left:b};</li> 
<li>//.scroll() 返回当前对象被卷区top 和 left。 ,返回值 = {top:a,left:b};</li> 
<li>//.offparent() 返回当前对象距离父节点的位置 top left。 ,返回值 = {top:a,left:b};</li> 
<li>//.client() 返回当前对象的可用高度和宽度 ,返回值 = {width:a,height:b};</li> 
<li>//.screen() 返回当前屏幕的可用高度和宽度 ,返回值 = {width:a,height:b};</li> 
<li>//.mouse(event) 返回当前鼠标的x,y坐标,elem不为空返回相对elem的坐标 ,返回值 = {x:a,y:b}; 
</li> 
</ul> 
</dd> 
<dt>例子</dt> 
<dd>//例子: 返回一个ID 为 test 的div 的可见区域宽度 
//jelle('test').inner().width 
//这里可以紧接后面直接下 width</dd> 
</dl> 
<textarea id="jelle_code" style="width:300px; height:50px;">jelle('t').offset().top</textarea> 
<input type="button" value="运行代码" onclick="alert(eval(document.getElementById('jelle_code').value))" /> 
<div class="jelle_box o" id="o"> 
div.id=o 
<div class="jelle_box t" id="t"> 
div.id=t 
<br/> 
<br/> 
<div class="jelle_box h" id="h">div.id=h <br>OK 这里是一个测试的地方。他包含3个DIV嵌套<br/><br/><br/><br/></div><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> 
</div> 
<br/><br/><br/><br/> 
</div> 
<script type="text/javascript"> 
//****介绍 
//解决各个浏览器下 获取dom 元素的 位置 
//****兼容性 
// ie 6 7 8 firefox 3.6 chrome 4.0 目前只测试了这几个浏览器 
//*****作者 
// Jelle · lu QQ:271412542 Email:idche@qq.com blogs:http://www.cnblogs.com/idche/ 
//*****源码说明 
// jquery 源码给我很大帮助,当然更多资源来源于网络。 
//*****功能说明 
// jelle(elem) 对象 elem传递对象ID 或者 dom对象 如果是窗口 传递 window 对象 
//.offset() 返回当前对象相对浏览器的绝对位置 ,返回值 = {top:a,left:b}; 
//.inner() 返回当前对象可见区域 宽度与高度 ,返回值 = {wisth:a,left:b}; 
//.scroll() 返回当前对象被卷区top 和 left ,返回值 = {top:a,left:b}; 
//.offparent() 返回当前对象距离父节点的位置 top left ,返回值 = {top:a,left:b}; 
//.client() 返回当前对象的可用高度和宽度 ,返回值 = {width:a,height:b}; 
//.screen() 返回当前屏幕的可用高度和宽度 ,返回值 = {width:a,height:b}; 
//.mouse(event) 返回当前鼠标的x,y坐标 ,返回值 = {x:a,y:b}; 
//*****例子 
//例子: 返回一个ID 为 test 的div 的可见区域宽度 
//jelle('test').inner().width 
//这里可以紧接后面直接下 width 
var jelle=function(elem){ 
// sys 浏览器判断 
var sys=(function(){ 
var sys={},ua=navigator.userAgent.toLowerCase(); 
//sys.firefox= ua.match(/firefox\/([\d\.]+)/) || false; //后面没有用到所以注销掉 
sys.ie= ua.match(/msie\s([\d\.]+)/) || false; 
//sys.chrome= ua.match(/chrome\/([\d\.]+)/) || false; //后面没有用到所以注销掉 
return sys; 
})(), 
comStyle=function(obj){ 
return window.getComputedStyle ? window.getComputedStyle(obj, null) : obj.currentStyle; 
}, 
// elem 当前对象 window or other object 
elem= typeof elem === 'string' ? document.getElementById(elem) : 
elem === undefined ? window : elem, 
isie=/^6.0|7.0|8.0$/.test(sys.ie[1]),//是否IE 浏览器 
isie67=/^6.0|7.0$/.test(sys.ie[1]), 
db=document.body, 
dd=document.documentElement, 
_this={}; 
//对象距离浏览器对0 0点的距离 
_this.offset=function(o){ 
//感谢 糖粒子 告诉我这个方法 
//有了这个方法至少省略了 15行代码 
return (o?o:elem).getBoundingClientRect(); 
} 
//当前对象可见区域的宽 高 window 
_this.inner=function(){ 
var width,height; 
//not window object 
if ( elem !== window ) { 
var computedStyle=comStyle(elem); 
width=elem.offsetWidth; 
height=elem.offsetHeight; 
//isie=/^6.0|7.0|8.0$/.test(sys.ie[1]), 
if( isie ){ 
width-=parseInt(computedStyle.marginTop) || 0; 
height-=parseInt(computedStyle.marginLeft) || 0; 
}else{ 
width-=parseInt(computedStyle.paddingTop) || 0; 
height-=parseInt(computedStyle.paddingLeft) || 0; 
} 
} else{ 
// window 需要区分浏览器 
//isie=/^6.0|7.0|8.0$/.test(sys.ie[1]), 
if ( isie ){ 
width=dd.offsetWidth; 
height=dd.offsetHeight; 
}else{ 
//当前elem=window 
width=elem.innerWidth; 
height=elem.innerHeight; 
} 
} 
// 返回的数据格式{width:a,height:b} 
return {'width':width,'height':height}; 
} 
//获取对象滚动条卷去的距离 
_this.scroll=function(o){ 
var _elem = o ? o : elem,top,left; 
if( _elem === window){ 
top=db.scrollTop+dd.scrollTop; 
left=db.scrollLeft+dd.scrollLeft; 
}else{ 
top=_elem.scrollTop || 0; 
left=_elem.scrollLeft || 0; 
} 
return { 'top':top , 'left':left }; 
} 
//获取对象距离父节点的 位置 
_this.offparent=function(){ 
return {'top':_this.offset(elem).top - _this.offset(elem.parentNode).top, 
'left':_this.offset(elem).left - _this.offset(elem.parentNode).left 
}; 
} 
//当前对象的可用高度与宽度 
_this.client=function(){ 
return elem==window ? {'width':db.clientWidth,'height':db.clientHeight} : 
{'height':elem.scrollWidth,'height':elem.scrollHeight}; 
} 
//屏幕可用工作区宽度高度 
_this.screen=function(){ 
return {'width':window.screen.availWidth,'height':window.screen.availHeight,} 
} 
//获取当前鼠标的位置 
_this.mouse=function (e){//获取鼠标坐标 请传递evnet参数 
var e = window.event || e, 
p=(e.pageX || e.pageY)?{ x:e.pageX, y:e.pageY } : 
{ x:e.clientX + db.scrollLeft - db.clientLeft, y:e.clientY + db.scrollTop - db.clientTop }; 
return elem === window ? p : 
{x:p.y - _this.offset().top, y:p.x - _this.offset().left}; 
} 
return _this; 
} 
</script> 
</body> 
</html>
Javascript 相关文章推荐
jQuery实现点击标题输入详细信息
Apr 16 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
Aug 14 Javascript
jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
Aug 09 Javascript
jQuery实现的简单分页示例
Jun 01 Javascript
javascript正则表达式中分组详解
Jul 17 Javascript
js添加千分位的实现代码(超简单)
Aug 01 Javascript
微信小程序开发一键登录 获取session_key和openid实例
Nov 23 Javascript
js实现自动轮换选项卡
Jan 13 Javascript
javascript阻止事件冒泡和浏览器的默认行为
Jan 21 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
Jul 03 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
Jun 25 Javascript
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 Vue.js
jquery ajax 同步异步的执行示例代码
Jun 23 #Javascript
jquery tab插件制作实现代码
Jun 22 #Javascript
jquery多浏览器捕捉回车事件代码
Jun 22 #Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
Jun 21 #Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
Jun 21 #Javascript
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
Jun 21 #Javascript
js操作时间(年-月-日 时-分-秒 星期几)
Jun 20 #Javascript
You might like
PHP详解ASCII码对照表与字符转换
2011/12/05 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
js实现淡入淡出轮播切换功能
2017/01/13 Javascript
vue中element-ui表格缩略图悬浮放大功能的实例代码
2018/06/26 Javascript
Vue中的v-for指令不起效果的解决方法
2018/09/27 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
2020/07/22 Javascript
解决Antd 里面的select 选择框联动触发的问题
2020/10/24 Javascript
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
python查看zip包中文件及大小的方法
2015/07/09 Python
python爬虫入门教程--快速理解HTTP协议(一)
2017/05/25 Python
Python字符串格式化%s%d%f详解
2018/02/02 Python
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
python numpy数组中的复制知识解析
2020/02/03 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
2020/03/02 Python
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
网络工程系信息安全技术专业大学生求职信
2013/10/22 职场文书
《月迹》教学反思
2014/02/19 职场文书
美容院经理岗位职责
2014/04/03 职场文书
个人融资协议书
2014/10/02 职场文书
群众路线学习笔记范文
2014/11/06 职场文书
先进基层党组织事迹材料
2014/12/25 职场文书
慰问信格式
2015/02/14 职场文书
申请吧主发表的感言
2015/08/03 职场文书
大学生社会实践感想
2015/08/11 职场文书
情感电台广播稿
2015/08/18 职场文书
汽车销售合同文本
2019/08/08 职场文书
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis