Skip to content Skip to sidebar Skip to footer

How To Detect When The Div Element Width Change (not Window Resize) In Js?

I have a scenario, if div element width changes, i need to perform some functionality. So is there any way to detect that element width changes (not window resize). for Example, I

Solution 1:

You can use a MutationObserver. Consider the following example that will let you know when the <p> tag is resized manually or when you click the "Resize" button. Any attribute mutation will trigger the observer so you will need to filter by what you want.

const p = document.querySelector("p");
const button = document.querySelector("button");

const p$ = newMutationObserver((mutationList, observer) => {
  for (mutation of mutationList) {
    console.log(mutation);
  }
});

p$.observe(p, {
  attributes: true,
  childList: false,
  subtree: false
});

button.addEventListener("click", () => {
  p.style.width = "100px";
});
.wrapper {
  width: 400px;
}

.resizable {
  resize: both;
  overflow: scroll;
  border: 1px solid black;
}
<divclass="wrapper"><pclass="resizable">Hello</p><button>Resize</button></div>

Solution 2:

You could use a MutationObserver instance and look for any change of the style attribute

var element = document.getElementById('d');

var observer = newMutationObserver(function() {
   console.log("You changed the style") 
});


observer.observe(element, { attributeFilter: ['style'] });


setTimeout(()=>{
   element.style.width = '400px';
}, 2000)
#d {
   width: 300px;
   height: 300px;
   background: #9bc;
}
<divid="d"></div>

If you instead apply a class with the given width then listen to any change of the class in the attributeFilter.

Solution 3:

The perfect solution would be a ResizeObserver, but as of now, it has not-too-good cross-browser support.

However, it will work in the newest Chrome, FF, and some others:

const elem = document.querySelector('#sizeobserver')

newResizeObserver(console.log).observe(elem)
#sizeobserver {
   resize: both;
   overflow: hidden;
   border: 1px solid black;
}
<divid="sizeobserver">Resize me!</div>

To ignore height changes, you can check for the width property of the contentRect. Now only the width's changes get logged:

const elem = document.querySelector('#sizeobserver')
{ // <--Just to encapsulate prevWidthlet prevWidth
  newResizeObserver(changes => {
    for(const change of changes){
      if(change.contentRect.width === prevWidth) return
      prevWidth = change.contentRect.width//Code here:console.log(change)
    }
  }).observe(elem)
}
#sizeobserver {
   resize: both;
   overflow: hidden;
   border: 1px solid black;
}
<divid="sizeobserver">Resize me!</div>

Post a Comment for "How To Detect When The Div Element Width Change (not Window Resize) In Js?"