绝对放置文字而不重叠

时间:2014-11-15 15:28:26

标签: php css overlap absolutelayout overlapping-matches

我需要根据数组中的内容将文本放在数组中。例如

<?php   $stuff = array (5, 15, 50, 55, 90);
for ($i=0; $i<5; $i++) {
echo "<div style=position:absolute; top:$i"."px> $stuff[$i] </div>"; 
}

将输出

5

15




50
55





90

这就是我想要的,但问题是数组中的元素可能会在一起,例如51而不是55:

$stuff = array (5,15,50,51,90);

将输出

5

15




overlapping 50
and 51 here





90

因为文本的字体大小大于单个像素。

有没有办法将元素放置在靠近它们的自然位置而不会重叠 - 在这个例子中,50只会向上发一根头发,而51只会向下发一条头发,所以它们不会重叠。

3 个答案:

答案 0 :(得分:0)

做这样的事情:

$stuff = array (5, 15, 50, 55, 90);
$limit = 5;

for ($i=0; $i < 5; $i++) {
    for($j=0; $j < $i; $j++) {
        if (abs($stuff[$j] - $stuff[$i]) <= $limit) $stuff[$i] += $limit;
    }

    echo "<div style=position:absolute; top:" . $i . "px> " . $stuff[$i] . " </div>";
}

这将检查所有先前值的距离。

答案 1 :(得分:0)

您可以像这样使用position: relative

<?php

    $stuff = array (5, 15, 50, 51, 90);

    foreach($stuff as $k => $v)
        echo "<div style='position: relative; top:" . $v . "px;'>$stuff[$k]</div>"; 

?>

更新

这应该适合你:

<?php

    $stuff = array (5, 15, 50, 51, 90);

    foreach($stuff as $k => $v)
        echo "<div style='position: absolute; top:" . (($k >= 1) ? (($stuff[$k]-$stuff[$k-1] < 15) ? ($v+10) : "$v") : "$v") . "px;'>$stuff[$k]</div>";

    $stuff = array (5, 15, 50, 55, 90);

    foreach($stuff as $k => $v)
        echo "<div style='position: absolute; top:" . (($k >= 1) ? (($stuff[$k]-$stuff[$k-1] < 15) ? ($v+10) : "$v") : "$v") . "px; left: 30px'>$stuff[$k]</div>"; 

?>

答案 2 :(得分:0)

所以我最终使用了while循环并增加了一个偏移量,直到空间不再被占用为止。

$stuff = array (5, 15, 50, 51, 90);
$z = array ();
for ($i=0; $i<5; $i++) {

$offset=0;
while  ( (in_array($stuff + $offset,$z)) || (in_array($stuff[1] + 1 + $offset,$z))    ) {  #this place already taken - assumes the text needs 2 px to display - adjust your math for your needs (I needed 8)
$offset++;
}

$i = $i + $offset;


#mark the spots as taken
$z[] = $stuff + $offset;
$z[] = $stuff + 1 + $offset;    


echo "<div style=position:absolute; top:$stuff[$i]"."px> $stuff[$i] </div>"; 
}