2013-08-16 13 views
6

Jak mogę osiągnąć, że niebieskie pudełko wypełnia pozostałe miejsce div i dynamicznie zmniejsza jego wysokość, gdy zielona skrzynia staje się większa?Dynamicznie zmienić wysokość div na rodzica

http://jsfiddle.net/trek711/ncrqb/4/

HTML

<div id="wrap"> 
    <div id="left"></div> 
    <div id="righttop"> 
     <div id="click">Click!</div> 
     <div id="box"></div> 
     <div id="place"></div> 
    </div> 
    <div id="rightbot"></div> 
</div> 

CSS

#wrap { 
    padding: 5px; 
    width: 700px; 
    height: 500px; 
    background-color: yellow; 
    border: 1px solid black; 
} 
#left { 
    float: left; 
    margin: 0 5px 0 0; 
    width: 395px; 
    height: inherit; 
    background-color: red; 
} 
#righttop { 
    float: left; 
    padding: 5px; 
    width: 290px; 
    background-color: green; 
} 
#rightbot { 
    float: left; 
    margin: 5px 0 0 0; 
    width: 300px; 
    height: 60%; 
    background-color: blue; 
} 
#click { 
    width: 50px; 
    height: 50px; 
    background-color: red; 
} 
#box { 
    display: none; 
    width: 200px; 
    height: 100px; 
    background-color: white; 
} 
#place { 
    width: 100px; 
    height: 120px; 
    background-color: lightgrey; 
} 

JS

$("#click").on("click", function (e) { 
    $("#box").slideToggle("fast"); 
}); 

Dziękuję bardzo!

+2

Powiązane, które mogą Ci się przydać: [Wykonaj div wypełnij pozostałe miejsce na ekranie] (http://stackoverflow.com/a/90886/425809) – Richard

+1

Możesz zbadać definicję flex-box: http: // css -tricks.com/snippets/css/a-guide-to-flexbox/ - Dokładniej odcinek z nim – cowcowmoomoo

+0

Będziesz potrzebował javascript. Uzyskaj wysokość niebieskiego pudełka, odejmując wysokość pojemnika od zielonego pudełka. Następnie onclick powinien zaktualizować wysokość niebieskiego pudełka zgodnie z nowym rozmiarem zielonej skrzynki. – Frisbetarian

Odpowiedz

3

Niestety, nie da się tego osiągnąć za pomocą CSS. Jednak slideToggle ma zwrotnego, którego można użyć do zmiany rozmiaru rzeczy, jak postępuje

$("#box").slideToggle(
     { duration: "fast", 
     progress: function() { 
      $('#rightbot').height(
       $('#wrap').height() 
       - $('#righttop').height() 
       - 15 /* margins */) 
     } 
    }); 

aw JSFiddle

Jedyną rzeczą jest brzydki marginesy. Prawdopodobnie możliwe jest również znalezienie tych programów.

Jest to jedyny sposób na to, że pozwala na płynne skalowanie niebieskim polu

+0

doskonały !!! Dziękuję Ci bardzo! – trek711

0
$("#click").on("click", function (e) { 
    $("#box").slideToggle("fast"); 
    $("#rightbot").height($("#left").height() - $("#rightbot").height()); 
}); 

użyłem wysokość #left div jako wartość 100%.

Innym sposobem jest użycie overflow:hidden do zawijania div.

Rozwiązanie zależy od Twojego przypadku użycia.

0

jak o tym:

$("#click").on("click", function (e) { 
    var height = "63%", 
     $box = $("#box"), 
     $blueBox = $("#rightbot"); 

    if($box.is(":visible")){   
     $box.hide("fast"); 
     $blueBox.height(height); 
     return; 
    } 

    height = "43%"; 
    $box.show("fast"); 
    $blueBox.height(height); 
}); 

skrzypce pracy tutaj: http://jsfiddle.net/ncrqb/15/

Mam nadzieję, że to pomaga.

+0

Bit przerywany, gdy rozszerza się ... – Richard

0
$("#click").on("click", function (e) { 
    $("#box").slideToggle("fast"); 
    if($("#rightbot").height()==300) 
     $("#rightbot").height("43%"); 
    else 
     $("#rightbot").height("300"); 
}); 

Oto fiddle

0

następujący kod rozwiąże ten problem: -

$("#click").on("click", function (e) { 
     $("#box").slideToggle("fast",function(){ 
      var bluedivHeight = 300;//$("#rightbot").height() if want to have dynamic  
      var toggleBoxHeight = $("#box").height(); 
      if($("#box").css("display")==="block"){ 
       $("#rightbot").height(bluedivHeight-toggleBoxHeight); 
      } else { 
       $("#rightbot").height(bluedivHeight); 
      } 
     }); 
    }); 
0

http://jsfiddle.net/ncrqb/21/

function centerBlue(){ 
     var blue = $("#rightbot"); 
     var parent = $("#left"); 
     var rightTop = $("#righttop"); 
     var left_space = (parent.outerHeight() - rightTop.outerHeight()) - 5; 
     blue.css("height",left_space+"px"); 
     console.log(rightTop.outerHeight()); 
    } 

Oto rozwiązanie, i to działa.

Wszystkie te odpowiedzi są prawidłowe, ale po prostu zapomniały, że trzeba zmienić rozmiar niebieskiego pola po zakończeniu animacji, w przeciwnym razie jQuery zwróci poprzednią wysokość stanu slajdu.

A to dlatego, że jQuery animuje się przy użyciu window.setTimeout(); i dlatego nie blokuje kodu, tylko animacja jest wykonywana.

Powiązane problemy