jQuery Resizable -> automatically find all elements for resizing and resize all elements properly

jQuery Resizable -> automatically find all elements for resizing and resize all elements properly

Hi guys,

I have a few issues. Im currently trying to make a resizable page.
I think this code is almost done, but there are just a few things I'd like to have in this page and I've had some trouble realizing them.

* edited * resizing works fine now

Secondly. I'm still not happy about the detection of all elements. 2 much is still hardcoded. Getting elements by the ID. I'd like to make it more dynamic. So if you guys have anything to automatically detect the elements around the element that you are currently resizing, that would be great =P.

Below is the code.

I hope you guys can help me out.


(Code variables are dutch!!!!)

CSS
  1. body {
  2. width:960px;
  3. height:768px;
  4. margin:0px auto;
  5. }
  6. h3,
  7. h4 {
  8. margin: 0px;
  9. font-weight: normal;
  10. }
  11. h3 {
  12. padding:5px 0px;
  13. text-align:center;
  14. font-size:1.0em;
  15. margin:0.5em;
  16. }
  17. #left {
  18. float:left;
  19. width:348px;
  20. }
  21. #right {
  22. float:right;
  23. width:608px;
  24. }
  25. #klaarzetten, #reserveren, #onderweg {
  26. width:100%;
  27. height:252px;
  28. margin:2px;
  29. position:relative;
  30. overflow:hidden;
  31. }
  32. #klaarzetten div, #reserveren div, #onderweg div, #openstaande_orderregels div, #in_behandeling div {
  33. margin: 8px 8px 8px 8px;
  34. overflow:auto;
  35. }
  36. #openstaande_orderregels, #in_behandeling {
  37. height:380px;
  38. width:100%;
  39. margin:2px;
  40. position:relative;
  41. overflow:hidden;
  42. }

JS
  1. /**
  2. Als er elementen worden toegevoegd op de pagina.
  3. Dan heel eenvoudig een extra .next() of .prev() controle toevoegen waar nodig.
  4. Plus eventueel de controle van de marges.
  5. **/

  6. function maakResizable() { //in functie gezet om t plaatsen in de document ready eenvoudig/overzichtelijk te maken
  7. var minimaleHoogte = 70; //minimale hoogte van divs
  8. var maximaleHoogte = 760; //maximale hoogte van divs
  9. var minimaleBreedte = 100; //minimale breedte van divs
  10. var maximaleBreedte = 960; //maximale breedte van divs
  11. //alert($("div.resizable").size()); //detecteerd aantal .resizable divs
  12. $("div.resizable").each(function() { //voor elk element met resizable class
  13. var aantal = $("#" + $(this).attr('id') + " > .resizable").size(); //vanwege handles het aantal child elementen tellen
  14. var handle = ''; //var handle aanmaken voor het slepen (waarmee je sleept, dat heet een "handle")
  15. if(aantal > 1) { //als het aantal groter is dan 1 dan hebben we te maken met het element aan de linker kant vanwege de 3 divs aan die kant
  16. handle = 'e'; //handle aan de east (rechterkant)
  17. } else {
  18. handle = 's'; //handle aan de south (onderkant)
  19. }
  20. $(this).resizable({ //maak de div resizable
  21. handles : handle, //plaats handle
  22. maxWidth: maximaleBreedte, //geef max breedte aan
  23. minWidth: minimaleBreedte, //geef min breedte aan
  24. minHeight: minimaleHoogte, //geef min hoogte aan
  25. resize: function(event, ui) { //als je de div resized voer deze functie uit
  26. var vertical = ui.size.height - ui.originalSize.height; //momentele hoogte min hoogte voorheen bepaald of de div hoger of lager is geworden
  27. var horizontal = ui.size.width - ui.originalSize.width; //momentele breedte min breedte voorheen bepaald of de div breder of smaller is geworden
  28. var id = $(this).parent().attr('id'); //het id van de parent ophalen voor de marges
  29. if(id == 'left' || id == 'right') { //het id controleren om fouten te voorkomen
  30. var aantal = $("#" + id + " > .resizable").size(); //haal het aantal div's met de class resizable op
  31. var marges = 0; //maak variabele marges aan
  32. if(aantal > 1) { //als het aantal groter is dan 1 hebben we te maken met de linkerkant van de pagina
  33. marges = aantal * 2; //marges is het aantal keer 2 vanwege margin:2px;
  34. } else {
  35. marges = 0; //marges is nul
  36. }
  37. }
  38. var maximaleHoogte = 760 - marges; //maximaleHoogte bestaat niet dus opnieuw aanmaken en meteen min marges
  39. var nieuweHoogte = 0; //maak var nieuweHoogte aan
  40. var nieuweBreedte = 0; //maak var nieuweBreedte aan
  41. var maximaleBreedte = 956; //maximaleBreedte opnieuw aangeven - 4 vanwege marges van divs
  42. var minimaleBreedte = 100; //minimale breedte opnieuw aangeven
  43. if(horizontal > 0 || horizontal < 0) { //als de breedte groter of kleiner is geworden
  44. if($(this).next().width() != null) { //hiermee ga ik ervan uit dat er 2 div's zijn en ik wil controleren of de volgende div bestaat - left en right div
  45. nieuweBreedte = maximaleBreedte - $(this).width(); //bereken breedte van volgende div
  46. if(nieuweBreedte > minimaleBreedte) { //controleer of de nieuwe breedte niet kleiner is dan de minimale breedte
  47. $(this).next().css("width", nieuweBreedte); //de breedte van de volgende div is nieuwe breedte
  48. $(this).css("width", maximaleBreedte - nieuweBreedte - 2); //pas breedte nogmaals toe voor het geval de breedte weer eens vreemd doet
  49. $(this).children().each(function() { //loop door child elementen heen van huidige div zodat we deze kunnen meeresizen
  50. if($(this).attr('class') != 'ui-resizable-handle ui-resizable-e') { //controleer of het child element geen handle is
  51. $(this).css("width", maximaleBreedte - nieuweBreedte); //pas breedte toe op huidige div 
  52. } //elk element is een child van bijv. #left. De child elementen resizen dus mee
  53. });
  54. $(this).next().children().each(function() { //loop door child elementen van volgende div
  55. if($(this).attr('class') != 'ui-resizable-handle ui-resizable-e') { //controleer of de child geen handle is
  56. $(this).css("width", nieuweBreedte); //pas breedte toe op het volgende element
  57. }
  58. });
  59. } else {
  60. $(this).next().css("width", minimaleBreedte); //breedte is minimale breedte
  61. $(this).css("width", maximaleBreedte - minimaleBreedte); //pas breedte nogmaals toe voor het geval de breedte weer eens vreemd doet
  62. $(this).next().children().each(function() { //loop door child elementen van volgende div
  63. if($(this).attr('class') != 'ui-resizable-handle ui-resizable-e') { //als de class niet die van handle is
  64. $(this).css("width", minimaleBreedte); //pas breedte op volgende element toe
  65. }
  66. });
  67. $(this).children().each(function() {
  68. if($(this).attr('class') != 'ui-resizable-handle ui-resizable-e') {
  69. $(this).css("width", maximaleBreedte - minimaleBreedte);
  70. }
  71. });
  72. }
  73. }
  74. } else if(vertical > 0 || vertical < 0) { //Element word geresized in de hoogte
  75. if($(this).next().next().height() != null && 
  76. $(this).next().next().attr('class') != 'ui-resizable-handle ui-resizable-e') { //controleer of er een 3e $(this) in de reeks staat voor als er 3 elementen bestaan
  77. nieuweHoogte = maximaleHoogte - ($(this).height() + $(this).next().next().height()); //nieuwe hoogte is de maximale hoogte - huidig element en omdat die bestaat ook een 3e element en berekent dus hoogte van de volgende div
  78. if(nieuweHoogte > minimaleHoogte) { //controleer of de nieuwe hoogte niet kleiner is dan de minimale hoogte
  79. $(this).next().css("height", nieuweHoogte); //hoogte is nieuwe hoogte
  80. $(this).css("height", maximaleHoogte - (nieuweHoogte + $(this).next().next().height())); //bereken hoogte huidig element
  81. } else {
  82. $(this).next().css("height", minimaleHoogte); //hoogte is minimale hoogte omdat de nieuwe hoogte anders kleiner is dan minimale hoogte
  83. $(this).css("height",maximaleHoogte - (minimaleHoogte + $(this).next().next().height())); //huidig element is max hoogte - minimale hoogte + 3e element hoogte
  84. }
  85. } else if($(this).next().height() != null) { //controleer of de volgende $(this) bestaat
  86. if($(this).prev().height() != null) { //controleer of er een vorige div bestaat
  87. nieuweHoogte = maximaleHoogte - ($(this).height() + $(this).prev().height()); //bereken hoogte van de volgende $(this)
  88. } else {
  89. nieuweHoogte = maximaleHoogte - $(this).height(); //volgende div hoogte is omdat er maar 2 divs zijn max hoogte min deze hoogte
  90. }
  91. if(nieuweHoogte > minimaleHoogte) { //controleer of de nieuwe hoogte niet kleiner is dan de minimale hoogte
  92. $(this).next().css("height", nieuweHoogte); //volgende element hoogte is nieuwe hoogte
  93. if($(this).prev().height() != null) { //controleer of .prev() element bestaat
  94. $(this).css("height", maximaleHoogte - (nieuweHoogte + $(this).prev().height())); //deze div hoogte is max hoogte - volgende div + vorige div
  95. } else {
  96. $(this).css("height", maximaleHoogte - nieuweHoogte); //als er geen vorige div is, is de hoogte maxhoogte - hoogte 
  97. }
  98. } else {
  99. $(this).next().css("height", minimaleHoogte); //volgende element hoogte is minimale hoogte
  100. if($(this).prev().height() != null) { //controleer of vorige div bestaat
  101. $(this).css("height", maximaleHoogte - (minimaleHoogte + $(this).prev().height())); //deze div hoogte is max - minimale hoogte(volgende div) - vorige div hoogte
  102. } else {
  103. $(this).css("height", maximaleHoogte - minimaleHoogte); //hoogte is als vorige div niet bestaat maxhoogte - minhoogte
  104. }
  105. }
  106. }
  107. }
  108. }
  109. });
  110. });
  111. }

HTML
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  5. <title>jQuery UI Resize Elementen</title>
  6. <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/themes/base/jquery-ui.css" type="text/css" media="all" />
  7. <link rel="stylesheet" href="test.css" type="text/css" media="all" />
  8. <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script> 
  9. <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.min.js" type="text/javascript"></script>
  10. <script src="test.js" type="text/javascript"></script>
  11. <script>
  12. ;(function($) { //beveiliging zodat zowel $ als jQuery nog beschikbaar is voor gebruik
  13. $(document).ready(function() {
  14. maakResizable(); //voer functie uit als document geladen is
  15. });
  16. })(jQuery); //beveiliging zodat zowel $ als jQuery nog beschikbaar is voor gebruik
  17. </script>
  18. </head>
  19. <body>
  20. <!-- verschillende elementen op de pagina / formaat aanhoudend van 960*768 -->
  21. <div id="left" class="resizable">
  22. <div id="klaarzetten" class="ui-widget-content ui-corner-all resizable">
  23. <h3 class="ui-widget-header ui-corner-all">Klaarzetten</h3>
  24. <div class="content">
  25. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam mauris dui, dapibus non volutpat vitae, imperdiet ut lacus. Proin tincidunt massa eu turpis accumsan vehicula. Sed fermentum ipsum vitae dolor elementum ultricies. Pellentesque id viverra nulla. Suspendisse potenti. Cras non ante justo. Curabitur rutrum, ante id gravida eleifend, quam eros elementum nibh, eget condimentum erat nunc eget est. Nunc quis pulvinar libero. Vestibulum non urna eu diam ultricies feugiat. Pellentesque ullamcorper pulvinar arcu posuere tincidunt. Sed viverra euismod urna, at ultricies erat dictum eget.
  26. </div>
  27. </div>
  28. <div id="reserveren" class="ui-widget-content ui-corner-all resizable">
  29. <h3 class="ui-widget-header ui-corner-all">Reserveren</h3>
  30. <div class="content">
  31. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam mauris dui, dapibus non volutpat vitae, imperdiet ut lacus. Proin tincidunt massa eu turpis accumsan vehicula. Sed fermentum ipsum vitae dolor elementum ultricies. Pellentesque id viverra nulla. Suspendisse potenti. Cras non ante justo. Curabitur rutrum, ante id gravida eleifend, quam eros elementum nibh, eget condimentum erat nunc eget est. Nunc quis pulvinar libero. Vestibulum non urna eu diam ultricies feugiat. Pellentesque ullamcorper pulvinar arcu posuere tincidunt. Sed viverra euismod urna, at ultricies erat dictum eget.
  32. </div>
  33. </div>
  34. <div id="onderweg" class="ui-widget-content ui-corner-all">
  35. <h3 class="ui-widget-header ui-corner-all">Onderweg</h3>
  36. <div class="content">
  37. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam mauris dui, dapibus non volutpat vitae, imperdiet ut lacus. Proin tincidunt massa eu turpis accumsan vehicula. Sed fermentum ipsum vitae dolor elementum ultricies. Pellentesque id viverra nulla. Suspendisse potenti. Cras non ante justo. Curabitur rutrum, ante id gravida eleifend, quam eros elementum nibh, eget condimentum erat nunc eget est. Nunc quis pulvinar libero. Vestibulum non urna eu diam ultricies feugiat. Pellentesque ullamcorper pulvinar arcu posuere tincidunt. Sed viverra euismod urna, at ultricies erat dictum eget.
  38. </div>
  39. </div>
  40. </div>
  41. <div id="right">
  42. <div id="openstaande_orderregels" class="ui-widget-content ui-corner-all resizable">
  43. <h3 class="ui-widget-header ui-corner-all">Openstaande Orderregels</h3>
  44. <div class="content">
  45. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam mauris dui, dapibus non volutpat vitae, imperdiet ut lacus. Proin tincidunt massa eu turpis accumsan vehicula. Sed fermentum ipsum vitae dolor elementum ultricies. Pellentesque id viverra nulla. Suspendisse potenti. Cras non ante justo. Curabitur rutrum, ante id gravida eleifend, quam eros elementum nibh, eget condimentum erat nunc eget est. Nunc quis pulvinar libero. Vestibulum non urna eu diam ultricies feugiat. Pellentesque ullamcorper pulvinar arcu posuere tincidunt. Sed viverra euismod urna, at ultricies erat dictum eget.
  46. </div>
  47. </div>
  48. <div id="in_behandeling" class="ui-widget-content ui-corner-all">
  49. <h3 class="ui-widget-header ui-corner-all">In Behandeling</h3>
  50. <div class="content">
  51. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam mauris dui, dapibus non volutpat vitae, imperdiet ut lacus. Proin tincidunt massa eu turpis accumsan vehicula. Sed fermentum ipsum vitae dolor elementum ultricies. Pellentesque id viverra nulla. Suspendisse potenti. Cras non ante justo. Curabitur rutrum, ante id gravida eleifend, quam eros elementum nibh, eget condimentum erat nunc eget est. Nunc quis pulvinar libero. Vestibulum non urna eu diam ultricies feugiat. Pellentesque ullamcorper pulvinar arcu posuere tincidunt. Sed viverra euismod urna, at ultricies erat dictum eget.
  52. </div>
  53. </div>
  54. </div>

  55. </body>
  56. </html>