JS 函数 - 数学优化,某些情况下减 1

JS function - Math optimization, off by 1 in some cases

我对 web 开发仍然一头雾水,不是最擅长数学的,而且当某些东西仍然存在问题时,我很难继续前进。希望大家帮帮忙。

快速:我正在使用 Jquery 使我的 header 中的一些(数量动态)div 重叠 30%,填满容器的整个宽度。我当前的迭代太多次向上舍入,所以我的最后一个元素低于其余元素。

我有 X 个元素填满了 header 容器的整个宽度。每个元素在任一侧重叠 30%。在等式中,我可以毫无问题地计算出数学。事实证明,用这些数字确保像素精度更加困难。这就是我用来确定每个元素的宽度的方法。

width of element = [container width] / ((.7 * ([# of elements] - 1)) + 1)
left margin of element = [width of element] * .3

我创建了称为 extraWidth 和 extraMargin 的变量,它们分别是宽度和边距 % 1。我现在使用的默认元素宽度是width-(width%1)。对于每个元素,我将 extraWidth 和 extraMargin 添加到 运行ning 总变量。任何时候这些变量的总和超过 .5,该特定元素的宽度或边距设置为比默认值高 1。

所以我不再 运行 了,here's a JSFiddle 有了一切必要的东西,看看我在处理什么。大多数时候 运行 没问题,但在某些宽度下我会宽 1 个像素。

p.s.

运行 JSFiddle 的工作方式与我的实时沙盒网站 so check that out here 不同。我觉得我包含了所有必要的部分,但我不能肯定地说。在我的 Chrome 上,当 window 大小为 575px(在许多其他宽度中)时,它被搞砸了。

编辑

请注意,我正在更改我的实时网站,但没有更新此 post。不过,我目前还没有删除任何功能,只是对现有功能进行新的 ones/minor 改动。

您有 2 个选择:

计算 pixelMargin 作为下一个整数。喜欢:

var pixelMargin = Math.ceil(circleMargin);

或者您可以在 %.

中使用 pixelMargin

第一个对我有用。

递归!递归是我能想到的最优雅的答案(似乎适用于所有情况)。

遍历我的 jQuery 对象,一次一个元素,并根据剩余容器宽度而不是整个容器宽度计算宽度和边距,这使得计算更容易。

function circleWidth(circles, containerWidth) {
    var width = containerWidth / ((.7 * (circles.length - 1)) + 1);
    var pxWidth = Math.round(width);
    var margin = width * .3;
    var pxMargin = Math.round(margin);

    $(circles[0]).css({
        'width': pxWidth + "px",
        'margin-left': "-" + pxMargin + "px"
    });

    containerWidth -= (pxWidth - pxMargin);

    if (circles.length > 1) {
        circleWidth(circles.slice(1), containerWidth);
    }
}

function circleSize(circles, containerWidth) {
    var height = Math.ceil(containerWidth / ((.7 * (circles.length - 1)) + 1));

    circles.each(function() {
        $(this).css({
            'height': height + "px"
        });
    });

    circleWidth(circles, containerWidth);

    $(circles[circles.length]).css({
        'margin-left': $(circles[0]).css('margin-left')
    });

    $(circles[0]).css({
        'margin-left': 0
    });
}

Here's the fiddle with my final result。我确定我还有一些优化要做,但至少它现在可以工作了。