javascript - Shrink to fit a div vertically inside a window -


i want window shrinks fit current window. fiddle close want achieve. use resize output window vertically until blue line gets cutoff. reverse process. however, want continue work if there padding and/or other elements on page.

<div id="output"></div>  <div id="sample" class="sampleclass">   <div>hello</div>   <div>hello</div>     <div>hello</div>   <div>hello</div>   <div>hello</div>   <div>hello</div> </div>  window.addeventlistener("resize", updatedimensions);   var originalheight = document.getelementbyid('sample').offsetheight; var safebuffer = 15;  function updatedimensions(){     var node = document.getelementbyid('sample');     var windowdimensions = {width: window.innerwidth, height: window.innerheight};     var dimensions = node.getboundingclientrect();   var nodebottom = dimensions.bottom;   var nodeheight = node.offsetheight;    var nodetop = dimensions.top;   var windowheight = windowdimensions.height;    var windowiscutoff = windowheight <= nodebottom;   var windowisshowing = windowheight >= nodetop;    console.log('windowheight: ' + windowheight + ' safebuffer: ' + safebuffer);   console.log('nodeheight: ' + nodeheight + ' originalheight: ' + originalheight);   var nodecangrowbigger =  (windowheight - safebuffer - 10) > nodeheight && nodeheight < originalheight;   console.log('nodecangrowbigger: ' + nodecangrowbigger);    if(windowisshowing && windowiscutoff) {      console.log('do work');      shrinkwindow(nodebottom, windowheight, nodeheight);   }    if(nodecangrowbigger){     growwindow(nodebottom, windowheight, nodeheight);   } }  function growwindow(nodebottom, windowheight, nodeheight){   var node = document.getelementbyid('sample');   var originalheight = nodeheight;   var offset = nodeheight - windowheight;   var newheight;   if(offset >= -safebuffer && offset <= safebuffer){    newheight = originalheight;   }   else if(offset >= 0){     newheight = originalheight + offset;     console.log('positive calculation originalheight: ' + originalheight + ' offset: ' + offset + ' newheight: ' + newheight);     }else{     newheight = originalheight - offset;     console.log('negative', newheight);   }   node.style.height = newheight + 'px';   console.log('height attmpted changed to', newheight);   console.log('height offset', node.offsetheight);   console.log('height style', node.style.height); }  function shrinkwindow(nodebottom, windowheight, nodeheight) {     var node = document.getelementbyid('sample');   var originalheight = nodeheight;   //console.log('originalheight', originalheight);   //console.log('nodebottom:' + nodebottom + ' windowheight: ' + windowheight);   var offset = nodeheight - windowheight;   //console.log('offset', offset);   var newheight;   if(offset >= -safebuffer && offset <= safebuffer){    newheight = originalheight - (safebuffer + 1);   }   else if(offset >= 0){     newheight = originalheight - offset;     //console.log('positive calculation originalheight: ' + originalheight + ' offset: ' + offset + ' newheight: ' + newheight);     }else{     newheight = originalheight + offset;     //console.log('negative', newheight);   }   node.style.height = newheight + 'px';   /*   console.log('height attmpted changed to', newheight);   console.log('height offset', node.offsetheight);   console.log('height style', node.style.height);   */ }   .sampleclass {  padding: 0px;  height: 300px;  overflow-y: auto;  border: solid blue;  //margin: 10px 300px 10px 25px;  margin: 0px  position: 'relative' } 

this javascript solution came feels overly complex. doesn't solve things padding, or more content on page either. can solve problem plain old css or js extension?

i know kendo ui has effect in modal windows (at least in 5 year old version use). i'm not open using kendo.

difficult if work situation ... @ following touch-up. use more work, think point in direction heading:

function updatedimensions(){   var node = document.getelementbyid('sample');   var windowdimensions = {width: window.innerwidth, height: window.innerheight};   var dimensions = node.getboundingclientrect();   var nodebottom = dimensions.bottom;   var nodeheight = node.offsetheight;    var nodetop = dimensions.top;   var windowheight = windowdimensions.height;    var windowiscutoff = windowheight <= nodebottom;   var windowisshowing = windowheight >= nodetop;    console.log('windowheight: ' + windowheight + ' safebuffer: ' + safebuffer);   console.log('nodeheight: ' + nodeheight + ' originalheight: ' + originalheight);   var nodecangrowbigger =  (windowheight - safebuffer - 10) > nodeheight && nodeheight < originalheight;   console.log('nodecangrowbigger: ' + nodecangrowbigger);    if ( (windowisshowing && windowiscutoff) || nodecangrowbigger ) {      growwindow(nodetop, windowheight, nodeheight);   } }  function growwindow(nodetop, windowheight, nodeheight){   var node = document.getelementbyid('sample');   var offset = windowheight - ( nodetop + nodeheight + safebuffer );   var newheight = nodeheight + offset;   node.style.height = newheight + 'px'; } 

as can see, use nodetop instead of nodebottom calculation , used combination of nodetop, nodeheight , safebuffer indicate bottom of node, used difference of window offset. should work regardless of whether you're shrinking or expanding window.


Comments