【问题标题】:change the location of an element everytime the page is loaded每次加载页面时更改元素的位置
【发布时间】:2012-09-08 21:04:08
【问题描述】:

我有一个 HTML 页面,上面有 5 张图片(每张 48px × 48px)。我希望每次加载页面时在网页上的随机位置出现图像。

我不知道如何实现,我只知道我需要 CSS 和 JavaScript (用于随机化)。有什么想法或建议吗?

这里是示例 HTML 代码:

  <a href="http://twitter.com/"><img alt="Twitter" src="/images/twitter-48.png" /></a>
  <a href="http://facebook.com/><img alt="Facebook" src="/images/facebook-48.png" /></a>
  <a href="https://plus.google.com/"><img alt="Google Plus" src="/images/plus-48.png" /></a>
  <a href="https://github.com/"><img alt="GitHub" src="/images/github-48.png" /></a>

【问题讨论】:

  • 关于 PHP:不要忘记,如果可以安全地卸载服务器,最好始终在客户端执行工作。关于随机定位 - 你是否已经有一个容器或图像元素,只需要随机分配src 或者你想设置position:fixed; 并将图像随机放置在正文中?
  • @Santosh,请提供更多详细信息。 “随机位置”是什么意思?它应该是一些容器包装器,其中图像将被绝对定位或其他什么?提供一些标记
  • @caligula,h[is|er] 的请求对我来说似乎很直接,他想随机化页面上元素的位置。 [S]他不确定要使用的正确技术是标记/css/javascript。
  • @caligula 我已经更新了问题,但我还没有做任何 CSS 工作。
  • @EvgeniyNaydenov 查看我更新的问题,我还没有触及 CSS 部分。如果我希望在 JavaScript 中完成此操作。

标签: php javascript html css


【解决方案1】:

这是一个相当简单的实现:http://jsfiddle.net/Eu8wT/

$('div.randomizeme').css({
    top: Math.random() * 100+'%',
    left: Math.random() * 100+'%'
});​

将此应用于多个元素:

$('div.randomizeme').each(function(){
    $(this).css({
        top: Math.random() * 100+'%',
        left: Math.random() * 100+'%'
    });
});​

没有 jQuery 也是一样的:

var elements = document.querySelectorAll('.randomizeme');
for (var i in elements) {
    elements[i].style.top = Math.random() * 100 + '%';
    elements[i].style.left = Math.random() * 100 + '%';
}​

【讨论】:

  • 嘿,它适用于jsFiddle,但不适用于我。可以review it吗?
  • 您在加载图像之前加载脚本,如果您以其他方式执行它会很好,或者您可以等待整个页面加载使用window.onLoad = function(){ }
  • 将脚本移动到结束正文标记的正上方(更新了该链接),但仍然存在这个问题。
  • 它不能在 jsFiddle 之外工作,你能提供一个真实世界 (在网页上) 的例子吗?
  • @Santosh 这是“无 jQuery”版本:fiddle.jshell.net/dSAzp/show 请务必记住,您只能有一个 window.onload 定义,因此如果您的页面有 jQuery 或其他使用 @987654330 的库@,尝试使用document.onload。我还应该让你知道我之前说的window.onLoad是不正确的,它是window.onload
【解决方案2】:

使用纯 JavaScript(无库)的解决方案

var imgs = document.querySelectorAll('.rand'), 
    len = imgs.length, 
    /* subtract the width/ height of images */
    w = document.body.clientWidth - 48, 
    h = document.body.clientHeight - 48;

for(var i = 0; i < len; i++) {
  imgs[i].style.top = Math.floor(Math.random() * h) + 'px';
  imgs[i].style.left = Math.floor(Math.random() * w) + 'px';
}

working demo

【讨论】:

  • @Ana 它在CodePen 上运行良好,但我不知道为什么它不适合我。可以review it吗?
  • 我不知道为什么,但我已经更新了笔和我的答案。这也更简单,我认为它应该可以工作:-?
  • 当我使用开发人员工具在您的网站上试用时,新版本对我有用。
  • @Ana 真的吗?我已经更新了 JavaScript,但它是原来的样子。图像似乎相互重叠,因此仅显示一张图像。您是否在浏览器(本地)中尝试过?
  • 我在您网站的控制台中运行了它。我想我现在已经弄清楚为什么它不起作用了。它说document.bodynull,这是合乎逻辑的,因为你把它放在head之前 body。您应该在关闭 body 标记之前放置脚本。
【解决方案3】:

假设您已经将图像硬编码到您的 html 文档中。您需要做的(如果您想用 PHP 完成此操作)是为每个元素添加一个 style 属性。在您的情况下,您的图像保存在 &lt;a&gt; 标签内,因此您需要随机定位 &lt;a&gt; 标签而不是图像...

function generateRandomPositions(){

  // define maximum and minimum 'top' values
  $maxTop = 1000;
  $minTop = 0;

  // define maximum and minimum 'left' values    
  $maxLeft = 1000;
  $minLeft = 0; 


  $styleProperties = array(
    'position:absolute',
    'top:'.rand($minTop,$maxTop) . 'px',
    'left:'.rand($minLeft,$maxLeft) . 'px'
  );

  return ' style="'.implode(';',$styleProperties).'" ';
}

函数会返回一个类似这样的字符串-

style="position:absolute;top:10px; left:45px;"

现在你要做的就是为页面上的每张图片调用这个函数 -

<a <?php echo generateRandomPositions();?> ><img src="...
<a <?php echo generateRandomPositions();?> ><img src="...
<a <?php echo generateRandomPositions();?> ><img src="...
<a <?php echo generateRandomPositions();?> ><img src="...

您的&lt;a&gt; 标签现在将包含随机的 CSS 定位参数,并且它们的图像将随之移动。

我相信您可以看到,这种使用 PHP 生成内联 CSS 属性的方法是一种倒退的方法。 JavaScript 可能是获得所需内容的最佳方式,并且还有其他答案可以涵盖它。您最初可以使用 CSS 隐藏元素,然后在设置随机定位后使用 JavaScript 显示它们。


参考资料 -

【讨论】:

  • 1000x1000 屏幕?使用 % 会更有意义 1000 倍,而且这种操作不应该用 PHP 来完成。
  • @kor - 100opx 限制只是我给出的限制示例。我清楚地知道 PHP 不是这样做的方法,但是原来的帖子询问 PHP - 这是一种替代方法。
  • 不想刻薄,但他的问题是最好使用哪种技术,然后他说他认为 php 是最好的。很高兴您能理解这一点,但您应该说明还有更好的方法。
  • @kor - 我同意。感谢您的反馈意见! :)
  • @Lix 按我的预期工作,有什么方法可以防止重叠?
【解决方案4】:
<?php
$images= array(
    'twitter-48.png',
    'facebook-48.png',
    'plus-48.png',
    'github-48.png'
);
$keys= range(0, count($images)- 1);
shuffle($keys);
foreach($keys as $key) {
    print "<div>{$images[$key]}</div>";
}

编辑:

<?php
$images= array(
    array('href'=> 'http://twitter.com/', 'alt'=> 'Twitter', 'src'=> '/images/twitter-48.png'),
    array('href'=> 'http://facebook.com/', 'alt'=> 'Facebook', 'src'=> '/images/facebook-48.png'),
    array('href'=> 'https://plus.google.com/', 'alt'=> 'Google Plus', 'src'=> '/images/plus-48.png'),
    array('href'=> 'https://github.com/', 'alt'=> 'GitHub', 'src'=> '/images/github-48.png')
);
$keys= range(0, count($images)- 1);
shuffle($keys);
?>
<div class='location1'>
    <a href='<?php print $images[$keys[0]]['href']; ?>'><img alt='<?php print $images[$keys[0]]['alt']; ?>' src='<?php print $images[$keys[0]]['src']; ?>'></img></a>
</div>
<div class='location2'>
    <a href='<?php print $images[$keys[1]]['href']; ?>'><img alt='<?php print $images[$keys[1]]['alt']; ?>' src='<?php print $images[$keys[1]]['src']; ?>'></img></a>
</div>
<div class='location3'>
    <a href='<?php print $images[$keys[2]]['href']; ?>'><img alt='<?php print $images[$keys[2]]['alt']; ?>' src='<?php print $images[$keys[2]]['src']; ?>'></img></a>
</div>
<div class='location4'>
    <a href='<?php print $images[$keys[3]]['href']; ?>'><img alt='<?php print $images[$keys[3]]['alt']; ?>' src='<?php print $images[$keys[3]]['src']; ?>'></img></a>
</div>

【讨论】:

  • 你的代码有两个错误,1.你没有关闭php标签。 2. 您只是使用文本而不是图像,您应该在代码中的某处使用img src。 + 我希望图像分散在整个页面上,而不仅仅是一列。
  • 以更好的方式,我将重申@HanhNghien所说的;结束标签是可选的。
  • @HanhNghien 但仍然在单列中。
  • &lt;div class='location1'&gt;...&lt;/div&gt; 放在页眉中,&lt;div class='location2'&gt;...&lt;/div&gt; 在左边,&lt;div class='location1'&gt;...&lt;/div&gt; 在右边,&lt;div class='location1'&gt;...&lt;/div&gt; 在页脚或任何地方
  • @HanhNghien 问题是关于随机化任何地方。无论如何,还有其他答案。
【解决方案5】:

试试这个:

$images = array('1.gif', '2.gif', '3.gif');
$images = array_shaffle($images);
foreach ($images as $image) {
  echo "<img src='{$image}' />;
}

【讨论】:

  • array_shaffle?此外,您没有关闭您的"。最后,这并不能完全回答提出的问题。
  • 宁可bool shuffle(array &amp;$array);我刚刚编辑了这个答案,等待接受。
  • @evg - 请不要编辑来自其他人帖子的代码块。他们可以(并且可能会)彻底改变所提供解决方案的结果。在这些情况下,最好为 OP 发表评论并让他们处理。
猜你喜欢
  • 2021-07-10
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
相关资源
最近更新 更多