全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解原生js实现offset方法

在为 jTool 提供 offset (获取当前节点位置)方法时, 先后使用了两种方式进行实现, 现整理出来以作记录。

前后共使用了两种方式实现了该方法, 这里将这两种方法分别列出。

通过递归实现

function offset(element) {
  var offest = {
    top: 0,
    left: 0
  };

  var _position;

  getOffset(element, true);

  return offest;

  // 递归获取 offset, 可以考虑使用 getBoundingClientRect
  function getOffset(node, init) {
    // 非Element 终止递归
    if (node.nodeType !== 1) {
      return;
    }
    _position = window.getComputedStyle(node)['position'];

    // position=static: 继续递归父节点
    if (typeof(init) === 'undefined' && _position === 'static') {
      getOffset(node.parentNode);
      return;
    }
    offest.top = node.offsetTop + offest.top - node.scrollTop;
    offest.left = node.offsetLeft + offest.left - node.scrollLeft;

    // position = fixed: 获取值后退出递归
    if (_position === 'fixed') {
      return;
    }

    getOffset(node.parentNode);
  }
}

// 执行offset
var s_kw_wrap = document.querySelector('#s_kw_wrap');
offset(s_kw_wrap); // => Object {top: 181, left: 400}

通过ClientRect实现

function offset2(node) {
  var offest = {
    top: 0,
    left: 0
  };
  // 当前为IE11以下, 直接返回{top: 0, left: 0}
  if (!node.getClientRects().length) {
    return offest;
  }
  // 当前DOM节点的 display === 'node' 时, 直接返回{top: 0, left: 0}
  if (window.getComputedStyle(node)['display'] === 'none') {
    return offest;
  }
  // Element.getBoundingClientRect()方法返回元素的大小及其相对于视口的位置。
  // 返回值包含了一组用于描述边框的只读属性——left、top、right和bottom,单位为像素。除了 width 和 height 外的属性都是相对于视口的左上角位置而言的。
  // 返回如{top: 8, right: 1432, bottom: 548, left: 8, width: 1424…}
  offest = node.getBoundingClientRect();
  var docElement = node.ownerDocument.documentElement;
  return {
    top: offest.top + window.pageYOffset - docElement.clientTop,
    left: offest.left + window.pageXOffset - docElement.clientLeft
  };
}
// 执行offset
var s_kw_wrap = document.querySelector('#s_kw_wrap');
offset2(s_kw_wrap); // => Object {top: 181.296875, left: 399.5}

offset2() 函数中使用到了 .getClientRects() 与 .getBoundingClientRect() 方法,IE11 以下浏览器并不支持; 所以该种实现, 只适于现代浏览器。

.getClientRects()

返回值是 ClientRect 对象集合(与该元素相关的CSS边框),每个 ClientRect 对象包含一组描述该边框的只读属性——left、top、right 和 bottom,单位为像素,这些属性值是相对于视口的top-left的。

并包含 length 属性, IE11以下可以通过是否包含 length 来验证当前是否为IE11以上版现。

.getBoundingClientRect()

返回值包含了一组用于描述边框的只读属性——left、top、right 和 bottom,单位为像素。除了 width 和 height 外的属性都是相对于视口的左上角位置而言的。

.getBoundingClientRect() 与 .getClientRects()的关系

  1. 这两个方法的区别与当前的 display 相关, 当 display=inline 时, .getClientRects() 返回当前节点内每一行文本的 ClientRect 对象数组, 此时数组长度等于文本行数。
  2. 当 display != inline 时, .getClientRects() 返回当前节点的 ClientRect 对象数组,此时数组长度为1.
  3. .getBoundingClientRect() 总是返回当前节点的 ClientRect 对象, 注意这里是 ClientRect 对象而不是对象数组。

提示

以上测试, 可以通过在百度首页执行进行测试, document.querySelect('#s_kw_wrap') 所获取到的节点为百度首页输入框

希望对大家的学习有所帮助,也希望大家多多支持。


# 原生js  # offset  # js  # js中offset  # client  # scroll 三大元素知识点总结  # MySQL查询中LIMIT的大offset导致性能低下浅析  # JS中offset和匀速动画详解  # js获取元素的偏移量offset简单方法(必看)  # JavaScript中offsetWidth的bug及解决方法  # div的offsetLeft与style.left区别  # JavaScript中style.left与offsetLeft的使用及区别详解  # window.setInterval()方法的定义和用法及offsetLeft与style.left  # springboot中如何实现kafa指定offset消费  # 递归  # 相对于  # 都是  # 两种  # 返回值  # 可以通过  # 首页  # 使用了  # 包含了  # 这两个  # 这两种  # 大家多多  # 输入框  # 与该  # 进行测试  # 而不是  # 长度为  # 行数  # 该种  # 实现了 


相关文章: 昆明网站制作哪家好,昆明公租房申请网上登录入口?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  Bpmn 2.0的XML文件怎么画流程图  如何制作网站标识牌,动态网站如何制作(教程)?  定制建站哪家更专业可靠?推荐榜单揭晓  如何用y主机助手快速搭建网站?  h5网站制作工具有哪些,h5页面制作工具有哪些?  实例解析angularjs的filter过滤器  零服务器AI建站解决方案:快速部署与云端平台低成本实践  香港服务器部署网站为何提示未备案?  建站之星云端配置指南:模板选择与SEO优化一键生成  建站之星后台管理系统如何操作?  安徽网站建设与外贸建站服务专业定制方案  专业网站建设制作报价,网页设计制作要考什么证?  linux top下的 minerd 木马清除方法  建站之星安装模板失败:服务器环境不兼容?  如何快速生成橙子建站落地页链接?  如何在云虚拟主机上快速搭建个人网站?  网站制作壁纸教程视频,电脑壁纸网站?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  网站制作模板下载什么软件,ppt模板免费下载网站?  如何登录建站主机?访问步骤全解析  定制建站是什么?如何实现个性化需求?  如何做静态网页,sublimetext3.0制作静态网页?  建站之星在线客服如何快速接入解答?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  制作农业网站的软件,比较好的农业网站推荐一下?  如何用VPS主机快速搭建个人网站?  如何通过NAT技术实现内网高效建站?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  建站之星如何实现五合一智能建站与营销推广?  香港网站服务器数量如何影响SEO优化效果?  建站之星logo尺寸如何设置最合适?  如何用PHP快速搭建CMS系统?  javascript中对象的定义、使用以及对象和原型链操作小结  焦点电影公司作品,电影焦点结局是什么?  如何高效完成独享虚拟主机建站?  建站之星如何取消后台验证码生成?  如何高效生成建站之星成品网站源码?  如何通过IIS搭建网站并配置访问权限?  湖北网站制作公司有哪些,湖北清能集团官网?  网站网页制作专业公司,怎样制作自己的网页?  建站之星客服服务时间及联系方式如何?  如何用虚拟主机快速搭建网站?详细步骤解析  已有域名和空间如何搭建网站?  南京网站制作费用,南京远驱官方网站?  如何选择PHP开源工具快速搭建网站?  建站之星安装提示数据库无法连接如何解决?  香港服务器如何优化才能显著提升网站加载速度? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。