6

我怎样才能实现,蓝色框填充 div 的剩余位置并在绿色框变大时动态降低他的高度?

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");
});

非常感谢你!

4

6 回答 6

3

不幸的是,您无法使用 CSS 完成此操作。但是,slideToggle 确实有一个回调,您可以在它进行时使用它来调整大小

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

JSFiddle

唯一丑陋的就是边距。不过,可能也可以通过编程方式找到它们。

这是允许平滑调整蓝色框大小的唯一方法

于 2013-08-16T12:01:34.583 回答
0
$("#click").on("click", function (e) {
    $("#box").slideToggle("fast");
    $("#rightbot").height($("#left").height() - $("#rightbot").height());
});

我使用#leftdiv 的高度作为 100% 的值。

另一种方法是overflow:hidden用于包装 div。

解决方案取决于您的用例。

于 2013-08-16T12:04:54.237 回答
0

那个怎么样:

  $("#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);
});

在这里工作小提琴:http: //jsfiddle.net/ncrqb/15/

我希望它有所帮助。

于 2013-08-16T12:05:44.863 回答
0
$("#click").on("click", function (e) {
    $("#box").slideToggle("fast");
    if($("#rightbot").height()==300)
       $("#rightbot").height("43%");
    else
       $("#rightbot").height("300");
});

这是小提琴

于 2013-08-16T12:07:25.130 回答
0

以下代码将解决该问题:-

$("#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);
            }
        });
    });
于 2013-08-16T12:09:59.167 回答
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());
    }

这是解决方案,它有效。

所有这些答案都是正确的,但是他们只是忘记了在动画完成后您需要重新调整蓝色框的大小,否则jQuery会返回之前的幻灯片状态高度。

这是因为,jQuery 动画使用 window.setTimeout(); 这就是为什么它不会阻塞代码,只完成动画。

于 2013-08-16T12:10:24.637 回答