代码之家  ›  专栏  ›  技术社区  ›  jpkeisala

生成随机元素位置,防止javascript中的重叠

  •  4
  • jpkeisala  · 技术社区  · 15 年前

    我在页面上有一个holder div,我想在其中随机位置加载小图像,作为一个拼贴,每个拼贴上有10px的填充。

    我怎样才能确保图像不会相互重叠或保持分区? 有没有我可以使用的插件或函数?

    迄今为止我的代码:

    <script src="jquery-1.3.2.min.js" type="text/javascript"></script>
    
    <script type="text/javascript">
    $(document).ready(function(){
    $("#my_canvas img").each(
    function(intIndex) {
    
    var l = Math.floor(Math.random() * $("#my_canvas").width());
    var t = Math.floor(Math.random() * $("#my_canvas").height());
    
    $(this).css("left", l);
    $(this).css("top", t);
    
    $(this).bind(
        "click",
            function() {
                alert("l=" + l + " t=" + t);
            }
        );
    
    }
    
    );
    

    (});

       <style type="text/css">
        #my_canvas
        {
            background: #eee;
            border: black 1px solid;
            width: 800px;
            height: 400px;
        }
        #my_canvas img
        {
            padding: 10px;
            position:absolute;
        }
    </style>
    
    <div id="my_canvas">
        <img src="images/1.jpg" />
        <img src="images/9.jpg" />
        <img src="images/2.jpg" />
        <img src="images/3.jpg" />
        <img src="images/4.jpg" />
        <img src="images/5.jpg" />
        <img src="images/6.jpg" />
        <img src="images/7.jpg" />
        <img src="images/8.jpg" />
    </div>
    
    3 回复  |  直到 7 年前
        1
  •  3
  •   Guffa    15 年前

    将拾取的坐标存储在一个数组中,以便您可以将放置的每个新图像的坐标与上一个图像的坐标进行比较。

    如果拾取的坐标与上一个图像重叠,请拾取新坐标。限制尝试次数,以便如果无法放置图像,例如1000次尝试,则从第一个图像重新开始。

        2
  •  2
  •   Manuel Maurer    7 年前

    很抱歉挖到了一个旧的帖子,但我最近遇到了一个类似的问题,我花了一些时间找到了完美的解决方案——我现在想和大家分享。实现这一点的方法有很多种。


    1)艰难的道路

    如果你想自己实现它,你可能会得到最符合你需要的结果。它确实需要一些时间和大量的测试,但实际上,自己实现这样一个特性并不难。你可以使用随机函数 Math.floor(Math.random() * Max) + Min 计算父元素中的随机位置。在定位第一个元素之后,您需要将元素的坐标存储在一个数组中,例如。现在,在显示下一个元素之前,您可以使用数组检查是否有重叠-如果有,您可以计算一个新的位置。这可能不是最有效的方法,但对于数量不多的元素来说,它会非常有效。但我很肯定,如果你实现了这个,优化你的算法以提高效率也不难。

    2)解决方法

    实现这一点的第二种方法比第一种方法更容易,但也没有那么灵活。因此,您需要使用一些预定义的布局——某种网格。所以假设您有一个包含100个网格块的容器,所以有100个元素要放入其中。现在只需计算一个介于1和100之间的随机数,并将元素附加到网格容器中。防止重叠是很容易的,但是这样做可能并不总是适合你的需要。

    3)最简单的方法 如果搜索了很长一段时间,但没有一个适合我需要的插件。所以我自己创造了一个,我出版了,可以免费使用。你可以在下面找到它 manuelmaurer.at/randposplugin.php . 它非常灵活,所以我认为这是你实现目标最简单的方法。

        3
  •  0
  •   jpkeisala    15 年前

    我想没有插件。我将像Sander所建议的那样,通过创建预定义的DIV网格并将随机图像加载到这些DIV来实现这一点。它比计算图像尺寸/位置更容易、更快速,而且执行的工作几乎相同。不是随机的,但视觉效果很好:)