zoukankan      html  css  js  c++  java
  • JS 获取元素的偏移量

    获取元素的偏移量

    获取父级节点

    curEle.parentNode

    document.parentNode -> null

    父级参照物

    offsetParent: 父级参照物

    在同一个平面中, 最外层的元素是里面所有元素的父级参照物(和HTML层级结构没有必然的联系)

    一般来说一个页面中所有的父级参照物都是body
    body的父级参照物是null

    使用position

    想要改变父级参照物需要通过positon定位来进行改变: absolute, relative, fixed 任意一个值都可以把父级参照物进行修改

    不能修改的有, static, inherit

    offSetTop/ offSetLeft

    offSetTop/ offSetLeft, 当前元素(外边框)距离其父级参照物的(内边框)偏移距离

    获取距离body的左偏移

    求出页面中任意一个元素(不管它的父级参照物是谁)距离body的左偏移

    • 首先加上自己本身的左偏移
    • 获取自己的父级参照物P, 把P的左边框和左偏移都加上
    • 基于当前的P再向上找父级参照物, 找到后依然是累加边框和其左偏移
    • 一直到父级参照物为null, 已经找到body了

    图示:

    代码

    offset: 等同于jQuery中的offset方法, 实现获取页面中任意一个元素, 距离body的偏移(包括左偏移和上偏移), 不管当前元素的父级参照物是谁

    function offset(curEle) {
          var totallLeft = null,
            totalTop = null,
            par = curEle.offsetParent;
          totallLeft += curEle.offsetLeft;
          totalTop += curEle.offsetTop;
          while (par) {
            totallLeft += par.clientLeft;
            totalTop += par.clientTop;
            totallLeft += par.offsetLeft;
            totalTop += par.offsetTop;
            par = par.offsetParent;
          }
          return {
            left: totallLeft,
            top: totalTop,
          };
        }
    
    兼容

    在标准的IE8浏览器中, 我们使用offsetLeft/ offsetTop, 其实是把父级参照物的边框已经算在内了, 所以我们不需要自己再单独的加边框了

    以下是兼容IE8浏览器的代码
     function offset(curEle) {
          var totallLeft = null,
            totalTop = null,
            par = curEle.offsetParent;
          totallLeft += curEle.offsetLeft;
          totalTop += curEle.offsetTop;
          while (par) {
            if (navigator.userAgent.indexOf("MSIE 8.0") === -1) {
              //不是标准的IE8浏览器, 我们才累加边框
              totallLeft += par.clientLeft;
              totalTop += par.clientTop;
            }
            totallLeft += par.offsetLeft;
            totalTop += par.offsetTop;
            par = par.offsetParent;
          }
          return {
            left: totallLeft,
            top: totalTop,
          };
        }
    
  • 相关阅读:
    Core3.0部署后访问接口提示500.30
    Core3.0返回的Json数据大小写格式问题
    linux内核分析之fork()
    【转】【机器人学:运动规划】OMPL开源运动规划库的安装和demo
    【转】毫米波雷达和激光雷达的对比
    [转]开发者需要的 9 款代码比较工具
    [转]关于特征点法、直接法、光流法slam的对比
    [转]【视觉 SLAM-2】 视觉SLAM- ORB 源码详解 2
    [转]ORB特征提取-----FAST角点检测
    [转]图像金字塔
  • 原文地址:https://www.cnblogs.com/xiaoxu-xmy/p/13661837.html
Copyright © 2011-2022 走看看