`
SnailWong
  • 浏览: 179838 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

获取Html元素在页面中的绝对位置及问题

    博客分类:
  • web
阅读更多

 在Web开发中如果要想随心所欲的自由控制HTML元素,我们很多时候需要获得HTML元素在页面中的绝对位置(就是相对于浏览器的左上角坐标(0,0))。

   这个位置的获取其实并不难,由于每个Html元素提供了一组和位置相关的属性,他们是: offsetLeft、offsetTop和offsetParent,还有两个带offset叫offsetWidth和offsetHeight,不过这俩和我们要说的取Html元素绝对位置没有太大关系。

   属性offsetLeft和offsetTop就是Html元素相对于自己的offsetParent元素的位置,所以我们一般使用如下代码获得指定元素的绝对位置:

function GetAbsoluteLocation(element)
{
    
if ( arguments.length != 1 || element == null )
    {
        
return null;
    }
    
var offsetTop = element.offsetTop;
    
var offsetLeft = element.offsetLeft;
    
var offsetWidth = element.offsetWidth;
    
var offsetHeight = element.offsetHeight;
    
while( element = element.offsetParent )
    {
        offsetTop 
+= element.offsetTop;
        offsetLeft 
+= element.offsetLeft;
    }
    
return { absoluteTop: offsetTop, absoluteLeft: offsetLeft,
        offsetWidth: offsetWidth, offsetHeight: offsetHeight };
}

    这个代码及其类似代码其实是比较常见,可是使用它来计算复杂的页面布局却会有问题,有什么问题呢?这需要了解了Web页中的HTML元素的排版布局规则后,才能很好的理解。 

 

 

    上次在获取Html元素在页面中的绝对位置及问题(1)中说了获取页面元素绝对位置的方法,最后又说到那个方法是有问题的。为了理解这个问题,希望先看一下这两篇文章再看下面文(Web页中的HTML元素的排版布局规则用户定制Web页中元素的排版布局策略)。

    第二篇文章最后比较清楚的说明了,当我们的元素所处的viewport不是<body>的时候,其定位是从自己的viewport的(0,0)开始计算的。这个时候我们如果用获取...(1)中的办法去取绝对位置,将产生错误的定位效果@_@。所以为了避免出错我们需要找到被计算绝对位置的元素的viewport,然后把它的offsetTop和offsetLeft累计到其viewport的(0,0)处为止。

    当我们需要计算的元素的offsetPerent满足这个条件:elmt.style.position == 'absolute' || elmt.style.position == 'relative' || ( elmt.style.overflow != 'visible' && elmt.style.overflow != '' ),它将是一个viewport,也就是说会影响绝对定位的计算,我们应该在此停止offset的累加。

    更新过的方法叫GetAbsoluteLocationEx,代码附后:

function GetAbsoluteLocationEx(element)
{
    
if ( arguments.length != 1 || element == null )
    {
        
return null;
    }
    
var elmt = element;
    
var offsetTop = elmt.offsetTop;
    
var offsetLeft = elmt.offsetLeft;
    
var offsetWidth = elmt.offsetWidth;
    
var offsetHeight = elmt.offsetHeight;
    while( elmt = elmt.offsetParent )
    {
          // add this judge
        
if ( elmt.style.position == 'absolute' || elmt.style.position == 'relative' 
            
|| ( elmt.style.overflow != 'visible' && elmt.style.overflow != '' ) )
        {
            
break;
        } 
        offsetTop 
+= elmt.offsetTop;
        offsetLeft 
+= elmt.offsetLeft;
    }
    
return { absoluteTop: offsetTop, absoluteLeft: offsetLeft,
        offsetWidth: offsetWidth, offsetHeight: offsetHeight };
}

    如果offsetParent没有设置position和overflow属性,GetAbsoluteLocation和GetAbsoluteLocationEx的计算结果完全相同的,也就是说GetAbsoluteLocationEx向下兼容GetAbsoluteLocation。

     The End.

分享到:
评论
1 楼 yql1986 2010-01-30  

太感谢了,最近再用AJAX显示提示信息,就是层定位搞不清楚,看了之后大有收获

相关推荐

    HTML5与CSS3基础教程(第8版)高清文字

    5.5 在页面中插入图像 103 5.6 提供替代文本 105 5.7 指定图像尺寸 106 5.8 在浏览器中改变图像的尺寸 108 5.9 在图像编辑器中改变图像的尺寸 110 5.10 为网站添加图标 111 第6章 链接 113 6.1...

    从入门到精通HTML5——PDF——网盘链接

     14.3 增加的页面元素 269  14.3.1 新增的figure元素 270  14.3.2 新增的details元素 271  14.3.3 新增的mark元素 272  14.3.4 新增的progress元素 274  14.3.5 新增的meter元素 275  14.3.6 改良的ol列表 ...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    目前市场业务中在产品以及其他项目的认证和检测方面存在诸多不便,用户需要实地考察并频繁与检测单位沟通,填写繁琐的纸质检测报告、当面送递样品,对于检测环节中存在的问题难以及时交互并处理。市场上相应的检测...

    XGet:XGet 是 Google Chrome 的浏览器扩展,可用于显示突出显示的页面元素的 XPath。 它模仿了 Chrome 的本地路径的内置“复制 XPath”功能,但也包括一个绝对路径,并会在可能的情况下尝试找到用于抓取数据的路径

    在具有项目列表的页面上,它还尝试确定可用于抓取所有相同类型元素的路径。 用法 安装 Chrome 扩展程序。 有关说明,请参阅 加载网页 突出显示感兴趣的数据 单击 XGet 图标 输出 本地路径:这模仿了可以通过在 ...

    HTML3D轮播切换图片源码附注释.rar

    源码使用CSS属性+原生js代码...js方面使用原生js代码获取页面图片容器元素、设置图片拖拽旋转角度、动态创建盒子元素、绑定鼠标按下、移动、抬起、元素缩放的监听事件。源码关键处附有详细注释说明适合初学者学习参考

    超实用的jQuery代码段

    1.19 获取鼠标在窗口页面中的坐标 1.20 设置Flash对象的WMode窗口模式 1.21 实现类Twitter的字数限制效果 1.22 提示文本的隐藏与显示 1.23 实现文字闪烁效果 1.24 实现文字动画效果 1.25 实现文字跟随鼠标移动变化的...

    css入门笔记

    独立于任何网页位置处,声明一个样式文件(.css为后缀),在文件中声明样式,在使用的网页中引入.css文件。 使用步骤: 1.创建样式表文件(.css) 2.在样式文件中编写样式规则 3.在网页中对样式文件进行引入 &lt...

    java面试宝典

    150、如何在JSP中包括绝对路径文件? 使用URLConnection即可。 37 151、在servlets和JSP之间能共享session对象吗? 37 152、如何设置cookie在某一时间后过期? 37 153、如何获得当前的sessions数? 37 154、能设置...

    html中的绝对路径URL和相对路径URL及子目录、父目录、根目录

    绝对URL用于表示Internet中特定文件所需要的全部内容,Internet中的每一个文件都有一个唯一的URL,这就是在网页中搜索时需要输入到地址栏的连接。 例如,要进入百度一下的网页,则在网页地址栏中输入:...

    dtl:从设计到布局。 在Figma中进行设计,并将其导出为您选择的框架的布局。 或HTML

    从设计到版面这是一个正在进行中的Figma插件,可用于获取页面并将该页面中的顶级框架转换为布局。 这些布局可以是HTML页面,应用程序中的视图,文档中的页面以及许多其他内容。 该插件生成一个中间表示形式,可以...

    使用jQuery内容过滤选择器选择元素实例讲解

    – 内容过滤选择器:根据元素中的文字内容或所包含的子元素特征获取元素,其文字内容可以模糊或绝对匹配进行元素定位 jQuery选择器详解 根据所获取页面中元素的不同,可以将jQuery选择器分为:基本选择器、层次选择...

    java源码包2

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    《程序天下:JavaScript实例自学手册》光盘源码

    21.7 使用DOM获取页面中某控件的属性 21.8 将某行排在表格的最后 21.9 动态删除页面中的元素 21.10 克隆表格 21.11 拖动表格行改变顺序 21.12 表格操作常用方法 第22章 流行应用:AJAX和Property的应用技巧 22.1 ...

    程序天下:JavaScript实例自学手册

    21.7 使用DOM获取页面中某控件的属性 21.8 将某行排在表格的最后 21.9 动态删除页面中的元素 21.10 克隆表格 21.11 拖动表格行改变顺序 21.12 表格操作常用方法 第22章 流行应用:AJAX和Property的应用技巧 22.1 ...

    大名鼎鼎SWFUpload- Flash+JS 上传

    什么是SWFUpload?  SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合Flash与JavaScript技术为WEB开发者提供了一个具有丰富...SWFpload必须在页面中初始化,一般可以在window.onload事件中...

    PHP程序开发范例宝典III

    让你短时间内由一名菜鸟到高手绝对没问题! 由于权限有限,分3部份下载 PHP程序开发范例宝典 内容提要 《PHP程序开发范例宝典》全面介绍了应用PHP进行网站开发的各种技术和技巧。《PHP程序开发范例宝典》分为20章...

    cms后台管理

    将解压后得到的jeecms-3.0.2-final文件夹下的root文件夹更名为jeecms拷贝到tomcat 安装目录下的webapps 文件夹下(例如: D:\Tomcat 6.0\webapps\),启动tomcat,在地址栏中输入http://localhost:8080/jeecms, 您...

    LHGDialog V3.5.2 正式版 lhgDialog弹出窗口组件 lhgdialog V3.5.2

    id:窗口的id号参数值:默认lhgdlgId,自定义对话框ID属性,要保证在页面中是唯一的,不能和页面中任何元素的id相同。 注意:如果页面中只有一个弹出窗口此参数可以不写,但页面中如果有1个以上的弹出窗口则一定要...

Global site tag (gtag.js) - Google Analytics