DomRect
的结果会返回{top: 10, right: 20, bottom: 30, left: 10, width: 10}
类型的特殊对象(或显然为Object.keys
)
它的结构类似于ClientRect
不幸的是,这个对象的行为与其他对象不同。
例如,在其上使用var obj = {}
for (key in rect) {
obj[key] = rect[key]
}
会返回一个空数组(我认为因为{{1}}属性不是可枚举的
我发现了一种转换为普通对象的肮脏方式:
{{1}}
我的问题是,有更好的方法吗?
答案 0 :(得分:14)
让我们不要过于复杂化!
function getBoundingClientRect(element) {
const rect = element.getBoundingClientRect();
return {
top: rect.top,
right: rect.right,
bottom: rect.bottom,
left: rect.left,
width: rect.width,
height: rect.height,
x: rect.x,
y: rect.y
};
}
答案 1 :(得分:5)
如果您使用的是jQuery,则可以使用 extend 方法。
var obj = $.extend( {}, element.getBoundingClientRect());
答案 2 :(得分:2)
警告:非标准行为(在Firefox < 62中无效,包括ESR 60以及Chrome以外的其他浏览器)
var obj = el.getBoundingClientRect().toJSON();
答案 3 :(得分:1)
这是我可以忍受的东西:
const persistRect = JSON.parse(JSON.stringify(someElement.getBoundingClientRect()))
答案 4 :(得分:1)
功能性ES6变体:
const propValueSet = (prop) => (value) => (obj) => ({...obj, [prop]: value})
const toObj = keys => obj => keys.reduce((o, k) => propValueSet(k)(obj[k])(o), {})
const getBoundingClientRect = el => toObj(['top', 'right', 'bottom', 'left', 'width', 'height', 'x', 'y'])(el.getBoundingClientRect())