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
- body {
- width:960px;
- height:768px;
- margin:0px auto;
- }
- h3,
- h4 {
- margin: 0px;
- font-weight: normal;
- }
- h3 {
- padding:5px 0px;
- text-align:center;
- font-size:1.0em;
- margin:0.5em;
- }
- #left {
- float:left;
- width:348px;
- }
- #right {
- float:right;
- width:608px;
- }
- #klaarzetten, #reserveren, #onderweg {
- width:100%;
- height:252px;
- margin:2px;
- position:relative;
- overflow:hidden;
- }
- #klaarzetten div, #reserveren div, #onderweg div, #openstaande_orderregels div, #in_behandeling div {
- margin: 8px 8px 8px 8px;
- overflow:auto;
- }
- #openstaande_orderregels, #in_behandeling {
- height:380px;
- width:100%;
- margin:2px;
- position:relative;
- overflow:hidden;
- }
JS
- /**
- Als er elementen worden toegevoegd op de pagina.
- Dan heel eenvoudig een extra .next() of .prev() controle toevoegen waar nodig.
- Plus eventueel de controle van de marges.
- **/
- function maakResizable() { //in functie gezet om t plaatsen in de document ready eenvoudig/overzichtelijk te maken
- var minimaleHoogte = 70; //minimale hoogte van divs
- var maximaleHoogte = 760; //maximale hoogte van divs
- var minimaleBreedte = 100; //minimale breedte van divs
- var maximaleBreedte = 960; //maximale breedte van divs
- //alert($("div.resizable").size()); //detecteerd aantal .resizable divs
-
- $("div.resizable").each(function() { //voor elk element met resizable class
- var aantal = $("#" + $(this).attr('id') + " > .resizable").size(); //vanwege handles het aantal child elementen tellen
- var handle = ''; //var handle aanmaken voor het slepen (waarmee je sleept, dat heet een "handle")
- 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
- handle = 'e'; //handle aan de east (rechterkant)
- } else {
- handle = 's'; //handle aan de south (onderkant)
- }
-
- $(this).resizable({ //maak de div resizable
- handles : handle, //plaats handle
- maxWidth: maximaleBreedte, //geef max breedte aan
- minWidth: minimaleBreedte, //geef min breedte aan
- minHeight: minimaleHoogte, //geef min hoogte aan
- resize: function(event, ui) { //als je de div resized voer deze functie uit
- var vertical = ui.size.height - ui.originalSize.height; //momentele hoogte min hoogte voorheen bepaald of de div hoger of lager is geworden
- var horizontal = ui.size.width - ui.originalSize.width; //momentele breedte min breedte voorheen bepaald of de div breder of smaller is geworden
-
- var id = $(this).parent().attr('id'); //het id van de parent ophalen voor de marges
- if(id == 'left' || id == 'right') { //het id controleren om fouten te voorkomen
- var aantal = $("#" + id + " > .resizable").size(); //haal het aantal div's met de class resizable op
- var marges = 0; //maak variabele marges aan
- if(aantal > 1) { //als het aantal groter is dan 1 hebben we te maken met de linkerkant van de pagina
- marges = aantal * 2; //marges is het aantal keer 2 vanwege margin:2px;
- } else {
- marges = 0; //marges is nul
- }
- }
-
- var maximaleHoogte = 760 - marges; //maximaleHoogte bestaat niet dus opnieuw aanmaken en meteen min marges
- var nieuweHoogte = 0; //maak var nieuweHoogte aan
- var nieuweBreedte = 0; //maak var nieuweBreedte aan
- var maximaleBreedte = 956; //maximaleBreedte opnieuw aangeven - 4 vanwege marges van divs
- var minimaleBreedte = 100; //minimale breedte opnieuw aangeven
-
- if(horizontal > 0 || horizontal < 0) { //als de breedte groter of kleiner is geworden
- 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
- nieuweBreedte = maximaleBreedte - $(this).width(); //bereken breedte van volgende div
-
- if(nieuweBreedte > minimaleBreedte) { //controleer of de nieuwe breedte niet kleiner is dan de minimale breedte
- $(this).next().css("width", nieuweBreedte); //de breedte van de volgende div is nieuwe breedte
- $(this).css("width", maximaleBreedte - nieuweBreedte - 2); //pas breedte nogmaals toe voor het geval de breedte weer eens vreemd doet
- $(this).children().each(function() { //loop door child elementen heen van huidige div zodat we deze kunnen meeresizen
- if($(this).attr('class') != 'ui-resizable-handle ui-resizable-e') { //controleer of het child element geen handle is
- $(this).css("width", maximaleBreedte - nieuweBreedte); //pas breedte toe op huidige div
- } //elk element is een child van bijv. #left. De child elementen resizen dus mee
- });
- $(this).next().children().each(function() { //loop door child elementen van volgende div
- if($(this).attr('class') != 'ui-resizable-handle ui-resizable-e') { //controleer of de child geen handle is
- $(this).css("width", nieuweBreedte); //pas breedte toe op het volgende element
- }
- });
- } else {
- $(this).next().css("width", minimaleBreedte); //breedte is minimale breedte
- $(this).css("width", maximaleBreedte - minimaleBreedte); //pas breedte nogmaals toe voor het geval de breedte weer eens vreemd doet
- $(this).next().children().each(function() { //loop door child elementen van volgende div
- if($(this).attr('class') != 'ui-resizable-handle ui-resizable-e') { //als de class niet die van handle is
- $(this).css("width", minimaleBreedte); //pas breedte op volgende element toe
- }
- });
- $(this).children().each(function() {
- if($(this).attr('class') != 'ui-resizable-handle ui-resizable-e') {
- $(this).css("width", maximaleBreedte - minimaleBreedte);
- }
- });
- }
- }
- } else if(vertical > 0 || vertical < 0) { //Element word geresized in de hoogte
- if($(this).next().next().height() != null &&
- $(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
- 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
-
- if(nieuweHoogte > minimaleHoogte) { //controleer of de nieuwe hoogte niet kleiner is dan de minimale hoogte
- $(this).next().css("height", nieuweHoogte); //hoogte is nieuwe hoogte
- $(this).css("height", maximaleHoogte - (nieuweHoogte + $(this).next().next().height())); //bereken hoogte huidig element
- } else {
- $(this).next().css("height", minimaleHoogte); //hoogte is minimale hoogte omdat de nieuwe hoogte anders kleiner is dan minimale hoogte
- $(this).css("height",maximaleHoogte - (minimaleHoogte + $(this).next().next().height())); //huidig element is max hoogte - minimale hoogte + 3e element hoogte
- }
- } else if($(this).next().height() != null) { //controleer of de volgende $(this) bestaat
- if($(this).prev().height() != null) { //controleer of er een vorige div bestaat
- nieuweHoogte = maximaleHoogte - ($(this).height() + $(this).prev().height()); //bereken hoogte van de volgende $(this)
- } else {
- nieuweHoogte = maximaleHoogte - $(this).height(); //volgende div hoogte is omdat er maar 2 divs zijn max hoogte min deze hoogte
- }
-
- if(nieuweHoogte > minimaleHoogte) { //controleer of de nieuwe hoogte niet kleiner is dan de minimale hoogte
- $(this).next().css("height", nieuweHoogte); //volgende element hoogte is nieuwe hoogte
- if($(this).prev().height() != null) { //controleer of .prev() element bestaat
- $(this).css("height", maximaleHoogte - (nieuweHoogte + $(this).prev().height())); //deze div hoogte is max hoogte - volgende div + vorige div
- } else {
- $(this).css("height", maximaleHoogte - nieuweHoogte); //als er geen vorige div is, is de hoogte maxhoogte - hoogte
- }
- } else {
- $(this).next().css("height", minimaleHoogte); //volgende element hoogte is minimale hoogte
- if($(this).prev().height() != null) { //controleer of vorige div bestaat
- $(this).css("height", maximaleHoogte - (minimaleHoogte + $(this).prev().height())); //deze div hoogte is max - minimale hoogte(volgende div) - vorige div hoogte
- } else {
- $(this).css("height", maximaleHoogte - minimaleHoogte); //hoogte is als vorige div niet bestaat maxhoogte - minhoogte
- }
- }
- }
- }
- }
- });
- });
- }
HTML
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <title>jQuery UI Resize Elementen</title>
- <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/themes/base/jquery-ui.css" type="text/css" media="all" />
- <link rel="stylesheet" href="test.css" type="text/css" media="all" />
- <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script>
- <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.min.js" type="text/javascript"></script>
- <script src="test.js" type="text/javascript"></script>
- <script>
- ;(function($) { //beveiliging zodat zowel $ als jQuery nog beschikbaar is voor gebruik
- $(document).ready(function() {
- maakResizable(); //voer functie uit als document geladen is
- });
- })(jQuery); //beveiliging zodat zowel $ als jQuery nog beschikbaar is voor gebruik
- </script>
- </head>
- <body>
-
- <!-- verschillende elementen op de pagina / formaat aanhoudend van 960*768 -->
- <div id="left" class="resizable">
- <div id="klaarzetten" class="ui-widget-content ui-corner-all resizable">
- <h3 class="ui-widget-header ui-corner-all">Klaarzetten</h3>
- <div class="content">
- 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.
- </div>
- </div>
- <div id="reserveren" class="ui-widget-content ui-corner-all resizable">
- <h3 class="ui-widget-header ui-corner-all">Reserveren</h3>
- <div class="content">
- 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.
- </div>
- </div>
- <div id="onderweg" class="ui-widget-content ui-corner-all">
- <h3 class="ui-widget-header ui-corner-all">Onderweg</h3>
- <div class="content">
- 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.
- </div>
- </div>
- </div>
- <div id="right">
- <div id="openstaande_orderregels" class="ui-widget-content ui-corner-all resizable">
- <h3 class="ui-widget-header ui-corner-all">Openstaande Orderregels</h3>
- <div class="content">
- 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.
- </div>
- </div>
- <div id="in_behandeling" class="ui-widget-content ui-corner-all">
- <h3 class="ui-widget-header ui-corner-all">In Behandeling</h3>
- <div class="content">
- 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.
- </div>
- </div>
- </div>
- </body>
- </html>