博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
原生js实现offset方法
阅读量:6230 次
发布时间:2019-06-22

本文共 2574 字,大约阅读时间需要 8 分钟。

在为 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);	}}// 执行offsetvar 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	};}// 执行offsetvar 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()的关系 这两个方法的区别与当前的 display 相关, 当 display=inline 时, .getClientRects() 返回当前节点内每一行文本的 ClientRect 对象数组, 此时数组长度等于文本行数。

当 display != inline 时, .getClientRects() 返回当前节点的 ClientRect 对象数组,此时数组长度为1.

.getBoundingClientRect() 总是返回当前节点的 ClientRect 对象, 注意这里是 ClientRect 对象而不是对象数组。

相关API

提示

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

以上代码是在进行jtool类库编码时实践出来的方式,欢迎

转载地址:http://ifena.baihongyu.com/

你可能感兴趣的文章
【行业翘楚】井田云:化解线上线下冲突让鱼与熊掌皆得
查看>>
System.currentTimeMillis();
查看>>
keil中的存储模式
查看>>
jQuery EasyUI API 中文文档 - Panel面板
查看>>
egrep 查找IP
查看>>
从子集和问题的动态规划解看判断问题与优化问题的区别与联系
查看>>
Effective C++:条款28:避免返回 handles 指向对象内部成员
查看>>
gulp-notify处理报错----gulp系列(二)
查看>>
浅谈OCR之Onenote 2010
查看>>
Android SDK打包
查看>>
yii url美化 urlManager组件
查看>>
数据库(表)的逻辑备份与恢复
查看>>
SQL SERVER 2005允许自定义聚合函数-表中字符串分组连接
查看>>
linux內核輸出soft lockup
查看>>
Android -- Annotation
查看>>
第3章 结构之法——重建二叉树
查看>>
struts2基本介绍
查看>>
celery最佳实践
查看>>
Ubuntu的LTS版本
查看>>
(剑指Offer)面试题51:数组中重复的数字
查看>>