jQuery - 与窗口高度成比例缩放多个div的函数

时间:2012-06-07 07:27:12

标签: jquery css function html scale

请帮助一个菜鸟。

我正在尝试创建一个jQuery函数,它将根据窗口高度重新缩放并重新定位多个绝对定位的div。

我已经包含以下代码来说明我想要实现的结果类型。 数字960表示页面上任何div将具有的最大高度(以像素为单位)。因此,在调整大小时,960应该等于窗口高度的100%。

对于变量:divHeight,divLeft和divTop我手动输入了它们的值,因为我不知道如何从css中检索它们的值,然后在调整窗口大小时恢复这些原始值,这样函数就不会计算基于新值的div高度和位置。

function scaleDivs() {
    var winHeight = $(window).height();
    var divHeight = 348;
    var divLeft = 40;
    var divTop = 100;
    var percentDif = (winHeight / 960) * 100;
    var newHeight = (percentDif / 100) * divHeight;
    newHeight = parseInt(newHeight) + "px";
    var newLeft = (percentDif / 100) * divLeft;
    newLeft = parseInt(newLeft) + "px";
    var newTop = (percentDif / 100) * divTop;
    newTop = parseInt(newTop) + "px";
    $("#panel_0").css({"height": newHeight, "left": newLeft, "top": newTop});
}

$(document).ready(function() {
    scaleDivs();
    $(window).bind('resize', scaleDivs);
});

我想要的是一个控制多个div的函数 - 自动获取所需的css值。

如果有人知道插件可以解决我的问题,或者你是否可以在我的代码中指出我需要更改的内容,以便我可以提出要求,我会非常感激。


...编辑...

此解决方案使用 .data 来检索div高度和位置的初始值。

的jQuery

function scalePanels() {
    var winHeight = $(window).height();
    var ratio960 = winHeight / 960;
    $(".panelCont").each(function(){
        var panelHeight = $(this).data("initial-height");
        var newHeight = panelHeight * ratio960;
        newHeight = parseInt(newHeight) + "px";
        var panelTop = $(this).data("initial-top");
        var newTop = panelTop * ratio960;
        newTop = parseInt(newTop) + "px";
        var panelLeft = $(this).data("initial-left");
        var newLeft = panelLeft * ratio960;
        newLeft = parseInt(newLeft) + "px";
        $(this).css({"height": newHeight, "top": newTop, "left": newLeft});
    });

};

$(document).ready(function() {
  scalePanels();
  $(window).bind('resize', scalePanels);
}); 

HTML

<div class="group_1">
  <div class="panelCont" id="pnl_0a"
    data-initial-height= "960"
    data-initial-left= "0"
    data-initial-top= "0">
    <img src="images/pnl_0a.jpg" />
  </div>
  <div class="panelCont" id="pnl_0_title"
    data-initial-height= "97"
    data-initial-left= "186"
    data-initial-top= "26">
    <img src="images/pnl_0_title.svg" />
  </div>
  <div class="panelCont" id="pnl_0b"
    data-initial-height= "960"
    data-initial-left= "0"
    data-initial-top= "0">
    <img src="images/pnl_0b.jpg" />
  </div>  
</div>

CSS

body {
    margin: 0 auto;
    background-color: #000;
    overflow-y: hidden;
}
#pnl_0a {
    margin: 0px;
    width: auto;
    position: absolute;
    z-index: 2;
}
#pnl_0_title {
    margin: 0px;
    width: auto;
    position: absolute;
    z-index: 4;
}
#pnl_0b {
    margin: 0px;
    width: auto;
    position: absolute;
    z-index: 3;
}
img {
    margin: 0px;
    width: auto;
    height: 100%;
}
object {
    margin: 0px;
    height: 100%;
}

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是使用百分比而不是px来设置位置和高度。这样你只使用CSS而不使用javascript。

#panel_0 {
    height: 36%;
    left: 7%;
    top: 11%;
}
如果您不仅仅使用百分比来定位,那么此解决方案可能会出现问题(另请参阅this有关灵活定位的文章)

如果你想要javascript,你可以试试这样的东西(虽然未经测试,但要小心):

function adjust(wrapper){
    var wrapperHeight = $(wrapper).height();  
    var wrapperWidth = $(wrapper).width();
    var elementArr = [];

    // create location index for all the elements inside the wrapper 
    $.each($(wrapper).children('.adjustable'),function(key,value){
        var percLeft = $(value).css('left')/wrapperWidth;
        var percTop = $(value).css('top')/wrapperHeight; 
        var percHeight = $(value).height()/wrapperHeight;

        var elem = [value,percLeft,percTop,percHeight];
        elementArr.push(elem);
    });

    $(document).resize(function(){          
        $.each(elementArr, function(key,value){
            $(value[0])
                .css('left', $(value[0]).css('left') * value[1])
                .css('top',$(value[0]).css('top') * value[2])
                .height($(value[0]).height() * value[3]);           
        });
    }); 
};