以Vue + Element Dialog为例,用ResizeObserver
监听容器高度变化,当高度大于最大高度(出现滚动条),右边距减去滚动条的宽度,反之恢复正常边距
<el-dialog>
<div class="dialog_body" v-fix-scroll-bar="this">
<slot />
div>
el-dialog>
export default {
data() {
return {
resizeObserver: null,
}
},
methods: {
setScrollBar() {
this.resizeObserver = new ResizeObserver((entries) => {
for (let entry of entries) {
const cr = entry.contentRect;
const el_dialog_body = entry.target.parentNode;
const maxHeight = window.getComputedStyle(el_dialog_body).maxHeight;
if (maxHeight && cr.height > parseInt(maxHeight)) {
el_dialog_body.style.paddingRight = "20px";
} else {
el_dialog_body.style.paddingRight = "32px";
}
}
});
},
},
mounted() {
this.setScrollBar();
},
directives: {
fixScrollBar: {
inserted: (el, binding) => {
const _this = binding.value;
_this.resizeObserver.observe(el);
},
unbind: (el, binding) => {
const _this = binding.value;
_this.resizeObserver.unobserve(el);
},
},
},
}