#demo {
width: 100px;
height: 200px;
background: yellow;
margin: 10px;
padding: 10px;
border: 2px solid blue;
}
hello
var div = document.getElementById('demo');
console.log(div.offsetHeight); // 224
console.log(div.clientHeight); // 220
可以看出
offsetHeight = height + padding * 2 + border * 2
clientHeight = height +padding * 2
可以看出来offsetHeight包括元素的内容+内边距+边框,而clientHeight的值等于元素的内容+内边框。
那我们怎么获取元素的本身高度呢?
1.直接利用style?
但是console.log(div.style.height) // ''
打印出来为空,这是因为style属性只能通过元素标签style属性里面的值来获取。
这里的div什么都没有,style也没有,当然输出为空了。
#demo {
width: 100px;
/*height: 200px;*/
background: yellow;
margin: 10px;
padding: 10px;
border: 2px solid blue;
}
hello
要是把内部样式表中的height注释掉,将高度添加到style中,
console.log(div.style.height) // 200px
这样就能完美的获取到高度了。
显然这样每次都添加到内联样式是不理想的,那有没有更好的办法呢?
2.getComputedStyle
getComputedStyle()方法获取的是最终应用在元素上的所有CSS属性对象(即使没有CSS代码,也会把八辈祖宗
给显示出来)
这样就不用麻烦的再去添加内联样式了。
另外,getConputedStyle是只读的,但是style是可读可写的,搭配他俩就可以动态设置元素高度。
只需要一行代码
window.getComputedStyle(div);
就可以获得一大堆属性值。
但是只想要某个属性值的话怎么办?让getPropertyValue(可以获得CSS样式申明对象的属性值)来帮忙。
console.log(window.getComputedStyle().getProperttValue('height')); //200px
成功获取元素高度。
怎么获取元素属性值的变化呢
ResizeObserver 允许我们观察DOM元素的内容矩形大小(宽度、高度)的变化,并做出相应的响应。它就像给元素添加 document.onresize() 或 window.resize() 事件(但在JavaScript中,只有 window 才有 resize 事件)。当元素改变大小而不调整视窗大小时,它是有用的。 下面描述一些调整观察者的行为:
当观察到的元素被插入或从DOM中删除时,观察将会触发
当观察到的元素 display 值为 none 时,观察都会触发
观察不会对未替换的内联元素(non-replaced inline element)触发
观察不会由CSS的 transform 触发
如果元素有显示,而且元素大小不是 0,0 ,观察将会触发
使用Resize Observe,只需要实例化一个新的ResizeObserve对象并传入一个回调函数,该函数接收观察到的条目
const myObserver = new ResizeObserver(entries => {
// 遍历条目,做一些事情
});
然后我们在实例化对象上调用observe并传入一个元素来观察
const someEl = document.querySelector('.some-element');
const someOtherEl = document.querySelector('.some-other-element');
myObserver.observe(someEl);
myObserver.observe(someOtherEl);
对于每个entry,我们都会得到一个包含contentRect和一个target属性的对象。
target是DOM元素本身,contentRect是具有以下属性的对象:width,height,
x,y,top,right,bottom和left。
contentRectde width和height值不包括padding。contentRect.top是元素顶部的padding
contentRect.left是元素左侧padding
比如要打印出被监听元素寸尺变化时width和height的值,可以像下面这样做:
const myObserver = new ResizeObserver(entries => {
entries.forEach(entry => {
console.log('width', entry.contentRect.width);
console.log('height', entry.contentRect.height);
});
});
const someEl = document.querySelector('.some-element');
myObserver.observe(someEl);