Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jquery - How to determine if a div changes its height or any css attribute?

I wanna know how to trigger an event when a div changes its height or any css attribute.

I have a div with id = mainContent. I want jquery to automatically trigger an event when it changes its height. I did something like this:

$("#mainContent").change('height', function() {     $("#separator").css('height', $("#mainContent").height()); }); 

I know its wrong.

Here's my whole code (I pasted all of it because I can't get into jsfiddle for some reason I don't know):

<html> <head> <style type="text/css"> html, body {  width: 100%;  height: 100%;  margin: 0;  padding: 0; }  #separator {  border-right: 1px solid black; } </style>  <script type="text/javascript" src="jquery1.6.4min.js"> </script> <script type="text/javascript"> $(document).ready(function() {  $("#separator").css('height', $("body").height()); });  $(function() {  $("#btnSample1").click(function() {   $("#mainContent").css('height', '400px');   $("#mainContent").css('width', '600px');   $("#mainContent").css('background-color', '#F0F0F0');  });   $("#btnSample2").click(function() {   $("#mainContent").css('height', '1600px');   $("#mainContent").css('width', '700px');   $("#mainContent").css('background-color', '#F0F0F0');       });   $("#mainContent").change('height', function() {   $("#separator").css('height', $("#mainContent").height());  }); }); </script> </head> <body> <table style="width: 100%;">  <tr>   <td valign="top" style="width: 19%;">     <table id="mainMenu">     <tr><td><input id="btnSample1" type="button" value="Sample 1"  /></td></tr>     <tr><td><input id="btnSample2" type="button" value="Sample 2"  /></td></tr>    </table>   </td>    <td valign="top" style="width: 1%;" >    <div id="separator"></div>    </td>    <td valign="top" style="width: 80%;">    <div id="mainContent"></div>   </td>  </tr> </table> </body> </html> 

I am trying to adjust the height of the div id=separator based on the height of mainContent whenever the height of mainContent changes.

PS: In this case I know I can use the button event to do this but I want the div to trigger the event when the height is changed. Please help. Thanks in advance.

like image 382
NinjaBoy Avatar asked Mar 09 '12 03:03

NinjaBoy


People also ask

How do you check if a div is resized?

In the mean time, you can use function like the following. Since, the majority of element size changes will come from the window resizing or from changing something in the DOM. You can listen to window resizing with the window's resize event and you can listen to DOM changes using MutationObserver .

How can get current height of div in jQuery?

Method 1: The height() method returns the first matched element's height, But the height(value) method sets all matched elements height. // Returns the height of the first matched element $(selector). height() // Set the height of the all matched elements $(selector). height(value);

What is innerHeight in jQuery?

jQuery innerHeight() Method The innerHeight() method returns the inner height of the FIRST matched element. As the image below illustrates, this method includes padding, but not border and margin. Related methods: width() - Sets or returns the width of an element. height() - Sets or returns the height of an element.

What determines Div height?

By default a div is a block element, it means its width will be 100% of its container width, and its height will expand to cover all of its children. In case its children has a larger width than the div 's container width, the div itself does not expand horizontally but its children spill outside its boundary instead.


2 Answers

First, There is no such css-changes event out of the box, but you can create one by your own, as onchange is for :input elements only. not for css changes.

There are two ways to track css changes.

  1. Examine the DOM element for css changes every x time(500 milliseconds in the example).
  2. Trigger an event when you change the element css.
  3. Use the DOMAttrModified mutation event. But it's deprecated, so I'll skip on it.

First way:

var $element = $("#elementId"); var lastHeight = $("#elementId").css('height'); function checkForChanges() {     if ($element.css('height') != lastHeight)     {         alert('xxx');         lastHeight = $element.css('height');      }      setTimeout(checkForChanges, 500); } 

Second way:

$('#mainContent').bind('heightChange', function(){         alert('xxx');     });   $("#btnSample1").click(function() {     $("#mainContent").css('height', '400px');     $("#mainContent").trigger('heightChange'); //<====     ... });     

If you control the css changes, the second option is a lot more elegant and efficient way of doing it.

Documentations:

  • bind: Description: Attach a handler to an event for the elements.
  • trigger: Description: Execute all handlers and behaviors attached to the matched elements for the given event type.
like image 72
gdoron is supporting Monica Avatar answered Sep 21 '22 22:09

gdoron is supporting Monica


Please don't use techniques described in other answers here. They are either not working with css3 animations size changes, floating layout changes or changes that don't come from jQuery land. You can use a resize-detector, a event-based approach, that doesn't waste your CPU time.

https://github.com/marcj/css-element-queries

It contains a ResizeSensor class you can use for that purpose.

new ResizeSensor(jQuery('#mainContent'), function(){      console.log('main content dimension changed'); }); 

Disclaimer: I wrote this library

like image 33
Marc J. Schmidt Avatar answered Sep 21 '22 22:09

Marc J. Schmidt