【问题标题】:Saving multiple element properties into array with jQuery使用 jQuery 将多个元素属性保存到数组中
【发布时间】:2012-04-01 16:03:56
【问题描述】:

新手来了!我的问题如下:我有一个动态填充的 ul ,其中每个 li 项目包含 5 个绝对定位的内部 div。像这样:

<ul id="slider">
 <li class="slide">
   <div class="pic1"></div>
   <div class="pic2"></div>
   <div class="pic3"></div>
   <div class="pic4"></div>
   <div class="pic5"></div>
 </li>
 <li class="slide">
   <div class="pic1"></div>
   <div class="pic2"></div>
   <div class="pic3"></div>
   <div class="pic4"></div>
   <div class="pic5"></div>
 </li>
 //more li items...
</ul>

这些绝对定位的 div 中的每一个都使用同级的高度来使用 jQuery 计算其最终位置。水平(左、右)属性直接通过 css 应用。我尝试使用每个 pic 类的 each 方法来设置 css,例如这些示例:

var pic2 = new Array();
$('.slide .pic2').each(function(i) {
    pic2.push($(this).siblings('.pic1').find('img').height(); 
    $(this).css({ top : pic2[i] + 10 });
});

var pic4 = new Array();
$('.slide .pic4').each(function(i) {
    pic4.push($(this).siblings('.pic3').find('img').height(); 
    $(this).css({ top : pic4[i] + 10 });
});

但我认为必须有一种更简单、更紧凑的方法来做到这一点,因为这似乎太复杂了,而且它在 IE7 和 IE8 中也中断了,我注意到了。例如,也许一个 for 循环将创建一个多维数组并根据某些 if 语句将 css 应用于每个项目,或者可能使用 .position 方法?有任何想法吗?谢谢!

---- 编辑为像我这样的未来新手添加答案:

使用 Shasteriskt 的回答,我能够简化我丑陋的每个功能,并根据类添加某些参数,如下所示:

$('.slider li').children('div').each(function(i,picItem){
       if ( $(this).hasClass('pic2') ) {
            var top = $(picItem).prev().find('img').height();
            $(picItem).css({top: top + 100});
       }
      if ( $(this).hasClass('pic5') ) {
            var top = $(picItem).prev().find('img').height();
            $(picItem).css({top: top + 60});
       }
      else {
           var top = $(picItem).prev().find('img').height();
           $(picItem).css({top: top + 10});
      }
   });

谢谢你,Shasteriskt!很多巧克力饼干给你! :)

【问题讨论】:

  • 为什么不直接让css定位元素而不需要任何js呢?例如:.slide div {margin-top : 10px;}
  • 因为我使用的网格设计非常具体,因此绝对定位基于 div 的高度和宽度。虽然现在你这么说,让我想知道我是否尝试过!大声笑让我检查一下,我会告诉你;)
  • 我知道你可能有一个严格的网格,但由于你没有在你的问题中指定,我想我试了一下

标签: jquery arrays for-loop position each


【解决方案1】:

为什么需要将每个值推入数组?除非你以后需要使用它,否则我认为你真的不需要它。

您可以将其简化如下:

   $('.slider li').children('div:odd').each(function(i,picItem){
       var top = $(picItem).prev().find('img').height();
       $(picItem).css({top: top + 10});
   });

【讨论】:

  • 这确实有点用!唯一的问题是,就像我在上面告诉祗园的那样,我的网格是一个非常具体的设计,所以某些项目的顶部位置不是根据它上面的 div 而是根据它旁边的...(所有 div 都有用css设置不同的宽度,改变的是网格上根据高度的顺序)。是否可以在您发布的内容中添加不同的 if 语句,比如“如果这是 pic3,那么 picitem.css 是 top + 80”?如果这个问题很愚蠢,我很抱歉,我是 jQuery 的新手,所以我现在正在自学用它做一些漂亮的事情 O:)
  • 你可以通过if($(picItem).hasClass('.pic2')){ //do something }来检查当前哪个div在循环中。
猜你喜欢
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多