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

 更新时间:2010年06月23日 11:17:02   作者:  
你还在为offset,scroll,inner,client,screen,mouse发愁吗? 头都大了。而且各个浏览器方法还不太一样。所以往往很浪费我们的时间。 于是我产生了写一个方法用户 专门获取这样的数据。

介绍
解决各个浏览器下 获取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 阻止浏览器默认操作的实现代码

    Javascript 阻止浏览器默认操作的实现代码

    在浏览器事件中,会触发一些默认动作,比如:点击一个链接时,执行完捕获/冒泡动作后,会触发链接的默认事件:跳转到指定链接地址。
    2009-09-09
  • webpack文件打包错误异常

    webpack文件打包错误异常

    这篇文章主要介绍了webpack文件打包错误异常,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • bootstrap fileinput插件实现预览上传照片功能

    bootstrap fileinput插件实现预览上传照片功能

    这篇文章主要介绍了bootstrap fileinput插件实现预览上传照片功能,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-01-01
  • JS(JQuery)操作Array的相关方法介绍

    JS(JQuery)操作Array的相关方法介绍

    本篇文章主要是对JS(JQuery)操作Array的相关方法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-02-02
  • uni-app调取接口的3种方式以及封装uni.request()详解

    uni-app调取接口的3种方式以及封装uni.request()详解

    我们在实际工作中要将数据传输到服务器端,从服务器端获取信息,都是通过接口的形式,下面这篇文章主要给大家介绍了关于uni-app调取接口的3种方式以及封装uni.request()的相关资料,需要的朋友可以参考下
    2022-08-08
  • Jupyter Notebook运行JavaScript的方法

    Jupyter Notebook运行JavaScript的方法

    Jupyter Notebook是一块所见即所得的画布,通过在浏览器上编辑代码,让开发人员实现展示与快速迭代的利器,本文主要介绍了Jupyter Notebook运行JavaScript的方法,感兴趣的可以了解一下
    2021-05-05
  • JavaScript提取元素中第一个子元素的实现方法

    JavaScript提取元素中第一个子元素的实现方法

    本文主要介绍了JavaScript提取元素中第一个子元素的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • JS实现鼠标移上去显示图片或微信二维码

    JS实现鼠标移上去显示图片或微信二维码

    本文给大家分享一段使用的js代码实现鼠标移入显示图片或微信二维码样式,代码简单易懂,非常不错,需要的朋友参考下吧
    2016-12-12
  • 如何让一个json文件显示在表格里【实现代码】

    如何让一个json文件显示在表格里【实现代码】

    如何让一个json文件显示在表格里?下面小编就为大家带来一篇让一个json文件显示在表格里的实现代码。希望对大家有所帮助。一起跟随小编过来看看吧,祝大家游戏愉快哦
    2016-05-05
  • js 数组实现一个类似ruby的迭代器

    js 数组实现一个类似ruby的迭代器

    今天突然发现js的数组处理起来真是麻烦,代码一些就是一大堆,相比起ruby的迭代器来真是逊色不少。
    2009-10-10

最新评论